PR #22346 opened by Lynne
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22346
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22346.patch

Implements almost all operations. Dithering and packing/unpacking will be a 
separate PR.

Sponsored-by: Sovereign Tech Fund


>From a41a8076c6ef1d30765aba33218333d6f4ff807b Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Fri, 27 Feb 2026 16:29:11 +0100
Subject: [PATCH 1/8] swscale/vulkan: implement SW_OP_SCALE

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 64c9e3d45b..3935591ec5 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -158,6 +158,11 @@ static void free_fn(void *priv)
 }
 
 #if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG
+
+#define QSTR "(%i/%i%s)"
+#define QTYPE(i) op->c.q4[i].num, op->c.q4[i].den,       \
+                 op->type == SWS_PIXEL_F32 ? ".0f" : ""
+
 static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                         SwsOpList *ops, FFVulkanShader *shd)
 {
@@ -268,12 +273,20 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
             for (int i = 0; i < 4; i++) {
                 if (!op->c.q4[i].den)
                     continue;
-                av_bprintf(&shd->src, "    %s.%c = %s(%i/%i%s);\n", type_name,
-                           "xyzw"[i], type_s, op->c.q4[i].num, op->c.q4[i].den,
-                           op->type == SWS_PIXEL_F32 ? ".0f" : "");
+                av_bprintf(&shd->src, "    %s.%c = %s"QSTR";\n", type_name,
+                           "xyzw"[i], type_s, QTYPE(i));
             }
             break;
         }
+        case SWS_OP_SCALE:
+            for (int i = 0; i < 4; i++) {
+                if (!op->c.q4[i].den)
+                    continue;
+                av_bprintf(&shd->src, "    %s.%c = %s((%s.%c*%i)/%i%s);\n",
+                           type_name, "xyzw"[i], type_s,
+                           type_name, "xyzw"[i], QTYPE(i));
+            }
+            break;
         default:
             return AVERROR(ENOTSUP);
         }
-- 
2.52.0


>From 835a069ae7813be07a95df2969623ad2226acf4d Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Fri, 27 Feb 2026 16:36:59 +0100
Subject: [PATCH 2/8] swscale/vulkan: implement SWS_OP_MIN

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 3935591ec5..845905ec45 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -287,6 +287,17 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                            type_name, "xyzw"[i], QTYPE(i));
             }
             break;
+        case SWS_OP_MIN:
+            for (int i = 0; i < 4; i++) {
+                if (!op->c.q4[i].den)
+                    continue;
+                av_bprintf(&shd->src, "    %s.%c = min(%s.%c, "QSTR");\n",
+                           type_name, "xyzw"[i],
+                           type_name, "xyzw"[i],
+                           op->c.q4[i].num, op->c.q4[i].den,
+                           op->type == SWS_PIXEL_F32 ? ".0f" : "");
+            }
+            break;
         default:
             return AVERROR(ENOTSUP);
         }
-- 
2.52.0


>From 535519e26311fb8217b68838dc658127b11b38fc Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Fri, 27 Feb 2026 16:37:27 +0100
Subject: [PATCH 3/8] swscale/vulkan: implement SWS_OP_MAX

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 845905ec45..a81ca70795 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -298,6 +298,17 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                            op->type == SWS_PIXEL_F32 ? ".0f" : "");
             }
             break;
+        case SWS_OP_MAX:
+            for (int i = 0; i < 4; i++) {
+                if (!op->c.q4[i].den)
+                    continue;
+                av_bprintf(&shd->src, "    %s.%c = max(%s.%c, "QSTR");\n",
+                           type_name, "xyzw"[i],
+                           type_name, "xyzw"[i],
+                           op->c.q4[i].num, op->c.q4[i].den,
+                           op->type == SWS_PIXEL_F32 ? ".0f" : "");
+            }
+            break;
         default:
             return AVERROR(ENOTSUP);
         }
-- 
2.52.0


>From 35aa233318c3d16c7d48ce7d8dc15a3af1532e12 Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Fri, 27 Feb 2026 16:47:45 +0100
Subject: [PATCH 4/8] swscale/vulkan: implement SWS_OP_LSHIFT

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index a81ca70795..1c72852eef 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -309,6 +309,9 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                            op->type == SWS_PIXEL_F32 ? ".0f" : "");
             }
             break;
+        case SWS_OP_LSHIFT:
+            av_bprintf(&shd->src, "    %s <<= %i;\n", type_name, op->c.u);
+            break;
         default:
             return AVERROR(ENOTSUP);
         }
-- 
2.52.0


>From f7e9ff65e6e2cc3e805e174ab244e4b180514a25 Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Fri, 27 Feb 2026 16:48:08 +0100
Subject: [PATCH 5/8] swscale/vulkan: implement SWS_OP_RSHIFT

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 1c72852eef..8258b17714 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -312,6 +312,9 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
         case SWS_OP_LSHIFT:
             av_bprintf(&shd->src, "    %s <<= %i;\n", type_name, op->c.u);
             break;
+        case SWS_OP_RSHIFT:
+            av_bprintf(&shd->src, "    %s >>= %i;\n", type_name, op->c.u);
+            break;
         default:
             return AVERROR(ENOTSUP);
         }
-- 
2.52.0


>From 5897dd2e8f4504882dd3ad9efb9a514c694a883c Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Mon, 2 Mar 2026 11:07:16 +0100
Subject: [PATCH 6/8] swscale/vulkan: implement SWS_OP_LINEAR

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 8258b17714..14847ad643 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -163,6 +163,22 @@ static void free_fn(void *priv)
 #define QTYPE(i) op->c.q4[i].num, op->c.q4[i].den,       \
                  op->type == SWS_PIXEL_F32 ? ".0f" : ""
 
+#define QMATSTR "(%i/%i.0f), (%i/%i.0f), (%i/%i.0f), (%i/%i.0f)\n" \
+            "    (%i/%i.0f), (%i/%i.0f), (%i/%i.0f), (%i/%i.0f)\n" \
+            "    (%i/%i.0f), (%i/%i.0f), (%i/%i.0f), (%i/%i.0f)\n" \
+            "    (%i/%i.0f), (%i/%i.0f), (%i/%i.0f), (%i/%i.0f)"
+#define QMATTYPE op->lin.m[0][0].num, op->lin.m[0][0].den, 
op->lin.m[0][1].num, \
+                 op->lin.m[0][1].den, op->lin.m[0][2].num, 
op->lin.m[0][2].den, \
+                 op->lin.m[0][3].num, op->lin.m[0][3].den, 
op->lin.m[1][0].num, \
+                 op->lin.m[1][0].den, op->lin.m[1][1].num, 
op->lin.m[1][1].den, \
+                 op->lin.m[1][2].num, op->lin.m[1][2].den, 
op->lin.m[1][3].num, \
+                 op->lin.m[1][3].den, op->lin.m[2][0].num, 
op->lin.m[2][0].den, \
+                 op->lin.m[2][1].num, op->lin.m[2][1].den, 
op->lin.m[2][2].num, \
+                 op->lin.m[2][2].den, op->lin.m[2][3].num, 
op->lin.m[2][3].den, \
+                 op->lin.m[3][0].num, op->lin.m[3][0].den, 
op->lin.m[3][1].num, \
+                 op->lin.m[3][1].den, op->lin.m[3][2].num, 
op->lin.m[3][2].den, \
+                 op->lin.m[3][3].num, op->lin.m[3][3].den
+
 static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                         SwsOpList *ops, FFVulkanShader *shd)
 {
@@ -315,6 +331,11 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
         case SWS_OP_RSHIFT:
             av_bprintf(&shd->src, "    %s >>= %i;\n", type_name, op->c.u);
             break;
+        case SWS_OP_LINEAR:
+            av_bprintf(&shd->src, "    %s = %s*mat4("QMATSTR") +  + 
(%i/%i.0f));",
+                       type_name, type_name, QMATTYPE,
+                       op->lin.m[3][4].num, op->lin.m[3][4].den);
+            break;
         default:
             return AVERROR(ENOTSUP);
         }
-- 
2.52.0


>From 9ef8b9cd61d7c51352dfb2c893053b90799967cf Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Mon, 2 Mar 2026 11:20:15 +0100
Subject: [PATCH 7/8] swscale/vulkan: implement SWS_OP_CONVERT

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 14847ad643..9dabef87ce 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -161,7 +161,7 @@ static void free_fn(void *priv)
 
 #define QSTR "(%i/%i%s)"
 #define QTYPE(i) op->c.q4[i].num, op->c.q4[i].den,       \
-                 op->type == SWS_PIXEL_F32 ? ".0f" : ""
+                 cur_type == SWS_PIXEL_F32 ? ".0f" : ""
 
 #define QMATSTR "(%i/%i.0f), (%i/%i.0f), (%i/%i.0f), (%i/%i.0f)\n" \
             "    (%i/%i.0f), (%i/%i.0f), (%i/%i.0f), (%i/%i.0f)\n" \
@@ -246,15 +246,17 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
     GLSLC(1,     f32vec4 f32;                                                 
);
     GLSLC(0,                                                                  
);
 
-    const char *type_name = ff_sws_pixel_type_name(ops->ops[0].type);
     for (int n = 0; n < ops->num_ops; n++) {
         const SwsOp *op = &ops->ops[n];
-        const char *type_v = op->type == SWS_PIXEL_F32 ? "f32vec4" :
-                             op->type == SWS_PIXEL_U32 ? "u32vec4" :
-                             op->type == SWS_PIXEL_U16 ? "u16vec4" : "u8vec4";
-        const char *type_s = op->type == SWS_PIXEL_F32 ? "float" :
-                             op->type == SWS_PIXEL_U32 ? "uint32_t" :
-                             op->type == SWS_PIXEL_U16 ? "uint16_t" : 
"uint8_t";
+        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";
         switch (op->op) {
         case SWS_OP_READ: {
             if (op->rw.packed) {
@@ -311,7 +313,7 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                            type_name, "xyzw"[i],
                            type_name, "xyzw"[i],
                            op->c.q4[i].num, op->c.q4[i].den,
-                           op->type == SWS_PIXEL_F32 ? ".0f" : "");
+                           cur_type == SWS_PIXEL_F32 ? ".0f" : "");
             }
             break;
         case SWS_OP_MAX:
@@ -322,7 +324,7 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                            type_name, "xyzw"[i],
                            type_name, "xyzw"[i],
                            op->c.q4[i].num, op->c.q4[i].den,
-                           op->type == SWS_PIXEL_F32 ? ".0f" : "");
+                           cur_type == SWS_PIXEL_F32 ? ".0f" : "");
             }
             break;
         case SWS_OP_LSHIFT:
@@ -336,6 +338,11 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                        type_name, type_name, QMATTYPE,
                        op->lin.m[3][4].num, op->lin.m[3][4].den);
             break;
+        case SWS_OP_CONVERT:
+            av_bprintf(&shd->src, "    %s = %s(%s);\n",
+                       ff_sws_pixel_type_name(op->type),
+                       type_s, type_name);
+            break;
         default:
             return AVERROR(ENOTSUP);
         }
-- 
2.52.0


>From 4623550d1a3f9505b4abf312d404ea0685f79461 Mon Sep 17 00:00:00 2001
From: Lynne <[email protected]>
Date: Mon, 2 Mar 2026 11:27:13 +0100
Subject: [PATCH 8/8] swscale/vulkan: fix compilation with --disable-unstable

Fixes #22295

Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 9dabef87ce..b964ad28d6 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -157,7 +157,7 @@ static void free_fn(void *priv)
     av_free(priv);
 }
 
-#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG
+#if CONFIG_UNSTABLE && (CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG)
 
 #define QSTR "(%i/%i%s)"
 #define QTYPE(i) op->c.q4[i].num, op->c.q4[i].den,       \
@@ -380,7 +380,7 @@ static int compile(SwsContext *sws, SwsOpList *ops, 
SwsCompiledOp *out)
         .s = s,
     };
 
-#if CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG
+#if CONFIG_UNSTABLE && (CONFIG_LIBSHADERC || CONFIG_LIBGLSLANG)
     {
         err = add_ops_glsl(&p, s, ops, &p.shd);
         if (err < 0)
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to