From ad9c3193faa5230c665ac4e215f6d3e58af6eced Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 15 Jan 2021 22:45:49 +0900 Subject: [PATCH] [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. --- include/QF/Vulkan/command.h | 11 ++++++++--- libs/video/renderer/vid_render_vulkan.c | 7 +++---- libs/video/renderer/vulkan/command.c | 12 +++++------- libs/video/renderer/vulkan/vulkan_draw.c | 9 ++++----- libs/video/renderer/vulkan/vulkan_vid_common.c | 7 +++---- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/include/QF/Vulkan/command.h b/include/QF/Vulkan/command.h index 925a63781..47418db1a 100644 --- a/include/QF/Vulkan/command.h +++ b/include/QF/Vulkan/command.h @@ -6,6 +6,9 @@ typedef struct qfv_cmdbufferset_s DARRAY_TYPE (VkCommandBuffer) qfv_cmdbufferset_t; +#define QFV_AllocCommandBufferSet(num, allocator) \ + DARRAY_ALLOCFIXED (qfv_cmdbufferset_t, num, allocator) + typedef struct qfv_semaphoreset_s DARRAY_TYPE (VkSemaphore) qfv_semaphoreset_t; @@ -23,9 +26,11 @@ struct qfv_device_s; VkCommandPool QFV_CreateCommandPool (struct qfv_device_s *device, uint32_t queueFamily, int transient, int reset); -qfv_cmdbufferset_t *QFV_AllocateCommandBuffers (struct qfv_device_s *device, - VkCommandPool pool, - int secondary, int count); +/** Allocate bufferset->size command buffers + */ +int QFV_AllocateCommandBuffers (struct qfv_device_s *device, + VkCommandPool pool, int secondary, + qfv_cmdbufferset_t *bufferset); VkSemaphore QFV_CreateSemaphore (struct qfv_device_s *device); VkFence QFV_CreateFence (struct qfv_device_s *device, int signaled); diff --git a/libs/video/renderer/vid_render_vulkan.c b/libs/video/renderer/vid_render_vulkan.c index 995763baf..f68e8c182 100644 --- a/libs/video/renderer/vid_render_vulkan.c +++ b/libs/video/renderer/vid_render_vulkan.c @@ -389,11 +389,10 @@ vulkan_vid_render_choose_visual (void) vulkan_ctx->cmdpool = QFV_CreateCommandPool (vulkan_ctx->device, vulkan_ctx->device->queue.queueFamily, 0, 1); - __auto_type cmdset = QFV_AllocateCommandBuffers (vulkan_ctx->device, - vulkan_ctx->cmdpool, - 0, 1); + __auto_type cmdset = QFV_AllocCommandBufferSet (1, alloca); + QFV_AllocateCommandBuffers (vulkan_ctx->device, vulkan_ctx->cmdpool, 0, + cmdset); vulkan_ctx->cmdbuffer = cmdset->a[0]; - free (cmdset); vulkan_ctx->fence = QFV_CreateFence (vulkan_ctx->device, 1); Sys_Printf ("vk choose visual %p %p %d %p\n", vulkan_ctx->device->dev, vulkan_ctx->device->queue.queue, diff --git a/libs/video/renderer/vulkan/command.c b/libs/video/renderer/vulkan/command.c index 8ba60ab32..10f0cc559 100644 --- a/libs/video/renderer/vulkan/command.c +++ b/libs/video/renderer/vulkan/command.c @@ -87,9 +87,9 @@ QFV_CreateCommandPool (qfv_device_t *device, uint32_t queueFamily, return pool; } -qfv_cmdbufferset_t * +int QFV_AllocateCommandBuffers (qfv_device_t *device, VkCommandPool pool, - int secondary, int count) + int secondary, qfv_cmdbufferset_t *bufferset) { VkDevice dev = device->dev; qfv_devfuncs_t *dfunc = device->funcs; @@ -99,12 +99,10 @@ QFV_AllocateCommandBuffers (qfv_device_t *device, VkCommandPool pool, } VkCommandBufferAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 0, - pool, level, count + pool, level, bufferset->size }; - qfv_cmdbufferset_t *cmdbufferset; - cmdbufferset = DARRAY_ALLOCFIXED (*cmdbufferset, count, malloc); - dfunc->vkAllocateCommandBuffers (dev, &allocInfo, cmdbufferset->a); - return cmdbufferset; + int ret = dfunc->vkAllocateCommandBuffers (dev, &allocInfo, bufferset->a); + return ret == VK_SUCCESS; } VkSemaphore diff --git a/libs/video/renderer/vulkan/vulkan_draw.c b/libs/video/renderer/vulkan/vulkan_draw.c index 0262e1802..61b85d3e1 100644 --- a/libs/video/renderer/vulkan/vulkan_draw.c +++ b/libs/video/renderer/vulkan/vulkan_draw.c @@ -355,12 +355,12 @@ Vulkan_Draw_Init (vulkan_ctx_t *ctx) QFV_ScrapImageView (draw_scrap), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, }; - __auto_type cmdBuffers - = QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, - ctx->framebuffers.size); + size_t frames = ctx->framebuffers.size; + __auto_type cmdBuffers = QFV_AllocCommandBufferSet (frames, alloca); + QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdBuffers); __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]; frame->twodDescriptors = sets->a[i]; @@ -379,7 +379,6 @@ Vulkan_Draw_Init (vulkan_ctx_t *ctx) DARRAY_APPEND (frame->subCommand, cmdBuffers->a[i]); } free (sets); - free (cmdBuffers); } static inline void diff --git a/libs/video/renderer/vulkan/vulkan_vid_common.c b/libs/video/renderer/vulkan/vulkan_vid_common.c index 126d602fd..16e60e5c1 100644 --- a/libs/video/renderer/vulkan/vulkan_vid_common.c +++ b/libs/video/renderer/vulkan/vulkan_vid_common.c @@ -402,9 +402,9 @@ Vulkan_CreateFramebuffers (vulkan_ctx_t *ctx) attachments->a[0] = ctx->renderpass.colorImage->view; attachments->a[1] = ctx->renderpass.depthImage->view; - __auto_type cmdBuffers - = QFV_AllocateCommandBuffers (device, cmdpool, 0, - ctx->framebuffers.size); + __auto_type cmdBuffers = QFV_AllocCommandBufferSet (ctx->framebuffers.size, + alloca); + QFV_AllocateCommandBuffers (device, cmdpool, 0, cmdBuffers); for (size_t i = 0; i < ctx->framebuffers.size; 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)); DARRAY_INIT (frame->subCommand, 4); } - free (cmdBuffers); } void