This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 026e94e3398f1a497a9b47c5ef710b970a7e4986 Author: Lynne <[email protected]> AuthorDate: Fri Jan 2 13:12:44 2026 +0100 Commit: Lynne <[email protected]> CommitDate: Mon Jan 12 17:28:42 2026 +0100 vulkan_prores_raw: use compile-time SPIR-V generation --- configure | 4 +- libavcodec/vulkan/Makefile | 5 +- libavcodec/vulkan/common.comp | 34 ++++++ libavcodec/vulkan/dct.comp | 14 ++- ...raw_decode.comp => prores_raw_decode.comp.glsl} | 24 ++++ ...res_raw_idct.comp => prores_raw_idct.comp.glsl} | 25 ++++ libavcodec/vulkan_prores_raw.c | 128 ++++++--------------- 7 files changed, 134 insertions(+), 100 deletions(-) diff --git a/configure b/configure index d578581ec9..0086769956 100755 --- a/configure +++ b/configure @@ -3396,7 +3396,7 @@ mpeg4_videotoolbox_hwaccel_deps="videotoolbox" mpeg4_videotoolbox_hwaccel_select="mpeg4_decoder" prores_videotoolbox_hwaccel_deps="videotoolbox" prores_videotoolbox_hwaccel_select="prores_decoder" -prores_raw_vulkan_hwaccel_deps="vulkan spirv_library" +prores_raw_vulkan_hwaccel_deps="vulkan" prores_raw_vulkan_hwaccel_select="prores_raw_decoder" prores_vulkan_hwaccel_deps="vulkan spirv_library" prores_vulkan_hwaccel_select="prores_decoder" @@ -4239,7 +4239,7 @@ cws2fws_extralibs="zlib_extralibs" # libraries, in any order avcodec_deps="avutil" -avcodec_suggest="libm stdatomic spirv_library" +avcodec_suggest="libm stdatomic zlib spirv_library" avdevice_deps="avformat avcodec avutil" avdevice_suggest="libm stdatomic" avfilter_deps="avutil" diff --git a/libavcodec/vulkan/Makefile b/libavcodec/vulkan/Makefile index c96a4bb442..465a8579fd 100644 --- a/libavcodec/vulkan/Makefile +++ b/libavcodec/vulkan/Makefile @@ -12,9 +12,8 @@ OBJS-$(CONFIG_FFV1_VULKAN_HWACCEL) += vulkan/common.o \ vulkan/ffv1_common.o vulkan/ffv1_reset.o \ vulkan/ffv1_dec_setup.o vulkan/ffv1_dec.o -OBJS-$(CONFIG_PRORES_RAW_VULKAN_HWACCEL) += vulkan/common.o vulkan/dct.o \ - vulkan/prores_raw_decode.o \ - vulkan/prores_raw_idct.o +OBJS-$(CONFIG_PRORES_RAW_VULKAN_HWACCEL) += vulkan/prores_raw_decode.comp.spv.o \ + vulkan/prores_raw_idct.comp.spv.o OBJS-$(CONFIG_PRORES_VULKAN_HWACCEL) += vulkan/common.o vulkan/dct.o \ vulkan/prores_vld.o \ diff --git a/libavcodec/vulkan/common.comp b/libavcodec/vulkan/common.comp index 3538aeacd1..8a658f8524 100644 --- a/libavcodec/vulkan/common.comp +++ b/libavcodec/vulkan/common.comp @@ -18,6 +18,35 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifndef VULKAN_COMMON_H +#define VULKAN_COMMON_H + +#pragma use_vulkan_memory_model + +layout (local_size_x_id = 253, local_size_y_id = 254, local_size_z_id = 255) in; + +#extension GL_EXT_shader_explicit_arithmetic_types : require +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require +#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require +#extension GL_EXT_shader_explicit_arithmetic_types_int32 : require +#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require +#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require +#extension GL_EXT_shader_explicit_arithmetic_types_float32 : require +#extension GL_EXT_shader_explicit_arithmetic_types_float64 : require +#extension GL_EXT_shader_8bit_storage : require +#extension GL_EXT_shader_16bit_storage : require + +#extension GL_EXT_shader_image_load_formatted : require +#extension GL_EXT_nonuniform_qualifier : require +#extension GL_EXT_scalar_block_layout : require +#extension GL_EXT_buffer_reference : require +#extension GL_EXT_buffer_reference2 : require +#extension GL_KHR_memory_scope_semantics : require +#extension GL_EXT_null_initializer : require + +#extension GL_EXT_expect_assume : enable +#extension GL_EXT_control_flow_attributes : enable + layout(buffer_reference, buffer_reference_align = 1) buffer u8buf { uint8_t v; }; @@ -78,6 +107,9 @@ layout(buffer_reference, buffer_reference_align = 8) buffer u64buf { #define ceil_rshift(a, b) \ (-((-(a)) >> (b))) +#define IS_WITHIN(v1, v2) \ + ((v1.x < v2.x) && (v1.y < v2.y)) + /* TODO: optimize */ uint align(uint src, uint a) { @@ -336,3 +368,5 @@ int left_bits(in GetBitContext gb) { return int(gb.buf_end - gb.buf) * 8 + gb.bits_valid; } + +#endif /* VULKAN_COMMON_H */ diff --git a/libavcodec/vulkan/dct.comp b/libavcodec/vulkan/dct.comp index 34c6ad128f..8e887c2023 100644 --- a/libavcodec/vulkan/dct.comp +++ b/libavcodec/vulkan/dct.comp @@ -31,12 +31,22 @@ * IEEE Transactions on Communications, Vol. 25, No. 9, pp 1004-1009, Sept. 1977 */ +#ifndef VULKAN_DCT_H +#define VULKAN_DCT_H + +#ifndef NB_BLOCKS +#define NB_BLOCKS 1 +#endif + #ifndef NB_COMPONENTS #define NB_COMPONENTS 1 #endif +layout (constant_id = 16) const uint32_t nb_blocks = NB_BLOCKS; +layout (constant_id = 17) const uint32_t nb_components = NB_COMPONENTS; + /* Padded by 1 row to avoid bank conflicts */ -shared float blocks[NB_BLOCKS][NB_COMPONENTS*8*(8 + 1)]; +shared float blocks[nb_blocks][nb_components*8*(8 + 1)]; const float idct_scale[64] = { 0.1250000000000000, 0.1733799806652684, 0.1633203706095471, 0.1469844503024199, @@ -117,3 +127,5 @@ void idct8(uint block, uint offset, uint stride) blocks[block][6*stride + offset] = u6; blocks[block][7*stride + offset] = u7; } + +#endif /* VULKAN_DCT_H */ diff --git a/libavcodec/vulkan/prores_raw_decode.comp b/libavcodec/vulkan/prores_raw_decode.comp.glsl similarity index 93% rename from libavcodec/vulkan/prores_raw_decode.comp rename to libavcodec/vulkan/prores_raw_decode.comp.glsl index 384046f891..3d7bb226d3 100644 --- a/libavcodec/vulkan/prores_raw_decode.comp +++ b/libavcodec/vulkan/prores_raw_decode.comp.glsl @@ -20,6 +20,30 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#version 460 +#pragma shader_stage(compute) +#extension GL_GOOGLE_include_directive : require + +#include "common.comp" + +struct TileData { + ivec2 pos; + uint offset; + uint size; +}; + +layout (set = 0, binding = 0) uniform writeonly uimage2D dst; +layout (set = 0, binding = 1, scalar) readonly buffer frame_data_buf { + TileData tile_data[]; +}; + +layout (push_constant, scalar) uniform pushConstants { + u8buf pkt_data; + ivec2 frame_size; + ivec2 tile_size; + uint8_t qmat[64]; +}; + #define COMP_ID (gl_LocalInvocationID.x) GetBitContext gb; diff --git a/libavcodec/vulkan/prores_raw_idct.comp b/libavcodec/vulkan/prores_raw_idct.comp.glsl similarity index 88% rename from libavcodec/vulkan/prores_raw_idct.comp rename to libavcodec/vulkan/prores_raw_idct.comp.glsl index c9850d17d7..52014d035b 100644 --- a/libavcodec/vulkan/prores_raw_idct.comp +++ b/libavcodec/vulkan/prores_raw_idct.comp.glsl @@ -20,6 +20,31 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#version 460 +#pragma shader_stage(compute) +#extension GL_GOOGLE_include_directive : require + +#include "common.comp" +#include "dct.comp" + +struct TileData { + ivec2 pos; + uint offset; + uint size; +}; + +layout (set = 0, binding = 0) uniform uimage2D dst; +layout (set = 0, binding = 1, scalar) readonly buffer frame_data_buf { + TileData tile_data[]; +}; + +layout (push_constant, scalar) uniform pushConstants { + u8buf pkt_data; + ivec2 frame_size; + ivec2 tile_size; + uint8_t qmat[64]; +}; + #define COMP_ID (gl_LocalInvocationID.z) #define BLOCK_ID (gl_LocalInvocationID.y) #define ROW_ID (gl_LocalInvocationID.x) diff --git a/libavcodec/vulkan_prores_raw.c b/libavcodec/vulkan_prores_raw.c index aa2b698925..b8bcbb9178 100644 --- a/libavcodec/vulkan_prores_raw.c +++ b/libavcodec/vulkan_prores_raw.c @@ -22,13 +22,13 @@ #include "hwaccel_internal.h" #include "prores_raw.h" -#include "libavutil/vulkan_spirv.h" #include "libavutil/mem.h" -extern const char *ff_source_common_comp; -extern const char *ff_source_dct_comp; -extern const char *ff_source_prores_raw_decode_comp; -extern const char *ff_source_prores_raw_idct_comp; +extern const unsigned char ff_prores_raw_decode_comp_spv_data[]; +extern const unsigned int ff_prores_raw_decode_comp_spv_len; + +extern const unsigned char ff_prores_raw_idct_comp_spv_data[]; +extern const unsigned int ff_prores_raw_idct_comp_spv_len; const FFVulkanDecodeDescriptor ff_vk_dec_prores_raw_desc = { .codec_id = AV_CODEC_ID_PRORES_RAW, @@ -287,46 +287,19 @@ fail: static int add_common_data(AVCodecContext *avctx, FFVulkanContext *s, FFVulkanShader *shd, int writeonly) { - AVHWFramesContext *dec_frames_ctx; - dec_frames_ctx = (AVHWFramesContext *)avctx->hw_frames_ctx->data; - - /* Common codec header */ - GLSLD(ff_source_common_comp); - - GLSLC(0, struct TileData { ); - GLSLC(1, ivec2 pos; ); - GLSLC(1, uint offset; ); - GLSLC(1, uint size; ); - GLSLC(0, }; ); - GLSLC(0, ); - GLSLC(0, layout(push_constant, scalar) uniform pushConstants { ); - GLSLC(1, u8buf pkt_data; ); - GLSLC(1, ivec2 frame_size; ); - GLSLC(1, ivec2 tile_size; ); - GLSLC(1, uint8_t qmat[64]; ); - GLSLC(0, }; ); - GLSLC(0, ); ff_vk_shader_add_push_const(shd, 0, sizeof(DecodePushData), VK_SHADER_STAGE_COMPUTE_BIT); - FFVulkanDescriptorSetBinding *desc_set; - desc_set = (FFVulkanDescriptorSetBinding []) { + FFVulkanDescriptorSetBinding desc_set[] = { { - .name = "dst", - .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - .mem_layout = ff_vk_shader_rep_fmt(dec_frames_ctx->sw_format, - FF_VK_REP_NATIVE), - .mem_quali = writeonly ? "writeonly" : NULL, - .dimensions = 2, - .stages = VK_SHADER_STAGE_COMPUTE_BIT, + .name = "dst", + .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, + .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, { - .name = "frame_data_buf", - .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, - .stages = VK_SHADER_STAGE_COMPUTE_BIT, - .mem_layout = "scalar", - .mem_quali = "readonly", - .buf_content = "TileData tile_data[];", + .name = "frame_data_buf", + .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; @@ -334,74 +307,49 @@ static int add_common_data(AVCodecContext *avctx, FFVulkanContext *s, } static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, - FFVkExecPool *pool, FFVkSPIRVCompiler *spv, - FFVulkanShader *shd, int version) + FFVkExecPool *pool, FFVulkanShader *shd, + int version) { int err; - uint8_t *spv_data; - size_t spv_len; - void *spv_opaque = NULL; - - RET(ff_vk_shader_init(s, shd, "prores_raw", - VK_SHADER_STAGE_COMPUTE_BIT, - (const char *[]) { "GL_EXT_buffer_reference", - "GL_EXT_buffer_reference2", - "GL_EXT_null_initializer" }, 3, - 4, 1, 1, 0)); - RET(add_common_data(avctx, s, shd, 1)); + ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, NULL, + (uint32_t []) { 4, 1, 1 }, 0); - GLSLD(ff_source_prores_raw_decode_comp); + add_common_data(avctx, s, shd, 1); - RET(spv->compile_shader(s, spv, shd, &spv_data, &spv_len, "main", - &spv_opaque)); - RET(ff_vk_shader_link(s, shd, spv_data, spv_len, "main")); + RET(ff_vk_shader_link(s, shd, + ff_prores_raw_decode_comp_spv_data, + ff_prores_raw_decode_comp_spv_len, "main")); RET(ff_vk_shader_register_exec(s, pool, shd)); fail: - if (spv_opaque) - spv->free_shader(spv, &spv_opaque); - return err; } static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, - FFVkExecPool *pool, FFVkSPIRVCompiler *spv, - FFVulkanShader *shd, int version) + FFVkExecPool *pool, FFVulkanShader *shd, + int version) { int err; - uint8_t *spv_data; - size_t spv_len; - void *spv_opaque = NULL; - - RET(ff_vk_shader_init(s, shd, "prores_raw", - VK_SHADER_STAGE_COMPUTE_BIT, - (const char *[]) { "GL_EXT_buffer_reference", - "GL_EXT_buffer_reference2" }, 2, - 8, - version == 0 ? 8 : 16 /* Horizontal blocks */, - 4 /* Components */, - 0)); + SPEC_LIST_CREATE(sl, 2, 2*sizeof(uint32_t)) - RET(add_common_data(avctx, s, shd, 0)); + int nb_blocks = version == 0 ? 8 : 16; + SPEC_LIST_ADD(sl, 16, 32, nb_blocks); + SPEC_LIST_ADD(sl, 17, 32, 4); /* nb_components */ - GLSLC(0, #define NB_BLOCKS 16); - GLSLC(0, #define NB_COMPONENTS 4); - GLSLD(ff_source_dct_comp); + ff_vk_shader_load(shd, VK_SHADER_STAGE_COMPUTE_BIT, sl, + (uint32_t []) { 8, nb_blocks, 4 }, 0); - GLSLD(ff_source_prores_raw_idct_comp); + add_common_data(avctx, s, shd, 0); - RET(spv->compile_shader(s, spv, shd, &spv_data, &spv_len, "main", - &spv_opaque)); - RET(ff_vk_shader_link(s, shd, spv_data, spv_len, "main")); + RET(ff_vk_shader_link(s, shd, + ff_prores_raw_idct_comp_spv_data, + ff_prores_raw_idct_comp_spv_len, "main")); RET(ff_vk_shader_register_exec(s, pool, shd)); fail: - if (spv_opaque) - spv->free_shader(spv, &spv_opaque); - return err; } @@ -423,12 +371,6 @@ static int vk_decode_prores_raw_init(AVCodecContext *avctx) FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; ProResRAWContext *prr = avctx->priv_data; - FFVkSPIRVCompiler *spv = ff_vk_spirv_init(); - if (!spv) { - av_log(avctx, AV_LOG_ERROR, "Unable to initialize SPIR-V compiler!\n"); - return AVERROR_EXTERNAL; - } - err = ff_vk_decode_init(avctx); if (err < 0) return err; @@ -443,14 +385,12 @@ static int vk_decode_prores_raw_init(AVCodecContext *avctx) ctx->sd_ctx_free = &vk_decode_prores_raw_uninit; /* Setup decode shader */ - RET(init_decode_shader(avctx, &ctx->s, &ctx->exec_pool, spv, &prv->decode, + RET(init_decode_shader(avctx, &ctx->s, &ctx->exec_pool, &prv->decode, prr->version)); - RET(init_idct_shader(avctx, &ctx->s, &ctx->exec_pool, spv, &prv->idct, + RET(init_idct_shader(avctx, &ctx->s, &ctx->exec_pool, &prv->idct, prr->version)); fail: - spv->uninit(&spv); - return err; } _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
