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

Git pushed a commit to branch master
in repository ffmpeg.

commit c40ac0f03aa6b74f76dc3e7b24e133c30aa411a0
Author:     Lynne <[email protected]>
AuthorDate: Sun Apr 26 12:54:05 2026 +0200
Commit:     Lynne <[email protected]>
CommitDate: Fri May 22 14:05:27 2026 +0900

    swscale/vulkan: add support for filtering on SWS_OP_READ
    
    Sponsored-by: Sovereign Tech Fund
---
 libswscale/vulkan/ops.c | 49 ++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 9 deletions(-)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 3b3d83b4a6..7eeea24606 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -1003,6 +1003,44 @@ static void 
add_desc_read_write(FFVulkanDescriptorSetBinding *out_desc,
 #define QSTR "(%i/%i%s)"
 #define QTYPE(Q) (Q).num, (Q).den, cur_type == SWS_PIXEL_F32 ? ".0f" : ""
 
+static void read_glsl(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.kernel;
+    if (op->rw.filter) {
+        const char *axis    = op->rw.filter == SWS_OP_FILTER_H ? "pos.x" : 
"pos.y";
+        const char *coord_x = op->rw.filter == SWS_OP_FILTER_H ? "o + i" : 
"pos.x";
+        const char *coord_y = op->rw.filter == SWS_OP_FILTER_H ? "pos.y" : "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.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 {
+        if (op->rw.packed) {
+            GLSLF(1, %s = %s(imageLoad(src_img[%i], pos));                     
,
+                  type_name, type_v, ops->plane_src[0]);
+        } else {
+            for (int i = 0; i < op->rw.elems; i++)
+                GLSLF(1, %s.%c = %s(imageLoad(src_img[%i], pos)[0]);           
,
+                      type_name, "xyzw"[i], type_s, ops->plane_src[i]);
+        }
+    }
+}
+
 static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
                         SwsOpList *ops, FFVulkanShader *shd)
 {
@@ -1109,16 +1147,9 @@ static int add_ops_glsl(VulkanPriv *p, FFVulkanOpsCtx *s,
 
         switch (op->op) {
         case SWS_OP_READ: {
-            if (op->rw.frac || op->rw.filter) {
+            if (op->rw.frac)
                 return AVERROR(ENOTSUP);
-            } else if (op->rw.packed) {
-                GLSLF(1, %s = %s(imageLoad(src_img[%i], pos));                 
,
-                      type_name, type_v, ops->plane_src[0]);
-            } else {
-                for (int i = 0; i < op->rw.elems; i++)
-                    GLSLF(1, %s.%c = %s(imageLoad(src_img[%i], pos)[0]);       
,
-                          type_name, "xyzw"[i], type_s, ops->plane_src[i]);
-            }
+            read_glsl(ops, op, shd, n, type_name, type_v, type_s);
             break;
         }
         case SWS_OP_WRITE: {

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

Reply via email to