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]

Reply via email to