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]

Reply via email to