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]
