mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-13 00:24:12 +00:00
[vulkan] Clean up draw's memory handling a little
Use cmem for pic and cachpic name allocations. If nothing else, it at least keeps memory a little less fragmented.
This commit is contained in:
parent
c536a363ec
commit
f023675f8c
1 changed files with 29 additions and 15 deletions
|
@ -38,6 +38,7 @@
|
||||||
# include <strings.h>
|
# include <strings.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "QF/cmem.h"
|
||||||
#include "QF/cvar.h"
|
#include "QF/cvar.h"
|
||||||
#include "QF/draw.h"
|
#include "QF/draw.h"
|
||||||
#include "QF/dstring.h"
|
#include "QF/dstring.h"
|
||||||
|
@ -69,7 +70,6 @@ typedef struct {
|
||||||
} drawvert_t;
|
} drawvert_t;
|
||||||
|
|
||||||
typedef struct cachepic_s {
|
typedef struct cachepic_s {
|
||||||
struct cachepic_s *next;
|
|
||||||
char *name;
|
char *name;
|
||||||
qpic_t *pic;
|
qpic_t *pic;
|
||||||
} cachepic_t;
|
} cachepic_t;
|
||||||
|
@ -92,6 +92,11 @@ typedef struct drawctx_s {
|
||||||
qpic_t *conchars;
|
qpic_t *conchars;
|
||||||
qpic_t *conback;
|
qpic_t *conback;
|
||||||
qpic_t *white_pic;
|
qpic_t *white_pic;
|
||||||
|
// use two separate cmem blocks for pics and strings (cachepic names)
|
||||||
|
// to ensure the names are never in the same cacheline as a pic since the
|
||||||
|
// names are used only for lookup
|
||||||
|
memsuper_t *pic_memsuper;
|
||||||
|
memsuper_t *string_memsuper;
|
||||||
hashtab_t *pic_cache;
|
hashtab_t *pic_cache;
|
||||||
VkBuffer vert_buffer;
|
VkBuffer vert_buffer;
|
||||||
VkDeviceMemory vert_memory;
|
VkDeviceMemory vert_memory;
|
||||||
|
@ -211,32 +216,34 @@ flush_draw_scrap (vulkan_ctx_t *ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pic_free (qpic_t *pic)
|
pic_free (drawctx_t *dctx, qpic_t *pic)
|
||||||
{
|
{
|
||||||
subpic_t *subpic = *(subpic_t **) pic->data;
|
subpic_t *subpic = *(subpic_t **) pic->data;
|
||||||
QFV_SubpicDelete (subpic);
|
QFV_SubpicDelete (subpic);
|
||||||
free (pic);
|
cmemfree (dctx->pic_memsuper, pic);
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME use cmem?
|
|
||||||
static cachepic_t *
|
static cachepic_t *
|
||||||
new_cachepic (const char *name, qpic_t *pic)
|
new_cachepic (drawctx_t *dctx, const char *name, qpic_t *pic)
|
||||||
{
|
{
|
||||||
cachepic_t *cp;
|
cachepic_t *cp;
|
||||||
|
size_t size = strlen (name) + 1;
|
||||||
|
|
||||||
cp = malloc (sizeof (cachepic_t));
|
cp = cmemalloc (dctx->pic_memsuper, sizeof (cachepic_t));
|
||||||
cp->name = strdup (name);
|
cp->name = cmemalloc (dctx->string_memsuper, size);
|
||||||
|
memcpy (cp->name, name, size);
|
||||||
cp->pic = pic;
|
cp->pic = pic;
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cachepic_free (void *_cp, void *unused)
|
cachepic_free (void *_cp, void *_dctx)
|
||||||
{
|
{
|
||||||
|
drawctx_t *dctx = _dctx;
|
||||||
cachepic_t *cp = (cachepic_t *) _cp;
|
cachepic_t *cp = (cachepic_t *) _cp;
|
||||||
pic_free (cp->pic);
|
pic_free (dctx, cp->pic);
|
||||||
free (cp->name);
|
cmemfree (dctx->string_memsuper, cp->name);
|
||||||
free (cp);
|
cmemfree (dctx->pic_memsuper, cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
|
@ -252,7 +259,8 @@ pic_data (const char *name, int w, int h, const byte *data, drawctx_t *dctx)
|
||||||
subpic_t *subpic;
|
subpic_t *subpic;
|
||||||
byte *picdata;
|
byte *picdata;
|
||||||
|
|
||||||
pic = malloc (field_offset (qpic_t, data[sizeof (subpic_t)]));
|
pic = cmemalloc (dctx->pic_memsuper,
|
||||||
|
field_offset (qpic_t, data[sizeof (subpic_t *)]));
|
||||||
pic->width = w;
|
pic->width = w;
|
||||||
pic->height = h;
|
pic->height = h;
|
||||||
|
|
||||||
|
@ -292,7 +300,8 @@ Vulkan_Draw_PicFromWad (const char *name, vulkan_ctx_t *ctx)
|
||||||
if (!wadpic) {
|
if (!wadpic) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return pic_data (name, wadpic->width, wadpic->height, wadpic->data, ctx->draw_context);
|
return pic_data (name, wadpic->width, wadpic->height, wadpic->data,
|
||||||
|
ctx->draw_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
qpic_t *
|
qpic_t *
|
||||||
|
@ -313,7 +322,7 @@ Vulkan_Draw_CachePic (const char *path, qboolean alpha, vulkan_ctx_t *ctx)
|
||||||
|
|
||||||
pic = pic_data (path, p->width, p->height, p->data, dctx);
|
pic = pic_data (path, p->width, p->height, p->data, dctx);
|
||||||
free (p);
|
free (p);
|
||||||
cpic = new_cachepic (path, pic);
|
cpic = new_cachepic (dctx, path, pic);
|
||||||
Hash_Add (dctx->pic_cache, cpic);
|
Hash_Add (dctx->pic_cache, cpic);
|
||||||
return pic;
|
return pic;
|
||||||
}
|
}
|
||||||
|
@ -341,6 +350,9 @@ Vulkan_Draw_Shutdown (vulkan_ctx_t *ctx)
|
||||||
destroy_quad_buffers (ctx);
|
destroy_quad_buffers (ctx);
|
||||||
|
|
||||||
dfunc->vkDestroyPipeline (device->dev, dctx->pipeline, 0);
|
dfunc->vkDestroyPipeline (device->dev, dctx->pipeline, 0);
|
||||||
|
Hash_DelTable (dctx->pic_cache);
|
||||||
|
delete_memsuper (dctx->pic_memsuper);
|
||||||
|
delete_memsuper (dctx->string_memsuper);
|
||||||
QFV_DestroyScrap (dctx->scrap);
|
QFV_DestroyScrap (dctx->scrap);
|
||||||
QFV_DestroyStagingBuffer (dctx->stage);
|
QFV_DestroyStagingBuffer (dctx->stage);
|
||||||
}
|
}
|
||||||
|
@ -359,8 +371,10 @@ Vulkan_Draw_Init (vulkan_ctx_t *ctx)
|
||||||
DARRAY_RESIZE (&dctx->frames, frames);
|
DARRAY_RESIZE (&dctx->frames, frames);
|
||||||
dctx->frames.grow = 0;
|
dctx->frames.grow = 0;
|
||||||
|
|
||||||
|
dctx->pic_memsuper = new_memsuper ();
|
||||||
|
dctx->string_memsuper = new_memsuper ();
|
||||||
dctx->pic_cache = Hash_NewTable (127, cachepic_getkey, cachepic_free,
|
dctx->pic_cache = Hash_NewTable (127, cachepic_getkey, cachepic_free,
|
||||||
0, 0);
|
dctx, 0);
|
||||||
|
|
||||||
create_quad_buffers (ctx);
|
create_quad_buffers (ctx);
|
||||||
dctx->stage = QFV_CreateStagingBuffer (device, "draw", 4 * 1024 * 1024,
|
dctx->stage = QFV_CreateStagingBuffer (device, "draw", 4 * 1024 * 1024,
|
||||||
|
|
Loading…
Reference in a new issue