[vulkan] Use darray size to control cmd buffer count

This allows the array in which the command buffers are allocated to be
allocated on the stack using alloca and thus remove the need to
malloc/free of relatively small chunks.
This commit is contained in:
Bill Currie 2021-01-15 22:45:49 +09:00
parent cef81741eb
commit ad9c3193fa
5 changed files with 23 additions and 23 deletions

View file

@ -6,6 +6,9 @@
typedef struct qfv_cmdbufferset_s typedef struct qfv_cmdbufferset_s
DARRAY_TYPE (VkCommandBuffer) qfv_cmdbufferset_t; DARRAY_TYPE (VkCommandBuffer) qfv_cmdbufferset_t;
#define QFV_AllocCommandBufferSet(num, allocator) \
DARRAY_ALLOCFIXED (qfv_cmdbufferset_t, num, allocator)
typedef struct qfv_semaphoreset_s typedef struct qfv_semaphoreset_s
DARRAY_TYPE (VkSemaphore) qfv_semaphoreset_t; DARRAY_TYPE (VkSemaphore) qfv_semaphoreset_t;
@ -23,9 +26,11 @@ struct qfv_device_s;
VkCommandPool QFV_CreateCommandPool (struct qfv_device_s *device, VkCommandPool QFV_CreateCommandPool (struct qfv_device_s *device,
uint32_t queueFamily, uint32_t queueFamily,
int transient, int reset); int transient, int reset);
qfv_cmdbufferset_t *QFV_AllocateCommandBuffers (struct qfv_device_s *device, /** Allocate bufferset->size command buffers
VkCommandPool pool, */
int secondary, int count); int QFV_AllocateCommandBuffers (struct qfv_device_s *device,
VkCommandPool pool, int secondary,
qfv_cmdbufferset_t *bufferset);
VkSemaphore QFV_CreateSemaphore (struct qfv_device_s *device); VkSemaphore QFV_CreateSemaphore (struct qfv_device_s *device);
VkFence QFV_CreateFence (struct qfv_device_s *device, int signaled); VkFence QFV_CreateFence (struct qfv_device_s *device, int signaled);

View file

@ -389,11 +389,10 @@ vulkan_vid_render_choose_visual (void)
vulkan_ctx->cmdpool = QFV_CreateCommandPool (vulkan_ctx->device, vulkan_ctx->cmdpool = QFV_CreateCommandPool (vulkan_ctx->device,
vulkan_ctx->device->queue.queueFamily, vulkan_ctx->device->queue.queueFamily,
0, 1); 0, 1);
__auto_type cmdset = QFV_AllocateCommandBuffers (vulkan_ctx->device, __auto_type cmdset = QFV_AllocCommandBufferSet (1, alloca);
vulkan_ctx->cmdpool, QFV_AllocateCommandBuffers (vulkan_ctx->device, vulkan_ctx->cmdpool, 0,
0, 1); cmdset);
vulkan_ctx->cmdbuffer = cmdset->a[0]; vulkan_ctx->cmdbuffer = cmdset->a[0];
free (cmdset);
vulkan_ctx->fence = QFV_CreateFence (vulkan_ctx->device, 1); vulkan_ctx->fence = QFV_CreateFence (vulkan_ctx->device, 1);
Sys_Printf ("vk choose visual %p %p %d %p\n", vulkan_ctx->device->dev, Sys_Printf ("vk choose visual %p %p %d %p\n", vulkan_ctx->device->dev,
vulkan_ctx->device->queue.queue, vulkan_ctx->device->queue.queue,

View file

@ -87,9 +87,9 @@ QFV_CreateCommandPool (qfv_device_t *device, uint32_t queueFamily,
return pool; return pool;
} }
qfv_cmdbufferset_t * int
QFV_AllocateCommandBuffers (qfv_device_t *device, VkCommandPool pool, QFV_AllocateCommandBuffers (qfv_device_t *device, VkCommandPool pool,
int secondary, int count) int secondary, qfv_cmdbufferset_t *bufferset)
{ {
VkDevice dev = device->dev; VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs; qfv_devfuncs_t *dfunc = device->funcs;
@ -99,12 +99,10 @@ QFV_AllocateCommandBuffers (qfv_device_t *device, VkCommandPool pool,
} }
VkCommandBufferAllocateInfo allocInfo = { VkCommandBufferAllocateInfo allocInfo = {
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 0, VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 0,
pool, level, count pool, level, bufferset->size
}; };
qfv_cmdbufferset_t *cmdbufferset; int ret = dfunc->vkAllocateCommandBuffers (dev, &allocInfo, bufferset->a);
cmdbufferset = DARRAY_ALLOCFIXED (*cmdbufferset, count, malloc); return ret == VK_SUCCESS;
dfunc->vkAllocateCommandBuffers (dev, &allocInfo, cmdbufferset->a);
return cmdbufferset;
} }
VkSemaphore VkSemaphore

View file

@ -355,12 +355,12 @@ Vulkan_Draw_Init (vulkan_ctx_t *ctx)
QFV_ScrapImageView (draw_scrap), QFV_ScrapImageView (draw_scrap),
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
}; };
__auto_type cmdBuffers size_t frames = ctx->framebuffers.size;
= QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, __auto_type cmdBuffers = QFV_AllocCommandBufferSet (frames, alloca);
ctx->framebuffers.size); QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdBuffers);
__auto_type sets = QFV_AllocateDescriptorSet (device, pool, layouts); __auto_type sets = QFV_AllocateDescriptorSet (device, pool, layouts);
for (size_t i = 0; i < ctx->framebuffers.size; i++) { for (size_t i = 0; i < frames; i++) {
__auto_type frame = &ctx->framebuffers.a[i]; __auto_type frame = &ctx->framebuffers.a[i];
frame->twodDescriptors = sets->a[i]; frame->twodDescriptors = sets->a[i];
@ -379,7 +379,6 @@ Vulkan_Draw_Init (vulkan_ctx_t *ctx)
DARRAY_APPEND (frame->subCommand, cmdBuffers->a[i]); DARRAY_APPEND (frame->subCommand, cmdBuffers->a[i]);
} }
free (sets); free (sets);
free (cmdBuffers);
} }
static inline void static inline void

View file

@ -402,9 +402,9 @@ Vulkan_CreateFramebuffers (vulkan_ctx_t *ctx)
attachments->a[0] = ctx->renderpass.colorImage->view; attachments->a[0] = ctx->renderpass.colorImage->view;
attachments->a[1] = ctx->renderpass.depthImage->view; attachments->a[1] = ctx->renderpass.depthImage->view;
__auto_type cmdBuffers __auto_type cmdBuffers = QFV_AllocCommandBufferSet (ctx->framebuffers.size,
= QFV_AllocateCommandBuffers (device, cmdpool, 0, alloca);
ctx->framebuffers.size); QFV_AllocateCommandBuffers (device, cmdpool, 0, cmdBuffers);
for (size_t i = 0; i < ctx->framebuffers.size; i++) { for (size_t i = 0; i < ctx->framebuffers.size; i++) {
attachments->a[2] = sc->imageViews->a[i]; attachments->a[2] = sc->imageViews->a[i];
@ -420,7 +420,6 @@ Vulkan_CreateFramebuffers (vulkan_ctx_t *ctx)
frame->subCommand = malloc (sizeof (qfv_cmdbufferset_t)); frame->subCommand = malloc (sizeof (qfv_cmdbufferset_t));
DARRAY_INIT (frame->subCommand, 4); DARRAY_INIT (frame->subCommand, 4);
} }
free (cmdBuffers);
} }
void void