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

Git pushed a commit to branch master
in repository ffmpeg.

commit 5c864087246655cf102e614c2096055f9afc78a2
Author:     Niklas Haas <[email protected]>
AuthorDate: Tue Jul 14 13:49:55 2026 +0200
Commit:     Niklas Haas <[email protected]>
CommitDate: Fri Jul 17 13:23:21 2026 +0000

    swscale/uops: add SWS_UOP_RW_SHUFFLE
    
    This directly encodes the "pshufb" loop style processing seen in the x86
    backend (and, presumably, other backends down the line). The major
    advantage of encoding this as a separate UOP is that it allows the macro
    generator to exhaustively enumerate all needed variants of the read/write
    chunk sizes, which so-far have been hand-maintained through trial and error.
    
    I decided to also go ahead and pre-emptively generalize the clear
    value to allow us to encode RGBA clears in addition to RGB0 clears,
    which makes this UOP useful for e.g. Gray -> RGBA32 as well; something
    that the current pshufb loop did not handle.
    
    This commit merely adds the UOP defition; it does not yet port
    the packed shuffle solver or x86 implementation.
    
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/uops.c            |  4 ++++
 libswscale/uops.h            | 18 +++++++++++++++++-
 libswscale/uops_list.h       |  1 +
 libswscale/uops_macros.h     |  8 ++++++++
 libswscale/uops_macros_gen.c | 11 +++++++++++
 5 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/libswscale/uops.c b/libswscale/uops.c
index 1b5ee346e6..44000b35f1 100644
--- a/libswscale/uops.c
+++ b/libswscale/uops.c
@@ -97,6 +97,10 @@ void ff_sws_uop_name(const SwsUOp *op, char 
buf[SWS_UOP_NAME_MAX])
     case SWS_UOP_READ_PLANAR_FV_FMA:
         av_bprintf(&bp, "_%s", ff_sws_pixel_type_name(par->filter.type));
         break;
+    case SWS_UOP_RW_SHUFFLE:
+        av_bprintf(&bp, "_%x_%u_%u", par->shuffle.clear_value,
+                   par->shuffle.read_size, par->shuffle.write_size);
+        break;
     case SWS_UOP_LSHIFT:
     case SWS_UOP_RSHIFT:
         av_bprintf(&bp, "_%u", par->shift.amount);
diff --git a/libswscale/uops.h b/libswscale/uops.h
index db4412ad1c..48d29572cd 100644
--- a/libswscale/uops.h
+++ b/libswscale/uops.h
@@ -142,6 +142,9 @@ typedef enum SwsUOpType {
     SWS_UOP_WRITE_NIBBLE,    /* fractional write (4 bits) to single plane */
     SWS_UOP_WRITE_BIT,       /* fractional write (1 bit) to single plane */
 
+    /* Packed shuffle / gather uops */
+    SWS_UOP_RW_SHUFFLE,      /* in-place (packed) indexed shuffle/gather */
+
     /* Data rearrangement uops; mask = needed or trivial components */
     SWS_UOP_PERMUTE,         /* permute pointers (no duplicates) */
     SWS_UOP_COPY,            /* permute data (may contain duplicates) */
@@ -176,6 +179,17 @@ typedef enum SwsUOpType {
     SWS_UOP_TYPE_NB,
 } SwsUOpType;
 
+typedef struct SwsShuffleUOp {
+    uint8_t clear_value; /* value to clear elements with negative indices to */
+    uint8_t read_size;   /* input bytes per iteration */
+    uint8_t write_size;  /* output bytes per iteration */
+} SwsShuffleUOp;
+
+typedef struct SwsShuffleMask {
+    int8_t mask[16];    /* shuffle index mask, or -1 to clear bytes (to 
`clear_value`) */
+    uint8_t pixels;     /* number of pixels per iteration */
+} SwsShuffleMask;
+
 typedef struct SwsFilterUOp {
     SwsPixelType type; /* pixel type to store result as */
 } SwsFilterUOp;
@@ -229,7 +243,8 @@ typedef struct SwsDitherUOp {
 int ff_sws_dither_height(const SwsDitherUOp *dither);
 
 typedef union SwsUOpParams {
-    SwsFilterUOp    filter; /* for SWS_UOP_READ_*_FV/FH */
+    SwsShuffleUOp   shuffle; /* for SWS_UOP_RW_SHUFFLE */
+    SwsFilterUOp    filter;  /* for SWS_UOP_READ_*_FV/FH */
     SwsShiftUOp     shift;
     SwsMoveUOp      move; /* for SWS_UOP_PERMUTE and SWS_UOP_COPY */
     SwsPackUOp      pack;
@@ -252,6 +267,7 @@ typedef struct SwsUOp {
         SwsPixel scalar;
         SwsPixel vec4[4];
         SwsPixel mat4[4][5];        /* row major */
+        SwsShuffleMask shuffle;     /* for SWS_UOP_RW_SHUFFLE */
         void *opaque;               /* reserved for internal use */
     } data;
 } SwsUOp;
diff --git a/libswscale/uops_list.h b/libswscale/uops_list.h
index 047ead2750..a35af90360 100644
--- a/libswscale/uops_list.h
+++ b/libswscale/uops_list.h
@@ -34,6 +34,7 @@
     ENTRY(SWS_UOP_WRITE_PACKED,         "write_packed")              \
     ENTRY(SWS_UOP_WRITE_NIBBLE,         "write_nibble")              \
     ENTRY(SWS_UOP_WRITE_BIT,            "write_bit")                 \
+    ENTRY(SWS_UOP_RW_SHUFFLE,           "rw_shuffle")                \
     ENTRY(SWS_UOP_PERMUTE,              "permute")                   \
     ENTRY(SWS_UOP_COPY,                 "copy")                      \
     ENTRY(SWS_UOP_SWAP_BYTES,           "swap_bytes")                \
diff --git a/libswscale/uops_macros.h b/libswscale/uops_macros.h
index fc96df9ef4..5cf28945e1 100644
--- a/libswscale/uops_macros.h
+++ b/libswscale/uops_macros.h
@@ -105,6 +105,8 @@
     MACRO(__VA_ARGS__, u8_write_bit_x                          , SWS_PIXEL_U8 
, SWS_UOP_WRITE_BIT       , 0x1)
 #define SWS_FOR_STRUCT_U8_WRITE_BIT(MACRO, ...) \
     MACRO(__VA_ARGS__, u8_write_bit_x                          , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_WRITE_BIT       , .mask = 0x1)
+#define SWS_FOR_U8_RW_SHUFFLE(MACRO, ...)
+#define SWS_FOR_STRUCT_U8_RW_SHUFFLE(MACRO, ...)
 #define SWS_FOR_U8_PERMUTE(MACRO, ...) \
     MACRO(__VA_ARGS__, u8_permute_xy_xy_zw                     , SWS_PIXEL_U8 
, SWS_UOP_PERMUTE         , 0x3, 2, 0, 1, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0) \
     MACRO(__VA_ARGS__, u8_permute_xyz_x_w                      , SWS_PIXEL_U8 
, SWS_UOP_PERMUTE         , 0x7, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0) \
@@ -373,6 +375,8 @@
 #define SWS_FOR_STRUCT_U16_WRITE_NIBBLE(MACRO, ...)
 #define SWS_FOR_U16_WRITE_BIT(MACRO, ...)
 #define SWS_FOR_STRUCT_U16_WRITE_BIT(MACRO, ...)
+#define SWS_FOR_U16_RW_SHUFFLE(MACRO, ...)
+#define SWS_FOR_STRUCT_U16_RW_SHUFFLE(MACRO, ...)
 #define SWS_FOR_U16_PERMUTE(MACRO, ...) \
     MACRO(__VA_ARGS__, u16_permute_xyz_x_w                     , 
SWS_PIXEL_U16, SWS_UOP_PERMUTE         , 0x7, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 
0, 0) \
     MACRO(__VA_ARGS__, u16_permute_xyz_y_w                     , 
SWS_PIXEL_U16, SWS_UOP_PERMUTE         , 0x7, 1, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 
0, 0) \
@@ -627,6 +631,8 @@
 #define SWS_FOR_STRUCT_U32_WRITE_NIBBLE(MACRO, ...)
 #define SWS_FOR_U32_WRITE_BIT(MACRO, ...)
 #define SWS_FOR_STRUCT_U32_WRITE_BIT(MACRO, ...)
+#define SWS_FOR_U32_RW_SHUFFLE(MACRO, ...)
+#define SWS_FOR_STRUCT_U32_RW_SHUFFLE(MACRO, ...)
 #define SWS_FOR_U32_PERMUTE(MACRO, ...) \
     MACRO(__VA_ARGS__, u32_permute_xyz_x_w                     , 
SWS_PIXEL_U32, SWS_UOP_PERMUTE         , 0x7, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 
0, 0) \
     MACRO(__VA_ARGS__, u32_permute_xyz_y_w                     , 
SWS_PIXEL_U32, SWS_UOP_PERMUTE         , 0x7, 1, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 
0, 0) \
@@ -843,6 +849,8 @@
 #define SWS_FOR_STRUCT_F32_WRITE_NIBBLE(MACRO, ...)
 #define SWS_FOR_F32_WRITE_BIT(MACRO, ...)
 #define SWS_FOR_STRUCT_F32_WRITE_BIT(MACRO, ...)
+#define SWS_FOR_F32_RW_SHUFFLE(MACRO, ...)
+#define SWS_FOR_STRUCT_F32_RW_SHUFFLE(MACRO, ...)
 #define SWS_FOR_F32_PERMUTE(MACRO, ...)
 #define SWS_FOR_STRUCT_F32_PERMUTE(MACRO, ...)
 #define SWS_FOR_F32_COPY(MACRO, ...)
diff --git a/libswscale/uops_macros_gen.c b/libswscale/uops_macros_gen.c
index db3d9ffdbe..1bdbf6774e 100644
--- a/libswscale/uops_macros_gen.c
+++ b/libswscale/uops_macros_gen.c
@@ -73,6 +73,13 @@ static int generate_entry_struct(void *opaque, void *key)
     case SWS_UOP_READ_PLANAR_FV_FMA:
         av_bprintf(bp, ", .par.filter.type = %s", 
pixel_types[par->filter.type].full);
         break;
+    case SWS_UOP_RW_SHUFFLE:
+        av_bprintf(bp, ", .par.shuffle.clear_value = 0x%x"
+                       ", .par.shuffle.read_size = %u"
+                       ", .par.shuffle.write_size = %u",
+                   par->shuffle.clear_value,
+                   par->shuffle.read_size, par->shuffle.write_size);
+        break;
     case SWS_UOP_LSHIFT:
     case SWS_UOP_RSHIFT:
         av_bprintf(bp, ", .par.shift.amount = %u", par->shift.amount);
@@ -133,6 +140,10 @@ static int generate_entry_args(void *opaque, void *key)
     case SWS_UOP_READ_PLANAR_FV_FMA:
         av_bprintf(bp, ", %s", pixel_types[par->filter.type].full);
         break;
+    case SWS_UOP_RW_SHUFFLE:
+        av_bprintf(bp, ", 0x%x, %u, %u", par->shuffle.clear_value,
+                   par->shuffle.read_size, par->shuffle.write_size);
+        break;
     case SWS_UOP_LSHIFT:
     case SWS_UOP_RSHIFT:
         av_bprintf(bp, ", %u", par->shift.amount);

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

Reply via email to