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

Git pushed a commit to branch master
in repository ffmpeg.

commit 3d5ab8093b1c163f8362a6ab57a818e46035de97
Author:     Ramiro Polla <[email protected]>
AuthorDate: Thu Jul 2 17:58:36 2026 +0200
Commit:     Ramiro Polla <[email protected]>
CommitDate: Thu Jul 16 08:30:30 2026 +0000

    swscale/aarch64/ops: perform pass splitting while generating ops_entries.c
    
    There was a mismatch between the ops generated by sws_ops_aarch64 and
    the aarch64 backend, leading to missed optimizations.
    
    Sponsored-by: Sovereign Tech Fund
    Signed-off-by: Ramiro Polla <[email protected]>
---
 libswscale/aarch64/ops_entries.c   | 16 ++++-----
 libswscale/tests/sws_ops_aarch64.c | 68 +++++++++++++++++++++++++++-----------
 2 files changed, 57 insertions(+), 27 deletions(-)

diff --git a/libswscale/aarch64/ops_entries.c b/libswscale/aarch64/ops_entries.c
index 9466c800e6..5c90cf3805 100644
--- a/libswscale/aarch64/ops_entries.c
+++ b/libswscale/aarch64/ops_entries.c
@@ -40,7 +40,6 @@
 { .op = AARCH64_SWS_OP_READ_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_READ_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x1111 },
 { .op = AARCH64_SWS_OP_WRITE_BIT, .block_size = 8, .type = AARCH64_PIXEL_U8, 
.mask = 0x0001 },
-{ .op = AARCH64_SWS_OP_WRITE_BIT, .block_size = 16, .type = AARCH64_PIXEL_U8, 
.mask = 0x0001 },
 { .op = AARCH64_SWS_OP_WRITE_NIBBLE, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0001 },
 { .op = AARCH64_SWS_OP_WRITE_NIBBLE, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0001 },
 { .op = AARCH64_SWS_OP_WRITE_PACKED, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0011 },
@@ -59,18 +58,22 @@
 { .op = AARCH64_SWS_OP_WRITE_PACKED, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_WRITE_PACKED, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x1111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0001 },
+{ .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0011 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x1111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U16, .mask = 0x0001 },
+{ .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U16, .mask = 0x0011 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U16, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U16, .mask = 0x1111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U32, .mask = 0x0001 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U32, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 8, .type = 
AARCH64_PIXEL_U32, .mask = 0x1111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0001 },
+{ .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0011 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x1111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x0001 },
+{ .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x0011 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_WRITE_PLANAR, .block_size = 16, .type = 
AARCH64_PIXEL_U16, .mask = 0x1111 },
 { .op = AARCH64_SWS_OP_SWAP_BYTES, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x0001 },
@@ -136,7 +139,6 @@
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf00f, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0110 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf00f, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0110 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf00f, .block_size = 32, .type = 
AARCH64_PIXEL_U8, .mask = 0x0110 },
-{ .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf021, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf021, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf021, .block_size = 32, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf0f2, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0101 },
@@ -154,8 +156,6 @@
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf12f, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0110 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf12f, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0110 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf12f, .block_size = 32, .type = 
AARCH64_PIXEL_U8, .mask = 0x0110 },
-{ .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf132, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
-{ .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf132, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf132, .block_size = 32, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf321, .block_size = 8, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
 { .op = AARCH64_SWS_OP_SWIZZLE, .swizzle = 0xf321, .block_size = 16, .type = 
AARCH64_PIXEL_U8, .mask = 0x0111 },
@@ -245,19 +245,15 @@
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x0010 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x0011 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x0101 },
-{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x0110 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x1000 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x1011 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x1100 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x1101 },
-{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U8, .mask 
= 0x1110 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x0001 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x0010 },
-{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x0110 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x1000 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x1100 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x1101 },
-{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U16, 
.mask = 0x1110 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U32, 
.mask = 0x0001 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U32, 
.mask = 0x0010 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U32, 
.mask = 0x0101 },
@@ -267,10 +263,14 @@
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 8, .type = AARCH64_PIXEL_U32, 
.mask = 0x1101 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U8, 
.mask = 0x0001 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U8, 
.mask = 0x0010 },
+{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U8, 
.mask = 0x0011 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U8, 
.mask = 0x0110 },
+{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U8, 
.mask = 0x0111 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U8, 
.mask = 0x1000 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U16, 
.mask = 0x0001 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U16, 
.mask = 0x0010 },
+{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U16, 
.mask = 0x0011 },
+{ .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U16, 
.mask = 0x0111 },
 { .op = AARCH64_SWS_OP_CLEAR, .block_size = 16, .type = AARCH64_PIXEL_U16, 
.mask = 0x1000 },
 { .op = AARCH64_SWS_OP_CONVERT, .to_type = AARCH64_PIXEL_U8, .block_size = 8, 
.type = AARCH64_PIXEL_F32, .mask = 0x0001 },
 { .op = AARCH64_SWS_OP_CONVERT, .to_type = AARCH64_PIXEL_U8, .block_size = 8, 
.type = AARCH64_PIXEL_F32, .mask = 0x0011 },
diff --git a/libswscale/tests/sws_ops_aarch64.c 
b/libswscale/tests/sws_ops_aarch64.c
index 1dc90c7e60..fb53b2194e 100644
--- a/libswscale/tests/sws_ops_aarch64.c
+++ b/libswscale/tests/sws_ops_aarch64.c
@@ -22,9 +22,11 @@
 
 #include "libavutil/mem.h"
 #include "libavutil/tree.h"
+#include "libswscale/graph.h"
 #include "libswscale/ops.h"
 #include "libswscale/ops_chain.h"
 #include "libswscale/op_list_gen_template.c"
+#include "libswscale/ops_dispatch.h"
 
 #include "libswscale/aarch64/ops_impl.c"
 #include "libswscale/aarch64/ops_impl_conv.c"
@@ -73,27 +75,12 @@ error:
     return ret;
 }
 
-static int register_op(SwsContext *ctx, void *opaque, SwsOpList *ops)
+static int collect_ops_compile(SwsContext *ctx, const SwsOpList *ops,
+                               SwsCompiledOp *out)
 {
-    struct AVTreeNode **root = (struct AVTreeNode **) opaque;
+    struct AVTreeNode **root = (struct AVTreeNode **) ctx->opaque;
     int ret;
 
-    /* Skip ops lists which include filtering, since this is still not
-     * supported. */
-    for (int i = 0; i < ops->num_ops; i++) {
-        const SwsOp *op = &ops->ops[i];
-        switch (op->op) {
-        case SWS_OP_READ:
-        case SWS_OP_WRITE:
-            if (op->rw.filter.op)
-                return 0;
-            break;
-        case SWS_OP_FILTER_H:
-        case SWS_OP_FILTER_V:
-            return 0;
-        }
-    }
-
     /* Use at most two full vregs during the widest precision section */
     int block_size = (ff_sws_op_list_max_size(ops) == 4) ? 8 : 16;
 
@@ -119,12 +106,46 @@ static int register_op(SwsContext *ctx, void *opaque, 
SwsOpList *ops)
         }
     }
 
+    *out = (SwsCompiledOp) { 0 };
     ret = 0;
 
 end:
     return ret;
 }
 
+static const SwsOpBackend backend_collect = {
+    .name    = "collect_ops",
+    .compile = collect_ops_compile,
+};
+
+/*********************************************************************/
+static int register_op(SwsContext *ctx, void *opaque, SwsOpList *ops)
+{
+    /* Skip ops lists which include filtering, since this is still not
+     * supported. */
+    for (int i = 0; i < ops->num_ops; i++) {
+        const SwsOp *op = &ops->ops[i];
+        switch (op->op) {
+        case SWS_OP_READ:
+        case SWS_OP_WRITE:
+            if (op->rw.filter.op)
+                return 0;
+            break;
+        case SWS_OP_FILTER_H:
+        case SWS_OP_FILTER_V:
+            return 0;
+        }
+    }
+
+    /* ff_sws_compile_pass() takes over ownership of `ops` */
+    SwsOpList *copy = ff_sws_op_list_duplicate(ops);
+    if (!copy)
+        return AVERROR(ENOMEM);
+
+    const int flags = SWS_OP_FLAG_DRY_RUN | SWS_OP_FLAG_SPLIT_MEMCPY;
+    return ff_sws_compile_pass(opaque, &backend_collect, &copy, flags, NULL, 
NULL);
+}
+
 /*********************************************************************/
 static void serialize_op(char *buf, size_t size, const SwsAArch64OpImplParams 
*params)
 {
@@ -171,7 +192,14 @@ int main(int argc, char *argv[])
     if (!ctx)
         goto fail;
 
-    ret = ff_sws_enum_op_lists(ctx, &root, AV_PIX_FMT_NONE, AV_PIX_FMT_NONE,
+    SwsGraph *graph = ff_sws_graph_alloc();
+    if (!graph)
+        goto fail;
+
+    graph->ctx = ctx;
+    ctx->opaque = &root;
+
+    ret = ff_sws_enum_op_lists(ctx, graph, AV_PIX_FMT_NONE, AV_PIX_FMT_NONE,
                                register_op);
 
     /**
@@ -185,6 +213,8 @@ int main(int argc, char *argv[])
     printf("\n");
     av_tree_enumerate(root, stdout, NULL, print_op);
 
+    ff_sws_graph_free(&graph);
+
 fail:
     av_tree_destroy(root);
     sws_free_context(&ctx);

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

Reply via email to