This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 198991372c68cd41d99f527b812c41a1002db9e7
Author:     Lynne <[email protected]>
AuthorDate: Wed Apr 8 14:48:23 2026 +0200
Commit:     Lynne <[email protected]>
CommitDate: Fri May 22 15:27:03 2026 +0900

    swscale/vulkan: move linear op handling to a separate function
    
    Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 88 +++++++++++++++++++++++++++----------------------
 1 file changed, 49 insertions(+), 39 deletions(-)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 7eeea24606..ccd517c68b 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -638,6 +638,54 @@ static void define_shader_bindings(SwsOpList *ops, SPICtx 
*spi, SPIRVIDs *id,
                    SpvStorageClassUniformConstant, 0);
 }
 
+static int insert_bitexact_linear(const SwsOp *op, SPICtx *spi, SPIRVIDs *id,
+                                  int data, int linear_ops_idx, int 
*nb_const_ids)
+{
+    int type_s = op->type == SWS_PIXEL_F32 ? id->f32_type : id->u32_type;
+    int type_v = op->type == SWS_PIXEL_F32 ? id->f32vec4_type : 
id->u32vec4_type;
+
+    int tmp[4];
+    tmp[0] = spi_OpCompositeExtract(spi, type_s, data, 0);
+    tmp[1] = spi_OpCompositeExtract(spi, type_s, data, 1);
+    tmp[2] = spi_OpCompositeExtract(spi, type_s, data, 2);
+    tmp[3] = spi_OpCompositeExtract(spi, type_s, data, 3);
+
+    int off = spi_reserve(spi, 0); /* Current offset */
+    spi->off = id->linear_deco_off[linear_ops_idx];
+    for (int i = 0; i < id->linear_deco_ops[linear_ops_idx]; i++)
+        spi_OpDecorate(spi, spi->id + i, SpvDecorationNoContraction);
+    spi->off = off;
+
+    int res[4];
+    for (int j = 0; j < 4; j++) {
+        res[j] = op->type == SWS_PIXEL_F32 ? id->f32_0 : id->u32_cid[0];
+        if (op->lin.m[j][0].num)
+            res[j] = spi_OpFMul(spi, type_s, tmp[0],
+                                id->const_ids[(*nb_const_ids)++]);
+
+        if (op->lin.m[j][0].num && op->lin.m[j][4].num)
+            res[j] = spi_OpFAdd(spi, type_s,
+                                id->const_ids[(*nb_const_ids)++], res[j]);
+        else if (op->lin.m[j][4].num)
+            res[j] = id->const_ids[(*nb_const_ids)++];
+
+        for (int i = 1; i < 4; i++) {
+            if (!op->lin.m[j][i].num)
+                continue;
+
+            int v = spi_OpFMul(spi, type_s, tmp[i],
+                               id->const_ids[(*nb_const_ids)++]);
+            if (op->lin.m[j][0].num || op->lin.m[j][4].num)
+                res[j] = spi_OpFAdd(spi, type_s, res[j], v);
+            else
+                res[j] = v;
+        }
+    }
+
+    return spi_OpCompositeConstruct(spi, type_v,
+                                    res[0], res[1], res[2], res[3]);
+}
+
 static int add_ops_spirv(VulkanPriv *p, FFVulkanOpsCtx *s,
                          SwsOpList *ops, FFVulkanShader *shd)
 {
@@ -906,45 +954,7 @@ static int add_ops_spirv(VulkanPriv *p, FFVulkanOpsCtx *s,
             break;
         }
         case SWS_OP_LINEAR: {
-            int tmp[4];
-            tmp[0] = spi_OpCompositeExtract(spi, type_s, data, 0);
-            tmp[1] = spi_OpCompositeExtract(spi, type_s, data, 1);
-            tmp[2] = spi_OpCompositeExtract(spi, type_s, data, 2);
-            tmp[3] = spi_OpCompositeExtract(spi, type_s, data, 3);
-
-            int off = spi_reserve(spi, 0); /* Current offset */
-            spi->off = id->linear_deco_off[nb_linear_ops];
-            for (int i = 0; i < id->linear_deco_ops[nb_linear_ops]; i++)
-                spi_OpDecorate(spi, spi->id + i, SpvDecorationNoContraction);
-            spi->off = off;
-
-            int res[4];
-            for (int j = 0; j < 4; j++) {
-                res[j] = op->type == SWS_PIXEL_F32 ? id->f32_0 : 
id->u32_cid[0];
-                if (op->lin.m[j][0].num)
-                    res[j] = spi_OpFMul(spi, type_s, tmp[0],
-                                        id->const_ids[nb_const_ids++]);
-
-                if (op->lin.m[j][0].num && op->lin.m[j][4].num)
-                    res[j] = spi_OpFAdd(spi, type_s,
-                                        id->const_ids[nb_const_ids++], res[j]);
-                else if (op->lin.m[j][4].num)
-                    res[j] = id->const_ids[nb_const_ids++];
-
-                for (int i = 1; i < 4; i++) {
-                    if (!op->lin.m[j][i].num)
-                        continue;
-
-                    int v = spi_OpFMul(spi, type_s, tmp[i],
-                                       id->const_ids[nb_const_ids++]);
-                    if (op->lin.m[j][0].num || op->lin.m[j][4].num)
-                        res[j] = spi_OpFAdd(spi, type_s, res[j], v);
-                    else
-                        res[j] = v;
-                }
-            }
-            data = spi_OpCompositeConstruct(spi, type_v,
-                                            res[0], res[1], res[2], res[3]);
+            data = insert_bitexact_linear(op, spi, id, data, nb_linear_ops, 
&nb_const_ids);
             nb_linear_ops++;
             break;
         }

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

Reply via email to