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]
