This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 826b72d12f5fd95d3d751871be2d7b673e9dc7bd Author: Lynne <[email protected]> AuthorDate: Tue Feb 10 14:47:35 2026 +0100 Commit: Lynne <[email protected]> CommitDate: Thu Feb 19 19:42:32 2026 +0100 vulkan/ffv1: mark buffers as uniform/readonly when needed Should be a speedup in most cases. --- libavcodec/ffv1_vulkan.c | 1 + libavcodec/ffv1enc_vulkan.c | 8 ++++---- libavcodec/vulkan/ffv1_common.glsl | 10 +++++++++- libavcodec/vulkan/ffv1_dec.comp.glsl | 6 +++--- libavcodec/vulkan/ffv1_dec_reset.comp.glsl | 1 + libavcodec/vulkan/ffv1_enc.comp.glsl | 20 ++++++++++---------- libavcodec/vulkan/ffv1_enc_rct_search.comp.glsl | 1 + libavcodec/vulkan/ffv1_enc_reset.comp.glsl | 1 + libavcodec/vulkan/rangecoder.glsl | 8 +++++++- libavcodec/vulkan_ffv1.c | 4 ++-- 10 files changed, 39 insertions(+), 21 deletions(-) diff --git a/libavcodec/ffv1_vulkan.c b/libavcodec/ffv1_vulkan.c index a67eb3e15d..368e66b025 100644 --- a/libavcodec/ffv1_vulkan.c +++ b/libavcodec/ffv1_vulkan.c @@ -85,6 +85,7 @@ static int init_state_transition_data(FFVulkanContext *s, 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)); diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c index 8bbccc5ac7..128f9ee902 100644 --- a/libavcodec/ffv1enc_vulkan.c +++ b/libavcodec/ffv1enc_vulkan.c @@ -793,7 +793,7 @@ static int init_rct_search_shader(AVCodecContext *avctx, VkSpecializationInfo *s const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -836,7 +836,7 @@ static int init_setup_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -876,7 +876,7 @@ static int init_reset_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -923,7 +923,7 @@ static int init_encode_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, { /* quant_buf */ diff --git a/libavcodec/vulkan/ffv1_common.glsl b/libavcodec/vulkan/ffv1_common.glsl index 9e793b4290..536a37b093 100644 --- a/libavcodec/vulkan/ffv1_common.glsl +++ b/libavcodec/vulkan/ffv1_common.glsl @@ -93,7 +93,15 @@ struct SliceContext { bool slice_reset_contexts; }; -layout (set = 1, binding = 0, scalar) buffer slice_ctx_buf { +#if !defined(SB_QUALI) +#if (defined(ENCODE) || defined(DECODE)) +#define SB_QUALI readonly +#else +#define SB_QUALI +#endif +#endif + +layout (set = 1, binding = 0, scalar) SB_QUALI buffer slice_ctx_buf { SliceContext slice_ctx[]; }; diff --git a/libavcodec/vulkan/ffv1_dec.comp.glsl b/libavcodec/vulkan/ffv1_dec.comp.glsl index cee1fb477a..a08c067433 100644 --- a/libavcodec/vulkan/ffv1_dec.comp.glsl +++ b/libavcodec/vulkan/ffv1_dec.comp.glsl @@ -157,7 +157,7 @@ layout (set = 1, binding = 3, scalar) buffer slice_state_buf { GetBitContext gb; -void golomb_init(inout SliceContext sc) +void golomb_init(void) { if (version == 3 && micro_version > 1 || version > 3) get_rac_internal(rc.range * 129 >> 8); @@ -274,7 +274,7 @@ void writeout_rgb(in SliceContext sc, ivec2 sp, int w, int y, bool apply_rct) } #endif -void decode_slice(inout SliceContext sc, const uint slice_idx) +void decode_slice(in SliceContext sc, uint slice_idx) { int w = sc.slice_dim.x; ivec2 sp = sc.slice_pos; @@ -313,7 +313,7 @@ void decode_slice(inout SliceContext sc, const uint slice_idx) #ifdef GOLOMB slice_state_off >>= 3; // division by VLC_STATE_SIZE - golomb_init(sc); + golomb_init(); #endif #ifdef RGB diff --git a/libavcodec/vulkan/ffv1_dec_reset.comp.glsl b/libavcodec/vulkan/ffv1_dec_reset.comp.glsl index 1aeb196e1e..c5f28a1953 100644 --- a/libavcodec/vulkan/ffv1_dec_reset.comp.glsl +++ b/libavcodec/vulkan/ffv1_dec_reset.comp.glsl @@ -23,6 +23,7 @@ #pragma shader_stage(compute) #extension GL_GOOGLE_include_directive : require +#define SB_QUALI readonly #include "common.glsl" #include "ffv1_common.glsl" diff --git a/libavcodec/vulkan/ffv1_enc.comp.glsl b/libavcodec/vulkan/ffv1_enc.comp.glsl index c2a1d7125d..a690014e94 100644 --- a/libavcodec/vulkan/ffv1_enc.comp.glsl +++ b/libavcodec/vulkan/ffv1_enc.comp.glsl @@ -52,8 +52,8 @@ void put_symbol(uint state_off, int v) if (is_nil) return; - const int a = abs(v); - const int e = findMSB(a); + int a = abs(v); + int e = findMSB(a); for (int i = 0; i < e; i++) WRITE(1 + min(i, 9), true); @@ -65,7 +65,7 @@ void put_symbol(uint state_off, int v) WRITE(22 - 11 + min(e, 10), v < 0); } -void encode_line_pcm(inout SliceContext sc, readonly uimage2D img, +void encode_line_pcm(in SliceContext sc, readonly uimage2D img, ivec2 sp, int y, int p, int comp) { int w = sc.slice_dim.x; @@ -86,7 +86,7 @@ void encode_line_pcm(inout SliceContext sc, readonly uimage2D img, } } -void encode_line(inout SliceContext sc, readonly uimage2D img, uint state_off, +void encode_line(in SliceContext sc, readonly uimage2D img, uint state_off, ivec2 sp, int y, int p, int comp, uint8_t quant_table_idx, const int run_index) { @@ -124,14 +124,14 @@ layout (set = 1, binding = 2, scalar) buffer slice_state_buf { uint hdr_len = 0; PutBitContext pb; -void init_golomb(inout SliceContext sc) +void init_golomb(void) { hdr_len = rac_terminate(slice_start); init_put_bits(pb, OFFBUF(u8buf, slice_start, hdr_len), slice_size_max - hdr_len); } -void encode_line(inout SliceContext sc, readonly uimage2D img, uint state_off, +void encode_line(in SliceContext sc, readonly uimage2D img, uint state_off, ivec2 sp, int y, int p, int comp, uint8_t quant_table_idx, inout int run_index) { @@ -239,7 +239,7 @@ void preload_rgb(in SliceContext sc, ivec2 sp, int w, int y, bool apply_rct) } #endif -void encode_slice(inout SliceContext sc, const uint slice_idx) +void encode_slice(in SliceContext sc, uint slice_idx) { ivec2 sp = sc.slice_pos; @@ -284,7 +284,7 @@ void encode_slice(inout SliceContext sc, const uint slice_idx) #ifdef GOLOMB slice_state_off >>= 3; - init_golomb(slice_ctx[slice_idx]); + init_golomb(); #endif #ifndef RGB @@ -320,7 +320,7 @@ void encode_slice(inout SliceContext sc, const uint slice_idx) #endif } -void finalize_slice(inout SliceContext sc, const uint slice_idx) +void finalize_slice(const uint slice_idx) { #ifdef GOLOMB uint32_t enc_len = hdr_len + flush_put_bits(pb); @@ -368,5 +368,5 @@ void main(void) rc = slice_ctx[slice_idx].c; encode_slice(slice_ctx[slice_idx], slice_idx); - finalize_slice(slice_ctx[slice_idx], slice_idx); + finalize_slice(slice_idx); } diff --git a/libavcodec/vulkan/ffv1_enc_rct_search.comp.glsl b/libavcodec/vulkan/ffv1_enc_rct_search.comp.glsl index 9c6dc2ecf3..face9583a4 100644 --- a/libavcodec/vulkan/ffv1_enc_rct_search.comp.glsl +++ b/libavcodec/vulkan/ffv1_enc_rct_search.comp.glsl @@ -24,6 +24,7 @@ #extension GL_GOOGLE_include_directive : require #define ENCODE +#define SB_QUALI #include "common.glsl" #include "ffv1_common.glsl" diff --git a/libavcodec/vulkan/ffv1_enc_reset.comp.glsl b/libavcodec/vulkan/ffv1_enc_reset.comp.glsl index 1ad0d99125..549ad2d35e 100644 --- a/libavcodec/vulkan/ffv1_enc_reset.comp.glsl +++ b/libavcodec/vulkan/ffv1_enc_reset.comp.glsl @@ -23,6 +23,7 @@ #pragma shader_stage(compute) #extension GL_GOOGLE_include_directive : require +#define SB_QUALI readonly #include "common.glsl" #include "ffv1_common.glsl" diff --git a/libavcodec/vulkan/rangecoder.glsl b/libavcodec/vulkan/rangecoder.glsl index 549e0f0dda..5ee2443b95 100644 --- a/libavcodec/vulkan/rangecoder.glsl +++ b/libavcodec/vulkan/rangecoder.glsl @@ -26,7 +26,13 @@ #define CONTEXT_SIZE 32 #define MAX_OVERREAD 2 -layout (set = 0, binding = 0, scalar) readonly buffer rangecoder_buf { +#if !defined(GOLOMB) && (defined(DECODE)) +#define RC_BTYPE readonly buffer +#else +#define RC_BTYPE uniform +#endif + +layout (set = 0, binding = 0, scalar) RC_BTYPE rangecoder_buf { uint8_t zero_one_state[512]; }; diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c index 40384c4baa..cc71902156 100644 --- a/libavcodec/vulkan_ffv1.c +++ b/libavcodec/vulkan_ffv1.c @@ -519,7 +519,7 @@ static int init_setup_shader(FFV1Context *f, FFVulkanContext *s, const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, { /* crc_ieee_buf */ @@ -570,7 +570,7 @@ static int init_reset_shader(FFV1Context *f, FFVulkanContext *s, const FFVulkanDescriptorSetBinding desc_set_const[] = { { /* rangecoder_buf */ - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
