PR #23781 opened by Lynne URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23781 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23781.patch
Just a simple removal. I want this to land in 9.0, so I'm planning on pushing this soon (its just a removal). >From 4bac69c4576400313589a96ea140be7056345e9f Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Sun, 12 Jul 2026 14:10:15 +0900 Subject: [PATCH 1/5] avcodec: remove unneeded vulkan_spirv.h includes Leftover crud from before the rewrite to compile-time SPIR-V. --- libavcodec/apv_encode_vulkan.c | 1 - libavcodec/proresenc_kostya_vulkan.c | 1 - 2 files changed, 2 deletions(-) diff --git a/libavcodec/apv_encode_vulkan.c b/libavcodec/apv_encode_vulkan.c index 6c0e3bbfd1..c4a4e8732c 100644 --- a/libavcodec/apv_encode_vulkan.c +++ b/libavcodec/apv_encode_vulkan.c @@ -25,7 +25,6 @@ #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/vulkan.h" -#include "libavutil/vulkan_spirv.h" #include "avcodec.h" #include "codec_internal.h" diff --git a/libavcodec/proresenc_kostya_vulkan.c b/libavcodec/proresenc_kostya_vulkan.c index 11b11675b7..ab71394337 100644 --- a/libavcodec/proresenc_kostya_vulkan.c +++ b/libavcodec/proresenc_kostya_vulkan.c @@ -27,7 +27,6 @@ #include "libavutil/mem_internal.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" -#include "libavutil/vulkan_spirv.h" #include "libavutil/hwcontext_vulkan.h" #include "libavutil/vulkan_loader.h" #include "libavutil/vulkan.h" -- 2.52.0 >From 647b042dabc7dc82d6f36baa4905aa3e86a9ff37 Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Sun, 12 Jul 2026 14:10:31 +0900 Subject: [PATCH 2/5] vf_scale_vulkan: port to compile-time SPIR-V generation Same functionality as before, but cleaner. --- libavfilter/vf_scale_vulkan.c | 229 +++++++-------------------- libavfilter/vulkan/Makefile | 3 +- libavfilter/vulkan/debayer.comp.glsl | 1 + libavfilter/vulkan/scale.comp.glsl | 120 ++++++++++++++ 4 files changed, 182 insertions(+), 171 deletions(-) create mode 100644 libavfilter/vulkan/scale.comp.glsl diff --git a/libavfilter/vf_scale_vulkan.c b/libavfilter/vf_scale_vulkan.c index 19b4e5e5ac..4e54d8806c 100644 --- a/libavfilter/vf_scale_vulkan.c +++ b/libavfilter/vf_scale_vulkan.c @@ -18,9 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "libavutil/random_seed.h" #include "libavutil/opt.h" -#include "libavutil/vulkan_spirv.h" #include "vulkan_filter.h" #include "scale_eval.h" #include "filters.h" @@ -28,6 +26,9 @@ #include "video.h" #include "libswscale/swscale.h" +extern const unsigned char ff_scale_comp_spv_data[]; +extern const unsigned int ff_scale_comp_spv_len; + extern const unsigned char ff_debayer_comp_spv_data[]; extern const unsigned int ff_debayer_comp_spv_len; @@ -45,6 +46,14 @@ enum DebayerFunc { DB_NB, }; +/* Output modes, must match scale.comp.glsl */ +enum ScaleMode { + MODE_COPY = 0, + MODE_NV12, + MODE_YUV420, + MODE_YUV444, +}; + typedef struct ScaleVulkanContext { FFVulkanContext vkctx; SwsContext *sws; @@ -62,6 +71,7 @@ typedef struct ScaleVulkanContext { int crop_y; int crop_w; int crop_h; + float in_dims[2]; } opts; char *out_format_string; @@ -73,145 +83,17 @@ typedef struct ScaleVulkanContext { enum DebayerFunc debayer; } ScaleVulkanContext; -static const char scale_bilinear[] = { - C(0, vec4 scale_bilinear(int idx, ivec2 pos, vec2 crop_range, vec2 crop_off)) - C(0, { ) - C(1, vec2 npos = (vec2(pos) + 0.5f) / imageSize(output_img[idx]); ) - C(1, npos *= crop_range; /* Reduce the range */ ) - C(1, npos += crop_off; /* Offset the start */ ) - C(1, return texture(input_img[idx], npos); ) - C(0, } ) -}; - -static const char rgb2yuv[] = { - C(0, vec4 rgb2yuv(vec4 src, int fullrange) ) - C(0, { ) - C(1, src *= yuv_matrix; ) - C(1, if (fullrange == 1) { ) - C(2, src += vec4(0.0, 0.5, 0.5, 0.0); ) - C(1, } else { ) - C(2, src *= vec4(219.0 / 255.0, 224.0 / 255.0, 224.0 / 255.0, 1.0); ) - C(2, src += vec4(16.0 / 255.0, 128.0 / 255.0, 128.0 / 255.0, 0.0); ) - C(1, } ) - C(1, return src; ) - C(0, } ) -}; - -static const char write_nv12[] = { - C(0, void write_nv12(vec4 src, ivec2 pos) ) - C(0, { ) - C(1, imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0)); ) - C(1, pos /= ivec2(2); ) - C(1, imageStore(output_img[1], pos, vec4(src.g, src.b, 0.0, 0.0)); ) - C(0, } ) -}; - -static const char write_420[] = { - C(0, void write_420(vec4 src, ivec2 pos) ) - C(0, { ) - C(1, imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0)); ) - C(1, pos /= ivec2(2); ) - C(1, imageStore(output_img[1], pos, vec4(src.g, 0.0, 0.0, 0.0)); ) - C(1, imageStore(output_img[2], pos, vec4(src.b, 0.0, 0.0, 0.0)); ) - C(0, } ) -}; - -static const char write_444[] = { - C(0, void write_444(vec4 src, ivec2 pos) ) - C(0, { ) - C(1, imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0)); ) - C(1, imageStore(output_img[1], pos, vec4(src.g, 0.0, 0.0, 0.0)); ) - C(1, imageStore(output_img[2], pos, vec4(src.b, 0.0, 0.0, 0.0)); ) - C(0, } ) -}; - -static int init_scale_shader(AVFilterContext *ctx, FFVulkanShader *shd, - FFVulkanDescriptorSetBinding *desc, AVFrame *in) -{ - ScaleVulkanContext *s = ctx->priv; - GLSLD( scale_bilinear ); - - if (s->vkctx.output_format != s->vkctx.input_format) { - GLSLD( rgb2yuv ); - } - - switch (s->vkctx.output_format) { - case AV_PIX_FMT_NV12: GLSLD(write_nv12); break; - case AV_PIX_FMT_YUV420P: GLSLD( write_420); break; - case AV_PIX_FMT_YUV444P: GLSLD( write_444); break; - default: break; - } - - GLSLC(0, void main() ); - GLSLC(0, { ); - GLSLC(1, ivec2 size; ); - GLSLC(1, ivec2 pos = ivec2(gl_GlobalInvocationID.xy); ); - GLSLF(1, vec2 in_d = vec2(%i, %i); ,in->width, in->height); - GLSLC(1, vec2 c_r = vec2(crop_w, crop_h) / in_d; ); - GLSLC(1, vec2 c_o = vec2(crop_x, crop_y) / in_d; ); - GLSLC(0, ); - - if (s->vkctx.output_format == s->vkctx.input_format) { - for (int i = 0; i < desc[1].elems; i++) { - GLSLF(1, size = imageSize(output_img[%i]); ,i); - GLSLC(1, if (IS_WITHIN(pos, size)) { ); - switch (s->scaler) { - case F_NEAREST: - case F_BILINEAR: - GLSLF(2, vec4 res = scale_bilinear(%i, pos, c_r, c_o); ,i); - GLSLF(2, imageStore(output_img[%i], pos, res); ,i); - break; - }; - GLSLC(1, } ); - } - } else { - GLSLC(1, vec4 res = scale_bilinear(0, pos, c_r, c_o); ); - GLSLF(1, res = rgb2yuv(res, %i); ,s->out_range == AVCOL_RANGE_JPEG); - switch (s->vkctx.output_format) { - case AV_PIX_FMT_NV12: GLSLC(1, write_nv12(res, pos); ); break; - case AV_PIX_FMT_YUV420P: GLSLC(1, write_420(res, pos); ); break; - case AV_PIX_FMT_YUV444P: GLSLC(1, write_444(res, pos); ); break; - default: return AVERROR(EINVAL); - } - } - - GLSLC(0, } ); - - if (s->vkctx.output_format != s->vkctx.input_format) { - const AVLumaCoefficients *lcoeffs; - double tmp_mat[3][3]; - - lcoeffs = av_csp_luma_coeffs_from_avcsp(in->colorspace); - if (!lcoeffs) { - av_log(ctx, AV_LOG_ERROR, "Unsupported colorspace\n"); - return AVERROR(EINVAL); - } - - ff_fill_rgb2yuv_table(lcoeffs, tmp_mat); - - for (int y = 0; y < 3; y++) - for (int x = 0; x < 3; x++) - s->opts.yuv_matrix[x][y] = tmp_mat[x][y]; - s->opts.yuv_matrix[3][3] = 1.0; - } - - return 0; -} - static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) { int err; - uint8_t *spv_data; - size_t spv_len; - void *spv_opaque = NULL; VkFilter sampler_mode; + enum ScaleMode mode; ScaleVulkanContext *s = ctx->priv; FFVulkanContext *vkctx = &s->vkctx; FFVulkanShader *shd = &s->shd; - FFVkSPIRVCompiler *spv; - FFVulkanDescriptorSetBinding *desc; int in_planes = av_pix_fmt_count_planes(s->vkctx.input_format); + int out_planes = av_pix_fmt_count_planes(s->vkctx.output_format); switch (s->scaler) { case F_NEAREST: @@ -222,29 +104,33 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) break; }; - spv = ff_vk_spirv_init(); - if (!spv) { - av_log(ctx, AV_LOG_ERROR, "Unable to initialize SPIR-V compiler!\n"); - return AVERROR_EXTERNAL; + if (s->vkctx.output_format == s->vkctx.input_format) { + mode = MODE_COPY; + } else { + switch (s->vkctx.output_format) { + case AV_PIX_FMT_NV12: mode = MODE_NV12; break; + case AV_PIX_FMT_YUV420P: mode = MODE_YUV420; break; + case AV_PIX_FMT_YUV444P: mode = MODE_YUV444; break; + default: return AVERROR(EINVAL); + } } RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 0, sampler_mode)); - RET(ff_vk_shader_init(vkctx, &s->shd, "scale", - VK_SHADER_STAGE_COMPUTE_BIT, - NULL, 0, - 32, 32, 1, - 0)); + SPEC_LIST_CREATE(sl, 3, 3*sizeof(int32_t)) + SPEC_LIST_ADD(sl, 0, 32, out_planes); + SPEC_LIST_ADD(sl, 1, 32, mode); + SPEC_LIST_ADD(sl, 2, 32, s->out_range == AVCOL_RANGE_JPEG); - desc = (FFVulkanDescriptorSetBinding []) { + ff_vk_shader_load(&s->shd, VK_SHADER_STAGE_COMPUTE_BIT, sl, + (uint32_t []) { 32, 32, 1 }, 0); + + const FFVulkanDescriptorSetBinding desc[] = { { .name = "input_img", .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - .mem_layout = NULL, - .mem_quali = "readonly", - .dimensions = 2, .elems = in_planes, .stages = VK_SHADER_STAGE_COMPUTE_BIT, .samplers = DUP_SAMPLER(s->sampler), @@ -252,46 +138,47 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) { .name = "output_img", .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - .mem_layout = ff_vk_shader_rep_fmt(s->vkctx.output_format, FF_VK_REP_FLOAT), - .mem_quali = "writeonly", - .dimensions = 2, - .elems = av_pix_fmt_count_planes(s->vkctx.output_format), + .elems = out_planes, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - RET(ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0)); - - GLSLC(0, layout(push_constant, std430) uniform pushConstants { ); - GLSLC(1, mat4 yuv_matrix; ); - GLSLC(1, int crop_x; ); - GLSLC(1, int crop_y; ); - GLSLC(1, int crop_w; ); - GLSLC(1, int crop_h; ); - GLSLC(0, }; ); - GLSLC(0, ); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0); ff_vk_shader_add_push_const(&s->shd, 0, sizeof(s->opts), VK_SHADER_STAGE_COMPUTE_BIT); - err = init_scale_shader(ctx, shd, desc, in); - if (err < 0) - goto fail; + if (mode != MODE_COPY) { + const AVLumaCoefficients *lcoeffs; + double tmp_mat[3][3]; - RET(spv->compile_shader(vkctx, spv, shd, &spv_data, &spv_len, "main", - &spv_opaque)); - RET(ff_vk_shader_link(vkctx, shd, spv_data, spv_len, "main")); + lcoeffs = av_csp_luma_coeffs_from_avcsp(in->colorspace); + if (!lcoeffs) { + av_log(ctx, AV_LOG_ERROR, "Unsupported colorspace\n"); + err = AVERROR(EINVAL); + goto fail; + } + + ff_fill_rgb2yuv_table(lcoeffs, tmp_mat); + + for (int y = 0; y < 3; y++) + for (int x = 0; x < 3; x++) + s->opts.yuv_matrix[x][y] = tmp_mat[x][y]; + s->opts.yuv_matrix[3][3] = 1.0; + } + + s->opts.in_dims[0] = in->width; + s->opts.in_dims[1] = in->height; + + RET(ff_vk_shader_link(vkctx, shd, + ff_scale_comp_spv_data, + ff_scale_comp_spv_len, "main")); RET(ff_vk_shader_register_exec(vkctx, &s->e, &s->shd)); s->initialized = 1; fail: - if (spv_opaque) - spv->free_shader(spv, &spv_opaque); - if (spv) - spv->uninit(&spv); - return err; } @@ -455,6 +342,8 @@ static int scale_vulkan_config_output(AVFilterLink *outlink) if (!s->sws) return AVERROR(ENOMEM); av_opt_set(s->sws, "sws_flags", "unstable", 0); + av_opt_set(s->sws, "scaler", + s->scaler == F_NEAREST ? "point" : "bilinear", 0); } else if (s->vkctx.output_format != s->vkctx.input_format) { if (!ff_vk_mt_is_np_rgb(s->vkctx.input_format)) { av_log(avctx, AV_LOG_ERROR, "Unsupported input format for conversion\n"); diff --git a/libavfilter/vulkan/Makefile b/libavfilter/vulkan/Makefile index 2cfe9cfa93..8a0912b4df 100644 --- a/libavfilter/vulkan/Makefile +++ b/libavfilter/vulkan/Makefile @@ -8,7 +8,8 @@ OBJS-$(CONFIG_BWDIF_VULKAN_FILTER) += vulkan/bwdif.comp.spv.o OBJS-$(CONFIG_CHROMABER_VULKAN_FILTER) += vulkan/chromaber.comp.spv.o OBJS-$(CONFIG_COLOR_VULKAN_FILTER) += vulkan/color.comp.spv.o OBJS-$(CONFIG_GBLUR_VULKAN_FILTER) += vulkan/gblur.comp.spv.o -OBJS-$(CONFIG_SCALE_VULKAN_FILTER) += vulkan/debayer.comp.spv.o +OBJS-$(CONFIG_SCALE_VULKAN_FILTER) += vulkan/scale.comp.spv.o \ + vulkan/debayer.comp.spv.o OBJS-$(CONFIG_SCDET_VULKAN_FILTER) += vulkan/scdet.comp.spv.o OBJS-$(CONFIG_OVERLAY_VULKAN_FILTER) += vulkan/overlay.comp.spv.o OBJS-$(CONFIG_FLIP_VULKAN_FILTER) += vulkan/flip.comp.spv.o diff --git a/libavfilter/vulkan/debayer.comp.glsl b/libavfilter/vulkan/debayer.comp.glsl index 0a4e22de99..90a1516717 100644 --- a/libavfilter/vulkan/debayer.comp.glsl +++ b/libavfilter/vulkan/debayer.comp.glsl @@ -36,6 +36,7 @@ layout(push_constant, std430) uniform pushConstants { int crop_y; int crop_w; int crop_h; + vec2 in_dims; }; #define LD(xo, yo) \ diff --git a/libavfilter/vulkan/scale.comp.glsl b/libavfilter/vulkan/scale.comp.glsl new file mode 100644 index 0000000000..b439344106 --- /dev/null +++ b/libavfilter/vulkan/scale.comp.glsl @@ -0,0 +1,120 @@ +/* + * + * Copyright (c) Lynne <[email protected]> + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma shader_stage(compute) + +#extension GL_EXT_shader_image_load_formatted : require +#extension GL_EXT_scalar_block_layout : require +#extension GL_EXT_nonuniform_qualifier : require + +layout (local_size_x_id = 253, local_size_y_id = 254, local_size_z_id = 255) in; + +#define MODE_COPY 0 +#define MODE_NV12 1 +#define MODE_YUV420 2 +#define MODE_YUV444 3 + +layout (constant_id = 0) const int nb_planes = 0; +layout (constant_id = 1) const int mode = MODE_COPY; +layout (constant_id = 2) const int fullrange = 0; + +layout (set = 0, binding = 0) uniform sampler2D input_img[]; +layout (set = 0, binding = 1) uniform writeonly image2D output_img[]; + +layout (push_constant, std430) uniform pushConstants { + mat4 yuv_matrix; + int crop_x; + int crop_y; + int crop_w; + int crop_h; + vec2 in_dims; +}; + +vec4 scale_bilinear(int idx, ivec2 pos, vec2 crop_range, vec2 crop_off) +{ + vec2 npos = (vec2(pos) + 0.5f) / imageSize(output_img[idx]); + npos *= crop_range; /* Reduce the range */ + npos += crop_off; /* Offset the start */ + return texture(input_img[idx], npos); +} + +vec4 rgb2yuv(vec4 src) +{ + src *= yuv_matrix; + if (fullrange == 1) { + src += vec4(0.0, 0.5, 0.5, 0.0); + } else { + src *= vec4(219.0 / 255.0, 224.0 / 255.0, 224.0 / 255.0, 1.0); + src += vec4(16.0 / 255.0, 128.0 / 255.0, 128.0 / 255.0, 0.0); + } + return src; +} + +void write_nv12(vec4 src, ivec2 pos) +{ + imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0)); + pos /= ivec2(2); + imageStore(output_img[1], pos, vec4(src.g, src.b, 0.0, 0.0)); +} + +void write_420(vec4 src, ivec2 pos) +{ + imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0)); + pos /= ivec2(2); + imageStore(output_img[1], pos, vec4(src.g, 0.0, 0.0, 0.0)); + imageStore(output_img[2], pos, vec4(src.b, 0.0, 0.0, 0.0)); +} + +void write_444(vec4 src, ivec2 pos) +{ + imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0)); + imageStore(output_img[1], pos, vec4(src.g, 0.0, 0.0, 0.0)); + imageStore(output_img[2], pos, vec4(src.b, 0.0, 0.0, 0.0)); +} + +void main() +{ + ivec2 pos = ivec2(gl_GlobalInvocationID.xy); + vec2 c_r = vec2(crop_w, crop_h) / in_dims; + vec2 c_o = vec2(crop_x, crop_y) / in_dims; + + if (mode == MODE_COPY) { + for (int i = 0; i < nb_planes; i++) { + ivec2 size = imageSize(output_img[i]); + if (any(greaterThanEqual(pos, size))) + continue; + + vec4 res = scale_bilinear(i, pos, c_r, c_o); + imageStore(output_img[i], pos, res); + } + } else { + ivec2 size = imageSize(output_img[0]); + if (any(greaterThanEqual(pos, size))) + return; + + vec4 res = rgb2yuv(scale_bilinear(0, pos, c_r, c_o)); + switch (mode) { + case MODE_NV12: write_nv12(res, pos); break; + case MODE_YUV420: write_420(res, pos); break; + case MODE_YUV444: write_444(res, pos); break; + } + } +} -- 2.52.0 >From 99c47de58ef836f0ad708b1d364b2f7480e68f0c Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Sun, 12 Jul 2026 14:11:32 +0900 Subject: [PATCH 3/5] swscale: remove GLSL backend No longer needed. The SPIR-V version is pretty clean and neat. --- doc/scaler.texi | 3 - libswscale/ops.c | 6 - libswscale/options.c | 1 - libswscale/swscale.h | 4 +- libswscale/vulkan/Makefile | 2 - libswscale/vulkan/ops.c | 375 +---------------------------- libswscale/vulkan/ops.h | 7 - libswscale/vulkan/vulkan_glslang.c | 19 -- libswscale/vulkan/vulkan_shaderc.c | 19 -- 9 files changed, 6 insertions(+), 430 deletions(-) delete mode 100644 libswscale/vulkan/vulkan_glslang.c delete mode 100644 libswscale/vulkan/vulkan_shaderc.c diff --git a/doc/scaler.texi b/doc/scaler.texi index a66c8217f8..274e500837 100644 --- a/doc/scaler.texi +++ b/doc/scaler.texi @@ -227,9 +227,6 @@ AArch64 NEON kernels. @item spirv Vulkan SPIR-V backend. -@item glsl -Vulkan GLSL backend. - @end table @end table diff --git a/libswscale/ops.c b/libswscale/ops.c index a57b942981..b9d959c1e7 100644 --- a/libswscale/ops.c +++ b/libswscale/ops.c @@ -38,9 +38,6 @@ extern const SwsOpBackend backend_x86; #if HAVE_SPIRV_HEADERS_SPIRV_H || HAVE_SPIRV_UNIFIED1_SPIRV_H extern const SwsOpBackend backend_spirv; #endif -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG -extern const SwsOpBackend backend_glsl; -#endif const SwsOpBackend * const ff_sws_op_backends[] = { &backend_murder, @@ -52,9 +49,6 @@ const SwsOpBackend * const ff_sws_op_backends[] = { &backend_c, #if HAVE_SPIRV_HEADERS_SPIRV_H || HAVE_SPIRV_UNIFIED1_SPIRV_H &backend_spirv, -#endif -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG - &backend_glsl, #endif NULL }; diff --git a/libswscale/options.c b/libswscale/options.c index 960c6b91dc..fe6c5a6eac 100644 --- a/libswscale/options.c +++ b/libswscale/options.c @@ -117,7 +117,6 @@ static const AVOption swscale_options[] = { { "x86", "x86 SIMD kernels", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_BACKEND_X86 }, .flags = VE, .unit = "sws_backend" }, { "aarch64", "AArch64 NEON kernels", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_BACKEND_AARCH64 }, .flags = VE, .unit = "sws_backend" }, { "spirv", "Vulkan SPIR-V backend", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_BACKEND_SPIRV }, .flags = VE, .unit = "sws_backend" }, - { "glsl", "Vulkan GLSL backend", 0, AV_OPT_TYPE_CONST, { .i64 = SWS_BACKEND_GLSL }, .flags = VE, .unit = "sws_backend" }, { NULL } }; diff --git a/libswscale/swscale.h b/libswscale/swscale.h index 9b53ebbdff..c913e76985 100644 --- a/libswscale/swscale.h +++ b/libswscale/swscale.h @@ -118,13 +118,11 @@ typedef enum SwsBackend { SWS_BACKEND_X86 = (1 << 3), ///< Chained x86 SIMD kernels SWS_BACKEND_AARCH64 = (1 << 4), ///< Chained AArch64 NEON kernels SWS_BACKEND_SPIRV = (1 << 5), ///< Vulkan SPIR-V backend - SWS_BACKEND_GLSL = (1 << 6), ///< Vulkan GLSL backend SWS_BACKEND_UNSTABLE = SWS_BACKEND_C | SWS_BACKEND_MEMCPY | SWS_BACKEND_X86 | SWS_BACKEND_AARCH64 | - SWS_BACKEND_SPIRV | - SWS_BACKEND_GLSL, + SWS_BACKEND_SPIRV, SWS_BACKEND_ALL = SWS_BACKEND_STABLE | SWS_BACKEND_UNSTABLE, SWS_BACKEND_MAX_ENUM = 0x7FFFFFFF, ///< force size to 32 bits, not a valid backend diff --git a/libswscale/vulkan/Makefile b/libswscale/vulkan/Makefile index e899f35955..396cdeb936 100644 --- a/libswscale/vulkan/Makefile +++ b/libswscale/vulkan/Makefile @@ -2,5 +2,3 @@ clean:: $(RM) $(CLEANSUFFIXES:%=libswscale/vulkan/%) OBJS-$(CONFIG_VULKAN) += vulkan/ops.o vulkan/vulkan.o -OBJS-$(CONFIG_LIBSHADERC) += vulkan/vulkan_shaderc.o -OBJS-$(CONFIG_LIBGLSLANG) += vulkan/vulkan_glslang.o diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c index 045f220745..c4abc8fcec 100644 --- a/libswscale/vulkan/ops.c +++ b/libswscale/vulkan/ops.c @@ -35,10 +35,6 @@ static void ff_sws_vk_uninit(AVRefStructOpaque opaque, void *obj) { FFVulkanOpsCtx *s = obj; -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG - if (s->spvc) - s->spvc->uninit(&s->spvc); -#endif ff_vk_uninit(&s->vkctx); } @@ -72,14 +68,6 @@ int ff_sws_vk_init(SwsContext *sws, AVBufferRef *dev_ref) return AVERROR(ENOTSUP); } -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG - if (!s->spvc) { - s->spvc = ff_vk_spirv_init(); - if (!s->spvc) - return AVERROR(ENOMEM); - } -#endif - return 0; } @@ -1130,7 +1118,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s, switch (op->op) { case SWS_OP_READ: - if (op->rw.frac || op->rw.filter.op) { + if (op->rw.frac) { return AVERROR(ENOTSUP); } else if (op->rw.filter.op) { av_assert0(op->rw.mode != SWS_RW_PALETTE); @@ -1289,338 +1277,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s, } #endif -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG -static void add_desc_read_write(FFVulkanDescriptorSetBinding *out_desc, - enum FFVkShaderRepFormat *out_rep, - const SwsOp *op) -{ - const char *img_type = op->type == SWS_PIXEL_F32 ? "rgba32f" : - op->type == SWS_PIXEL_U32 ? "rgba32ui" : - op->type == SWS_PIXEL_U16 ? "rgba16ui" : - "rgba8ui"; - - *out_desc = (FFVulkanDescriptorSetBinding) { - .name = op->op == SWS_OP_WRITE ? "dst_img" : "src_img", - .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, - .mem_layout = img_type, - .mem_quali = op->op == SWS_OP_WRITE ? "writeonly" : "readonly", - .dimensions = 2, - .elems = 4, - .stages = VK_SHADER_STAGE_COMPUTE_BIT, - }; - - *out_rep = op->type == SWS_PIXEL_F32 ? FF_VK_REP_FLOAT : FF_VK_REP_UINT; -} - -#define QSTR "(%"PRId64"/%"PRId64"%s)" -#define QTYPE(Q) (Q).num, (Q).den, cur_type == SWS_PIXEL_F32 ? ".0f" : "" - -static void read_glsl(const SwsOpList *ops, const SwsOp *op, FFVulkanShader *shd, - int idx, const char *type_name, - const char *type_v, const char *type_s) -{ - const SwsFilterWeights *wd = op->rw.filter.kernel; - const int interlaced = ops->src.interlaced; - if (op->rw.filter.op) { - const char *axis = op->rw.filter.op == SWS_OP_FILTER_H ? "pos.x" : "pos.y"; - const char *coord_x = op->rw.filter.op == SWS_OP_FILTER_H ? "o + i" : "pos.x"; - const char *coord_y; - if (op->rw.filter.op == SWS_OP_FILTER_H) - coord_y = interlaced ? "spos.y" : "pos.y"; - else - coord_y = interlaced ? "((o + i) * 2 + int(params.field))" : "o + i"; - GLSLC(1, tmp = vec4(0); ); - av_bprintf(&shd->src, " int o = filter_o%i[%s];\n", idx, axis); - av_bprintf(&shd->src, " for (int i = 0; i < %i; i++) {\n", - wd->filter_size); - av_bprintf(&shd->src, " float w = filter_w%i[%s][i];\n", - idx, axis); - if (op->rw.mode == SWS_RW_PACKED) { - GLSLF(2, tmp += w * %s(imageLoad(src_img[%i], ivec2(%s, %s))); , - type_v, ops->plane_src[0], coord_x, coord_y); - } else { - for (int i = 0; i < op->rw.elems; i++) - GLSLF(2, - tmp.%c += w * %s(imageLoad(src_img[%i], ivec2(%s, %s))[0]); , - "xyzw"[i], type_s, ops->plane_src[i], coord_x, coord_y); - } - GLSLC(1, } ); - GLSLC(1, f32 = tmp; ); - } else { - const char *src_pos = interlaced ? "spos" : "pos"; - if (op->rw.mode == SWS_RW_PACKED) { - GLSLF(1, %s = %s(imageLoad(src_img[%i], %s)); , - type_name, type_v, ops->plane_src[0], src_pos); - } else { - for (int i = 0; i < op->rw.elems; i++) - GLSLF(1, %s.%c = %s(imageLoad(src_img[%i], %s)[0]); , - type_name, "xyzw"[i], type_s, ops->plane_src[i], src_pos); - } - } -} - -static int add_ops_glsl(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s, - const SwsOpList *ops, FFVulkanShader *shd) -{ - int err; - uint8_t *spv_data; - size_t spv_len; - void *spv_opaque = NULL; - const int interlaced = ops->src.interlaced || ops->dst.interlaced; - - err = ff_vk_shader_init(&s->vkctx, shd, "sws_pass", - VK_SHADER_STAGE_COMPUTE_BIT, - NULL, 0, 32, 32, 1, 0); - if (err < 0) - return err; - - p->interlaced = interlaced; - if (interlaced) - ff_vk_shader_add_push_const(shd, 0, sizeof(uint32_t), - VK_SHADER_STAGE_COMPUTE_BIT); - - int nb_desc = 0; - FFVulkanDescriptorSetBinding buf_desc[8]; - - const SwsOp *read = ff_sws_op_list_input(ops); - const SwsOp *write = ff_sws_op_list_output(ops); - if (read) - add_desc_read_write(&buf_desc[nb_desc++], &p->src_rep, read); - add_desc_read_write(&buf_desc[nb_desc++], &p->dst_rep, write); - ff_vk_shader_add_descriptor_set(&s->vkctx, shd, buf_desc, nb_desc, 0, 0); - - err = create_bufs(s, p, ops); - if (err < 0) - return err; - - nb_desc = 0; - char data_buf_name[MAX_DATA_BUFS][256]; - char data_str_name[MAX_DATA_BUFS][256]; - for (int n = 0; n < ops->num_ops; n++) { - const SwsOp *op = &ops->ops[n]; - if (op->op == SWS_OP_DITHER) { - int size = (1 << op->dither.size_log2); - av_assert0(size < 8192); - snprintf(data_buf_name[nb_desc], 256, "dither_buf%i", n); - snprintf(data_str_name[nb_desc], 256, "float dither_mat%i[%i][%i];", - n, size, size); - buf_desc[nb_desc] = (FFVulkanDescriptorSetBinding) { - .name = data_buf_name[nb_desc], - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - .stages = VK_SHADER_STAGE_COMPUTE_BIT, - .mem_layout = "scalar", - .buf_content = data_str_name[nb_desc], - }; - nb_desc++; - } else if (op->op == SWS_OP_FILTER_H || op->op == SWS_OP_FILTER_V || - ((op->op == SWS_OP_READ || op->op == SWS_OP_WRITE) && - op->rw.filter.op)) { - const SwsFilterWeights *wd = (op->op == SWS_OP_READ || - op->op == SWS_OP_WRITE) ? - op->rw.filter.kernel : op->filter.kernel; - snprintf(data_buf_name[nb_desc], 256, "filter_buf%i", n); - snprintf(data_str_name[nb_desc], 256, - "float filter_w%i[%i][%i];\n" - " int filter_o%i[%i];", - n, wd->dst_size, wd->filter_size, - n, wd->dst_size); - buf_desc[nb_desc] = (FFVulkanDescriptorSetBinding) { - .name = data_buf_name[nb_desc], - .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - .stages = VK_SHADER_STAGE_COMPUTE_BIT, - .mem_layout = "scalar", - .buf_content = data_str_name[nb_desc], - }; - nb_desc++; - } - } - if (nb_desc) - ff_vk_shader_add_descriptor_set(&s->vkctx, shd, buf_desc, - nb_desc, 1, 0); - - if (interlaced) { - GLSLC(0, layout(push_constant, std430) uniform pushConstants { ); - GLSLC(1, uint field; ); - GLSLC(0, } params; ); - GLSLC(0, ); - } - - GLSLC(0, void main() ); - GLSLC(0, { ); - GLSLC(1, ivec2 pos = ivec2(gl_GlobalInvocationID.xy); ); - GLSLC(1, ivec2 size = imageSize(dst_img[0]); ); - if (ops->src.interlaced) - GLSLC(1, ivec2 spos = ivec2(pos.x, pos.y * 2 + int(params.field)); ); - if (ops->dst.interlaced) - GLSLC(1, ivec2 dpos = ivec2(pos.x, pos.y * 2 + int(params.field)); ); - if (ops->dst.interlaced) { - GLSLC(1, if (any(greaterThanEqual(dpos, size))) ); - } else { - GLSLC(1, if (any(greaterThanEqual(pos, size))) ); - } - GLSLC(2, return; ); - GLSLC(0, ); - GLSLC(1, u8vec4 u8; ); - GLSLC(1, u16vec4 u16; ); - GLSLC(1, u32vec4 u32; ); - GLSLC(1, precise f32vec4 f32; ); - GLSLC(1, precise f32vec4 tmp; ); - GLSLC(0, ); - - for (int n = 0; n < ops->num_ops; n++) { - const SwsOp *op = &ops->ops[n]; - SwsPixelType cur_type = op->op == SWS_OP_CONVERT ? op->convert.to : - op->type; - const char *type_name = ff_sws_pixel_type_name(cur_type); - const char *type_v = cur_type == SWS_PIXEL_F32 ? "f32vec4" : - cur_type == SWS_PIXEL_U32 ? "u32vec4" : - cur_type == SWS_PIXEL_U16 ? "u16vec4" : "u8vec4"; - const char *type_s = cur_type == SWS_PIXEL_F32 ? "float" : - cur_type == SWS_PIXEL_U32 ? "uint32_t" : - cur_type == SWS_PIXEL_U16 ? "uint16_t" : "uint8_t"; - av_bprintf(&shd->src, " // %s\n", ff_sws_op_type_name(op->op)); - - switch (op->op) { - case SWS_OP_READ: { - if (op->rw.frac) - return AVERROR(ENOTSUP); - switch (op->rw.mode) { - case SWS_RW_PLANAR: - case SWS_RW_PACKED: - read_glsl(ops, op, shd, n, type_name, type_v, type_s); - break; - default: - return AVERROR(ENOTSUP); - } - break; - } - case SWS_OP_WRITE: { - const char *dst_pos = ops->dst.interlaced ? "dpos" : "pos"; - if (op->rw.frac || op->rw.filter.op) { - return AVERROR(ENOTSUP); - } else if (op->rw.mode == SWS_RW_PACKED) { - GLSLF(1, imageStore(dst_img[%i], %s, %s(%s)); , - ops->plane_dst[0], dst_pos, type_v, type_name); - } else { - for (int i = 0; i < op->rw.elems; i++) - GLSLF(1, imageStore(dst_img[%i], %s, %s(%s[%i])); , - ops->plane_dst[i], dst_pos, type_v, type_name, i); - } - break; - } - case SWS_OP_SWIZZLE: { - av_bprintf(&shd->src, " %s = %s.", type_name, type_name); - for (int i = 0; i < 4; i++) - av_bprintf(&shd->src, "%c", "xyzw"[op->swizzle.in[i]]); - av_bprintf(&shd->src, ";\n"); - break; - } - case SWS_OP_CLEAR: { - for (int i = 0; i < 4; i++) { - if (!SWS_COMP_TEST(op->clear.mask, i)) - continue; - av_bprintf(&shd->src, " %s.%c = %s"QSTR";\n", type_name, - "xyzw"[i], type_s, QTYPE(op->clear.value[i])); - } - break; - } - case SWS_OP_SCALE: - av_bprintf(&shd->src, " %s = %s * "QSTR";\n", - type_name, type_name, QTYPE(op->scale.factor)); - break; - case SWS_OP_MIN: - case SWS_OP_MAX: - for (int i = 0; i < 4; i++) { - if (!op->clamp.limit[i].den) - continue; - av_bprintf(&shd->src, " %s.%c = %s(%s.%c, "QSTR");\n", - type_name, "xyzw"[i], - op->op == SWS_OP_MIN ? "min" : "max", - type_name, "xyzw"[i], QTYPE(op->clamp.limit[i])); - } - break; - case SWS_OP_LSHIFT: - case SWS_OP_RSHIFT: - av_bprintf(&shd->src, " %s %s= %i;\n", type_name, - op->op == SWS_OP_LSHIFT ? "<<" : ">>", op->shift.amount); - break; - case SWS_OP_CONVERT: - if (ff_sws_pixel_type_is_int(cur_type) && op->convert.expand) { - const AVRational64 sc = ff_sws_pixel_expand(op->type, op->convert.to); - av_bprintf(&shd->src, " %s = %s((%s*%"PRId64")/%"PRId64");\n", - type_name, type_v, ff_sws_pixel_type_name(op->type), - sc.num, sc.den); - } else { - av_bprintf(&shd->src, " %s = %s(%s);\n", - type_name, type_v, ff_sws_pixel_type_name(op->type)); - } - break; - case SWS_OP_DITHER: { - int size = (1 << op->dither.size_log2); - for (int i = 0; i < 4; i++) { - if (op->dither.y_offset[i] < 0) - continue; - av_bprintf(&shd->src, " %s.%c += dither_mat%i[(pos.y + %i) & %i]" - "[pos.x & %i];\n", - type_name, "xyzw"[i], n, - op->dither.y_offset[i], size - 1, - size - 1); - } - break; - } - case SWS_OP_LINEAR: - for (int i = 0; i < 4; i++) { - if (op->lin.m[i][4].num) - av_bprintf(&shd->src, " tmp.%c = "QSTR";\n", "xyzw"[i], - QTYPE(op->lin.m[i][4])); - else - av_bprintf(&shd->src, " tmp.%c = 0;\n", "xyzw"[i]); - for (int j = 0; j < 4; j++) { - if (!op->lin.m[i][j].num) - continue; - av_bprintf(&shd->src, " tmp.%c += f32.%c*"QSTR";\n", - "xyzw"[i], "xyzw"[j], QTYPE(op->lin.m[i][j])); - } - } - av_bprintf(&shd->src, " f32 = tmp;\n"); - break; - case SWS_OP_UNPACK: - /* MSB->LSB indexing */ - av_bprintf(&shd->src, " %s = %s.%s;\n", type_name, type_name, - ops->src.format == AV_PIX_FMT_X2BGR10 ? "wzyx" : "wxyz"); - break; - case SWS_OP_PACK: - /* LSB->MSB indexing */ - av_bprintf(&shd->src, " %s = %s.%s;\n", type_name, type_name, - ops->dst.format == AV_PIX_FMT_X2BGR10 ? "wzyx" : "yzwx"); - break; - default: - return AVERROR(ENOTSUP); - } - } - - GLSLC(0, } ); - - err = s->spvc->compile_shader(&s->vkctx, s->spvc, shd, - &spv_data, &spv_len, "main", - &spv_opaque); - if (err < 0) - return err; - - err = ff_vk_shader_link(&s->vkctx, shd, spv_data, spv_len, "main"); - - if (spv_opaque) - s->spvc->free_shader(s->spvc, &spv_opaque); - - if (err < 0) - return err; - - return 0; -} -#endif - -static int compile(SwsContext *sws, const SwsOpList *ops, SwsCompiledOp *out, - int glsl) +static int compile(SwsContext *sws, const SwsOpList *ops, SwsCompiledOp *out) { int err; SwsInternal *c = sws_internal(sws); @@ -1638,17 +1295,10 @@ static int compile(SwsContext *sws, const SwsOpList *ops, SwsCompiledOp *out, if (err < 0) goto fail; - if (glsl) { - err = AVERROR(ENOTSUP); -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG - err = add_ops_glsl(sws, p, s, ops, &p->shd); -#endif - } else { - err = AVERROR(ENOTSUP); + err = AVERROR(ENOTSUP); #if HAVE_SPIRV_HEADERS_SPIRV_H || HAVE_SPIRV_UNIFIED1_SPIRV_H - err = add_ops_spirv(sws, p, s, ops, &p->shd); + err = add_ops_spirv(sws, p, s, ops, &p->shd); #endif - } if (err < 0) goto fail; @@ -1679,7 +1329,7 @@ fail: static int compile_spirv(SwsContext *sws, const SwsOpList *ops, SwsCompiledOp *out) { - return compile(sws, ops, out, 0); + return compile(sws, ops, out); } const SwsOpBackend backend_spirv = { @@ -1689,18 +1339,3 @@ const SwsOpBackend backend_spirv = { .hw_format = AV_PIX_FMT_VULKAN, }; #endif - -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG -static int compile_glsl(SwsContext *sws, const SwsOpList *ops, - SwsCompiledOp *out) -{ - return compile(sws, ops, out, 1); -} - -const SwsOpBackend backend_glsl = { - .name = "glsl", - .flags = SWS_BACKEND_GLSL, - .compile = compile_glsl, - .hw_format = AV_PIX_FMT_VULKAN, -}; -#endif diff --git a/libswscale/vulkan/ops.h b/libswscale/vulkan/ops.h index 6c9ae6c7fd..26596bee5f 100644 --- a/libswscale/vulkan/ops.h +++ b/libswscale/vulkan/ops.h @@ -24,16 +24,9 @@ #include "libavutil/vulkan.h" #include "../swscale.h" -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG -#include "libavutil/vulkan_spirv.h" -#endif - typedef struct FFVulkanOpsCtx { FFVulkanContext vkctx; AVVulkanDeviceQueueFamily *qf; -#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG - FFVkSPIRVCompiler *spvc; -#endif } FFVulkanOpsCtx; int ff_sws_vk_init(SwsContext *sws, AVBufferRef *dev_ref); diff --git a/libswscale/vulkan/vulkan_glslang.c b/libswscale/vulkan/vulkan_glslang.c deleted file mode 100644 index 9aa41567a3..0000000000 --- a/libswscale/vulkan/vulkan_glslang.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "libavutil/vulkan_glslang.c" diff --git a/libswscale/vulkan/vulkan_shaderc.c b/libswscale/vulkan/vulkan_shaderc.c deleted file mode 100644 index 9f60bf4dfd..0000000000 --- a/libswscale/vulkan/vulkan_shaderc.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "libavutil/vulkan_shaderc.c" -- 2.52.0 >From 989c855733035560ef6fd343f8d6f1cd919ec313 Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Sun, 12 Jul 2026 14:11:45 +0900 Subject: [PATCH 4/5] vulkan: remove runtime shader compilation support No longer needed. --- libavcodec/apv_encode_vulkan.c | 6 +- libavcodec/ffv1enc_vulkan.c | 26 ++-- libavcodec/proresenc_kostya_vulkan.c | 10 +- libavcodec/vulkan_apv.c | 4 +- libavcodec/vulkan_dpx.c | 2 +- libavcodec/vulkan_ffv1.c | 12 +- libavcodec/vulkan_prores.c | 4 +- libavcodec/vulkan_prores_raw.c | 4 +- libavfilter/vf_avgblur_vulkan.c | 2 +- libavfilter/vf_blackdetect_vulkan.c | 2 +- libavfilter/vf_blend_vulkan.c | 2 +- libavfilter/vf_bwdif_vulkan.c | 2 +- libavfilter/vf_chromaber_vulkan.c | 2 +- libavfilter/vf_flip_vulkan.c | 2 +- libavfilter/vf_gblur_vulkan.c | 6 +- libavfilter/vf_interlace_vulkan.c | 2 +- libavfilter/vf_nlmeans_vulkan.c | 12 +- libavfilter/vf_overlay_vulkan.c | 2 +- libavfilter/vf_scale_vulkan.c | 4 +- libavfilter/vf_scdet_vulkan.c | 2 +- libavfilter/vf_transpose_vulkan.c | 2 +- libavfilter/vf_v360_vulkan.c | 2 +- libavfilter/vf_xfade_vulkan.c | 2 +- libavfilter/vsrc_testsrc_vulkan.c | 2 +- libavutil/vulkan.c | 181 +-------------------------- libavutil/vulkan.h | 59 +-------- libswscale/vulkan/ops.c | 4 +- 27 files changed, 67 insertions(+), 293 deletions(-) diff --git a/libavcodec/apv_encode_vulkan.c b/libavcodec/apv_encode_vulkan.c index c4a4e8732c..076d151d77 100644 --- a/libavcodec/apv_encode_vulkan.c +++ b/libavcodec/apv_encode_vulkan.c @@ -258,7 +258,7 @@ static int init_dct_shader(AVCodecContext *avctx) .elems = av_pix_fmt_count_planes(ev->sw_format), }, }; - RET(ff_vk_shader_add_descriptor_set(&ev->s, shd, desc_set, 2, 0, 0)); + ff_vk_shader_add_descriptor_set(&ev->s, shd, desc_set, 2, 0); RET(ff_vk_shader_link(&ev->s, shd, ff_apv_encode_dct_comp_spv_data, @@ -299,7 +299,7 @@ static int init_entropy_shader(AVCodecContext *avctx, int blocks_per_mb, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - RET(ff_vk_shader_add_descriptor_set(&ev->s, shd, desc_set, 2, 0, 0)); + ff_vk_shader_add_descriptor_set(&ev->s, shd, desc_set, 2, 0); RET(ff_vk_shader_link(&ev->s, shd, ff_apv_encode_tiles_comp_spv_data, @@ -330,7 +330,7 @@ static int init_compact_shader(AVCodecContext *avctx) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - RET(ff_vk_shader_add_descriptor_set(&ev->s, shd, desc_set, 1, 0, 0)); + ff_vk_shader_add_descriptor_set(&ev->s, shd, desc_set, 1, 0); RET(ff_vk_shader_link(&ev->s, shd, ff_seg_gather_comp_spv_data, diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c index 7e7edbfd0e..34a18fcb57 100644 --- a/libavcodec/ffv1enc_vulkan.c +++ b/libavcodec/ffv1enc_vulkan.c @@ -967,7 +967,7 @@ static int init_rct_search_shader(AVCodecContext *avctx, VkSpecializationInfo *s .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -980,7 +980,7 @@ static int init_rct_search_shader(AVCodecContext *avctx, VkSpecializationInfo *s .elems = av_pix_fmt_count_planes(fv->s.frames->sw_format), }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0); RET(ff_vk_shader_link(&fv->s, shd, ff_ffv1_enc_rct_search_comp_spv_data, @@ -1011,7 +1011,7 @@ static int init_sort32_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -1028,7 +1028,7 @@ static int init_sort32_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 3, 0, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 3, 0); RET(ff_vk_shader_link(&fv->s, shd, ff_ffv1_enc_sort32_comp_spv_data, @@ -1058,7 +1058,7 @@ static int init_remap_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -1075,7 +1075,7 @@ static int init_remap_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 3, 0, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 3, 0); RET(ff_vk_shader_link(&fv->s, shd, ff_ffv1_enc_remap_comp_spv_data, @@ -1105,7 +1105,7 @@ static int init_setup_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -1117,7 +1117,7 @@ static int init_setup_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0); RET(ff_vk_shader_link(&fv->s, shd, ff_ffv1_enc_setup_comp_spv_data, @@ -1149,7 +1149,7 @@ static int init_reset_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 1, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -1161,7 +1161,7 @@ static int init_reset_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 2, 0); if (fv->ctx.ac == AC_GOLOMB_RICE) RET(ff_vk_shader_link(&fv->s, shd, @@ -1206,7 +1206,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_const, 3, 1, 0); + ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set_const, 3, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -1236,7 +1236,7 @@ static int init_encode_shader(AVCodecContext *avctx, VkSpecializationInfo *sl) }, }; ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, - 4 + fv->is_rgb + !!f->remap_mode, 0, 0); + 4 + fv->is_rgb + !!f->remap_mode, 0); if (f->bayer) { if (fv->ctx.ac == AC_GOLOMB_RICE) @@ -1300,7 +1300,7 @@ static int init_gather_shader(AVCodecContext *avctx) .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, 1, 0); RET(ff_vk_shader_link(&fv->s, shd, ff_seg_gather_comp_spv_data, diff --git a/libavcodec/proresenc_kostya_vulkan.c b/libavcodec/proresenc_kostya_vulkan.c index ab71394337..e95302f928 100644 --- a/libavcodec/proresenc_kostya_vulkan.c +++ b/libavcodec/proresenc_kostya_vulkan.c @@ -169,7 +169,7 @@ static int init_slice_data_pipeline(ProresVulkanContext *pv, FFVulkanShader *shd .elems = av_pix_fmt_count_planes(vkctx->frames->sw_format), }, }; - RET(ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 2, 0, 0)); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 2, 0); ff_vk_shader_add_push_const(shd, 0, sizeof(SliceDataInfo), VK_SHADER_STAGE_COMPUTE_BIT); @@ -210,7 +210,7 @@ static int init_alpha_data_pipeline(ProresVulkanContext *pv, FFVulkanShader* shd .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - RET(ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 2, 0, 0)); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 2, 0); RET(ff_vk_shader_link(vkctx, shd, ff_prores_ks_alpha_data_comp_spv_data, @@ -260,7 +260,7 @@ static int init_estimate_slice_pipeline(ProresVulkanContext *pv, FFVulkanShader* .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - RET(ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 3, 0, 0)); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 3, 0); RET(ff_vk_shader_link(vkctx, shd, ff_prores_ks_estimate_slice_comp_spv_data, @@ -304,7 +304,7 @@ static int init_trellis_node_pipeline(ProresVulkanContext *pv, FFVulkanShader* s .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - RET(ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 2, 0, 0)); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 2, 0); RET(ff_vk_shader_link(vkctx, shd, ff_prores_ks_trellis_node_comp_spv_data, @@ -350,7 +350,7 @@ static int init_encode_slice_pipeline(ProresVulkanContext *pv, FFVulkanShader* s .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - RET(ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 3, 0, 0)); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc, 3, 0); ff_vk_shader_add_push_const(shd, 0, sizeof(EncodeSliceInfo), VK_SHADER_STAGE_COMPUTE_BIT); diff --git a/libavcodec/vulkan_apv.c b/libavcodec/vulkan_apv.c index 4c9b61d7e6..9c077cafb4 100644 --- a/libavcodec/vulkan_apv.c +++ b/libavcodec/vulkan_apv.c @@ -409,7 +409,7 @@ static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, } }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0); RET(ff_vk_shader_link(s, shd, ff_apv_decode_comp_spv_data, @@ -464,7 +464,7 @@ static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0); RET(ff_vk_shader_link(s, shd, ff_apv_idct_comp_spv_data, diff --git a/libavcodec/vulkan_dpx.c b/libavcodec/vulkan_dpx.c index f0963f0f39..103dd65694 100644 --- a/libavcodec/vulkan_dpx.c +++ b/libavcodec/vulkan_dpx.c @@ -252,7 +252,7 @@ static int init_shader(AVCodecContext *avctx, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2 + (2*!unpack), 0, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2 + (2*!unpack), 0); const unsigned char *src = ff_dpx_copy_comp_spv_data; size_t src_len = ff_dpx_copy_comp_spv_len; diff --git a/libavcodec/vulkan_ffv1.c b/libavcodec/vulkan_ffv1.c index 4be037d2dc..d61f66455e 100644 --- a/libavcodec/vulkan_ffv1.c +++ b/libavcodec/vulkan_ffv1.c @@ -583,7 +583,7 @@ static int init_setup_shader(FFV1Context *f, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set_const, 2, 1, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set_const, 2, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -603,7 +603,7 @@ static int init_setup_shader(FFV1Context *f, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set, 4, 0, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 4, 0); RET(ff_vk_shader_link(s, shd, ff_ffv1_dec_setup_comp_spv_data, @@ -634,7 +634,7 @@ static int init_reset_shader(FFV1Context *f, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set_const, 1, 1, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set_const, 1, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -646,7 +646,7 @@ static int init_reset_shader(FFV1Context *f, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2, 0); if (ac == AC_GOLOMB_RICE) RET(ff_vk_shader_link(s, shd, @@ -689,7 +689,7 @@ static int init_decode_shader(FFV1Context *f, FFVulkanContext *s, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set_const, 2, 1, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set_const, 2, 1); const FFVulkanDescriptorSetBinding desc_set[] = { { /* slice_data_buf */ @@ -733,7 +733,7 @@ static int init_decode_shader(FFV1Context *f, FFVulkanContext *s, /* Bindings 5 (dst) and 6 (fltmap_buf) are conditional */ ff_vk_shader_add_descriptor_set(s, shd, desc_set, 5 + rgb + (is_float && !bayer), - 0, 0); + 0); if (bayer) { if (ac == AC_GOLOMB_RICE) diff --git a/libavcodec/vulkan_prores.c b/libavcodec/vulkan_prores.c index c5611894b1..ef3b5381a6 100644 --- a/libavcodec/vulkan_prores.c +++ b/libavcodec/vulkan_prores.c @@ -387,7 +387,7 @@ static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, .elems = av_pix_fmt_count_planes(dec_frames_ctx->sw_format), }, }; - ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0); RET(ff_vk_shader_link(s, shd, ff_prores_vld_comp_spv_data, @@ -443,7 +443,7 @@ static int init_idct_shader(AVCodecContext *avctx, FFVulkanContext *s, .elems = av_pix_fmt_count_planes(dec_frames_ctx->sw_format), }, }; - RET(ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0, 0)); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 3, 0); RET(ff_vk_shader_link(s, shd, ff_prores_idct_comp_spv_data, diff --git a/libavcodec/vulkan_prores_raw.c b/libavcodec/vulkan_prores_raw.c index 4a8d92c627..3642f5aa77 100644 --- a/libavcodec/vulkan_prores_raw.c +++ b/libavcodec/vulkan_prores_raw.c @@ -290,7 +290,9 @@ static int add_desc(AVCodecContext *avctx, FFVulkanContext *s, }, }; - return ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(s, shd, desc_set, 2, 0); + + return 0; } static int init_decode_shader(AVCodecContext *avctx, FFVulkanContext *s, diff --git a/libavfilter/vf_avgblur_vulkan.c b/libavfilter/vf_avgblur_vulkan.c index 3716f62ccd..da00e3579d 100644 --- a/libavfilter/vf_avgblur_vulkan.c +++ b/libavfilter/vf_avgblur_vulkan.c @@ -81,7 +81,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 2, 0); RET(ff_vk_shader_link(vkctx, &s->shd, ff_avgblur_comp_spv_data, diff --git a/libavfilter/vf_blackdetect_vulkan.c b/libavfilter/vf_blackdetect_vulkan.c index 3a8da6a7e9..298b298a18 100644 --- a/libavfilter/vf_blackdetect_vulkan.c +++ b/libavfilter/vf_blackdetect_vulkan.c @@ -101,7 +101,7 @@ static av_cold int init_filter(AVFilterContext *ctx) .stages = VK_SHADER_STAGE_COMPUTE_BIT, } }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0); RET(ff_vk_shader_link(vkctx, &s->shd, ff_blackdetect_comp_spv_data, diff --git a/libavfilter/vf_blend_vulkan.c b/libavfilter/vf_blend_vulkan.c index b0eeed0b95..525381c04f 100644 --- a/libavfilter/vf_blend_vulkan.c +++ b/libavfilter/vf_blend_vulkan.c @@ -131,7 +131,7 @@ static av_cold int init_filter(AVFilterContext *avctx) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0); RET(ff_vk_shader_link(vkctx, &s->shd, ff_blend_comp_spv_data, diff --git a/libavfilter/vf_bwdif_vulkan.c b/libavfilter/vf_bwdif_vulkan.c index ea4154daf5..c8f6ad1fed 100644 --- a/libavfilter/vf_bwdif_vulkan.c +++ b/libavfilter/vf_bwdif_vulkan.c @@ -86,7 +86,7 @@ static av_cold int init_filter(AVFilterContext *ctx) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 4, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 4, 0); ff_vk_shader_add_push_const(&s->shd, 0, sizeof(BWDIFParameters), VK_SHADER_STAGE_COMPUTE_BIT); diff --git a/libavfilter/vf_chromaber_vulkan.c b/libavfilter/vf_chromaber_vulkan.c index fa0bc8e300..7a9bf77e09 100644 --- a/libavfilter/vf_chromaber_vulkan.c +++ b/libavfilter/vf_chromaber_vulkan.c @@ -84,7 +84,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0); RET(ff_vk_shader_link(vkctx, shd, ff_chromaber_comp_spv_data, diff --git a/libavfilter/vf_flip_vulkan.c b/libavfilter/vf_flip_vulkan.c index b86f236d2a..b44c12c49d 100644 --- a/libavfilter/vf_flip_vulkan.c +++ b/libavfilter/vf_flip_vulkan.c @@ -78,7 +78,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0); RET(ff_vk_shader_link(vkctx, shd, ff_flip_comp_spv_data, diff --git a/libavfilter/vf_gblur_vulkan.c b/libavfilter/vf_gblur_vulkan.c index 18d65df8c9..021c94f5a5 100644 --- a/libavfilter/vf_gblur_vulkan.c +++ b/libavfilter/vf_gblur_vulkan.c @@ -122,7 +122,7 @@ static int init_gblur_pipeline(GBlurVulkanContext *s, .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, .stages = VK_SHADER_STAGE_COMPUTE_BIT, }; - ff_vk_shader_add_descriptor_set(&s->vkctx, shd, &buf_desc, 1, 1, 0); + ff_vk_shader_add_descriptor_set(&s->vkctx, shd, &buf_desc, 1, 1); RET(ff_vk_shader_link(&s->vkctx, shd, ff_gblur_comp_spv_data, @@ -180,13 +180,13 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) /* Horizontal */ ff_vk_shader_load(&s->shd_hor, VK_SHADER_STAGE_COMPUTE_BIT, NULL, (uint32_t []) { 32, 1, 1 }, 0); - ff_vk_shader_add_descriptor_set(vkctx, &s->shd_hor, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd_hor, desc, 2, 0); RET(init_gblur_pipeline(s, &s->shd_hor, &s->params_hor, s->size, s->sigma)); /* Vertical */ ff_vk_shader_load(&s->shd_ver, VK_SHADER_STAGE_COMPUTE_BIT, NULL, (uint32_t []) { 1, 32, 1 }, 0); - ff_vk_shader_add_descriptor_set(vkctx, &s->shd_ver, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd_ver, desc, 2, 0); RET(init_gblur_pipeline(s, &s->shd_ver, &s->params_ver, s->sizeV, s->sigmaV)); s->initialized = 1; diff --git a/libavfilter/vf_interlace_vulkan.c b/libavfilter/vf_interlace_vulkan.c index 6f393a7a08..3de16c51ed 100644 --- a/libavfilter/vf_interlace_vulkan.c +++ b/libavfilter/vf_interlace_vulkan.c @@ -88,7 +88,7 @@ static av_cold int init_filter(AVFilterContext *ctx) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0); RET(ff_vk_shader_link(vkctx, &s->shd, ff_interlace_comp_spv_data, diff --git a/libavfilter/vf_nlmeans_vulkan.c b/libavfilter/vf_nlmeans_vulkan.c index 902c072669..2a41f6fd8d 100644 --- a/libavfilter/vf_nlmeans_vulkan.c +++ b/libavfilter/vf_nlmeans_vulkan.c @@ -122,7 +122,7 @@ static av_cold int init_integral_pipeline(FFVulkanContext *vkctx, FFVkExecPool * .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_img, 1, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_img, 1, 0); const FFVulkanDescriptorSetBinding desc_set_xyoffsets[] = { { /* xyoffsets_buffer */ @@ -130,7 +130,7 @@ static av_cold int init_integral_pipeline(FFVulkanContext *vkctx, FFVkExecPool * .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_xyoffsets, 1, 1, 0); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_xyoffsets, 1, 1); RET(ff_vk_shader_link(vkctx, shd, ff_nlmeans_vertical_comp_spv_data, @@ -185,7 +185,7 @@ static av_cold int init_weights_pipeline(FFVulkanContext *vkctx, FFVkExecPool *e .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set, 3, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set, 3, 0); const FFVulkanDescriptorSetBinding desc_set_xyoffsets[] = { { /* xyoffsets_buffer */ @@ -193,7 +193,7 @@ static av_cold int init_weights_pipeline(FFVulkanContext *vkctx, FFVkExecPool *e .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_xyoffsets, 1, 1, 0); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_xyoffsets, 1, 1); RET(ff_vk_shader_link(vkctx, shd, ff_nlmeans_weights_comp_spv_data, @@ -238,7 +238,7 @@ static av_cold int init_denoise_pipeline(FFVulkanContext *vkctx, FFVkExecPool *e .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_img, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_img, 2, 0); const FFVulkanDescriptorSetBinding desc_set_ws[] = { { /* weights_buffer */ @@ -250,7 +250,7 @@ static av_cold int init_denoise_pipeline(FFVulkanContext *vkctx, FFVkExecPool *e .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_ws, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, shd, desc_set_ws, 2, 0); RET(ff_vk_shader_link(vkctx, shd, ff_nlmeans_denoise_comp_spv_data, diff --git a/libavfilter/vf_overlay_vulkan.c b/libavfilter/vf_overlay_vulkan.c index 67b372a6f1..561fd812bd 100644 --- a/libavfilter/vf_overlay_vulkan.c +++ b/libavfilter/vf_overlay_vulkan.c @@ -95,7 +95,7 @@ static av_cold int init_filter(AVFilterContext *ctx) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0); RET(ff_vk_shader_link(vkctx, shd, ff_overlay_comp_spv_data, diff --git a/libavfilter/vf_scale_vulkan.c b/libavfilter/vf_scale_vulkan.c index 4e54d8806c..2cb5e15587 100644 --- a/libavfilter/vf_scale_vulkan.c +++ b/libavfilter/vf_scale_vulkan.c @@ -143,7 +143,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0); ff_vk_shader_add_push_const(&s->shd, 0, sizeof(s->opts), VK_SHADER_STAGE_COMPUTE_BIT); @@ -211,7 +211,7 @@ static av_cold int init_debayer(AVFilterContext *ctx, AVFrame *in) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0); RET(ff_vk_shader_link(vkctx, shd, ff_debayer_comp_spv_data, diff --git a/libavfilter/vf_scdet_vulkan.c b/libavfilter/vf_scdet_vulkan.c index 552904a2bb..97273cc750 100644 --- a/libavfilter/vf_scdet_vulkan.c +++ b/libavfilter/vf_scdet_vulkan.c @@ -94,7 +94,7 @@ static av_cold int init_filter(AVFilterContext *ctx) .stages = VK_SHADER_STAGE_COMPUTE_BIT, } }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0); RET(ff_vk_shader_link(vkctx, &s->shd, ff_scdet_comp_spv_data, diff --git a/libavfilter/vf_transpose_vulkan.c b/libavfilter/vf_transpose_vulkan.c index e193bb6829..2eef40d061 100644 --- a/libavfilter/vf_transpose_vulkan.c +++ b/libavfilter/vf_transpose_vulkan.c @@ -75,7 +75,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 2, 0); RET(ff_vk_shader_link(vkctx, &s->shd, ff_transpose_comp_spv_data, diff --git a/libavfilter/vf_v360_vulkan.c b/libavfilter/vf_v360_vulkan.c index 25b55276f4..a88fc6f0a6 100644 --- a/libavfilter/vf_v360_vulkan.c +++ b/libavfilter/vf_v360_vulkan.c @@ -145,7 +145,7 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 2, 0); RET(ff_vk_shader_link(vkctx, &s->shd, ff_v360_comp_spv_data, diff --git a/libavfilter/vf_xfade_vulkan.c b/libavfilter/vf_xfade_vulkan.c index 8dcf0bef5c..82868d6933 100644 --- a/libavfilter/vf_xfade_vulkan.c +++ b/libavfilter/vf_xfade_vulkan.c @@ -128,7 +128,7 @@ static av_cold int init_vulkan(AVFilterContext *avctx) .stages = VK_SHADER_STAGE_COMPUTE_BIT, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc, 3, 0); ff_vk_shader_add_push_const(&s->shd, 0, sizeof(XFadeParameters), VK_SHADER_STAGE_COMPUTE_BIT); diff --git a/libavfilter/vsrc_testsrc_vulkan.c b/libavfilter/vsrc_testsrc_vulkan.c index 6475423f39..bad6c0372a 100644 --- a/libavfilter/vsrc_testsrc_vulkan.c +++ b/libavfilter/vsrc_testsrc_vulkan.c @@ -94,7 +94,7 @@ static av_cold int init_filter(AVFilterContext *ctx, enum TestSrcVulkanMode mode .elems = planes, }, }; - ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 1, 0, 0); + ff_vk_shader_add_descriptor_set(vkctx, &s->shd, desc_set, 1, 0); if (mode == TESTSRC_COLOR) { double rgb2yuv[3][3]; diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index 07580dda3b..3b2cc35bf9 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -2162,92 +2162,6 @@ int ff_vk_shader_load(FFVulkanShader *shd, return 0; } -int ff_vk_shader_init(FFVulkanContext *s, FFVulkanShader *shd, const char *name, - VkPipelineStageFlags stage, - const char *extensions[], int nb_extensions, - int lg_x, int lg_y, int lg_z, - uint32_t required_subgroup_size) -{ - ff_vk_shader_load(shd, stage, NULL, - (uint32_t []) { lg_x, lg_y, lg_z }, required_subgroup_size); - - shd->name = name; - shd->precompiled = 0; - av_bprint_init(&shd->src, 0, AV_BPRINT_SIZE_UNLIMITED); - - if (required_subgroup_size) { - shd->subgroup_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO; - shd->subgroup_info.requiredSubgroupSize = required_subgroup_size; - } - - av_bprintf(&shd->src, "/* %s shader: %s */\n", - (stage == VK_SHADER_STAGE_TASK_BIT_EXT || - stage == VK_SHADER_STAGE_MESH_BIT_EXT) ? - "Mesh" : - (shd->bind_point == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) ? - "Raytrace" : - (shd->bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) ? - "Compute" : "Graphics", - name); - GLSLF(0, #version %i ,460); - GLSLC(0, ); - - /* Common utilities */ - GLSLC(0, #define IS_WITHIN(v1, v2) ((v1.x < v2.x) && (v1.y < v2.y)) ); - GLSLC(0, ); - GLSLC(0, #extension GL_EXT_scalar_block_layout : require ); - GLSLC(0, #extension GL_EXT_shader_explicit_arithmetic_types : require ); - GLSLC(0, #extension GL_EXT_control_flow_attributes : require ); - GLSLC(0, #extension GL_EXT_shader_image_load_formatted : require ); - if (s->extensions & FF_VK_EXT_EXPECT_ASSUME) { - GLSLC(0, #extension GL_EXT_expect_assume : require ); - } else { - GLSLC(0, #define assumeEXT(x) (x) ); - GLSLC(0, #define expectEXT(x, c) (x) ); - } - if ((s->extensions & FF_VK_EXT_DEBUG_UTILS) && - (s->extensions & FF_VK_EXT_RELAXED_EXTENDED_INSTR)) { - GLSLC(0, #extension GL_EXT_debug_printf : require ); - GLSLC(0, #define DEBUG ); - } - - if (stage == VK_SHADER_STAGE_TASK_BIT_EXT || - stage == VK_SHADER_STAGE_MESH_BIT_EXT) - GLSLC(0, #extension GL_EXT_mesh_shader : require ); - - for (int i = 0; i < nb_extensions; i++) - GLSLF(0, #extension %s : %s ,extensions[i], "require"); - GLSLC(0, ); - - GLSLF(0, layout (local_size_x = %i, local_size_y = %i, local_size_z = %i) in; - , shd->lg_size[0], shd->lg_size[1], shd->lg_size[2]); - GLSLC(0, ); - - return 0; -} - -void ff_vk_shader_print(void *ctx, FFVulkanShader *shd, int prio) -{ - int line = 0; - const char *p = shd->src.str; - const char *start = p; - const size_t len = strlen(p); - - AVBPrint buf; - av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED); - - for (int i = 0; i < len; i++) { - if (p[i] == '\n') { - av_bprintf(&buf, "%i\t", ++line); - av_bprint_append_data(&buf, start, &p[i] - start + 1); - start = &p[i + 1]; - } - } - - av_log(ctx, prio, "Shader %s: \n%s", shd->name, buf.str); - av_bprint_finalize(&buf, NULL); -} - static int init_pipeline_layout(FFVulkanContext *s, FFVulkanShader *shd) { VkResult ret; @@ -2522,34 +2436,10 @@ end: return err; } -static const struct descriptor_props { - size_t struct_size; /* Size of the opaque which updates the descriptor */ - const char *type; - int is_uniform; - int mem_quali; /* Can use a memory qualifier */ - int dim_needed; /* Must indicate dimension */ - int buf_content; /* Must indicate buffer contents */ -} descriptor_props[] = { - [VK_DESCRIPTOR_TYPE_SAMPLER] = { sizeof(VkDescriptorImageInfo), "sampler", 1, 0, 0, 0, }, - [VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] = { sizeof(VkDescriptorImageInfo), "texture", 1, 0, 1, 0, }, - [VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] = { sizeof(VkDescriptorImageInfo), "image", 1, 1, 1, 0, }, - [VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT] = { sizeof(VkDescriptorImageInfo), "subpassInput", 1, 0, 0, 0, }, - [VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] = { sizeof(VkDescriptorImageInfo), "sampler", 1, 0, 1, 0, }, - [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER] = { sizeof(VkDescriptorBufferInfo), NULL, 1, 0, 0, 1, }, - [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER] = { sizeof(VkDescriptorBufferInfo), "buffer", 0, 1, 0, 1, }, - [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] = { sizeof(VkDescriptorBufferInfo), NULL, 1, 0, 0, 1, }, - [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] = { sizeof(VkDescriptorBufferInfo), "buffer", 0, 1, 0, 1, }, - [VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER] = { sizeof(VkBufferView), "samplerBuffer", 1, 0, 0, 0, }, - [VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER] = { sizeof(VkBufferView), "imageBuffer", 1, 0, 0, 0, }, -}; - -int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, - const FFVulkanDescriptorSetBinding *desc, int nb, - int singular, int print_to_shader_only) +void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, + const FFVulkanDescriptorSetBinding *desc, int nb, + int singular) { - if (print_to_shader_only) - goto print; - FFVulkanDescriptorSet *set = &shd->desc_set[shd->nb_descriptor_sets++]; av_assert1(shd->nb_descriptor_sets < FF_VK_MAX_DESCRIPTOR_SETS); av_assert1(nb < FF_VK_MAX_DESCRIPTOR_BINDINGS); @@ -2578,69 +2468,6 @@ int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, set->singular = singular; set->nb_bindings = nb; - - if (shd->precompiled) - return 0; - -print: - /* Write shader info */ - for (int i = 0; i < nb; i++) { - const struct descriptor_props *prop = &descriptor_props[desc[i].type]; - GLSLA("layout (set = %i, binding = %i", FFMAX(shd->nb_descriptor_sets - 1, 0), i); - - if (desc[i].mem_layout && - (desc[i].type != VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)) - GLSLA(", %s", desc[i].mem_layout); - - GLSLA(")"); - - if (prop->is_uniform) - GLSLA(" uniform"); - - if (prop->mem_quali && desc[i].mem_quali) - GLSLA(" %s", desc[i].mem_quali); - - if (prop->type) { - GLSLA(" "); - if (desc[i].type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) { - if (desc[i].mem_layout) { - int len = strlen(desc[i].mem_layout); - if (desc[i].mem_layout[len - 1] == 'i' && - desc[i].mem_layout[len - 2] == 'u') { - GLSLA("u"); - } else if (desc[i].mem_layout[len - 1] == 'i') { - GLSLA("i"); - } - } - } - GLSLA("%s", prop->type); - } - - if (prop->dim_needed) - GLSLA("%iD", desc[i].dimensions); - - GLSLA(" %s", desc[i].name); - - if (prop->buf_content) { - GLSLA(" {\n "); - if (desc[i].buf_elems) { - GLSLA("%s", desc[i].buf_content); - GLSLA("[%i];", desc[i].buf_elems); - } else { - GLSLA("%s", desc[i].buf_content); - } - GLSLA("\n}"); - } - - if (desc[i].elems > 0) - GLSLA("[%i]", desc[i].elems); - - GLSLA(";"); - GLSLA("\n"); - } - GLSLA("\n"); - - return 0; } int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, @@ -2854,8 +2681,6 @@ void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd) { FFVulkanFunctions *vk = &s->vkfn; - av_bprint_finalize(&shd->src, NULL); - #if 0 if (shd->shader.module) vk->DestroyShaderModule(s->hwctx->act_dev, shd->shader.module, diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h index 1a2fcc74f1..b37d998d37 100644 --- a/libavutil/vulkan.h +++ b/libavutil/vulkan.h @@ -24,46 +24,12 @@ #include <stdatomic.h> #include "pixdesc.h" -#include "bprint.h" #include "hwcontext.h" #include "vulkan_functions.h" #include "hwcontext_vulkan.h" #include "avassert.h" #include "intreadwrite.h" -/* GLSL management macros */ -#define INDENT(N) INDENT_##N -#define INDENT_0 -#define INDENT_1 INDENT_0 " " -#define INDENT_2 INDENT_1 INDENT_1 -#define INDENT_3 INDENT_2 INDENT_1 -#define INDENT_4 INDENT_3 INDENT_1 -#define INDENT_5 INDENT_4 INDENT_1 -#define INDENT_6 INDENT_5 INDENT_1 -#define C(N, S) INDENT(N) #S "\n" - -#define GLSLC(N, S) \ - do { \ - av_bprintf(&shd->src, C(N, S)); \ - } while (0) - -#define GLSLA(...) \ - do { \ - av_bprintf(&shd->src, __VA_ARGS__); \ - } while (0) - -#define GLSLF(N, S, ...) \ - do { \ - av_bprintf(&shd->src, C(N, S), __VA_ARGS__); \ - } while (0) - -#define GLSLD(D) \ - do { \ - av_bprintf(&shd->src, "\n"); \ - av_bprint_append_data(&shd->src, D, strlen(D)); \ - av_bprintf(&shd->src, "\n"); \ - } while (0) - /* Helper, pretty much every Vulkan return value needs to be checked */ #define RET(x) \ do { \ @@ -230,9 +196,6 @@ typedef struct FFVulkanShader { int precompiled; VkSpecializationInfo *specialization_info; - /* Shader text */ - AVBPrint src; - /* Compute shader local group sizes */ uint32_t lg_size[3]; @@ -636,16 +599,6 @@ int ff_vk_host_map_buffer(FFVulkanContext *s, AVBufferRef **dst, int ff_vk_init_sampler(FFVulkanContext *s, VkSampler *sampler, int unnorm_coords, VkFilter filt); -/** - * Initialize a shader object, with a specific set of extensions, type+bind, - * local group size, and subgroup requirements. - */ -int ff_vk_shader_init(FFVulkanContext *s, FFVulkanShader *shd, const char *name, - VkPipelineStageFlags stage, - const char *extensions[], int nb_extensions, - int lg_x, int lg_y, int lg_z, - uint32_t required_subgroup_size); - /** * Initialize a shader object. * If spec is non-null, it must have been created with SPEC_LIST_CREATE(). @@ -655,12 +608,6 @@ int ff_vk_shader_load(FFVulkanShader *shd, VkPipelineStageFlags stage, VkSpecializationInfo *spec, uint32_t wg_size[3], uint32_t required_subgroup_size); -/** - * Output the shader code as logging data, with a specific - * priority. - */ -void ff_vk_shader_print(void *ctx, FFVulkanShader *shd, int prio); - /** * Link a shader into an executable. */ @@ -677,9 +624,9 @@ int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, /** * Add descriptor to a shader. Must be called before shader init. */ -int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, - const FFVulkanDescriptorSetBinding *desc, int nb, - int singular, int print_to_shader_only); +void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, + const FFVulkanDescriptorSetBinding *desc, int nb, + int singular); /** * Register a shader with an exec pool. diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c index c4abc8fcec..83d2ddea52 100644 --- a/libswscale/vulkan/ops.c +++ b/libswscale/vulkan/ops.c @@ -937,7 +937,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s, .elems = 4, }, }; - ff_vk_shader_add_descriptor_set(&s->vkctx, shd, desc_set, 2, 0, 0); + ff_vk_shader_add_descriptor_set(&s->vkctx, shd, desc_set, 2, 0); /* Create dither buffers */ int err = create_bufs(s, p, ops); @@ -997,7 +997,7 @@ static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s, } if (nb_data_bufs) ff_vk_shader_add_descriptor_set(&s->vkctx, shd, desc_set, - nb_data_bufs, 1, 0); + nb_data_bufs, 1); if (id->interlaced) { id->push_const_struct_id = spi_get_id(spi); -- 2.52.0 >From 1b059eac9669a1923dc85a8940f8bb43d40efe66 Mon Sep 17 00:00:00 2001 From: Lynne <[email protected]> Date: Sun, 12 Jul 2026 14:11:59 +0900 Subject: [PATCH 5/5] configure: remove libshaderc and libglslang support All of it is now gone. --- configure | 36 +--- doc/filters.texi | 3 +- libavfilter/Makefile | 4 - libavfilter/vulkan_glslang.c | 19 --- libavfilter/vulkan_shaderc.c | 19 --- libavutil/Makefile | 2 - libavutil/vulkan_glslang.c | 307 ----------------------------------- libavutil/vulkan_shaderc.c | 144 ---------------- libavutil/vulkan_spirv.h | 44 ----- 9 files changed, 6 insertions(+), 572 deletions(-) delete mode 100644 libavfilter/vulkan_glslang.c delete mode 100644 libavfilter/vulkan_shaderc.c delete mode 100644 libavutil/vulkan_glslang.c delete mode 100644 libavutil/vulkan_shaderc.c delete mode 100644 libavutil/vulkan_spirv.h diff --git a/configure b/configure index 80954aa826..862822752e 100755 --- a/configure +++ b/configure @@ -237,7 +237,6 @@ External library support: --enable-libfreetype enable libfreetype, needed for drawtext filter [no] --enable-libfribidi enable libfribidi, improves drawtext filter [no] --enable-libharfbuzz enable libharfbuzz, needed for drawtext filter [no] - --enable-libglslang enable runtime GLSL->SPIRV compilation via libglslang [no] --enable-libgme enable Game Music Emu via libgme [no] --enable-libgsm enable GSM de/encoding via libgsm [no] --enable-libiec61883 enable iec61883 via libiec61883 [no] @@ -274,7 +273,6 @@ External library support: --enable-librsvg enable SVG rasterization via librsvg [no] --enable-librubberband enable rubberband needed for rubberband filter [no] --enable-librtmp enable RTMP[E] support via librtmp [no] - --enable-libshaderc enable runtime GLSL->SPIRV compilation via libshaderc [no] --enable-libshine enable fixed-point MP3 encoding via libshine [no] --enable-libsmbclient enable Samba protocol via libsmbclient [no] --enable-libsnappy enable Snappy compression, needed for hap encoding [no] @@ -2091,7 +2089,6 @@ EXTERNAL_LIBRARY_LIST=" libfreetype libfribidi libharfbuzz - libglslang libgme libgsm libiec61883 @@ -2123,7 +2120,6 @@ EXTERNAL_LIBRARY_LIST=" librist librsvg librtmp - libshaderc libshine libsmbclient libsnappy @@ -4306,7 +4302,7 @@ zoompan_filter_deps="swscale" zscale_filter_deps="libzimg const_nan" scale_vaapi_filter_deps="vaapi" scale_vt_filter_deps="videotoolbox VTPixelTransferSessionCreate" -scale_vulkan_filter_deps="vulkan spirv_compiler spirv_library" +scale_vulkan_filter_deps="vulkan spirv_compiler swscale" vpp_qsv_filter_deps="libmfx" vpp_qsv_filter_select="qsvvpp" xfade_opencl_filter_deps="opencl" @@ -4364,14 +4360,14 @@ avcodec_suggest="libm stdatomic zlib" avdevice_deps="avformat avcodec avutil" avdevice_suggest="libm stdatomic" avfilter_deps="avutil" -avfilter_suggest="libm stdatomic zlib spirv_library" +avfilter_suggest="libm stdatomic zlib" avformat_deps="avcodec avutil" avformat_suggest="libm network zlib stdatomic" avutil_suggest="amf clock_gettime ffnvcodec gcrypt libm zlib libdrm libmfx opencl openssl user32 vaapi vulkan videotoolbox corefoundation corevideo coremedia bcrypt stdatomic" swresample_deps="avutil" swresample_suggest="libm libsoxr stdatomic" swscale_deps="avutil" -swscale_suggest="libm stdatomic spirv_library" +swscale_suggest="libm stdatomic" shader_compression_suggest="zlib" avcodec_extralibs="pthreads_extralibs iconv_extralibs dxva2_extralibs liblcevc_dec_extralibs lcms2_extralibs" @@ -6988,15 +6984,6 @@ if test -n "$custom_allocator"; then add_extralibs "$custom_allocator_extralibs" fi -# Unlike other feature flags or libraries, spirv_library is not defined -# within any of our predefined categories of components. -# It gets defined if either libshaderc or libglslang check succeeds. -# As such, its in a state of neither being explicitly enabled, nor -# explicitly disabled, but even in this state, being mentioned in -# _deps results in it always passing. -# Disable it explicitly to fix this. -disable spirv_library - check_func_headers malloc.h _aligned_malloc && enable aligned_malloc check_func ${malloc_prefix}memalign && enable memalign check_func ${malloc_prefix}posix_memalign && enable posix_memalign @@ -7230,10 +7217,6 @@ if ! disabled ffnvcodec; then check_pkg_config ffnvcodec "ffnvcodec >= 11.1.5.3 ffnvcodec < 12.0" "$ffnv_hdr_list" "" fi -if enabled_all libglslang libshaderc; then - die "ERROR: libshaderc and libglslang are mutually exclusive, if in doubt, disable libglslang" -fi - check_cpp_condition winrt windows.h "!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)" if ! disabled w32threads && ! enabled pthreads; then @@ -7365,16 +7348,6 @@ enabled libfontconfig && require_pkg_config libfontconfig fontconfig "fontco enabled libfreetype && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType enabled libfribidi && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info enabled libharfbuzz && require_pkg_config libharfbuzz harfbuzz hb.h hb_buffer_create -if enabled libglslang; then - spvremap="-lSPVRemapper" - require_headers "glslang/build_info.h" && { test_cpp_condition glslang/build_info.h "GLSLANG_VERSION_MAJOR >= 16" && spvremap="" ; } - check_lib spirv_library glslang/Include/glslang_c_interface.h glslang_initialize_process \ - -lglslang -lMachineIndependent -lGenericCodeGen \ - ${spvremap} -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lstdc++ $libm_extralibs $pthreads_extralibs || - require spirv_library glslang/Include/glslang_c_interface.h glslang_initialize_process \ - -lglslang -lMachineIndependent -lOSDependent -lHLSL -lOGLCompiler -lGenericCodeGen \ - ${spvremap} -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lstdc++ $libm_extralibs $pthreads_extralibs ; -fi enabled libgme && { check_pkg_config libgme libgme gme/gme.h gme_new_emu || require libgme gme/gme.h gme_new_emu -lgme -lstdc++; } enabled libgsm && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do @@ -7460,7 +7433,6 @@ enabled librist && require_pkg_config librist "librist >= 0.2.7" libri enabled librsvg && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_new_from_data enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket enabled librubberband && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++" -enabled libshaderc && require_pkg_config spirv_library "shaderc >= 2019.1" shaderc/shaderc.h shaderc_compiler_initialize enabled libshine && require_pkg_config libshine shine shine/layer3.h shine_encode_buffer enabled libsmbclient && { check_pkg_config libsmbclient smbclient libsmbclient.h smbc_init || require libsmbclient libsmbclient.h smbc_init -lsmbclient; } @@ -7881,7 +7853,7 @@ if enabled vulkan; then probe_glslc $program && break done else - disable libglslang libshaderc spirv_library spirv_compiler + disable spirv_compiler fi if enabled vulkan; then diff --git a/doc/filters.texi b/doc/filters.texi index 34219890d4..70a7975b57 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -29200,7 +29200,8 @@ Preserve landscape geometry (when @var{width} >= @var{height}). Below is a description of the currently available Vulkan video filters. To enable compilation of these filters you need to configure FFmpeg with -@code{--enable-vulkan} and either @code{--enable-libglslang} or @code{--enable-libshaderc}. +@code{--enable-vulkan}, and have a SPIR-V compiler (@code{glslc} or +@code{glslangValidator}) available at build time. Running Vulkan filters requires you to initialize a hardware device and to pass that device to all filters in any filter graph. @table @option diff --git a/libavfilter/Makefile b/libavfilter/Makefile index cbae5f4ffd..ce40cf3e65 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -665,10 +665,6 @@ OBJS-$(CONFIG_AVSYNCTEST_FILTER) += src_avsynctest.o OBJS-$(CONFIG_AMOVIE_FILTER) += src_movie.o OBJS-$(CONFIG_MOVIE_FILTER) += src_movie.o -# vulkan libs -OBJS-$(CONFIG_LIBGLSLANG) += vulkan_glslang.o vulkan.o -OBJS-$(CONFIG_LIBSHADERC) += vulkan_shaderc.o vulkan.o - # Objects duplicated from other libraries for shared builds SHLIBOBJS += log2_tab.o diff --git a/libavfilter/vulkan_glslang.c b/libavfilter/vulkan_glslang.c deleted file mode 100644 index 9aa41567a3..0000000000 --- a/libavfilter/vulkan_glslang.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "libavutil/vulkan_glslang.c" diff --git a/libavfilter/vulkan_shaderc.c b/libavfilter/vulkan_shaderc.c deleted file mode 100644 index 9f60bf4dfd..0000000000 --- a/libavfilter/vulkan_shaderc.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "libavutil/vulkan_shaderc.c" diff --git a/libavutil/Makefile b/libavutil/Makefile index 90a42fbb06..c3cadf5c2f 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -253,8 +253,6 @@ SKIPHEADERS-$(CONFIG_VDPAU) += hwcontext_vdpau.h SKIPHEADERS-$(CONFIG_VULKAN) += hwcontext_vulkan.h vulkan.h \ vulkan_functions.h \ vulkan_loader.h -SKIPHEADERS-$(CONFIG_LIBSHADERC) += vulkan_spirv.h -SKIPHEADERS-$(CONFIG_LIBGLSLANG) += vulkan_spirv.h SKIPHEADERS-$(CONFIG_SHADER_COMPRESSION) += zlib_utils.h TESTPROGS = adler32 \ diff --git a/libavutil/vulkan_glslang.c b/libavutil/vulkan_glslang.c deleted file mode 100644 index aebb52dd44..0000000000 --- a/libavutil/vulkan_glslang.c +++ /dev/null @@ -1,307 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <glslang/build_info.h> -#include <glslang/Include/glslang_c_interface.h> - -#include "vulkan_spirv.h" -#include "libavutil/mem.h" -#include "libavutil/avassert.h" -#include "libavutil/thread.h" - -static AVMutex glslc_mutex = AV_MUTEX_INITIALIZER; -static int glslc_refcount = 0; - -static const glslang_resource_t glslc_resource_limits = { - .max_lights = 32, - .max_clip_planes = 6, - .max_texture_units = 32, - .max_texture_coords = 32, - .max_vertex_attribs = 64, - .max_vertex_uniform_components = 4096, - .max_varying_floats = 64, - .max_vertex_texture_image_units = 32, - .max_combined_texture_image_units = 80, - .max_texture_image_units = 32, - .max_fragment_uniform_components = 4096, - .max_draw_buffers = 32, - .max_vertex_uniform_vectors = 128, - .max_varying_vectors = 8, - .max_fragment_uniform_vectors = 16, - .max_vertex_output_vectors = 16, - .max_fragment_input_vectors = 15, - .min_program_texel_offset = -8, - .max_program_texel_offset = 7, - .max_clip_distances = 8, - .max_compute_work_group_count_x = 65535, - .max_compute_work_group_count_y = 65535, - .max_compute_work_group_count_z = 65535, - .max_compute_work_group_size_x = 1024, - .max_compute_work_group_size_y = 1024, - .max_compute_work_group_size_z = 64, - .max_compute_uniform_components = 1024, - .max_compute_texture_image_units = 16, - .max_compute_image_uniforms = 8, - .max_compute_atomic_counters = 8, - .max_compute_atomic_counter_buffers = 1, - .max_varying_components = 60, - .max_vertex_output_components = 64, - .max_geometry_input_components = 64, - .max_geometry_output_components = 128, - .max_fragment_input_components = 128, - .max_image_units = 8, - .max_combined_image_units_and_fragment_outputs = 8, - .max_combined_shader_output_resources = 8, - .max_image_samples = 0, - .max_vertex_image_uniforms = 0, - .max_tess_control_image_uniforms = 0, - .max_tess_evaluation_image_uniforms = 0, - .max_geometry_image_uniforms = 0, - .max_fragment_image_uniforms = 8, - .max_combined_image_uniforms = 8, - .max_geometry_texture_image_units = 16, - .max_geometry_output_vertices = 256, - .max_geometry_total_output_components = 1024, - .max_geometry_uniform_components = 1024, - .max_geometry_varying_components = 64, - .max_tess_control_input_components = 128, - .max_tess_control_output_components = 128, - .max_tess_control_texture_image_units = 16, - .max_tess_control_uniform_components = 1024, - .max_tess_control_total_output_components = 4096, - .max_tess_evaluation_input_components = 128, - .max_tess_evaluation_output_components = 128, - .max_tess_evaluation_texture_image_units = 16, - .max_tess_evaluation_uniform_components = 1024, - .max_tess_patch_components = 120, - .max_patch_vertices = 32, - .max_tess_gen_level = 64, - .max_viewports = 16, - .max_vertex_atomic_counters = 0, - .max_tess_control_atomic_counters = 0, - .max_tess_evaluation_atomic_counters = 0, - .max_geometry_atomic_counters = 0, - .max_fragment_atomic_counters = 8, - .max_combined_atomic_counters = 8, - .max_atomic_counter_bindings = 1, - .max_vertex_atomic_counter_buffers = 0, - .max_tess_control_atomic_counter_buffers = 0, - .max_tess_evaluation_atomic_counter_buffers = 0, - .max_geometry_atomic_counter_buffers = 0, - .max_fragment_atomic_counter_buffers = 1, - .max_combined_atomic_counter_buffers = 1, - .max_atomic_counter_buffer_size = 16384, - .max_transform_feedback_buffers = 4, - .max_transform_feedback_interleaved_components = 64, - .max_cull_distances = 8, - .max_combined_clip_and_cull_distances = 8, - .max_samples = 4, - .max_mesh_output_vertices_nv = 256, - .max_mesh_output_primitives_nv = 512, - .max_mesh_work_group_size_x_nv = 32, - .max_mesh_work_group_size_y_nv = 1, - .max_mesh_work_group_size_z_nv = 1, - .max_task_work_group_size_x_nv = 32, - .max_task_work_group_size_y_nv = 1, - .max_task_work_group_size_z_nv = 1, - .max_mesh_view_count_nv = 4, - .maxDualSourceDrawBuffersEXT = 1, - - .limits = { - .non_inductive_for_loops = 1, - .while_loops = 1, - .do_while_loops = 1, - .general_uniform_indexing = 1, - .general_attribute_matrix_vector_indexing = 1, - .general_varying_indexing = 1, - .general_sampler_indexing = 1, - .general_variable_indexing = 1, - .general_constant_matrix_vector_indexing = 1, - } -}; - -static int glslc_shader_compile(FFVulkanContext *s, FFVkSPIRVCompiler *ctx, - FFVulkanShader *shd, uint8_t **data, - size_t *size, const char *entrypoint, - void **opaque) -{ - const char *messages; - glslang_shader_t *glslc_shader; - glslang_program_t *glslc_program; - - static const glslang_stage_t glslc_stage[] = { - [VK_SHADER_STAGE_VERTEX_BIT] = GLSLANG_STAGE_VERTEX, - [VK_SHADER_STAGE_FRAGMENT_BIT] = GLSLANG_STAGE_FRAGMENT, - [VK_SHADER_STAGE_COMPUTE_BIT] = GLSLANG_STAGE_COMPUTE, -#if ((GLSLANG_VERSION_MAJOR) > 12) - [VK_SHADER_STAGE_TASK_BIT_EXT] = GLSLANG_STAGE_TASK, - [VK_SHADER_STAGE_MESH_BIT_EXT] = GLSLANG_STAGE_MESH, - [VK_SHADER_STAGE_RAYGEN_BIT_KHR] = GLSLANG_STAGE_RAYGEN, - [VK_SHADER_STAGE_INTERSECTION_BIT_KHR] = GLSLANG_STAGE_INTERSECT, - [VK_SHADER_STAGE_ANY_HIT_BIT_KHR] = GLSLANG_STAGE_ANYHIT, - [VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR] = GLSLANG_STAGE_CLOSESTHIT, - [VK_SHADER_STAGE_MISS_BIT_KHR] = GLSLANG_STAGE_MISS, - [VK_SHADER_STAGE_CALLABLE_BIT_KHR] = GLSLANG_STAGE_CALLABLE, -#endif - }; - - const glslang_input_t glslc_input = { - .language = GLSLANG_SOURCE_GLSL, - .stage = glslc_stage[shd->stage], - .client = GLSLANG_CLIENT_VULKAN, -#if ((GLSLANG_VERSION_MAJOR) >= 12) - .client_version = GLSLANG_TARGET_VULKAN_1_3, - .target_language_version = GLSLANG_TARGET_SPV_1_6, -#else - .client_version = GLSLANG_TARGET_VULKAN_1_2, - .target_language_version = GLSLANG_TARGET_SPV_1_5, -#endif - .target_language = GLSLANG_TARGET_SPV, - .code = shd->src.str, - .default_version = 460, - .default_profile = GLSLANG_NO_PROFILE, - .force_default_version_and_profile = false, - .forward_compatible = false, - .messages = GLSLANG_MSG_DEFAULT_BIT, - .resource = &glslc_resource_limits, - }; - -#if ((GLSLANG_VERSION_MAJOR) >= 12) - glslang_spv_options_t glslc_opts = { - .generate_debug_info = !!(s->extensions & (FF_VK_EXT_DEBUG_UTILS | FF_VK_EXT_RELAXED_EXTENDED_INSTR)), - .emit_nonsemantic_shader_debug_info = !!(s->extensions & FF_VK_EXT_RELAXED_EXTENDED_INSTR), - .emit_nonsemantic_shader_debug_source = !!(s->extensions & FF_VK_EXT_RELAXED_EXTENDED_INSTR), - .disable_optimizer = !!(s->extensions & FF_VK_EXT_DEBUG_UTILS), - .strip_debug_info = !(s->extensions & (FF_VK_EXT_DEBUG_UTILS | FF_VK_EXT_RELAXED_EXTENDED_INSTR)), - .optimize_size = 0, - .disassemble = 0, - .validate = 1, - /* .compile_only = 0, */ - }; -#endif - - av_assert0(glslc_refcount); - - *opaque = NULL; - - if (!(glslc_shader = glslang_shader_create(&glslc_input))) - return AVERROR(ENOMEM); - - if (!glslang_shader_preprocess(glslc_shader, &glslc_input)) { - ff_vk_shader_print(s, shd, AV_LOG_WARNING); - av_log(s, AV_LOG_ERROR, "Unable to preprocess shader: %s (%s)!\n", - glslang_shader_get_info_log(glslc_shader), - glslang_shader_get_info_debug_log(glslc_shader)); - glslang_shader_delete(glslc_shader); - return AVERROR(EINVAL); - } - - if (!glslang_shader_parse(glslc_shader, &glslc_input)) { - ff_vk_shader_print(s, shd, AV_LOG_WARNING); - av_log(s, AV_LOG_ERROR, "Unable to parse shader: %s (%s)!\n", - glslang_shader_get_info_log(glslc_shader), - glslang_shader_get_info_debug_log(glslc_shader)); - glslang_shader_delete(glslc_shader); - return AVERROR(EINVAL); - } - - if (!(glslc_program = glslang_program_create())) { - glslang_shader_delete(glslc_shader); - return AVERROR(EINVAL); - } - - glslang_program_add_shader(glslc_program, glslc_shader); - - if (!glslang_program_link(glslc_program, GLSLANG_MSG_SPV_RULES_BIT | - GLSLANG_MSG_VULKAN_RULES_BIT)) { - ff_vk_shader_print(s, shd, AV_LOG_WARNING); - av_log(s, AV_LOG_ERROR, "Unable to link shader: %s (%s)!\n", - glslang_program_get_info_log(glslc_program), - glslang_program_get_info_debug_log(glslc_program)); - glslang_program_delete(glslc_program); - glslang_shader_delete(glslc_shader); - return AVERROR(EINVAL); - } - -#if ((GLSLANG_VERSION_MAJOR) >= 12) - glslang_program_SPIRV_generate_with_options(glslc_program, glslc_input.stage, &glslc_opts); -#else - glslang_program_SPIRV_generate(glslc_program, glslc_input.stage); -#endif - - messages = glslang_program_SPIRV_get_messages(glslc_program); - if (messages) { - ff_vk_shader_print(s, shd, AV_LOG_WARNING); - av_log(s, AV_LOG_WARNING, "%s\n", messages); - } else { - ff_vk_shader_print(s, shd, AV_LOG_DEBUG); - } - - glslang_shader_delete(glslc_shader); - - *size = glslang_program_SPIRV_get_size(glslc_program) * sizeof(unsigned int); - *data = (void *)glslang_program_SPIRV_get_ptr(glslc_program); - *opaque = glslc_program; - - return 0; -} - -static void glslc_shader_free(FFVkSPIRVCompiler *ctx, void **opaque) -{ - if (!opaque || !*opaque) - return; - - av_assert0(glslc_refcount); - glslang_program_delete(*opaque); - *opaque = NULL; -} - -static void glslc_uninit(FFVkSPIRVCompiler **ctx) -{ - if (!ctx || !*ctx) - return; - - ff_mutex_lock(&glslc_mutex); - if (glslc_refcount && (--glslc_refcount == 0)) - glslang_finalize_process(); - ff_mutex_unlock(&glslc_mutex); - - av_freep(ctx); -} - -FFVkSPIRVCompiler *ff_vk_glslang_init(void) -{ - FFVkSPIRVCompiler *ret = av_mallocz(sizeof(*ret)); - if (!ret) - return NULL; - - ret->compile_shader = glslc_shader_compile; - ret->free_shader = glslc_shader_free; - ret->uninit = glslc_uninit; - - ff_mutex_lock(&glslc_mutex); - if (!glslc_refcount++) { - if (!glslang_initialize_process()) { - av_freep(&ret); - glslc_refcount--; - } - } - ff_mutex_unlock(&glslc_mutex); - - return ret; -} diff --git a/libavutil/vulkan_shaderc.c b/libavutil/vulkan_shaderc.c deleted file mode 100644 index 3f7d52743c..0000000000 --- a/libavutil/vulkan_shaderc.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include <shaderc/shaderc.h> - -#include "libavutil/mem.h" -#include "vulkan_spirv.h" - -static int shdc_shader_compile(FFVulkanContext *s, FFVkSPIRVCompiler *ctx, - FFVulkanShader *shd, uint8_t **data, - size_t *size, const char *entrypoint, - void **opaque) -{ - int loglevel, err, warn, ret; - const char *status, *message; - shaderc_compilation_result_t res; - static const char *shdc_result[] = { - [shaderc_compilation_status_success] = "success", - [shaderc_compilation_status_invalid_stage] = "invalid stage", - [shaderc_compilation_status_compilation_error] = "error", - [shaderc_compilation_status_internal_error] = "internal error", - [shaderc_compilation_status_null_result_object] = "no result", - [shaderc_compilation_status_invalid_assembly] = "invalid assembly", - }; - static const shaderc_shader_kind shdc_kind[] = { - [VK_SHADER_STAGE_VERTEX_BIT] = shaderc_glsl_vertex_shader, - [VK_SHADER_STAGE_FRAGMENT_BIT] = shaderc_glsl_fragment_shader, - [VK_SHADER_STAGE_COMPUTE_BIT] = shaderc_glsl_compute_shader, - [VK_SHADER_STAGE_MESH_BIT_EXT] = shaderc_mesh_shader, - [VK_SHADER_STAGE_TASK_BIT_EXT] = shaderc_task_shader, - [VK_SHADER_STAGE_RAYGEN_BIT_KHR] = shaderc_raygen_shader, - [VK_SHADER_STAGE_ANY_HIT_BIT_KHR] = shaderc_anyhit_shader, - [VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR] = shaderc_closesthit_shader, - [VK_SHADER_STAGE_MISS_BIT_KHR] = shaderc_miss_shader, - [VK_SHADER_STAGE_INTERSECTION_BIT_KHR] = shaderc_intersection_shader, - [VK_SHADER_STAGE_CALLABLE_BIT_KHR] = shaderc_callable_shader, - }; - - shaderc_compile_options_t opts = shaderc_compile_options_initialize(); - *opaque = NULL; - if (!opts) - return AVERROR(ENOMEM); - - shaderc_compile_options_set_target_env(opts, shaderc_target_env_vulkan, - shaderc_env_version_vulkan_1_3); - shaderc_compile_options_set_target_spirv(opts, shaderc_spirv_version_1_6); - - /* If either extension is set, turn on debug info */ - if (s->extensions & (FF_VK_EXT_DEBUG_UTILS | FF_VK_EXT_RELAXED_EXTENDED_INSTR)) - shaderc_compile_options_set_generate_debug_info(opts); - - if (s->extensions & FF_VK_EXT_DEBUG_UTILS) - shaderc_compile_options_set_optimization_level(opts, - shaderc_optimization_level_zero); - else - shaderc_compile_options_set_optimization_level(opts, - shaderc_optimization_level_performance); - - res = shaderc_compile_into_spv((shaderc_compiler_t)ctx->priv, - shd->src.str, strlen(shd->src.str), - shdc_kind[shd->stage], - shd->name, entrypoint, opts); - shaderc_compile_options_release(opts); - - ret = shaderc_result_get_compilation_status(res); - err = shaderc_result_get_num_errors(res); - warn = shaderc_result_get_num_warnings(res); - message = shaderc_result_get_error_message(res); - - if (ret != shaderc_compilation_status_success && !err) - err = 1; - - loglevel = err ? AV_LOG_ERROR : warn ? AV_LOG_WARNING : AV_LOG_DEBUG; - - ff_vk_shader_print(s, shd, loglevel); - if (message && (err || warn)) - av_log(s, loglevel, "%s\n", message); - status = ret < FF_ARRAY_ELEMS(shdc_result) ? shdc_result[ret] : "unknown"; - av_log(s, loglevel, "shaderc compile status '%s' (%d errors, %d warnings)\n", - status, err, warn); - - if (err > 0) - return AVERROR(EINVAL); - - *data = (uint8_t *)shaderc_result_get_bytes(res); - *size = shaderc_result_get_length(res); - *opaque = res; - - return 0; -} - -static void shdc_shader_free(FFVkSPIRVCompiler *ctx, void **opaque) -{ - if (!opaque || !*opaque) - return; - - shaderc_result_release((shaderc_compilation_result_t)*opaque); - *opaque = NULL; -} - -static void shdc_uninit(FFVkSPIRVCompiler **ctx) -{ - FFVkSPIRVCompiler *s; - - if (!ctx || !*ctx) - return; - - s = *ctx; - - shaderc_compiler_release((shaderc_compiler_t)s->priv); - av_freep(ctx); -} - -FFVkSPIRVCompiler *ff_vk_shaderc_init(void) -{ - FFVkSPIRVCompiler *ret = av_mallocz(sizeof(*ret)); - if (!ret) - return NULL; - - ret->compile_shader = shdc_shader_compile; - ret->free_shader = shdc_shader_free; - ret->uninit = shdc_uninit; - - ret->priv = (void *)shaderc_compiler_initialize(); - if (!ret->priv) - av_freep(&ret); - - return ret; -} diff --git a/libavutil/vulkan_spirv.h b/libavutil/vulkan_spirv.h deleted file mode 100644 index c13b50f8e7..0000000000 --- a/libavutil/vulkan_spirv.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVUTIL_VULKAN_SPIRV_H -#define AVUTIL_VULKAN_SPIRV_H - -#include "vulkan.h" - -#include "config.h" - -typedef struct FFVkSPIRVCompiler { - void *priv; - int (*compile_shader)(FFVulkanContext *s, struct FFVkSPIRVCompiler *ctx, - FFVulkanShader *shd, uint8_t **data, - size_t *size, const char *entrypoint, void **opaque); - void (*free_shader)(struct FFVkSPIRVCompiler *ctx, void **opaque); - void (*uninit)(struct FFVkSPIRVCompiler **ctx); -} FFVkSPIRVCompiler; - -#if CONFIG_LIBGLSLANG -FFVkSPIRVCompiler *ff_vk_glslang_init(void); -#define ff_vk_spirv_init ff_vk_glslang_init -#endif -#if CONFIG_LIBSHADERC -FFVkSPIRVCompiler *ff_vk_shaderc_init(void); -#define ff_vk_spirv_init ff_vk_shaderc_init -#endif - -#endif /* AVUTIL_VULKAN_H */ -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
