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

Git pushed a commit to branch master
in repository ffmpeg.

commit b230ba4db9ae323bfe905d4bca94afd1813f74dd
Author:     Lynne <[email protected]>
AuthorDate: Sun Feb 8 05:18:02 2026 +0100
Commit:     Lynne <[email protected]>
CommitDate: Thu Feb 19 19:42:30 2026 +0100

    ffv1enc_vulkan: use regular descriptors for slice state
---
 libavcodec/ffv1_vulkan.h                          |  1 -
 libavcodec/ffv1enc_vulkan.c                       | 29 ++++++++++++++---
 libavcodec/vulkan/ffv1_common.glsl                |  1 -
 libavcodec/vulkan/ffv1_enc.comp.glsl              | 19 +++++++----
 libavcodec/vulkan/ffv1_enc_golomb.comp.glsl       |  1 -
 libavcodec/vulkan/ffv1_enc_reset.comp.glsl        | 39 +++++++++++++----------
 libavcodec/vulkan/ffv1_enc_reset_golomb.comp.glsl |  1 -
 libavcodec/vulkan/ffv1_enc_rgb.comp.glsl          |  2 +-
 libavcodec/vulkan/ffv1_enc_rgb_golomb.comp.glsl   |  1 -
 libavcodec/vulkan/ffv1_vlc.glsl                   |  9 +-----
 libavcodec/vulkan_ffv1.c                          |  1 -
 11 files changed, 62 insertions(+), 42 deletions(-)

diff --git a/libavcodec/ffv1_vulkan.h b/libavcodec/ffv1_vulkan.h
index fcd6f98532..8585315741 100644
--- a/libavcodec/ffv1_vulkan.h
+++ b/libavcodec/ffv1_vulkan.h
@@ -42,7 +42,6 @@ int ff_ffv1_vk_init_crc_table_data(FFVulkanContext *s,
 
 typedef struct FFv1ShaderParams {
     VkDeviceAddress slice_data;
-    VkDeviceAddress slice_state;
 
     uint32_t extend_lookup[8];
     uint16_t context_count[8];
diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c
index 490dc5f514..d540f38a88 100644
--- a/libavcodec/ffv1enc_vulkan.c
+++ b/libavcodec/ffv1enc_vulkan.c
@@ -286,7 +286,6 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext 
*avctx,
     /* With everything allocated, setup push data */
     FFv1ShaderParams pd = {
         .slice_data = out_data_buf->address,
-        .slice_state = slice_data_buf->address + f->slice_count*256,
 
         .img_size[0] = fv->s.frames->width,
         .img_size[1] = fv->s.frames->height,
@@ -422,6 +421,12 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext 
*avctx,
                                         slice_data_buf,
                                         0, slice_data_size*f->slice_count,
                                         VK_FORMAT_UNDEFINED);
+        ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->reset,
+                                        1, 1, 0,
+                                        slice_data_buf,
+                                        f->slice_count*256,
+                                        VK_WHOLE_SIZE,
+                                        VK_FORMAT_UNDEFINED);
 
         ff_vk_exec_bind_shader(&fv->s, exec, &fv->reset);
         ff_vk_shader_update_push_const(&fv->s, exec, &fv->reset,
@@ -485,15 +490,21 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext 
*avctx,
                                     results_data_buf,
                                     0, results_data_buf->size,
                                     VK_FORMAT_UNDEFINED);
+    ff_vk_shader_update_desc_buffer(&fv->s, exec, &fv->enc,
+                                    1, 2, 0,
+                                    slice_data_buf,
+                                    f->slice_count*256,
+                                    VK_WHOLE_SIZE,
+                                    VK_FORMAT_UNDEFINED);
     ff_vk_shader_update_img_array(&fv->s, exec, &fv->enc,
                                   src, src_views,
-                                  1, 2,
+                                  1, 3,
                                   VK_IMAGE_LAYOUT_GENERAL,
                                   VK_NULL_HANDLE);
     if (fv->is_rgb)
         ff_vk_shader_update_img_array(&fv->s, exec, &fv->enc,
                                       tmp, tmp_views,
-                                      1, 3,
+                                      1, 4,
                                       VK_IMAGE_LAYOUT_GENERAL,
                                       VK_NULL_HANDLE);
 
@@ -878,8 +889,12 @@ static int init_reset_shader(AVCodecContext *avctx, 
VkSpecializationInfo *sl)
             .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
+        { /* slice_state_buf */
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+            .stages = VK_SHADER_STAGE_COMPUTE_BIT,
+        },
     };
-    ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 1, 0, 0);
+    ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0, 0);
 
     if (fv->ctx.ac == AC_GOLOMB_RICE)
         RET(ff_vk_shader_link(&fv->s, shd,
@@ -933,6 +948,10 @@ static int init_encode_shader(AVCodecContext *avctx, 
VkSpecializationInfo *sl)
             .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
+        { /* slice_state_buf */
+            .type   = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+            .stages = VK_SHADER_STAGE_COMPUTE_BIT,
+        },
         { /* src */
             .type   = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
@@ -943,7 +962,7 @@ static int init_encode_shader(AVCodecContext *avctx, 
VkSpecializationInfo *sl)
             .stages = VK_SHADER_STAGE_COMPUTE_BIT,
         },
     };
-    ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 3 + fv->is_rgb, 0, 
0);
+    ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 4 + fv->is_rgb, 0, 
0);
 
     if (fv->ctx.ac == AC_GOLOMB_RICE) {
         if (fv->is_rgb)
diff --git a/libavcodec/vulkan/ffv1_common.glsl 
b/libavcodec/vulkan/ffv1_common.glsl
index e7bc8f5e20..360890f153 100644
--- a/libavcodec/vulkan/ffv1_common.glsl
+++ b/libavcodec/vulkan/ffv1_common.glsl
@@ -59,7 +59,6 @@ layout (constant_id = 17) const uint context_model = 0;
 
 layout (push_constant, scalar) uniform pushConstants {
     u8buf slice_data;
-    u8buf slice_state;
 
     bool extend_lookup[MAX_QUANT_TABLES];
     uint16_t context_count[MAX_QUANT_TABLES];
diff --git a/libavcodec/vulkan/ffv1_enc.comp.glsl 
b/libavcodec/vulkan/ffv1_enc.comp.glsl
index 7be01be1d9..d50696992e 100644
--- a/libavcodec/vulkan/ffv1_enc.comp.glsl
+++ b/libavcodec/vulkan/ffv1_enc.comp.glsl
@@ -34,12 +34,15 @@ layout (set = 0, binding = 2, scalar) uniform crc_ieee_buf {
 layout (set = 1, binding = 1, scalar) writeonly buffer slice_results_buf {
     uint64_t slice_results[];
 };
-layout (set = 1, binding = 2) uniform uimage2D src[];
+layout (set = 1, binding = 3) uniform uimage2D src[];
 
 #ifndef GOLOMB
-#define WRITE(c, off, val) put_rac(c, uint64_t(slice_state) + (state_off + 
off), val)
 
-/* Note - only handles signed values */
+layout (set = 1, binding = 2, scalar) buffer slice_state_buf {
+    uint8_t slice_rc_state[];
+};
+
+#define WRITE(c, off, val) put_rac_direct(c, slice_rc_state[state_off + off], 
val)
 void put_symbol(inout RangeCoder c, uint state_off, int v)
 {
     bool is_nil = (v == 0);
@@ -112,6 +115,10 @@ void encode_line(inout SliceContext sc, readonly uimage2D 
img, uint state_off,
 
 #else /* GOLOMB */
 
+layout (set = 1, binding = 2, scalar) buffer slice_state_buf {
+    VlcState slice_vlc_state[];
+};
+
 uint hdr_len = 0;
 PutBitContext pb;
 
@@ -174,9 +181,8 @@ void encode_line(inout SliceContext sc, readonly uimage2D 
img, uint state_off,
         }
 
         if (!run_mode) {
-            VlcState sb = VlcState(uint64_t(slice_state) +
-                                   state_off + VLC_STATE_SIZE*d[0]);
-            Symbol sym = get_vlc_symbol(sb, d[1], bits);
+            Symbol sym = get_vlc_symbol(slice_vlc_state[state_off + d[0]],
+                                        d[1], bits);
             put_bits(pb, sym.bits, sym.val);
         }
     }
@@ -276,6 +282,7 @@ void encode_slice(inout SliceContext sc, const uint 
slice_idx)
                                uvec4(0, 1, 1, 2))*plane_state_size;
 
 #ifdef GOLOMB
+    slice_state_off >>= 3;
     init_golomb(slice_ctx[slice_idx]);
 #endif
 
diff --git a/libavcodec/vulkan/ffv1_enc_golomb.comp.glsl 
b/libavcodec/vulkan/ffv1_enc_golomb.comp.glsl
index 459c65d954..a120564602 100644
--- a/libavcodec/vulkan/ffv1_enc_golomb.comp.glsl
+++ b/libavcodec/vulkan/ffv1_enc_golomb.comp.glsl
@@ -23,6 +23,5 @@
 #pragma shader_stage(compute)
 #extension GL_GOOGLE_include_directive : require
 
-#define VLC_BUFFER
 #define GOLOMB
 #include "ffv1_enc.comp.glsl"
diff --git a/libavcodec/vulkan/ffv1_enc_reset.comp.glsl 
b/libavcodec/vulkan/ffv1_enc_reset.comp.glsl
index 4d8637a0d3..1ad0d99125 100644
--- a/libavcodec/vulkan/ffv1_enc_reset.comp.glsl
+++ b/libavcodec/vulkan/ffv1_enc_reset.comp.glsl
@@ -26,34 +26,41 @@
 #include "common.glsl"
 #include "ffv1_common.glsl"
 
+#ifdef GOLOMB
+#define PS_SHIFT 3
+layout (set = 1, binding = 1, scalar) writeonly buffer slice_state_buf {
+    VlcState slice_vlc_state[];
+};
+#else
+#define PS_SHIFT 2
+layout (set = 1, binding = 1, scalar) writeonly buffer slice_state_buf {
+    uint32_t slice_rc_state[];
+};
+#endif
+
 void main(void)
 {
     const uint slice_idx = gl_WorkGroupID.y*gl_NumWorkGroups.x + 
gl_WorkGroupID.x;
 
     uint contexts = context_count[context_model];
-    uint64_t slice_state_off = uint64_t(slice_state) +
-                               slice_idx*plane_state_size*codec_planes;
+    uint plane_state_len = plane_state_size >> PS_SHIFT;
+    uint offs = slice_idx*plane_state_len*codec_planes +
+                gl_WorkGroupID.z*plane_state_len +
+                gl_LocalInvocationID.x;
 
 #ifdef GOLOMB
-    uint64_t start = slice_state_off +
-                     (gl_WorkGroupID.z*(plane_state_size/VLC_STATE_SIZE) +
-                      gl_LocalInvocationID.x)*VLC_STATE_SIZE;
     for (uint x = gl_LocalInvocationID.x; x < contexts; x += 
gl_WorkGroupSize.x) {
-        VlcState sb = VlcState(start);
-        sb.drift     =  int16_t(0);
-        sb.error_sum = uint16_t(4);
-        sb.bias      =   int8_t(0);
-        sb.count     =  uint8_t(1);
-        start += gl_WorkGroupSize.x*VLC_STATE_SIZE;
+        slice_vlc_state[offs].drift     =  int16_t(0);
+        slice_vlc_state[offs].error_sum = uint16_t(4);
+        slice_vlc_state[offs].bias      =   int8_t(0);
+        slice_vlc_state[offs].count     =  uint8_t(1);
+        offs += gl_WorkGroupSize.x;
     }
 #else
-    uint64_t start = slice_state_off +
-                     gl_WorkGroupID.z*plane_state_size +
-                     (gl_LocalInvocationID.x << 2 /* dwords */); /* Bytes */
     uint count_total = contexts*(CONTEXT_SIZE /* bytes */ >> 2 /* dwords */);
     for (uint x = gl_LocalInvocationID.x; x < count_total; x += 
gl_WorkGroupSize.x) {
-        u32buf(start).v = 0x80808080;
-        start += gl_WorkGroupSize.x*(CONTEXT_SIZE >> 3 /* 1/8th of context */);
+        slice_rc_state[offs] = 0x80808080;
+        offs += gl_WorkGroupSize.x;
     }
 #endif
 }
diff --git a/libavcodec/vulkan/ffv1_enc_reset_golomb.comp.glsl 
b/libavcodec/vulkan/ffv1_enc_reset_golomb.comp.glsl
index 23eca0c7ed..277f88c6c3 100644
--- a/libavcodec/vulkan/ffv1_enc_reset_golomb.comp.glsl
+++ b/libavcodec/vulkan/ffv1_enc_reset_golomb.comp.glsl
@@ -23,6 +23,5 @@
 #pragma shader_stage(compute)
 #extension GL_GOOGLE_include_directive : require
 
-#define VLC_BUFFER
 #define GOLOMB
 #include "ffv1_enc_reset.comp.glsl"
diff --git a/libavcodec/vulkan/ffv1_enc_rgb.comp.glsl 
b/libavcodec/vulkan/ffv1_enc_rgb.comp.glsl
index 24c79c222e..90d136be1f 100644
--- a/libavcodec/vulkan/ffv1_enc_rgb.comp.glsl
+++ b/libavcodec/vulkan/ffv1_enc_rgb.comp.glsl
@@ -24,7 +24,7 @@
 #extension GL_GOOGLE_include_directive : require
 #extension GL_EXT_shader_image_load_formatted : require
 
-layout (set = 1, binding = 3) uniform uimage2D tmp;
+layout (set = 1, binding = 4) uniform uimage2D tmp;
 
 #define RGB
 #include "ffv1_enc.comp.glsl"
diff --git a/libavcodec/vulkan/ffv1_enc_rgb_golomb.comp.glsl 
b/libavcodec/vulkan/ffv1_enc_rgb_golomb.comp.glsl
index c7a3d17fd5..8efffd19e8 100644
--- a/libavcodec/vulkan/ffv1_enc_rgb_golomb.comp.glsl
+++ b/libavcodec/vulkan/ffv1_enc_rgb_golomb.comp.glsl
@@ -23,6 +23,5 @@
 #pragma shader_stage(compute)
 #extension GL_GOOGLE_include_directive : require
 
-#define VLC_BUFFER
 #define GOLOMB
 #include "ffv1_enc_rgb.comp.glsl"
diff --git a/libavcodec/vulkan/ffv1_vlc.glsl b/libavcodec/vulkan/ffv1_vlc.glsl
index 68353ae9ce..23e3c3ab42 100644
--- a/libavcodec/vulkan/ffv1_vlc.glsl
+++ b/libavcodec/vulkan/ffv1_vlc.glsl
@@ -23,14 +23,7 @@
 #ifndef VULKAN_FFV1_VLC_H
 #define VULKAN_FFV1_VLC_H
 
-#define VLC_STATE_SIZE 8
-#ifdef VLC_BUFFER
-layout(buffer_reference, buffer_reference_align = VLC_STATE_SIZE) buffer
-#else
-struct
-#endif
-
-VlcState {
+struct VlcState {
     uint32_t error_sum;
     int16_t  drift;
     int8_t   bias;
diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c
index 0e2cda1028..28bb6659d2 100644
--- a/libavcodec/vulkan_ffv1.c
+++ b/libavcodec/vulkan_ffv1.c
@@ -355,7 +355,6 @@ static int vk_ffv1_end_frame(AVCodecContext *avctx)
 
     FFv1ShaderParams pd = {
         .slice_data = slices_buf->address,
-        .slice_state  = slice_state->address + 
f->slice_count*fp->slice_data_size,
 
         .img_size[0] = f->picture.f->width,
         .img_size[1] = f->picture.f->height,

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

Reply via email to