This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 40edf7d75d57ca08e3368c53bef1382a1ef2f454 Author: Lynne <[email protected]> AuthorDate: Fri Jan 2 03:15:40 2026 +0100 Commit: Lynne <[email protected]> CommitDate: Mon Jan 12 17:28:35 2026 +0100 vulkan: switch to static allocation for temporary descriptor data Simplifies management, and the hardware is limited to 4 descriptor sets and whatever bindings. --- libavutil/vulkan.c | 127 ++++++++++------------------------------------------- libavutil/vulkan.h | 29 +++++++----- 2 files changed, 42 insertions(+), 114 deletions(-) diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index 33d7e8aace..de7fe4f73d 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -333,13 +333,9 @@ void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool) vk->DestroyDescriptorPool(s->hwctx->act_dev, sd->desc_pool, s->hwctx->alloc); - av_freep(&sd->desc_set_buf); - av_freep(&sd->desc_bind); av_freep(&sd->desc_sets); } - av_freep(&pool->reg_shd); - for (int i = 0; i < pool->pool_size; i++) { if (pool->cmd_buf_pools[i]) vk->FreeCommandBuffers(s->hwctx->act_dev, pool->cmd_buf_pools[i], @@ -1492,21 +1488,11 @@ int ff_vk_host_map_buffer(FFVulkanContext *s, AVBufferRef **dst, int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage) { - VkPushConstantRange *pc; - - shd->push_consts = av_realloc_array(shd->push_consts, - sizeof(*shd->push_consts), - shd->push_consts_num + 1); - if (!shd->push_consts) - return AVERROR(ENOMEM); - - pc = &shd->push_consts[shd->push_consts_num++]; - memset(pc, 0, sizeof(*pc)); - + VkPushConstantRange *pc = &shd->push_consts[shd->push_consts_num++]; + av_assert1(shd->push_consts_num < FF_VK_MAX_PUSH_CONSTS); pc->stageFlags = stage; pc->offset = offset; pc->size = size; - return 0; } @@ -2329,11 +2315,6 @@ static int init_descriptors(FFVulkanContext *s, FFVulkanShader *shd) VkResult ret; FFVulkanFunctions *vk = &s->vkfn; - shd->desc_layout = av_malloc_array(shd->nb_descriptor_sets, - sizeof(*shd->desc_layout)); - if (!shd->desc_layout) - return AVERROR(ENOMEM); - if (!(s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER)) { int has_singular = 0; int max_descriptors = 0; @@ -2405,11 +2386,6 @@ int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, return err; if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) { - shd->bound_buffer_indices = av_calloc(shd->nb_descriptor_sets, - sizeof(*shd->bound_buffer_indices)); - if (!shd->bound_buffer_indices) - return AVERROR(ENOMEM); - for (int i = 0; i < shd->nb_descriptor_sets; i++) shd->bound_buffer_indices[i] = i; } @@ -2465,35 +2441,17 @@ static const struct descriptor_props { }; int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, - FFVulkanDescriptorSetBinding *desc, int nb, + const FFVulkanDescriptorSetBinding *desc, int nb, int singular, int print_to_shader_only) { int has_sampler = 0; - FFVulkanDescriptorSet *set; if (print_to_shader_only) goto print; - /* Actual layout allocated for the pipeline */ - set = av_realloc_array(shd->desc_set, - sizeof(*shd->desc_set), - shd->nb_descriptor_sets + 1); - if (!set) - return AVERROR(ENOMEM); - shd->desc_set = set; - - set = &set[shd->nb_descriptor_sets]; - memset(set, 0, sizeof(*set)); - - set->binding = av_calloc(nb, sizeof(*set->binding)); - if (!set->binding) - return AVERROR(ENOMEM); - - set->binding_offset = av_calloc(nb, sizeof(*set->binding_offset)); - if (!set->binding_offset) { - av_freep(&set->binding); - return AVERROR(ENOMEM); - } + FFVulkanDescriptorSet *set = &shd->desc_set[shd->nb_descriptor_sets++]; + av_assert1(shd->nb_descriptor_sets < FF_VK_MAX_DESCRIPTOR_SETS); + av_assert1(nb < FF_VK_MAX_DESCRIPTOR_BINDINGS); for (int i = 0; i < nb; i++) { set->binding[i].binding = i; @@ -2515,20 +2473,12 @@ int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, if (!(s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER)) { for (int i = 0; i < nb; i++) { int j; - VkDescriptorPoolSize *desc_pool_size; for (j = 0; j < shd->nb_desc_pool_size; j++) if (shd->desc_pool_size[j].type == desc[i].type) break; if (j >= shd->nb_desc_pool_size) { - desc_pool_size = av_realloc_array(shd->desc_pool_size, - sizeof(*desc_pool_size), - shd->nb_desc_pool_size + 1); - if (!desc_pool_size) - return AVERROR(ENOMEM); - - shd->desc_pool_size = desc_pool_size; shd->nb_desc_pool_size++; - memset(&desc_pool_size[j], 0, sizeof(VkDescriptorPoolSize)); + av_assert1(shd->nb_desc_pool_size < FF_VK_MAX_DESCRIPTOR_TYPES); } shd->desc_pool_size[j].type = desc[i].type; shd->desc_pool_size[j].descriptorCount += FFMAX(desc[i].elems, 1); @@ -2537,7 +2487,6 @@ int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, set->singular = singular; set->nb_bindings = nb; - shd->nb_descriptor_sets++; print: /* Write shader info */ @@ -2604,33 +2553,17 @@ int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd) { int err; - FFVulkanShaderData *sd; if (!shd->nb_descriptor_sets) return 0; - sd = av_realloc_array(pool->reg_shd, - sizeof(*pool->reg_shd), - pool->nb_reg_shd + 1); - if (!sd) - return AVERROR(ENOMEM); - - pool->reg_shd = sd; - sd = &sd[pool->nb_reg_shd++]; - memset(sd, 0, sizeof(*sd)); + FFVulkanShaderData *sd = &pool->reg_shd[pool->nb_reg_shd++]; + av_assert1(pool->nb_reg_shd < FF_VK_MAX_SHADERS); sd->shd = shd; sd->nb_descriptor_sets = shd->nb_descriptor_sets; if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) { - sd->desc_bind = av_malloc_array(sd->nb_descriptor_sets, sizeof(*sd->desc_bind)); - if (!sd->desc_bind) - return AVERROR(ENOMEM); - - sd->desc_set_buf = av_calloc(sd->nb_descriptor_sets, sizeof(*sd->desc_set_buf)); - if (!sd->desc_set_buf) - return AVERROR(ENOMEM); - for (int i = 0; i < sd->nb_descriptor_sets; i++) { FFVulkanDescriptorSet *set = &shd->desc_set[i]; FFVulkanDescriptorSetData *sdb = &sd->desc_set_buf[i]; @@ -2717,8 +2650,8 @@ int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, return 0; } -static inline FFVulkanShaderData *get_shd_data(FFVkExecContext *e, - FFVulkanShader *shd) +static inline const FFVulkanShaderData *get_shd_data(FFVkExecContext *e, + FFVulkanShader *shd) { for (int i = 0; i < e->parent->nb_reg_shd; i++) if (e->parent->reg_shd[i].shd == shd) @@ -2734,7 +2667,7 @@ static inline void update_set_descriptor(FFVulkanContext *s, FFVkExecContext *e, { FFVulkanFunctions *vk = &s->vkfn; FFVulkanDescriptorSet *desc_set = &shd->desc_set[set]; - FFVulkanShaderData *sd = get_shd_data(e, shd); + const FFVulkanShaderData *sd = get_shd_data(e, shd); const size_t exec_offset = desc_set->singular ? 0 : desc_set->aligned_size*e->idx; void *desc = sd->desc_set_buf[set].desc_mem + /* Base */ @@ -2751,7 +2684,7 @@ static inline void update_set_pool_write(FFVulkanContext *s, FFVkExecContext *e, { FFVulkanFunctions *vk = &s->vkfn; FFVulkanDescriptorSet *desc_set = &shd->desc_set[set]; - FFVulkanShaderData *sd = get_shd_data(e, shd); + const FFVulkanShaderData *sd = get_shd_data(e, shd); if (desc_set->singular) { for (int i = 0; i < e->parent->pool_size; i++) { @@ -2931,7 +2864,7 @@ void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, { FFVulkanFunctions *vk = &s->vkfn; VkDeviceSize offsets[1024]; - FFVulkanShaderData *sd = get_shd_data(e, shd); + const FFVulkanShaderData *sd = get_shd_data(e, shd); if (s->extensions & FF_VK_EXT_SHADER_OBJECT) { VkShaderStageFlagBits stages = shd->stage; @@ -2943,12 +2876,15 @@ void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, if (sd && sd->nb_descriptor_sets) { if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) { for (int i = 0; i < sd->nb_descriptor_sets; i++) - offsets[i] = shd->desc_set[i].singular ? 0 : shd->desc_set[i].aligned_size*e->idx; + offsets[i] = shd->desc_set[i].singular ? + 0 : shd->desc_set[i].aligned_size*e->idx; /* Bind descriptor buffers */ - vk->CmdBindDescriptorBuffersEXT(e->buf, sd->nb_descriptor_sets, sd->desc_bind); + vk->CmdBindDescriptorBuffersEXT(e->buf, sd->nb_descriptor_sets, + sd->desc_bind); /* Binding offsets */ - vk->CmdSetDescriptorBufferOffsetsEXT(e->buf, shd->bind_point, shd->pipeline_layout, + vk->CmdSetDescriptorBufferOffsetsEXT(e->buf, shd->bind_point, + shd->pipeline_layout, 0, sd->nb_descriptor_sets, shd->bound_buffer_indices, offsets); } else if (!shd->use_push) { @@ -2980,25 +2916,10 @@ void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd) vk->DestroyPipelineLayout(s->hwctx->act_dev, shd->pipeline_layout, s->hwctx->alloc); - for (int i = 0; i < shd->nb_descriptor_sets; i++) { - FFVulkanDescriptorSet *set = &shd->desc_set[i]; - av_free(set->binding); - av_free(set->binding_offset); - } - - if (shd->desc_layout) { - for (int i = 0; i < shd->nb_descriptor_sets; i++) - if (shd->desc_layout[i]) - vk->DestroyDescriptorSetLayout(s->hwctx->act_dev, shd->desc_layout[i], - s->hwctx->alloc); - } - - av_freep(&shd->desc_pool_size); - av_freep(&shd->desc_layout); - av_freep(&shd->desc_set); - av_freep(&shd->bound_buffer_indices); - av_freep(&shd->push_consts); - shd->push_consts_num = 0; + for (int i = 0; i < shd->nb_descriptor_sets; i++) + if (shd->desc_layout[i]) + vk->DestroyDescriptorSetLayout(s->hwctx->act_dev, shd->desc_layout[i], + s->hwctx->alloc); } void ff_vk_uninit(FFVulkanContext *s) diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h index cde2876e46..9bc2ff8fad 100644 --- a/libavutil/vulkan.h +++ b/libavutil/vulkan.h @@ -71,6 +71,12 @@ #define DUP_SAMPLER(x) { x, x, x, x } +#define FF_VK_MAX_DESCRIPTOR_SETS 4 +#define FF_VK_MAX_DESCRIPTOR_BINDINGS 16 +#define FF_VK_MAX_DESCRIPTOR_TYPES 16 +#define FF_VK_MAX_PUSH_CONSTS 4 +#define FF_VK_MAX_SHADERS 16 + typedef struct FFVulkanDescriptorSetBinding { const char *name; VkDescriptorType type; @@ -175,8 +181,9 @@ typedef struct FFVulkanDescriptorSet { VkDeviceSize aligned_size; /* descriptorBufferOffsetAlignment */ VkBufferUsageFlags usage; - VkDescriptorSetLayoutBinding *binding; - VkDeviceSize *binding_offset; + VkDescriptorSetLayoutBinding binding[FF_VK_MAX_DESCRIPTOR_BINDINGS]; + VkDeviceSize binding_offset[FF_VK_MAX_DESCRIPTOR_BINDINGS]; + int nb_bindings; /* Descriptor set is shared between all submissions */ @@ -208,20 +215,20 @@ typedef struct FFVulkanShader { VkPipelineLayout pipeline_layout; /* Push consts */ - VkPushConstantRange *push_consts; + VkPushConstantRange push_consts[FF_VK_MAX_PUSH_CONSTS]; int push_consts_num; /* Descriptor sets */ - FFVulkanDescriptorSet *desc_set; + FFVulkanDescriptorSet desc_set[FF_VK_MAX_DESCRIPTOR_SETS]; int nb_descriptor_sets; /* Descriptor buffer */ - VkDescriptorSetLayout *desc_layout; - uint32_t *bound_buffer_indices; + VkDescriptorSetLayout desc_layout[FF_VK_MAX_DESCRIPTOR_SETS]; + uint32_t bound_buffer_indices[FF_VK_MAX_DESCRIPTOR_SETS]; /* Descriptor pool */ int use_push; - VkDescriptorPoolSize *desc_pool_size; + VkDescriptorPoolSize desc_pool_size[FF_VK_MAX_DESCRIPTOR_TYPES]; int nb_desc_pool_size; } FFVulkanShader; @@ -237,8 +244,8 @@ typedef struct FFVulkanShaderData { int nb_descriptor_sets; /* Descriptor buffer */ - FFVulkanDescriptorSetData *desc_set_buf; - VkDescriptorBufferBindingInfoEXT *desc_bind; + FFVulkanDescriptorSetData desc_set_buf[FF_VK_MAX_DESCRIPTOR_SETS]; + VkDescriptorBufferBindingInfoEXT desc_bind[FF_VK_MAX_DESCRIPTOR_SETS]; /* Descriptor pools */ VkDescriptorSet *desc_sets; @@ -263,7 +270,7 @@ typedef struct FFVkExecPool { size_t qd_size; /* Registered shaders' data */ - FFVulkanShaderData *reg_shd; + FFVulkanShaderData reg_shd[FF_VK_MAX_SHADERS]; int nb_reg_shd; } FFVkExecPool; @@ -624,7 +631,7 @@ int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, * Add descriptor to a shader. Must be called before shader init. */ int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, - FFVulkanDescriptorSetBinding *desc, int nb, + const FFVulkanDescriptorSetBinding *desc, int nb, int singular, int print_to_shader_only); /** _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
