This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit da99d3f209c3ab22fae9452015cf68e49b9d4461 Author: Lynne <[email protected]> AuthorDate: Sat Feb 7 01:55:21 2026 +0100 Commit: Lynne <[email protected]> CommitDate: Thu Feb 19 19:42:30 2026 +0100 vulkan_ffv1: implement parallel probability adaptation --- libavcodec/ffv1_vulkan.c | 2 +- libavcodec/ffv1enc_vulkan.c | 8 ++--- libavcodec/vulkan/ffv1_dec.comp.glsl | 67 ++++++++++++++++++++++++++---------- libavcodec/vulkan/rangecoder.glsl | 12 ++++++- libavcodec/vulkan_ffv1.c | 9 ++--- 5 files changed, 70 insertions(+), 28 deletions(-) diff --git a/libavcodec/ffv1_vulkan.c b/libavcodec/ffv1_vulkan.c index 91cfb7bd73..7908cc5f5a 100644 --- a/libavcodec/ffv1_vulkan.c +++ b/libavcodec/ffv1_vulkan.c @@ -86,7 +86,7 @@ static int init_state_transition_data(FFVulkanContext *s, buf_len, NULL, NULL, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)); diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c index b57292a783..490dc5f514 100644 --- a/libavcodec/ffv1enc_vulkan.c +++ b/libavcodec/ffv1enc_vulkan.c @@ -784,7 +784,7 @@ static int init_rct_search_shader(AVCodecContext *avctx, VkSpecializationInfo *s const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -827,7 +827,7 @@ static int init_setup_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -867,7 +867,7 @@ static int init_reset_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -910,7 +910,7 @@ static int init_encode_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, { /* quant_buf */ diff --git a/libavcodec/vulkan/ffv1_dec.comp.glsl b/libavcodec/vulkan/ffv1_dec.comp.glsl index 584735f35e..1f37c23b2a 100644 --- a/libavcodec/vulkan/ffv1_dec.comp.glsl +++ b/libavcodec/vulkan/ffv1_dec.comp.glsl @@ -36,35 +36,51 @@ layout (set = 1, binding = 2, scalar) writeonly buffer slice_status_buf { layout (set = 1, binding = 3) uniform uimage2D dec[]; #ifndef GOLOMB -#define READ(c, off) get_rac(c, uint64_t(slice_state) + (state_off + off)) -int get_isymbol(inout RangeCoder c, uint state_off) + +#define READ(c, idx) get_rac_noadapt(c, idx) +int get_isymbol(inout RangeCoder c) { if (READ(c, 0)) return 0; uint e = 1; - for (; e < 33; e++) - if (!READ(c, min(e, 10))) + for (; e < 11; e++) { + if (!READ(c, e)) break; - - if (expectEXT(e == 1, false)) { - return READ(c, 11) ? -1 : 1; - } else if (expectEXT(e == 33, false)) { - corrupt = true; - return 0; } int a = 1; - for (uint i = e + 20; i >= 22; i--) { - a <<= 1; - a |= int(READ(c, min(i, 31))); + uint i = e; + + if (bits > 8 && e == 11) { + do { + rc_state[10] = zero_one_state[rc_state[10] + 256]; + e++; + } while (READ(c, 10)); + + e--; + i = e - 1; + + a += a + int(READ(c, 31)); + for (; i >= 11; i--) { + rc_state[31] = zero_one_state[rc_state[31] + + (rc_data[31] ? 256 : 0)]; + a += a + int(READ(c, 31)); + } } + i += 20; + for (; i >= 22; i--) + a += a + int(READ(c, i)); + return READ(c, min(e + 10, 21)) ? -a : a; } void decode_line_pcm(inout SliceContext sc, ivec2 sp, int w, int y, int p) { + if (gl_LocalInvocationID.x > 0) + return; + #ifndef RGB if (p > 0 && p < 3) { w = ceil_rshift(w, chroma_shift.x); @@ -99,13 +115,28 @@ void decode_line(inout SliceContext sc, ivec2 sp, int w, quant_table_idx, extend_lookup[quant_table_idx]); uint context_off = state_off + CONTEXT_SIZE*abs(pr[0]); + u8buf cd = u8buf(uint64_t(slice_state) + context_off); - int diff = get_isymbol(sc.c, context_off); - if (pr[0] < 0) - diff = -diff; + rc_state[gl_LocalInvocationID.x] = cd[gl_LocalInvocationID.x].v; + rc_dec[gl_LocalInvocationID.x] = false; + barrier(); - uint v = zero_extend(pr[1] + diff, bits); - imageStore(dec[p], sp + LADDR(ivec2(x, y)), uvec4(v)); + int diff; + if (gl_LocalInvocationID.x == 0) + diff = get_isymbol(sc.c); + + barrier(); + uint i = gl_LocalInvocationID.x; + if (rc_dec[i]) + cd[i].v = zero_one_state[rc_state[i] + (rc_data[i] ? 256 : 0)]; + + if (gl_LocalInvocationID.x == 0) { + if (pr[0] < 0) + diff = -diff; + + uint v = zero_extend(pr[1] + diff, bits); + imageStore(dec[p], sp + LADDR(ivec2(x, y)), uvec4(v)); + } } } #else diff --git a/libavcodec/vulkan/rangecoder.glsl b/libavcodec/vulkan/rangecoder.glsl index 15f6655359..545f13d463 100644 --- a/libavcodec/vulkan/rangecoder.glsl +++ b/libavcodec/vulkan/rangecoder.glsl @@ -25,7 +25,7 @@ #define CONTEXT_SIZE 32 -layout (set = 0, binding = 0, scalar) uniform rangecoder_buf { +layout (set = 0, binding = 0, scalar) readonly buffer rangecoder_buf { uint8_t zero_one_state[512]; }; @@ -40,6 +40,10 @@ struct RangeCoder { uint8_t outstanding_byte; }; +shared uint8_t rc_state[CONTEXT_SIZE]; +shared bool rc_data[CONTEXT_SIZE]; +shared bool rc_dec[CONTEXT_SIZE]; + void rac_init(out RangeCoder r, u8buf data, uint buf_size) { r.bytestream_start = uint64_t(data); @@ -239,6 +243,12 @@ bool get_rac_direct(inout RangeCoder c, inout uint8_t state) return bit; } +bool get_rac_noadapt(inout RangeCoder c, uint idx) +{ + rc_dec[idx] = true; + return (rc_data[idx] = get_rac_internal(c, c.range * rc_state[idx] >> 8)); +} + bool get_rac(inout RangeCoder c, uint64_t state) { return get_rac_direct(c, u8buf(state).v); diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c index bdc3be50b4..3b1bce97d1 100644 --- a/libavcodec/vulkan_ffv1.c +++ b/libavcodec/vulkan_ffv1.c @@ -540,7 +540,7 @@ static int init_setup_shader(FFV1Context *f, FFVulkanContext *s, const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, { /* crc_ieee_buf */ @@ -591,7 +591,7 @@ static int init_reset_shader(FFV1Context *f, FFVulkanContext *s, const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -628,15 +628,16 @@ static int init_decode_shader(FFV1Context *f, FFVulkanContext *s, { int err; + uint32_t wg_x = ac != AC_GOLOMB_RICE ? CONTEXT_SIZE : 1; ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl, - (uint32_t []) { 1, 1, 1 }, 0); + (uint32_t []) { wg_x, 1, 1 }, 0); ff_vk_shader_add_push_const(shd, 0, sizeof(FFv1ShaderParams), VK_SHADER_STAGE_COMPUTE_BIT); const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, { /* quant_buf */ _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
