This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit f32e70ecc91e3bc63bfb3b38884804675562765a
Author:     Lynne <[email protected]>
AuthorDate: Sat Feb 14 05:21:55 2026 +0100
Commit:     Lynne <[email protected]>
CommitDate: Thu Feb 19 19:42:34 2026 +0100

    vulkan/ffv1: unify all constants buffer into a single buffer
    
    Less allocations is always better.
---
 libavcodec/ffv1_vulkan.c    | 95 ++++++++++-----------------------------------
 libavcodec/ffv1_vulkan.h    | 12 +-----
 libavcodec/ffv1enc_vulkan.c | 43 ++++++--------------
 libavcodec/vulkan_ffv1.c    | 27 ++++++-------
 4 files changed, 45 insertions(+), 132 deletions(-)

diff --git a/libavcodec/ffv1_vulkan.c b/libavcodec/ffv1_vulkan.c
index 368e66b025..2a2226016f 100644
--- a/libavcodec/ffv1_vulkan.c
+++ b/libavcodec/ffv1_vulkan.c
@@ -55,103 +55,50 @@ void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, 
FFV1Context *f,
     SPEC_LIST_ADD(sl, 14, 32, f->chroma_v_shift);
 }
 
-int ff_ffv1_vk_update_state_transition_data(FFVulkanContext *s,
-                                            FFVkBuffer *vkb, FFV1Context *f)
+static void set_crc_tab(uint32_t *buf)
 {
-    int err;
-    uint8_t *buf_mapped;
-
-    RET(ff_vk_map_buffer(s, vkb, &buf_mapped, 0));
-
-    for (int i = 1; i < 256; i++) {
-        buf_mapped[256 + i] = f->state_transition[i];
-        buf_mapped[256 - i] = 256 - (int)f->state_transition[i];
+    for (uint32_t i = 0; i < 256; i++) {
+        uint32_t c = i << 24;
+        for (int j = 0; j < 8; j++)
+            c = (c << 1) ^ (0x04C11DB7 & (((int32_t) c) >> 31));
+        buf[i] = av_bswap32(c);
     }
-
-    RET(ff_vk_unmap_buffer(s, vkb, 1));
-
-fail:
-    return err;
 }
 
-static int init_state_transition_data(FFVulkanContext *s,
-                                      FFVkBuffer *vkb, FFV1Context *f,
-                                      int (*write_data)(FFVulkanContext *s,
-                                                        FFVkBuffer *vkb, 
FFV1Context *f))
+static void set_rc_state_tab(FFV1Context *f, uint8_t *buf)
 {
-    int err;
-    size_t buf_len = 512*sizeof(uint8_t);
-
-    RET(ff_vk_create_buf(s, vkb,
-                         buf_len,
-                         NULL, NULL,
-                         VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
-                         VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-                         VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
-                         VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
-
-    write_data(s, vkb, f);
-
-fail:
-    return err;
-}
-
-int ff_ffv1_vk_init_state_transition_data(FFVulkanContext *s,
-                                          FFVkBuffer *vkb, FFV1Context *f)
-{
-    return init_state_transition_data(s, vkb, f,
-                                      ff_ffv1_vk_update_state_transition_data);
+    for (int i = 1; i < 256; i++) {
+        buf[256 + i] = f->state_transition[i];
+        buf[256 - i] = 256 - (int)f->state_transition[i];
+    }
 }
 
-int ff_ffv1_vk_init_quant_table_data(FFVulkanContext *s,
-                                     FFVkBuffer *vkb, FFV1Context *f)
+int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
 {
     int err;
 
-    int16_t *buf_mapped;
-    size_t buf_len = MAX_QUANT_TABLES*
+    uint8_t *buf_mapped;
+    size_t buf_len = 256*sizeof(uint32_t) + /* CRC */
+                     512*sizeof(uint8_t) + /* Rangecoder */
+                     MAX_QUANT_TABLES*
                      MAX_CONTEXT_INPUTS*
                      MAX_QUANT_TABLE_SIZE*sizeof(int16_t);
 
     RET(ff_vk_create_buf(s, vkb,
                          buf_len,
                          NULL, NULL,
+                         VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
                          VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
                          VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
                          VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
     RET(ff_vk_map_buffer(s, vkb, (void *)&buf_mapped, 0));
 
-    memcpy(buf_mapped, f->quant_tables,
-           sizeof(f->quant_tables));
-
-    RET(ff_vk_unmap_buffer(s, vkb, 1));
-
-fail:
-    return err;
-}
-
-int ff_ffv1_vk_init_crc_table_data(FFVulkanContext *s,
-                                   FFVkBuffer *vkb, FFV1Context *f)
-{
-    int err;
-
-    uint32_t *buf_mapped;
-    size_t buf_len = 256*sizeof(int32_t);
+    set_crc_tab((uint32_t *)buf_mapped);
 
-    RET(ff_vk_create_buf(s, vkb,
-                         buf_len,
-                         NULL, NULL,
-                         VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
-                         VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
-                         VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
-    RET(ff_vk_map_buffer(s, vkb, (void *)&buf_mapped, 0));
+    set_rc_state_tab(f, buf_mapped + 256*sizeof(uint32_t));
 
-    for (uint32_t i = 0; i < 256; i++) {
-        uint32_t c = i << 24;
-        for (int j = 0; j < 8; j++)
-            c = (c << 1) ^ (0x04C11DB7 & (((int32_t) c) >> 31));
-        buf_mapped[i] = av_bswap32(c);
-    }
+    memcpy(buf_mapped + 256*sizeof(uint32_t) + 512*sizeof(uint8_t),
+           f->quant_tables, sizeof(f->quant_tables));
 
     RET(ff_vk_unmap_buffer(s, vkb, 1));
 
diff --git a/libavcodec/ffv1_vulkan.h b/libavcodec/ffv1_vulkan.h
index 8585315741..9a206afaca 100644
--- a/libavcodec/ffv1_vulkan.h
+++ b/libavcodec/ffv1_vulkan.h
@@ -28,17 +28,7 @@ void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, 
FFV1Context *f,
                               VkSpecializationInfo *sl,
                               enum AVPixelFormat sw_format);
 
-int ff_ffv1_vk_update_state_transition_data(FFVulkanContext *s,
-                                            FFVkBuffer *vkb, FFV1Context *f);
-
-int ff_ffv1_vk_init_state_transition_data(FFVulkanContext *s,
-                                          FFVkBuffer *vkb, FFV1Context *f);
-
-int ff_ffv1_vk_init_quant_table_data(FFVulkanContext *s,
-                                     FFVkBuffer *vkb, FFV1Context *f);
-
-int ff_ffv1_vk_init_crc_table_data(FFVulkanContext *s,
-                                   FFVkBuffer *vkb, FFV1Context *f);
+int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context 
*f);
 
 typedef struct FFv1ShaderParams {
     VkDeviceAddress slice_data;
diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c
index ef3c9fa7be..e1362524da 100644
--- a/libavcodec/ffv1enc_vulkan.c
+++ b/libavcodec/ffv1enc_vulkan.c
@@ -78,9 +78,7 @@ typedef struct VulkanEncodeFFv1Context {
     FFVulkanShader enc;
 
     /* Constant read-only buffers */
-    FFVkBuffer quant_buf;
-    FFVkBuffer rangecoder_static_buf;
-    FFVkBuffer crc_tab_buf;
+    FFVkBuffer consts_buf;
 
     /* Slice data buffer pool */
     AVBufferPool *slice_data_pool;
@@ -1195,48 +1193,33 @@ static av_cold int 
vulkan_encode_ffv1_init(AVCodecContext *avctx)
     if (err < 0)
         return err;
 
-    /* Range coder data */
-    err = ff_ffv1_vk_init_state_transition_data(&fv->s,
-                                                &fv->rangecoder_static_buf,
-                                                f);
-    if (err < 0)
-        return err;
-
-    /* Quantization table data */
-    err = ff_ffv1_vk_init_quant_table_data(&fv->s,
-                                           &fv->quant_buf,
-                                           f);
-    if (err < 0)
-        return err;
-
-    /* CRC table buffer */
-    err = ff_ffv1_vk_init_crc_table_data(&fv->s,
-                                         &fv->crc_tab_buf,
-                                         f);
+    /* Constant data */
+    err = ff_ffv1_vk_init_consts(&fv->s, &fv->consts_buf, f);
     if (err < 0)
         return err;
 
     /* Update setup global descriptors */
     RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
                                         &fv->setup, 0, 0, 0,
-                                        &fv->rangecoder_static_buf,
-                                        0, 512*sizeof(uint8_t),
+                                        &fv->consts_buf,
+                                        256*sizeof(uint32_t), 
512*sizeof(uint8_t),
                                         VK_FORMAT_UNDEFINED));
 
     /* Update encode global descriptors */
     RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
                                         &fv->enc, 0, 0, 0,
-                                        &fv->rangecoder_static_buf,
-                                        0, fv->rangecoder_static_buf.size,
+                                        &fv->consts_buf,
+                                        256*sizeof(uint32_t), 
512*sizeof(uint8_t),
                                         VK_FORMAT_UNDEFINED));
     RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
                                         &fv->enc, 0, 1, 0,
-                                        &fv->quant_buf,
-                                        0, VK_WHOLE_SIZE,
+                                        &fv->consts_buf,
+                                        256*sizeof(uint32_t) + 
512*sizeof(uint8_t),
+                                        VK_WHOLE_SIZE,
                                         VK_FORMAT_UNDEFINED));
     RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
                                         &fv->enc, 0, 2, 0,
-                                        &fv->crc_tab_buf,
+                                        &fv->consts_buf,
                                         0, 256*sizeof(uint32_t),
                                         VK_FORMAT_UNDEFINED));
 
@@ -1292,9 +1275,7 @@ static av_cold int 
vulkan_encode_ffv1_close(AVCodecContext *avctx)
     av_buffer_unref(&fv->keyframe_slice_data_ref);
     av_buffer_pool_uninit(&fv->slice_data_pool);
 
-    ff_vk_free_buf(&fv->s, &fv->quant_buf);
-    ff_vk_free_buf(&fv->s, &fv->rangecoder_static_buf);
-    ff_vk_free_buf(&fv->s, &fv->crc_tab_buf);
+    ff_vk_free_buf(&fv->s, &fv->consts_buf);
 
     av_free(fv->buf_regions);
     av_frame_free(&fv->frame);
diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c
index cc71902156..e807fe4de6 100644
--- a/libavcodec/vulkan_ffv1.c
+++ b/libavcodec/vulkan_ffv1.c
@@ -74,9 +74,7 @@ typedef struct FFv1VulkanDecodeContext {
     FFVulkanShader reset;
     FFVulkanShader decode;
 
-    FFVkBuffer rangecoder_buf;
-    FFVkBuffer quant_buf;
-    FFVkBuffer crc_buf;
+    FFVkBuffer consts_buf;
 
     AVBufferPool *slice_state_pool;
     AVBufferPool *slice_feedback_pool;
@@ -732,9 +730,7 @@ static void vk_decode_ffv1_uninit(FFVulkanDecodeShared *ctx)
     ff_vk_shader_free(&ctx->s, &fv->reset);
     ff_vk_shader_free(&ctx->s, &fv->decode);
 
-    ff_vk_free_buf(&ctx->s, &fv->rangecoder_buf);
-    ff_vk_free_buf(&ctx->s, &fv->quant_buf);
-    ff_vk_free_buf(&ctx->s, &fv->crc_buf);
+    ff_vk_free_buf(&ctx->s, &fv->consts_buf);
 
     av_buffer_pool_uninit(&fv->slice_state_pool);
     av_buffer_pool_uninit(&fv->slice_feedback_pool);
@@ -800,32 +796,31 @@ static int vk_decode_ffv1_init(AVCodecContext *avctx)
                            dctx, hwfc, sl, f->ac, is_rgb));
 
     /* Init static data */
-    RET(ff_ffv1_vk_init_state_transition_data(&ctx->s, &fv->rangecoder_buf, 
f));
-    RET(ff_ffv1_vk_init_crc_table_data(&ctx->s, &fv->crc_buf, f));
-    RET(ff_ffv1_vk_init_quant_table_data(&ctx->s, &fv->quant_buf, f));
+    RET(ff_ffv1_vk_init_consts(&ctx->s, &fv->consts_buf, f));
 
     /* Update setup global descriptors */
     RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
                                         &fv->setup, 0, 0, 0,
-                                        &fv->rangecoder_buf,
-                                        0, 512*sizeof(uint8_t),
+                                        &fv->consts_buf,
+                                        256*sizeof(uint32_t), 
512*sizeof(uint8_t),
                                         VK_FORMAT_UNDEFINED));
     RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
                                         &fv->setup, 0, 1, 0,
-                                        &fv->crc_buf,
+                                        &fv->consts_buf,
                                         0, 256*sizeof(uint32_t),
                                         VK_FORMAT_UNDEFINED));
 
     /* Update decode global descriptors */
     RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
                                         &fv->decode, 0, 0, 0,
-                                        &fv->rangecoder_buf,
-                                        0, 512*sizeof(uint8_t),
+                                        &fv->consts_buf,
+                                        256*sizeof(uint32_t), 
512*sizeof(uint8_t),
                                         VK_FORMAT_UNDEFINED));
     RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
                                         &fv->decode, 0, 1, 0,
-                                        &fv->quant_buf,
-                                        0, VK_WHOLE_SIZE,
+                                        &fv->consts_buf,
+                                        256*sizeof(uint32_t) + 
512*sizeof(uint8_t),
+                                        VK_WHOLE_SIZE,
                                         VK_FORMAT_UNDEFINED));
 
 fail:

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to