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]
