PR #25446 opened by Niklas Haas (haasn)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25446
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/25446.patch

@ramiro this required fixing a bug in the SWS_UOP_LINEAR metadata that may 
impact your JIT branch (see the corresponding aarch64 commit)


>From c1c51e241609798ade01cff58ee08d719622fe7b Mon Sep 17 00:00:00 2001
From: Niklas Haas <[email protected]>
Date: Wed, 21 Oct 2026 01:35:11 +0200
Subject: [PATCH 1/6] swscale/uops: add SWS_UOP_FLAG_PUNNING

The current CPU-based backends don't suffer any penalty or consequence
of intermixing integers and float operations on the same registers. However,
this is not a universal assumption - in particular, SPIR-V expects fully
typed operations.

In theory, older x86 CPUs also have a penalty for switching from float to
int, but ENOCARE.

Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/aarch64/ops.c           |  4 +++-
 libswscale/tests/sws_ops.c         |  3 ++-
 libswscale/tests/sws_ops_aarch64.c |  4 +++-
 libswscale/uops.c                  | 18 ++++++++++++------
 libswscale/uops.h                  |  1 +
 libswscale/uops_backend.c          |  3 ++-
 libswscale/uops_macros_gen.c       |  2 +-
 libswscale/x86/ops.c               |  3 ++-
 8 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/libswscale/aarch64/ops.c b/libswscale/aarch64/ops.c
index 963bfec7308..6bfe1824e97 100644
--- a/libswscale/aarch64/ops.c
+++ b/libswscale/aarch64/ops.c
@@ -225,7 +225,9 @@ static int aarch64_compile(SwsContext *ctx, const SwsOpList 
*ops,
     if (!uops)
         return AVERROR(ENOMEM);
 
-    const SwsUOpFlags flags = (ctx->flags & SWS_BITEXACT) ? 0 : 
SWS_UOP_FLAG_FMA;
+    SwsUOpFlags flags = SWS_UOP_FLAG_PUNNING;
+    if (!(ctx->flags & SWS_BITEXACT))
+        flags |= SWS_UOP_FLAG_FMA;
     int ret = ff_sws_ops_translate(ctx, ops, flags, uops);
     if (ret < 0)
         goto error;
diff --git a/libswscale/tests/sws_ops.c b/libswscale/tests/sws_ops.c
index b2ca5ec41ea..fa1f292ce44 100644
--- a/libswscale/tests/sws_ops.c
+++ b/libswscale/tests/sws_ops.c
@@ -41,7 +41,8 @@ static int print_ops(SwsContext *ctx, const SwsOpList *ops, 
SwsCompiledOp *out)
 
     const SwsUOpFlags flags = SWS_UOP_FLAG_EXPAND_BIT
                             | SWS_UOP_FLAG_READ_PALETTE
-                            | SWS_UOP_FLAG_ADD;
+                            | SWS_UOP_FLAG_ADD
+                            | SWS_UOP_FLAG_PUNNING;
     int ret = ff_sws_ops_translate(ctx, ops, flags, uops);
     if (ret == AVERROR(ENOTSUP))
         goto fail;
diff --git a/libswscale/tests/sws_ops_aarch64.c 
b/libswscale/tests/sws_ops_aarch64.c
index 05eba0f0bb7..3a56d71f593 100644
--- a/libswscale/tests/sws_ops_aarch64.c
+++ b/libswscale/tests/sws_ops_aarch64.c
@@ -201,7 +201,9 @@ static int collect_ops_compile(SwsContext *ctx, const 
SwsOpList *ops,
     if (!uops)
         return AVERROR(ENOMEM);
 
-    const SwsUOpFlags flags = (ctx->flags & SWS_BITEXACT) ? 0 : 
SWS_UOP_FLAG_FMA;
+    SwsUOpFlags flags = SWS_UOP_FLAG_PUNNING;
+    if (!(ctx->flags & SWS_BITEXACT))
+        flags |= SWS_UOP_FLAG_FMA;
     ret = ff_sws_ops_translate(ctx, ops, flags, uops);
     if (ret == AVERROR(ENOTSUP)) {
         ret = 0;
diff --git a/libswscale/uops.c b/libswscale/uops.c
index 6f8b276d33f..054c8984cd0 100644
--- a/libswscale/uops.c
+++ b/libswscale/uops.c
@@ -219,6 +219,12 @@ static SwsPixelType pixel_type_to_int(const SwsPixelType 
type)
     return SWS_PIXEL_NONE;
 }
 
+/* Type to use for uops that do not care about the exact pixel contents */
+static SwsPixelType bits_type(SwsUOpFlags flags, const SwsPixelType type)
+{
+    return (flags & SWS_UOP_FLAG_PUNNING) ? pixel_type_to_int(type) : type;
+}
+
 static bool exact_product_f32(float a, float b)
 {
     volatile float prod   = a * b;
@@ -274,7 +280,7 @@ static int translate_rw_op(SwsContext *ctx, SwsUOpList 
*ops, SwsUOpFlags flags,
 
     /* Non-filtered reads don't care about the exact pixel contents */
     if (!op->rw.filter.op)
-        uop.type = pixel_type_to_int(op->rw.type);
+        uop.type = bits_type(flags, op->rw.type);
 
     const bool is_read = op->op == SWS_OP_READ;
     if (op->rw.filter.op) {
@@ -327,11 +333,11 @@ static int count_idx(const int *arr, size_t size, int val)
     return num;
 }
 
-static int translate_swizzle(SwsUOpList *ops, const SwsOp *op)
+static int translate_swizzle(SwsUOpList *ops, SwsUOpFlags flags, const SwsOp 
*op)
 {
     SwsUOp uop = {
         .uop  = SWS_UOP_PERMUTE,
-        .type = pixel_type_to_int(ff_sws_op_input_type(op)),
+        .type = bits_type(flags, ff_sws_op_input_type(op)),
         .mask = ff_sws_comp_mask_needed(op),
     };
     SwsMoveUOp *par = &uop.par.move;
@@ -524,7 +530,7 @@ static int translate_op(SwsContext *ctx, SwsUOpList *uops, 
SwsUOpFlags flags,
     case SWS_OP_WRITE:
         return translate_rw_op(ctx, uops, flags, op);
     case SWS_OP_SWIZZLE:
-        return translate_swizzle(uops, op);
+        return translate_swizzle(uops, flags, op);
     case SWS_OP_DITHER:
         return translate_dither_op(uops, flags, op);
     case SWS_OP_LINEAR:
@@ -573,7 +579,7 @@ static int translate_op(SwsContext *ctx, SwsUOpList *uops, 
SwsUOpFlags flags,
             const AVRational64 v = op->clear.value[i];
             const SwsPixelType type = op->clear.type[i];
             const SwsPixel px = ff_sws_pixel_from_q64(type, v);
-            uop.type = pixel_type_to_int(type);
+            uop.type = bits_type(flags, type);
             uop.data.vec4[i] = px;
             if (v.num == 0)
                 uop.par.clear.zero |= SWS_COMP(i);
@@ -596,7 +602,7 @@ static int translate_op(SwsContext *ctx, SwsUOpList *uops, 
SwsUOpFlags flags,
         break;
     case SWS_OP_SWAP_BYTES:
         uop.uop = SWS_UOP_SWAP_BYTES;
-        uop.type = pixel_type_to_int(uop.type);
+        uop.type = bits_type(flags, uop.type);
         break;
     case SWS_OP_LUT_3D:
         uop.uop = SWS_UOP_LUT_3D;
diff --git a/libswscale/uops.h b/libswscale/uops.h
index 8660de3c41a..a70a6ac4600 100644
--- a/libswscale/uops.h
+++ b/libswscale/uops.h
@@ -152,6 +152,7 @@ typedef enum SwsUOpFlagBits {
     SWS_UOP_FLAG_EXPAND_BIT   = (1 << 2), /* backend implements 
SWS_UOP_EXPAND_BIT */
     SWS_UOP_FLAG_READ_PALETTE = (1 << 3), /* backend implements 
SWS_UOP_READ_PALETTE */
     SWS_UOP_FLAG_ADD          = (1 << 4), /* backend implements SWS_UOP_ADD */
+    SWS_UOP_FLAG_PUNNING      = (1 << 5), /* allow type punning float data as 
int */
 } SwsUOpFlagBits;
 
 typedef enum SwsUOpType {
diff --git a/libswscale/uops_backend.c b/libswscale/uops_backend.c
index 5dfb829b4e4..aa8b4dd0b4b 100644
--- a/libswscale/uops_backend.c
+++ b/libswscale/uops_backend.c
@@ -187,7 +187,8 @@ static int compile_c(SwsContext *ctx, const SwsOpList *ops, 
SwsCompiledOp *out)
 
     const SwsUOpFlags flags = SWS_UOP_FLAG_EXPAND_BIT
                             | SWS_UOP_FLAG_READ_PALETTE
-                            | SWS_UOP_FLAG_ADD;
+                            | SWS_UOP_FLAG_ADD
+                            | SWS_UOP_FLAG_PUNNING;
     int ret = ff_sws_ops_translate(ctx, ops, flags, uops);
     if (ret < 0)
         goto fail;
diff --git a/libswscale/uops_macros_gen.c b/libswscale/uops_macros_gen.c
index 4da20af67c5..2af7e6fd984 100644
--- a/libswscale/uops_macros_gen.c
+++ b/libswscale/uops_macros_gen.c
@@ -217,7 +217,7 @@ fail:
 
 enum {
     COMMON_FLAGS = SWS_UOP_FLAG_EXPAND_BIT | SWS_UOP_FLAG_READ_PALETTE |
-                   SWS_UOP_FLAG_ADD,
+                   SWS_UOP_FLAG_ADD | SWS_UOP_FLAG_PUNNING,
 };
 
 typedef struct Backend {
diff --git a/libswscale/x86/ops.c b/libswscale/x86/ops.c
index 7985b7a0266..6337711b33c 100644
--- a/libswscale/x86/ops.c
+++ b/libswscale/x86/ops.c
@@ -726,7 +726,8 @@ static int compile_x86(SwsContext *ctx, const SwsOpList 
*ops, SwsCompiledOp *out
     SwsUOpFlags flags = SWS_UOP_FLAG_PSHUFB
                       | SWS_UOP_FLAG_EXPAND_BIT
                       | SWS_UOP_FLAG_READ_PALETTE
-                      | SWS_UOP_FLAG_ADD;
+                      | SWS_UOP_FLAG_ADD
+                      | SWS_UOP_FLAG_PUNNING;
     if (EXTERNAL_FMA3(cpu_flags))
         flags |= SWS_UOP_FLAG_FMA;
 
-- 
2.54.0


>From 10826c0c8549ef35f4e75385dd2c1d1a4bc9489b Mon Sep 17 00:00:00 2001
From: Niklas Haas <[email protected]>
Date: Sun, 25 Oct 2026 12:08:52 +0100
Subject: [PATCH 2/6] swscale/aaarch64/ops: skip over masked SWS_UOP_LINEAR
 rows

These are entirely unneeded; prerequisite to the following fix, which fixes
the wrong `zero` mask for the masked identity rows.

Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/aarch64/ops.c      | 2 +-
 libswscale/aarch64/ops_impl.h | 8 +++++---
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/libswscale/aarch64/ops.c b/libswscale/aarch64/ops.c
index 6bfe1824e97..1497352ad43 100644
--- a/libswscale/aarch64/ops.c
+++ b/libswscale/aarch64/ops.c
@@ -83,7 +83,7 @@ static int aarch64_setup_linear(const SwsAArch64OpImplParams 
*p,
      * The same order must be followed in asmgen_op_linear().
      */
     int i_coeff = 0;
-    for (int i = 0; i < 4; i++) {
+    LOOP_MASK(p, i) {
         for (int j = 0; j < 5; j++) {
             const int jj = (j == 0) ? 4 : (j - 1);
             if (!(p->par.lin.zero & SWS_MASK(i, jj))) {
diff --git a/libswscale/aarch64/ops_impl.h b/libswscale/aarch64/ops_impl.h
index c9ad019cfe0..ff3181f3961 100644
--- a/libswscale/aarch64/ops_impl.h
+++ b/libswscale/aarch64/ops_impl.h
@@ -73,9 +73,11 @@ static inline int linear_vreg_nelems(SwsPixelType type)
 static inline int linear_num_vregs(const SwsAArch64OpImplParams *params)
 {
     int count = 0;
-    for (int i = 0; i < 4 * 5; i++)
-        if (!(params->par.lin.zero & (1ULL << i)))
-            count++;
+    LOOP_MASK(params, i) {
+        for (int j = 0; j < 5; j++)
+            if (!(params->par.lin.zero & SWS_MASK(i, j)))
+                count++;
+    }
     const int nelems = linear_vreg_nelems(params->type);
     return (count + nelems - 1) / nelems;
 }
-- 
2.54.0


>From 6ca02df0e840b486e00b5388a30348d02c06277d Mon Sep 17 00:00:00 2001
From: Niklas Haas <[email protected]>
Date: Sun, 25 Oct 2026 12:10:28 +0100
Subject: [PATCH 3/6] swscale/uops: correctly mark masked linear rows as
 identity rows

They are currently emitted identically to an explicit zero row, which is
wrong - a zero row would not be masked as it contains an operation (setting
the component to zero *is* an explicit operation; only leaving it untouched
is an implicit noop).

And also emit a 1 coefficient in the expected location in the data matrix.

I have verified that the resulting x86 and NEON kernels are bit-identical.

Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/aarch64/ops_entries.c |  72 ++++++------
 libswscale/uops.c                |   4 +-
 libswscale/uops_macros.h         |  92 +++++++--------
 libswscale/x86/uops_macros.asm   |  94 ++++++++--------
 libswscale/x86/uops_macros.h     | 188 +++++++++++++++----------------
 5 files changed, 226 insertions(+), 224 deletions(-)

diff --git a/libswscale/aarch64/ops_entries.c b/libswscale/aarch64/ops_entries.c
index 2f99ace3e08..4759c464be0 100644
--- a/libswscale/aarch64/ops_entries.c
+++ b/libswscale/aarch64/ops_entries.c
@@ -372,48 +372,48 @@ ENTRY(ff_sws_clear_ffff_16_u16_0001_neon,           { 
.uop = SWS_UOP_CLEAR,
 ENTRY(ff_sws_clear_ffff_16_u16_0011_neon,           { .uop = SWS_UOP_CLEAR,    
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x3, .par.clear = { .one = 
0x0, .zero = 0x0 } })
 ENTRY(ff_sws_clear_ffff_16_u16_0111_neon,           { .uop = SWS_UOP_CLEAR,    
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x7, .par.clear = { .one = 
0x0, .zero = 0x0 } })
 ENTRY(ff_sws_clear_ffff_16_u16_1000_neon,           { .uop = SWS_UOP_CLEAR,    
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x8, .par.clear = { .one = 
0x0, .zero = 0x0 } })
-ENTRY(ff_sws_linear_000000000f_8_u32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_U32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xfffee } })
-ENTRY(ff_sws_linear_000000000f_8_f32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xfffee } })
-ENTRY(ff_sws_linear_000000000f_16_u8_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xfffee } })
-ENTRY(ff_sws_linear_000000000f_16_u16_0001_neon,    { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xfffee } })
-ENTRY(ff_sws_linear_00000000fc_8_f32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xffff8 } })
-ENTRY(ff_sws_linear_00000000ff_8_f32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xfffe8 } })
-ENTRY(ff_sws_linear_000000c000_8_f32_0010_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x2, .par.lin = { .one = 
0x0, .zero = 0xfffbf } })
-ENTRY(ff_sws_linear_000000c000_16_u8_0010_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x2, .par.lin = { .one = 
0x0, .zero = 0xfffbf } })
-ENTRY(ff_sws_linear_000373dcc7_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x421, .zero = 0xfb10a } })
-ENTRY(ff_sws_linear_0003f3fccf_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfb10a } })
-ENTRY(ff_sws_linear_000c00c00c_8_u32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_U32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfefbe } })
-ENTRY(ff_sws_linear_000c00c00c_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfefbe } })
-ENTRY(ff_sws_linear_000c00c00c_16_u8_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfefbe } })
-ENTRY(ff_sws_linear_000c00c00c_16_u16_0111_neon,    { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfefbe } })
-ENTRY(ff_sws_linear_000c30cc0f_8_u32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_U32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfadae } })
-ENTRY(ff_sws_linear_000c30cc0f_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfadae } })
-ENTRY(ff_sws_linear_000c30cc0f_16_u8_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfadae } })
-ENTRY(ff_sws_linear_000c30cc0f_16_u16_0111_neon,    { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfadae } })
-ENTRY(ff_sws_linear_000ff3fcfc_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfa118 } })
-ENTRY(ff_sws_linear_000ff3fcff_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xfa108 } })
-ENTRY(ff_sws_linear_c000000000_8_f32_1000_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x8, .par.lin = { .one = 
0x0, .zero = 0xbffff } })
-ENTRY(ff_sws_linear_c00000000f_8_f32_1001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, .par.lin = { .one = 
0x0, .zero = 0xbffee } })
-ENTRY(ff_sws_linear_c0000000fc_8_f32_1001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, .par.lin = { .one = 
0x0, .zero = 0xbfff8 } })
+ENTRY(ff_sws_linear_c00373dcc7_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x421, .zero = 0xbb10a } })
+ENTRY(ff_sws_linear_c003f3fccf_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbb10a } })
 ENTRY(ff_sws_linear_c003f3fccf_8_f32_1111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf, .par.lin = { .one = 
0x0, .zero = 0xbb10a } })
+ENTRY(ff_sws_linear_c00c00c00c_8_u32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_U32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_c00c00c00c_8_f32_0010_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x2, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_c00c00c00c_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_c00c00c00c_8_f32_1000_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x8, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
 ENTRY(ff_sws_linear_c00c00c00c_8_f32_1111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_c00c00c00c_16_u8_0010_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x2, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_c00c00c00c_16_u8_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_c00c00c00c_16_u16_0111_neon,    { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
 ENTRY(ff_sws_linear_c00c00c00c_16_u16_1111_neon,    { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0xf, .par.lin = { .one = 
0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_c00c00c00f_8_u32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_U32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xbefae } })
+ENTRY(ff_sws_linear_c00c00c00f_8_f32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xbefae } })
+ENTRY(ff_sws_linear_c00c00c00f_8_f32_1001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, .par.lin = { .one = 
0x0, .zero = 0xbefae } })
+ENTRY(ff_sws_linear_c00c00c00f_16_u8_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xbefae } })
+ENTRY(ff_sws_linear_c00c00c00f_16_u16_0001_neon,    { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xbefae } })
+ENTRY(ff_sws_linear_c00c00c0fc_8_f32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xbefb8 } })
+ENTRY(ff_sws_linear_c00c00c0fc_8_f32_1001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, .par.lin = { .one = 
0x0, .zero = 0xbefb8 } })
+ENTRY(ff_sws_linear_c00c00c0ff_8_f32_0001_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, .par.lin = { .one = 
0x0, .zero = 0xbefa8 } })
+ENTRY(ff_sws_linear_c00c30cc0f_8_u32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_U32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbadae } })
+ENTRY(ff_sws_linear_c00c30cc0f_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbadae } })
+ENTRY(ff_sws_linear_c00c30cc0f_16_u8_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U8,  .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbadae } })
+ENTRY(ff_sws_linear_c00c30cc0f_16_u16_0111_neon,    { .uop = SWS_UOP_LINEAR,   
    .block_size = 16, .type = SWS_PIXEL_U16, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xbadae } })
+ENTRY(ff_sws_linear_c00ff3fcfc_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xba118 } })
+ENTRY(ff_sws_linear_c00ff3fcff_8_f32_0111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, .par.lin = { .one = 
0x0, .zero = 0xba108 } })
 ENTRY(ff_sws_linear_c00ff3fcff_8_f32_1111_neon,     { .uop = SWS_UOP_LINEAR,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf, .par.lin = { .one = 
0x0, .zero = 0xba108 } })
-ENTRY(ff_sws_linear_fma_000000000f_8_f32_0001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, 
.par.lin = { .one = 0x0, .zero = 0xfffee } })
-ENTRY(ff_sws_linear_fma_00000000fc_8_f32_0001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, 
.par.lin = { .one = 0x0, .zero = 0xffff8 } })
-ENTRY(ff_sws_linear_fma_00000000ff_8_f32_0001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, 
.par.lin = { .one = 0x0, .zero = 0xfffe8 } })
-ENTRY(ff_sws_linear_fma_000000c000_8_f32_0010_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x2, 
.par.lin = { .one = 0x0, .zero = 0xfffbf } })
-ENTRY(ff_sws_linear_fma_000373dcc7_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x421, .zero = 0xfb10a } })
-ENTRY(ff_sws_linear_fma_0003f3fccf_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xfb10a } })
-ENTRY(ff_sws_linear_fma_000c00c00c_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xfefbe } })
-ENTRY(ff_sws_linear_fma_000c30cc0f_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xfadae } })
-ENTRY(ff_sws_linear_fma_000ff3fcfc_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xfa118 } })
-ENTRY(ff_sws_linear_fma_000ff3fcff_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xfa108 } })
-ENTRY(ff_sws_linear_fma_c000000000_8_f32_1000_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x8, 
.par.lin = { .one = 0x0, .zero = 0xbffff } })
-ENTRY(ff_sws_linear_fma_c00000000f_8_f32_1001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, 
.par.lin = { .one = 0x0, .zero = 0xbffee } })
-ENTRY(ff_sws_linear_fma_c0000000fc_8_f32_1001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, 
.par.lin = { .one = 0x0, .zero = 0xbfff8 } })
+ENTRY(ff_sws_linear_fma_c00373dcc7_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x421, .zero = 0xbb10a } })
+ENTRY(ff_sws_linear_fma_c003f3fccf_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xbb10a } })
 ENTRY(ff_sws_linear_fma_c003f3fccf_8_f32_1111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf, 
.par.lin = { .one = 0x0, .zero = 0xbb10a } })
+ENTRY(ff_sws_linear_fma_c00c00c00c_8_f32_0010_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x2, 
.par.lin = { .one = 0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_fma_c00c00c00c_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_fma_c00c00c00c_8_f32_1000_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x8, 
.par.lin = { .one = 0x0, .zero = 0xbefbe } })
 ENTRY(ff_sws_linear_fma_c00c00c00c_8_f32_1111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf, 
.par.lin = { .one = 0x0, .zero = 0xbefbe } })
+ENTRY(ff_sws_linear_fma_c00c00c00f_8_f32_0001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, 
.par.lin = { .one = 0x0, .zero = 0xbefae } })
+ENTRY(ff_sws_linear_fma_c00c00c00f_8_f32_1001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, 
.par.lin = { .one = 0x0, .zero = 0xbefae } })
+ENTRY(ff_sws_linear_fma_c00c00c0fc_8_f32_0001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, 
.par.lin = { .one = 0x0, .zero = 0xbefb8 } })
+ENTRY(ff_sws_linear_fma_c00c00c0fc_8_f32_1001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x9, 
.par.lin = { .one = 0x0, .zero = 0xbefb8 } })
+ENTRY(ff_sws_linear_fma_c00c00c0ff_8_f32_0001_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x1, 
.par.lin = { .one = 0x0, .zero = 0xbefa8 } })
+ENTRY(ff_sws_linear_fma_c00c30cc0f_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xbadae } })
+ENTRY(ff_sws_linear_fma_c00ff3fcfc_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xba118 } })
+ENTRY(ff_sws_linear_fma_c00ff3fcff_8_f32_0111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0x7, 
.par.lin = { .one = 0x0, .zero = 0xba108 } })
 ENTRY(ff_sws_linear_fma_c00ff3fcff_8_f32_1111_neon, { .uop = 
SWS_UOP_LINEAR_FMA,   .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf, 
.par.lin = { .one = 0x0, .zero = 0xba108 } })
 ENTRY(ff_sws_dither_0325_4_8_f32_1111_neon,         { .uop = SWS_UOP_DITHER,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xf, .par.dither = { 
.y_offset = {5, 2, 3, 0}, .size_log2 = 4 } })
 ENTRY(ff_sws_dither_032f_4_8_f32_1110_neon,         { .uop = SWS_UOP_DITHER,   
    .block_size =  8, .type = SWS_PIXEL_F32, .mask = 0xe, .par.dither = { 
.y_offset = {0, 2, 3, 0}, .size_log2 = 4 } })
diff --git a/libswscale/uops.c b/libswscale/uops.c
index 054c8984cd0..079a65bab6e 100644
--- a/libswscale/uops.c
+++ b/libswscale/uops.c
@@ -484,13 +484,15 @@ static int translate_linear_op(SwsContext *ctx, 
SwsUOpList *ops,
         .uop  = SWS_UOP_LINEAR,
     };
 
+    const SwsPixel one = ff_sws_pixel_from_q64(uop.type, (AVRational64) {1, 
1});
     const uint32_t mask = ff_sws_linear_mask(&op->lin);
     const bool bitexact = ctx->flags & SWS_BITEXACT;
     uint32_t exact = 0;
 
     for (int i = 0; i < 4; i++) {
         if (!SWS_OP_NEEDED(op, i) || !(mask & SWS_MASK_ROW(i))) {
-            uop.par.lin.zero |= SWS_MASK_ROW(i);
+            uop.par.lin.zero |= SWS_MASK_ROW(i) ^ SWS_MASK(i, i);
+            uop.data.mat4x5[i][i] = one;
             continue;
         }
         uop.mask |= SWS_COMP(i);
diff --git a/libswscale/uops_macros.h b/libswscale/uops_macros.h
index 92d61f44424..de93567cf4d 100644
--- a/libswscale/uops_macros.h
+++ b/libswscale/uops_macros.h
@@ -288,15 +288,15 @@
     MACRO(__VA_ARGS__, u8_clear_xzw_1xx                        , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00001, .par.clear.zero = 0x00000) \
     MACRO(__VA_ARGS__, u8_clear_xzw_xx1                        , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00008, .par.clear.zero = 0x00000)
 #define SWS_FOR_U8_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xfffbf) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe)
+    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_U8_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffbf) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe)
+    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_U8_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_STRUCT_U8_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_U8_DITHER(MACRO, ...)
@@ -572,14 +572,14 @@
     MACRO(__VA_ARGS__, u16_clear_xzw_xx0                       , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00000, .par.clear.zero = 0x00008) \
     MACRO(__VA_ARGS__, u16_clear_xzw_1xx                       , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00001, .par.clear.zero = 0x00000)
 #define SWS_FOR_U16_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe) \
+    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe) \
     MACRO(__VA_ARGS__, u16_linear_xyzw_x0000_0x000_00x00_000x0 , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_U16_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe) \
+    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
     MACRO(__VA_ARGS__, u16_linear_xyzw_x0000_0x000_00x00_000x0 , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_U16_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_STRUCT_U16_LINEAR_FMA(MACRO, ...)
@@ -802,13 +802,13 @@
     MACRO(__VA_ARGS__, u32_clear_xyw_xxx                       , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_CLEAR           , .mask = 0xb, .par.clear.one = 
0x00000, .par.clear.zero = 0x00000) \
     MACRO(__VA_ARGS__, u32_clear_xzw_xxx                       , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00000, .par.clear.zero = 0x00000)
 #define SWS_FOR_U32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe)
+    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_U32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe)
+    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_U32_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_STRUCT_U32_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_U32_DITHER(MACRO, ...)
@@ -988,36 +988,36 @@
 #define SWS_FOR_F32_CLEAR(MACRO, ...)
 #define SWS_FOR_STRUCT_F32_CLEAR(MACRO, ...)
 #define SWS_FOR_F32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffe8) \
-    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xffff8) \
-    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xfffbf) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00421, 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x8, 0x00000, 0xbffff) \
-    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbffee) \
-    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbfff8) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefa8) \
+    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xba108) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xba118) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00421, 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x8, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbefb8) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_xxx0x_xxx0x_xxx0x_000x0 , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0x0x_xxx0x_xx00x_000x0 , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbb10a) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0000_0x000_00x00_000x0 , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_F32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffe8) \
-    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xffff8) \
-    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffbf) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00421, .par.lin.zero = 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x8, .par.lin.one = 
0x00000, .par.lin.zero = 0xbffff) \
-    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbffee) \
-    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbfff8) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefa8) \
+    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba118) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00421, .par.lin.zero = 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x8, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_xxx0x_xxx0x_xxx0x_000x0 , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0x0x_xxx0x_xx00x_000x0 , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0000_0x000_00x00_000x0 , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
diff --git a/libswscale/x86/uops_macros.asm b/libswscale/x86/uops_macros.asm
index d7d539f286c..7898cc84e11 100644
--- a/libswscale/x86/uops_macros.asm
+++ b/libswscale/x86/uops_macros.asm
@@ -231,10 +231,10 @@
 %endmacro
 
 %macro DECL_U8_LINEAR 1
-    DECL_OP %1, u8_linear_x_x000x                       , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee
-    DECL_OP %1, u8_linear_y_0x000                       , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x2, 0x00000, 0xfffbf
-    DECL_OP %1, u8_linear_xyz_x000x_0x00x_00x0x         , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae
-    DECL_OP %1, u8_linear_xyz_x0000_0x000_00x00         , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe
+    DECL_OP %1, u8_linear_x_x000x                       , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae
+    DECL_OP %1, u8_linear_y_0x000                       , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x2, 0x00000, 0xbefbe
+    DECL_OP %1, u8_linear_xyz_x000x_0x00x_00x0x         , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae
+    DECL_OP %1, u8_linear_xyz_x0000_0x000_00x00         , SWS_PIXEL_U8 , 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe
 %endmacro
 
 %macro DECL_U8_LINEAR_FMA 1
@@ -449,9 +449,9 @@
 %endmacro
 
 %macro DECL_U16_LINEAR 1
-    DECL_OP %1, u16_linear_x_x000x                      , SWS_PIXEL_U16, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee
-    DECL_OP %1, u16_linear_xyz_x000x_0x00x_00x0x        , SWS_PIXEL_U16, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae
-    DECL_OP %1, u16_linear_xyz_x0000_0x000_00x00        , SWS_PIXEL_U16, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe
+    DECL_OP %1, u16_linear_x_x000x                      , SWS_PIXEL_U16, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae
+    DECL_OP %1, u16_linear_xyz_x000x_0x00x_00x0x        , SWS_PIXEL_U16, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae
+    DECL_OP %1, u16_linear_xyz_x0000_0x000_00x00        , SWS_PIXEL_U16, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe
     DECL_OP %1, u16_linear_xyzw_x0000_0x000_00x00_000x0 , SWS_PIXEL_U16, 
SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbefbe
 %endmacro
 
@@ -636,9 +636,9 @@
 %endmacro
 
 %macro DECL_U32_LINEAR 1
-    DECL_OP %1, u32_linear_x_x000x                      , SWS_PIXEL_U32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee
-    DECL_OP %1, u32_linear_xyz_x000x_0x00x_00x0x        , SWS_PIXEL_U32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae
-    DECL_OP %1, u32_linear_xyz_x0000_0x000_00x00        , SWS_PIXEL_U32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe
+    DECL_OP %1, u32_linear_x_x000x                      , SWS_PIXEL_U32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae
+    DECL_OP %1, u32_linear_xyz_x000x_0x00x_00x0x        , SWS_PIXEL_U32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae
+    DECL_OP %1, u32_linear_xyz_x0000_0x000_00x00        , SWS_PIXEL_U32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe
 %endmacro
 
 %macro DECL_U32_LINEAR_FMA 1
@@ -805,49 +805,49 @@
 %endmacro
 
 %macro DECL_F32_LINEAR 1
-    DECL_OP %1, f32_linear_x_xxx0x                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffe8
-    DECL_OP %1, f32_linear_x_x000x                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee
-    DECL_OP %1, f32_linear_x_xxx00                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xffff8
-    DECL_OP %1, f32_linear_y_0x000                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x2, 0x00000, 0xfffbf
-    DECL_OP %1, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfa108
-    DECL_OP %1, f32_linear_xyz_x0x0x_xxx0x_xx00x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfb10a
-    DECL_OP %1, f32_linear_xyz_xxx00_xxx0x_xxx0x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfa118
-    DECL_OP %1, f32_linear_xyz_x000x_0x00x_00x0x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae
-    DECL_OP %1, f32_linear_xyz_x0000_0x000_00x00        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe
-    DECL_OP %1, f32_linear_xyz_10x0x_1xx0x_1x00x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00421, 0xfb10a
-    DECL_OP %1, f32_linear_w_000x0                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x8, 0x00000, 0xbffff
-    DECL_OP %1, f32_linear_xw_x000x_000x0               , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbffee
-    DECL_OP %1, f32_linear_xw_xxx00_000x0               , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbfff8
+    DECL_OP %1, f32_linear_x_xxx0x                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefa8
+    DECL_OP %1, f32_linear_x_x000x                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae
+    DECL_OP %1, f32_linear_x_xxx00                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefb8
+    DECL_OP %1, f32_linear_y_0x000                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x2, 0x00000, 0xbefbe
+    DECL_OP %1, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xba108
+    DECL_OP %1, f32_linear_xyz_x0x0x_xxx0x_xx00x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbb10a
+    DECL_OP %1, f32_linear_xyz_xxx00_xxx0x_xxx0x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xba118
+    DECL_OP %1, f32_linear_xyz_x000x_0x00x_00x0x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae
+    DECL_OP %1, f32_linear_xyz_x0000_0x000_00x00        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe
+    DECL_OP %1, f32_linear_xyz_10x0x_1xx0x_1x00x        , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x7, 0x00421, 0xbb10a
+    DECL_OP %1, f32_linear_w_000x0                      , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x8, 0x00000, 0xbefbe
+    DECL_OP %1, f32_linear_xw_x000x_000x0               , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbefae
+    DECL_OP %1, f32_linear_xw_xxx00_000x0               , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbefb8
     DECL_OP %1, f32_linear_xyzw_xxx0x_xxx0x_xxx0x_000x0 , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0xf, 0x00000, 0xba108
     DECL_OP %1, f32_linear_xyzw_x0x0x_xxx0x_xx00x_000x0 , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbb10a
     DECL_OP %1, f32_linear_xyzw_x0000_0x000_00x00_000x0 , SWS_PIXEL_F32, 
SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbefbe
 %endmacro
 
 %macro DECL_F32_LINEAR_FMA 1
-    DECL_OP %1, f32_linear_fma_x_xxx0x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffe8, 0xfffe8
-    DECL_OP %1, f32_linear_fma_x_XXX0x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffe8, 0xfffef
-    DECL_OP %1, f32_linear_fma_x_x000x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffee, 0xfffee
-    DECL_OP %1, f32_linear_fma_x_X000x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffee, 0xfffef
-    DECL_OP %1, f32_linear_fma_x_xxx00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffff8
-    DECL_OP %1, f32_linear_fma_x_xXx00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffffa
-    DECL_OP %1, f32_linear_fma_x_xxX00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffffc
-    DECL_OP %1, f32_linear_fma_x_xXX00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffffe
-    DECL_OP %1, f32_linear_fma_y_0x000                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x2, 0x00000, 0xfffbf, 0xfffbf
-    DECL_OP %1, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa108, 0xfa108
-    DECL_OP %1, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa108, 0xfbdaf
-    DECL_OP %1, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa108, 0xfbdef
-    DECL_OP %1, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfb10a, 0xfbdef
-    DECL_OP %1, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa118, 0xfa118
-    DECL_OP %1, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa118, 0xfbdbe
-    DECL_OP %1, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa118, 0xfbdfe
-    DECL_OP %1, f32_linear_fma_xyz_X000x_0X00x_00X0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfadae, 0xfbdef
-    DECL_OP %1, f32_linear_fma_xyz_x0000_0x000_00x00    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfefbe, 0xfefbe
-    DECL_OP %1, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00421, 0xfb10a, 0xfbdef
-    DECL_OP %1, f32_linear_fma_w_000x0                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x8, 0x00000, 0xbffff, 0xbffff
-    DECL_OP %1, f32_linear_fma_xw_x000x_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbffee, 0xbffee
-    DECL_OP %1, f32_linear_fma_xw_X000x_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbffee, 0xbffef
-    DECL_OP %1, f32_linear_fma_xw_xxx00_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbfff8, 0xbfff8
-    DECL_OP %1, f32_linear_fma_xw_xXX00_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbfff8, 0xbfffe
+    DECL_OP %1, f32_linear_fma_x_xxx0x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefa8, 0xbefa8
+    DECL_OP %1, f32_linear_fma_x_XXX0x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefa8, 0xbefaf
+    DECL_OP %1, f32_linear_fma_x_x000x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefae, 0xbefae
+    DECL_OP %1, f32_linear_fma_x_X000x                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefae, 0xbefaf
+    DECL_OP %1, f32_linear_fma_x_xxx00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefb8
+    DECL_OP %1, f32_linear_fma_x_xXx00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefba
+    DECL_OP %1, f32_linear_fma_x_xxX00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefbc
+    DECL_OP %1, f32_linear_fma_x_xXX00                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefbe
+    DECL_OP %1, f32_linear_fma_y_0x000                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x2, 0x00000, 0xbefbe, 0xbefbe
+    DECL_OP %1, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba108, 0xba108
+    DECL_OP %1, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba108, 0xbbdaf
+    DECL_OP %1, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba108, 0xbbdef
+    DECL_OP %1, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xbb10a, 0xbbdef
+    DECL_OP %1, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba118, 0xba118
+    DECL_OP %1, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba118, 0xbbdbe
+    DECL_OP %1, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba118, 0xbbdfe
+    DECL_OP %1, f32_linear_fma_xyz_X000x_0X00x_00X0x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xbadae, 0xbbdef
+    DECL_OP %1, f32_linear_fma_xyz_x0000_0x000_00x00    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xbefbe, 0xbefbe
+    DECL_OP %1, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x7, 0x00421, 0xbb10a, 0xbbdef
+    DECL_OP %1, f32_linear_fma_w_000x0                  , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x8, 0x00000, 0xbefbe, 0xbefbe
+    DECL_OP %1, f32_linear_fma_xw_x000x_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefae, 0xbefae
+    DECL_OP %1, f32_linear_fma_xw_X000x_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefae, 0xbefaf
+    DECL_OP %1, f32_linear_fma_xw_xxx00_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefb8, 0xbefb8
+    DECL_OP %1, f32_linear_fma_xw_xXX00_000x0           , SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefb8, 0xbefbe
     DECL_OP %1, f32_linear_fma_xyzw_xxx0x_xxx0x_xxx0x_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xba108
     DECL_OP %1, f32_linear_fma_xyzw_XXX0x_XXX0x_XXX0x_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xbbdef
     DECL_OP %1, f32_linear_fma_xyzw_X0X0x_XXX0x_XX00x_000x0, SWS_PIXEL_F32, 
SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbb10a, 0xbbdef
diff --git a/libswscale/x86/uops_macros.h b/libswscale/x86/uops_macros.h
index 8226feb9812..5363e5c968d 100644
--- a/libswscale/x86/uops_macros.h
+++ b/libswscale/x86/uops_macros.h
@@ -336,15 +336,15 @@
     MACRO(__VA_ARGS__, u8_clear_xzw_1xx                        , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00001, .par.clear.zero = 0x00000) \
     MACRO(__VA_ARGS__, u8_clear_xzw_xx1                        , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00008, .par.clear.zero = 0x00000)
 #define SWS_FOR_U8_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xfffbf) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe)
+    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , SWS_PIXEL_U8 
, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_U8_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffbf) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe)
+    MACRO(__VA_ARGS__, u8_linear_x_x000x                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, u8_linear_y_0x000                       , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x000x_0x00x_00x0x         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, u8_linear_xyz_x0000_0x000_00x00         , .type = 
SWS_PIXEL_U8 , .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_U8_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_STRUCT_U8_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_U8_DITHER(MACRO, ...)
@@ -628,14 +628,14 @@
     MACRO(__VA_ARGS__, u16_clear_xzw_xx0                       , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00000, .par.clear.zero = 0x00008) \
     MACRO(__VA_ARGS__, u16_clear_xzw_1xx                       , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00001, .par.clear.zero = 0x00000)
 #define SWS_FOR_U16_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe) \
+    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe) \
     MACRO(__VA_ARGS__, u16_linear_xyzw_x0000_0x000_00x00_000x0 , 
SWS_PIXEL_U16, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_U16_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe) \
+    MACRO(__VA_ARGS__, u16_linear_x_x000x                      , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, u16_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
     MACRO(__VA_ARGS__, u16_linear_xyzw_x0000_0x000_00x00_000x0 , .type = 
SWS_PIXEL_U16, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_U16_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_STRUCT_U16_LINEAR_FMA(MACRO, ...)
@@ -858,13 +858,13 @@
     MACRO(__VA_ARGS__, u32_clear_xyw_xxx                       , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_CLEAR           , .mask = 0xb, .par.clear.one = 
0x00000, .par.clear.zero = 0x00000) \
     MACRO(__VA_ARGS__, u32_clear_xzw_xxx                       , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_CLEAR           , .mask = 0xd, .par.clear.one = 
0x00000, .par.clear.zero = 0x00000)
 #define SWS_FOR_U32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe)
+    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_U32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_U32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe)
+    MACRO(__VA_ARGS__, u32_linear_x_x000x                      , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, u32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_U32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_U32_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_STRUCT_U32_LINEAR_FMA(MACRO, ...)
 #define SWS_FOR_U32_DITHER(MACRO, ...)
@@ -1052,93 +1052,93 @@
 #define SWS_FOR_F32_CLEAR(MACRO, ...)
 #define SWS_FOR_STRUCT_F32_CLEAR(MACRO, ...)
 #define SWS_FOR_F32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffe8) \
-    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xfffee) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xffff8) \
-    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xfffbf) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfadae) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xfefbe) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00421, 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x8, 0x00000, 0xbffff) \
-    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbffee) \
-    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbfff8) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefa8) \
+    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x1, 0x00000, 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x2, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xba108) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xba118) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbadae) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x7, 0x00421, 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x8, 0x00000, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0x9, 0x00000, 0xbefb8) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_xxx0x_xxx0x_xxx0x_000x0 , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0x0x_xxx0x_xx00x_000x0 , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbb10a) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0000_0x000_00x00_000x0 , 
SWS_PIXEL_F32, SWS_UOP_LINEAR          , 0xf, 0x00000, 0xbefbe)
 #define SWS_FOR_STRUCT_F32_LINEAR(MACRO, ...) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffe8) \
-    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee) \
-    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xffff8) \
-    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffbf) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe) \
-    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00421, .par.lin.zero = 0xfb10a) \
-    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x8, .par.lin.one = 
0x00000, .par.lin.zero = 0xbffff) \
-    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbffee) \
-    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbfff8) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx0x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefa8) \
+    MACRO(__VA_ARGS__, f32_linear_x_x000x                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_x_xxx00                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_y_0x000                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx0x_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0x0x_xxx0x_xx00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_xxx00_xxx0x_xxx0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba118) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x000x_0x00x_00x0x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_x0000_0x000_00x00        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xyz_10x0x_1xx0x_1x00x        , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x7, .par.lin.one = 
0x00421, .par.lin.zero = 0xbb10a) \
+    MACRO(__VA_ARGS__, f32_linear_w_000x0                      , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x8, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_xw_x000x_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_xw_xxx00_000x0               , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_xxx0x_xxx0x_xxx0x_000x0 , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0x0x_xxx0x_xx00x_000x0 , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a) \
     MACRO(__VA_ARGS__, f32_linear_xyzw_x0000_0x000_00x00_000x0 , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR          , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe)
 #define SWS_FOR_F32_LINEAR_FMA(MACRO, ...) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx0x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffe8, 0xfffe8) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_XXX0x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffe8, 0xfffef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_x000x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffee, 0xfffee) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_X000x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xfffee, 0xfffef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffff8) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xXx00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffffa) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xxX00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffffc) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xXX00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xffff8, 0xffffe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_y_0x000                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x2, 0x00000, 0xfffbf, 0xfffbf) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa108, 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa108, 0xfbdaf) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa108, 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfb10a, 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa118, 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa118, 0xfbdbe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfa118, 0xfbdfe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0X00x_00X0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfadae, 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0000_0x000_00x00    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xfefbe, 0xfefbe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00421, 0xfb10a, 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_w_000x0                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x8, 0x00000, 0xbffff, 0xbffff) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_x000x_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbffee, 0xbffee) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_X000x_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbffee, 0xbffef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_xxx00_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbfff8, 0xbfff8) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_xXX00_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbfff8, 0xbfffe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx0x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefa8, 0xbefa8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_XXX0x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefa8, 0xbefaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_x000x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefae, 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_X000x                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefae, 0xbefaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xXx00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefba) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xxX00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefbc) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xXX00                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x1, 0x00000, 0xbefb8, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_y_0x000                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x2, 0x00000, 0xbefbe, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba108, 0xba108) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba108, 0xbbdaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba108, 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xbb10a, 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba118, 0xba118) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba118, 0xbbdbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xba118, 0xbbdfe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0X00x_00X0x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xbadae, 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0000_0x000_00x00    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00000, 0xbefbe, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x7, 0x00421, 0xbb10a, 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_w_000x0                  , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x8, 0x00000, 0xbefbe, 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_x000x_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefae, 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_X000x_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefae, 0xbefaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_xxx00_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefb8, 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_xXX00_000x0           , 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0x9, 0x00000, 0xbefb8, 0xbefbe) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_xxx0x_xxx0x_xxx0x_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_XXX0x_XXX0x_XXX0x_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xba108, 0xbbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_X0X0x_XXX0x_XX00x_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbb10a, 0xbbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_x0000_0x000_00x00_000x0, 
SWS_PIXEL_F32, SWS_UOP_LINEAR_FMA      , 0xf, 0x00000, 0xbefbe, 0xbefbe)
 #define SWS_FOR_STRUCT_F32_LINEAR_FMA(MACRO, ...) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx0x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffe8, .par.lin.exact = 0xfffe8) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_XXX0x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffe8, .par.lin.exact = 0xfffef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_x000x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee, .par.lin.exact = 0xfffee) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_X000x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffee, .par.lin.exact = 0xfffef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xffff8, .par.lin.exact = 0xffff8) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xXx00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xffff8, .par.lin.exact = 0xffffa) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xxX00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xffff8, .par.lin.exact = 0xffffc) \
-    MACRO(__VA_ARGS__, f32_linear_fma_x_xXX00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xffff8, .par.lin.exact = 0xffffe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_y_0x000                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xfffbf, .par.lin.exact = 0xfffbf) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa108, .par.lin.exact = 0xfa108) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa108, .par.lin.exact = 0xfbdaf) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa108, .par.lin.exact = 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfb10a, .par.lin.exact = 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa118, .par.lin.exact = 0xfa118) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa118, .par.lin.exact = 0xfbdbe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfa118, .par.lin.exact = 0xfbdfe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0X00x_00X0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfadae, .par.lin.exact = 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0000_0x000_00x00    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xfefbe, .par.lin.exact = 0xfefbe) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00421, .par.lin.zero = 0xfb10a, .par.lin.exact = 0xfbdef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_w_000x0                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x8, .par.lin.one = 
0x00000, .par.lin.zero = 0xbffff, .par.lin.exact = 0xbffff) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_x000x_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbffee, .par.lin.exact = 0xbffee) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_X000x_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbffee, .par.lin.exact = 0xbffef) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_xxx00_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbfff8, .par.lin.exact = 0xbfff8) \
-    MACRO(__VA_ARGS__, f32_linear_fma_xw_xXX00_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbfff8, .par.lin.exact = 0xbfffe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx0x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefa8, .par.lin.exact = 0xbefa8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_XXX0x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefa8, .par.lin.exact = 0xbefaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_x000x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae, .par.lin.exact = 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_X000x                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae, .par.lin.exact = 0xbefaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xxx00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xXx00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xbefba) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xxX00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xbefbc) \
+    MACRO(__VA_ARGS__, f32_linear_fma_x_xXX00                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x1, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_y_0x000                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x2, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe, .par.lin.exact = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx0x_xxx0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108, .par.lin.exact = 0xba108) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XxX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108, .par.lin.exact = 0xbbdaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_XXX0x_XXX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108, .par.lin.exact = 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X0X0x_XXX0x_XX00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xxx00_xxx0x_xxx0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba118, .par.lin.exact = 0xba118) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XxX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba118, .par.lin.exact = 0xbbdbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_xXX00_XXX0x_XXX0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xba118, .par.lin.exact = 0xbbdfe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_X000x_0X00x_00X0x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbadae, .par.lin.exact = 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_x0000_0x000_00x00    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe, .par.lin.exact = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xyz_10X0x_1XX0x_1X00x    , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x7, .par.lin.one = 
0x00421, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xbbdef) \
+    MACRO(__VA_ARGS__, f32_linear_fma_w_000x0                  , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x8, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefbe, .par.lin.exact = 0xbefbe) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_x000x_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae, .par.lin.exact = 0xbefae) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_X000x_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefae, .par.lin.exact = 0xbefaf) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_xxx00_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xbefb8) \
+    MACRO(__VA_ARGS__, f32_linear_fma_xw_xXX00_000x0           , .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0x9, .par.lin.one = 
0x00000, .par.lin.zero = 0xbefb8, .par.lin.exact = 0xbefbe) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_xxx0x_xxx0x_xxx0x_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108, .par.lin.exact = 0xba108) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_XXX0x_XXX0x_XXX0x_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xba108, .par.lin.exact = 0xbbdef) \
     MACRO(__VA_ARGS__, f32_linear_fma_xyzw_X0X0x_XXX0x_XX00x_000x0, .type = 
SWS_PIXEL_F32, .uop = SWS_UOP_LINEAR_FMA      , .mask = 0xf, .par.lin.one = 
0x00000, .par.lin.zero = 0xbb10a, .par.lin.exact = 0xbbdef) \
-- 
2.54.0


>From 9db1868bfe3ac50e99e3154b1f3e5b87e82ce09a Mon Sep 17 00:00:00 2001
From: Niklas Haas <[email protected]>
Date: Thu, 22 Oct 2026 00:35:31 +0200
Subject: [PATCH 4/6] swscale/vulkan/ops: generate code via SwsUOps

This is still slightly abstraction-violating in that it needs the op list
to set up the plane mapping, image view formats and to know if the source
is interlaced or not. I don't have a good solution to these issues at
the moment, but at the very least, this decouples the actual codegen
from changes to the SwsOp layout.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/vulkan/ops.c | 329 +++++++++++++++++++++++-----------------
 1 file changed, 192 insertions(+), 137 deletions(-)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 5492a9390e5..22f0bbd113d 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -24,6 +24,7 @@
 #include "../graph.h"
 #include "../ops_internal.h"
 #include "../swscale_internal.h"
+#include "../uops.h"
 
 #include "ops.h"
 
@@ -224,14 +225,15 @@ fail:
     return err;
 }
 
-static int create_dither_buf(FFVulkanOpsCtx *s, const SwsDitherOp *dd,
+static int create_dither_buf(FFVulkanOpsCtx *s, const SwsUOp *uop,
                              FFVkBuffer *buf)
 {
     int err;
 
-    int size = (1 << dd->size_log2);
+    const int size = 1 << uop->par.dither.size_log2;
+    const int rows = ff_sws_dither_height(&uop->par.dither);
     err = ff_vk_create_buf(&s->vkctx, buf,
-                           size*size*sizeof(float), NULL, NULL,
+                           rows*size*sizeof(float), NULL, NULL,
                            VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
                            VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
                            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
@@ -243,12 +245,8 @@ static int create_dither_buf(FFVulkanOpsCtx *s, const 
SwsDitherOp *dd,
     if (err < 0)
         goto fail;
 
-    for (int i = 0; i < size; i++) {
-        for (int j = 0; j < size; j++) {
-            const AVRational64 r = dd->matrix[i*size + j];
-            dither_data[i*size + j] = r.num/(float)r.den;
-        }
-    }
+    for (int i = 0; i < rows*size; i++)
+        dither_data[i] = uop->data.ptr[i].f32;
 
     ff_vk_unmap_buffer(&s->vkctx, buf, 1);
 
@@ -349,28 +347,34 @@ static int const_zero(const SPIRVIDs *id, SwsPixelType 
type)
 }
 
 static int const_pixel(SPICtx *spi, const SPIRVIDs *id, SwsPixelType type,
-                       AVRational64 val)
+                       SwsPixel px)
 {
-    if (!ff_sws_pixel_type_is_int(type))
-        return spi_OpConstantFloat(spi, id->f32_type, (float) val.num / 
val.den);
-    av_assert0(val.den == 1);
-    return spi_OpConstantUInt(spi, id->u32_type, val.num);
+    switch (type) {
+    case SWS_PIXEL_U8:  return spi_OpConstantUInt(spi, id->u32_type, px.u8);
+    case SWS_PIXEL_U16: return spi_OpConstantUInt(spi, id->u32_type, px.u16);
+    case SWS_PIXEL_U32: return spi_OpConstantUInt(spi, id->u32_type, px.u32);
+    case SWS_PIXEL_F32: return spi_OpConstantFloat(spi, id->f32_type, px.f32);
+    default: break;
+    }
+
+    av_unreachable("Invalid pixel type!");
+    return 0;
 }
 
 static int const_splat(SPICtx *spi, const SPIRVIDs *id, SwsPixelType type,
-                       AVRational64 val)
+                       SwsPixel px)
 {
-    const int c = const_pixel(spi, id, type, val);
+    const int c = const_pixel(spi, id, type, px);
     return spi_OpConstantComposite(spi, type_vec4(id, type), c, c, c, c);
 }
 
 /* Shift and mask vectors for (un)packing each component */
-static void define_pack_consts(SPICtx *spi, const SPIRVIDs *id, const SwsOp 
*op,
+static void define_pack_consts(SPICtx *spi, const SPIRVIDs *id, const SwsUOp 
*uop,
                                int *shift_id, int *mask_id)
 {
     uint64_t mask[4];
     int shift[4], tmp[4];
-    ff_sws_pack_decode(op->pack.pattern, mask, shift);
+    ff_sws_pack_decode(uop->par.pack.pattern, mask, shift);
     for (int i = 0; i < 4; i++)
         tmp[i] = spi_OpConstantUInt(spi, id->u32_type, shift[i]);
     *shift_id = spi_OpConstantComposite(spi, id->u32vec4_type,
@@ -560,13 +564,14 @@ static void define_entry_point(FFVulkanShader *shd, 
SPICtx *spi, SPIRVIDs *id)
                         shd->lg_size, 3);
 }
 
-static int insert_vmat_linear(const SwsOp *op, SPICtx *spi, SPIRVIDs *id,
+static int insert_vmat_linear(const SwsUOp *uop, SPICtx *spi, SPIRVIDs *id,
                               int data)
 {
+    const SwsPixel (*m)[5] = uop->data.mat4x5;
     int col[4], tmp[4];
     for (int j = 0; j < 4; j++) {
         for (int i = 0; i < 4; i++)
-            tmp[i] = const_pixel(spi, id, SWS_PIXEL_F32, op->lin.m[i][j]);
+            tmp[i] = const_pixel(spi, id, SWS_PIXEL_F32, m[i][j]);
         col[j] = spi_OpConstantComposite(spi, id->f32vec4_type,
                                          tmp[0], tmp[1], tmp[2], tmp[3]);
     }
@@ -574,7 +579,7 @@ static int insert_vmat_linear(const SwsOp *op, SPICtx *spi, 
SPIRVIDs *id,
                                       col[0], col[1], col[2], col[3]);
 
     for (int i = 0; i < 4; i++)
-        tmp[i] = const_pixel(spi, id, SWS_PIXEL_F32, op->lin.m[i][4]);
+        tmp[i] = const_pixel(spi, id, SWS_PIXEL_F32, m[i][4]);
     int off = spi_OpConstantComposite(spi, id->f32vec4_type,
                                       tmp[0], tmp[1], tmp[2], tmp[3]);
 
@@ -582,10 +587,12 @@ static int insert_vmat_linear(const SwsOp *op, SPICtx 
*spi, SPIRVIDs *id,
     return spi_OpFAdd(spi, id->f32vec4_type, off, data);
 }
 
-static int insert_bitexact_linear(const SwsOp *op, SPICtx *spi, SPIRVIDs *id,
+static int insert_bitexact_linear(const SwsUOp *uop, SPICtx *spi, SPIRVIDs *id,
                                   int data)
 {
-    const SwsPixelType op_type = ff_sws_op_input_type(op);
+    const SwsPixelType op_type = uop->type;
+    const SwsPixel (*m)[5] = uop->data.mat4x5;
+    const uint32_t zero = uop->par.lin.zero;
     int type_s = type_scalar(id, op_type);
     int type_v = type_vec4(id, op_type);
 
@@ -599,14 +606,19 @@ static int insert_bitexact_linear(const SwsOp *op, SPICtx 
*spi, SPIRVIDs *id,
      * from left to right, skipping zero coefficients */
     int res[4];
     for (int j = 0; j < 4; j++) {
-        bool acc = op->lin.m[j][4].num;
-        res[j] = acc ? const_pixel(spi, id, op_type, op->lin.m[j][4])
+        if (!SWS_COMP_TEST(uop->mask, j)) {
+            res[j] = tmp[j];
+            continue;
+        }
+
+        bool acc = !(zero & SWS_MASK_OFF(j));
+        res[j] = acc ? const_pixel(spi, id, op_type, m[j][4])
                      : const_zero(id, op_type);
         for (int i = 0; i < 4; i++) {
-            if (!op->lin.m[j][i].num)
+            if (zero & SWS_MASK(j, i))
                 continue;
 
-            int k = const_pixel(spi, id, op_type, op->lin.m[j][i]);
+            int k = const_pixel(spi, id, op_type, m[j][i]);
             int v = emit_mul(spi, op_type, type_s, tmp[i], k);
             spi_OpDecorate(spi, v, SpvDecorationNoContraction);
             if (acc) {
@@ -624,8 +636,8 @@ static int insert_bitexact_linear(const SwsOp *op, SPICtx 
*spi, SPIRVIDs *id,
     /* Integer results are defined modulo the bit depth of the pixel type */
     if (op_type == SWS_PIXEL_U8 || op_type == SWS_PIXEL_U16) {
         const unsigned mask = op_type == SWS_PIXEL_U8 ? UINT8_MAX : UINT16_MAX;
-        result = spi_OpBitwiseAnd(spi, type_v, result,
-                                  const_splat(spi, id, op_type, Q(mask)));
+        const int mask_v = const_splat(spi, id, op_type, (SwsPixel) { .u32 = 
mask });
+        result = spi_OpBitwiseAnd(spi, type_v, result, mask_v);
     }
     return result;
 }
@@ -641,11 +653,11 @@ static int add_buf_binding(SPIRVIDs *id)
     return p->nb_data_bufs++;
 }
 
-static int emit_read_filtered(SPICtx *spi, SPIRVIDs *id, const SwsOp *op,
+static int emit_read_filtered(SPICtx *spi, SPIRVIDs *id, const SwsUOp *uop,
                               int *data)
 {
     const SwsOpList *ops = id->ops;
-    const SwsFilterWeights *wd = op->rw.filter.kernel;
+    const SwsFilterWeights *wd = uop->data.kernel;
     VulkanPriv *p = id->priv;
     if (p->nb_data_bufs >= MAX_DATA_BUFS)
         return AVERROR(ENOTSUP);
@@ -683,10 +695,10 @@ static int emit_read_filtered(SPICtx *spi, SPIRVIDs *id, 
const SwsOp *op,
 
     const int o_ptr_type = spi_OpTypePointer(spi, SpvStorageClassUniform,
                                              id->i32_type);
-    const int is_h = op->rw.filter.op == SWS_OP_FILTER_H;
+    const int is_h = uop->uop == SWS_UOP_READ_PLANAR_FH;
     const int src_interlaced = ops->src.interlaced;
 
-    const int read_vtype = type_vec4(id, op->rw.type);
+    const int read_vtype = type_vec4(id, uop->type);
 
     /* Buffer array index along the filtered axis: pos.x (H) or pos.y (V) */
     int axis = spi_OpCompositeExtract(spi, id->u32_type, id->gid, is_h ? 0 : 
1);
@@ -730,12 +742,14 @@ static int emit_read_filtered(SPICtx *spi, SPIRVIDs *id, 
const SwsOp *op,
             spi_OpCompositeConstruct(spi, id->i32vec2_type, c, pos_y) :
             spi_OpCompositeConstruct(spi, id->i32vec2_type, pos_x, c);
 
-        for (int e = 0; e < op->rw.elems; e++) {
+        for (int e = 0; e < 4; e++) {
+            if (!SWS_COMP_TEST(uop->mask, e))
+                continue;
             int px = spi_OpImageRead(spi, read_vtype,
                                      id->in_img[ops->plane_src[e]], coord,
                                      SpvImageOperandsMaskNone);
-            px = spi_OpCompositeExtract(spi, type_scalar(id, op->rw.type), px, 
0);
-            px = emit_convert(spi, op->rw.type, SWS_PIXEL_F32, id->f32_type, 
px);
+            px = spi_OpCompositeExtract(spi, type_scalar(id, uop->type), px, 
0);
+            px = emit_convert(spi, uop->type, SWS_PIXEL_F32, id->f32_type, px);
             px = spi_OpFMul(spi, id->f32_type, w, px);
             acc[e] = spi_OpFAdd(spi, id->f32_type, acc[e], px);
         }
@@ -792,27 +806,28 @@ static int rw_op_img_count(const SwsOp *op, const uint8_t 
*planes)
     return count;
 }
 
-static int emit_read(SPICtx *spi, SPIRVIDs *id, const SwsOp *op, int *data)
+static int emit_read(SPICtx *spi, SPIRVIDs *id, const SwsUOp *uop, int *data)
 {
     const SwsOpList *ops = id->ops;
-    const SwsPixelType type = ff_sws_op_output_type(op);
-    const int type_v = type_vec4(id, type);
-    const int type_s = type_scalar(id, type);
-    const int zero = const_zero(id, type);
+    const int type_v = type_vec4(id, uop->type);
+    const int type_s = type_scalar(id, uop->type);
+    const int zero = const_zero(id, uop->type);
 
-    if (op->rw.frac) {
-        return AVERROR(ENOTSUP);
-    } else if (op->rw.filter.op) {
-        if (op->rw.mode != SWS_RW_PLANAR ||
-            op->rw.filter.type != SWS_PIXEL_F32)
+    switch (uop->uop) {
+    case SWS_UOP_READ_PLANAR_FH:
+    case SWS_UOP_READ_PLANAR_FV:
+        if (uop->par.filter.type != SWS_PIXEL_F32)
             return AVERROR(ENOTSUP);
-        return emit_read_filtered(spi, id, op, data);
-    } else if (op->rw.mode == SWS_RW_PACKED) {
+        return emit_read_filtered(spi, id, uop, data);
+    case SWS_UOP_READ_PACKED:
         *data = spi_OpImageRead(spi, type_v, id->in_img[ops->plane_src[0]],
                                 id->src_gid, SpvImageOperandsMaskNone);
-    } else if (op->rw.mode == SWS_RW_PLANAR) {
+        break;
+    case SWS_UOP_READ_PLANAR: {
         int tmp[4] = { zero, zero, zero, zero };
-        for (int i = 0; i < op->rw.elems; i++) {
+        for (int i = 0; i < 4; i++) {
+            if (!SWS_COMP_TEST(uop->mask, i))
+                continue;
             tmp[i] = spi_OpImageRead(spi, type_v,
                                      id->in_img[ops->plane_src[i]], 
id->src_gid,
                                      SpvImageOperandsMaskNone);
@@ -820,49 +835,55 @@ static int emit_read(SPICtx *spi, SPIRVIDs *id, const 
SwsOp *op, int *data)
         }
         *data = spi_OpCompositeConstruct(spi, type_v,
                                          tmp[0], tmp[1], tmp[2], tmp[3]);
-    } else {
+        break;
+    }
+    default:
         return AVERROR(ENOTSUP);
     }
 
     return 0;
 }
 
-static int emit_write(SPICtx *spi, SPIRVIDs *id, const SwsOp *op, int *data)
+static int emit_write(SPICtx *spi, SPIRVIDs *id, const SwsUOp *uop, int *data)
 {
     const SwsOpList *ops = id->ops;
-    const SwsPixelType type = ff_sws_op_input_type(op);
-    const int type_v = type_vec4(id, type);
-    const int type_s = type_scalar(id, type);
+    const int type_v = type_vec4(id, uop->type);
+    const int type_s = type_scalar(id, uop->type);
 
-    if (op->rw.frac || op->rw.filter.op) {
-        return AVERROR(ENOTSUP);
-    } else if (op->rw.mode == SWS_RW_PACKED) {
+    switch (uop->uop) {
+    case SWS_UOP_WRITE_PACKED:
         spi_OpImageWrite(spi, id->out_img[ops->plane_dst[0]], id->dst_gid, 
*data,
                          SpvImageOperandsMaskNone);
-    } else {
-        for (int i = 0; i < op->rw.elems; i++) {
+        break;
+    case SWS_UOP_WRITE_PLANAR:
+        for (int i = 0; i < 4; i++) {
+            if (!SWS_COMP_TEST(uop->mask, i))
+                continue;
             int tmp = spi_OpCompositeExtract(spi, type_s, *data, i);
             tmp = spi_OpCompositeConstruct(spi, type_v, tmp, tmp, tmp, tmp);
             spi_OpImageWrite(spi, id->out_img[ops->plane_dst[i]], id->dst_gid, 
tmp,
                              SpvImageOperandsMaskNone);
         }
+        break;
+    default:
+        return AVERROR(ENOTSUP);
     }
 
     return 0;
 }
 
-static int emit_clamp(SPICtx *spi, SPIRVIDs *id, const SwsOp *op, int *data)
+static int emit_clamp(SPICtx *spi, SPIRVIDs *id, const SwsUOp *uop, int *data)
 {
-    const SwsPixelType type = ff_sws_op_input_type(op);
+    const SwsPixelType type = uop->type;
     const int type_v = type_vec4(id, type);
     const int type_s = type_scalar(id, type);
 
     for (int i = 0; i < 4; i++) {
-        if (!op->clamp.limit[i].den)
+        if (!SWS_COMP_TEST(uop->mask, i))
             continue;
-        int lim = const_pixel(spi, id, type, op->clamp.limit[i]);
+        int lim = const_pixel(spi, id, type, uop->data.vec4[i]);
         int tmp = spi_OpCompositeExtract(spi, type_s, *data, i);
-        if (op->op == SWS_OP_MIN)
+        if (uop->uop == SWS_UOP_MIN)
             tmp = emit_min(spi, id, type, type_s, tmp, lim);
         else
             tmp = emit_max(spi, id, type, type_s, tmp, lim);
@@ -872,28 +893,30 @@ static int emit_clamp(SPICtx *spi, SPIRVIDs *id, const 
SwsOp *op, int *data)
     return 0;
 }
 
-static int emit_dither(SPICtx *spi, SPIRVIDs *id, const SwsOp *op, int *data)
+static int emit_dither(SPICtx *spi, SPIRVIDs *id, const SwsUOp *uop, int *data)
 {
-    if (ff_sws_op_input_type(op) != SWS_PIXEL_F32)
+    if (uop->type != SWS_PIXEL_F32)
         return AVERROR(ENOTSUP);
 
     VulkanPriv *p = id->priv;
     if (p->nb_data_bufs >= MAX_DATA_BUFS)
         return AVERROR(ENOTSUP);
 
-    int err = create_dither_buf(p->s, &op->dither, 
&p->data_bufs[p->nb_data_bufs]);
+    int err = create_dither_buf(p->s, uop, &p->data_bufs[p->nb_data_bufs]);
     if (err < 0)
         return err;
     const int binding = add_buf_binding(id);
 
-    /* Uniform buffer in descriptor set 1: struct { float m[size][size]; } */
-    const int size = 1 << op->dither.size_log2;
+    /* Uniform buffer in descriptor set 1: struct { float m[rows][size]; } */
+    const int size = 1 << uop->par.dither.size_log2;
+    const int rows = ff_sws_dither_height(&uop->par.dither);
     const int size_id = spi_OpConstantUInt(spi, id->u32_type, size);
+    const int rows_id = spi_OpConstantUInt(spi, id->u32_type, rows);
     const int mask_id = spi_OpConstantUInt(spi, id->u32_type, size - 1);
 
     int arr_1d = spi_OpTypeArray(spi, id->f32_type, spi_get_id(spi), size_id);
     spi_OpDecorate(spi, arr_1d, SpvDecorationArrayStride, sizeof(float));
-    int arr_2d = spi_OpTypeArray(spi, arr_1d, spi_get_id(spi), size_id);
+    int arr_2d = spi_OpTypeArray(spi, arr_1d, spi_get_id(spi), rows_id);
     spi_OpDecorate(spi, arr_2d, SpvDecorationArrayStride, size*sizeof(float));
 
     int struct_id = spi_get_id(spi);
@@ -907,20 +930,21 @@ static int emit_dither(SPICtx *spi, SPIRVIDs *id, const 
SwsOp *op, int *data)
     spi_OpDecorate(spi, buf, SpvDecorationBinding, binding);
     id->iface[id->nb_iface++] = buf;
 
+    /* The matrix is padded to allow offsetting the wrapped row */
     int x_id = spi_OpCompositeExtract(spi, id->u32_type, id->gid, 0);
-    int y_pos = spi_OpCompositeExtract(spi, id->u32_type, id->gid, 1);
+    int y_id = spi_OpCompositeExtract(spi, id->u32_type, id->gid, 1);
     x_id = spi_OpBitwiseAnd(spi, id->u32_type, x_id, mask_id);
+    y_id = spi_OpBitwiseAnd(spi, id->u32_type, y_id, mask_id);
     for (int i = 0; i < 4; i++) {
-        if (op->dither.y_offset[i] < 0)
+        if (!SWS_COMP_TEST(uop->mask, i))
             continue;
 
         int y_off = spi_OpConstantUInt(spi, id->u32_type,
-                                       op->dither.y_offset[i]);
-        int y_id = spi_OpIAdd(spi, id->u32_type, y_pos, y_off);
-        y_id = spi_OpBitwiseAnd(spi, id->u32_type, y_id, mask_id);
+                                       uop->par.dither.y_offset[i]);
+        int row = spi_OpIAdd(spi, id->u32_type, y_id, y_off);
 
         int val_ptr = spi_OpAccessChain(spi, id->dither_ptr_elem_id, buf,
-                                        id->u32_cid[0], y_id, x_id);
+                                        id->u32_cid[0], row, x_id);
         int val = spi_OpLoad(spi, id->f32_type, val_ptr,
                              SpvMemoryAccessMaskNone, 0);
 
@@ -932,25 +956,23 @@ static int emit_dither(SPICtx *spi, SPIRVIDs *id, const 
SwsOp *op, int *data)
     return 0;
 }
 
-static int emit_linear(SPICtx *spi, SPIRVIDs *id, const SwsOp *op, int *data)
+static int emit_linear(SPICtx *spi, SPIRVIDs *id, const SwsUOp *uop, int *data)
 {
     /* Matrix operations are only defined for floats */
-    const SwsPixelType type = ff_sws_op_input_type(op);
-    if (id->bitexact || ff_sws_pixel_type_is_int(type))
-        *data = insert_bitexact_linear(op, spi, id, *data);
+    if (id->bitexact || ff_sws_pixel_type_is_int(uop->type))
+        *data = insert_bitexact_linear(uop, spi, id, *data);
     else
-        *data = insert_vmat_linear(op, spi, id, *data);
+        *data = insert_vmat_linear(uop, spi, id, *data);
     return 0;
 }
 
-static int emit_pack(SPICtx *spi, SPIRVIDs *id, const SwsOp *op, int *data)
+static int emit_pack(SPICtx *spi, SPIRVIDs *id, const SwsUOp *uop, int *data)
 {
-    const SwsPixelType type = ff_sws_op_input_type(op);
-    const int type_v = type_vec4(id, type);
-    const int type_s = type_scalar(id, type);
+    const int type_v = type_vec4(id, uop->type);
+    const int type_s = type_scalar(id, uop->type);
 
     int shift, mask;
-    define_pack_consts(spi, id, op, &shift, &mask);
+    define_pack_consts(spi, id, uop, &shift, &mask);
     *data = spi_OpBitwiseAnd(spi, type_v, *data, mask);
     *data = spi_OpShiftLeftLogical(spi, type_v, *data, shift);
     int val = spi_OpCompositeExtract(spi, type_s, *data, 0);
@@ -963,7 +985,8 @@ static int emit_pack(SPICtx *spi, SPIRVIDs *id, const SwsOp 
*op, int *data)
 }
 
 static int emit_shader(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
-                       const SwsOpList *ops, FFVulkanShader *shd, SPICtx *spi)
+                       const SwsOpList *ops, const SwsUOpList *uops,
+                       FFVulkanShader *shd, SPICtx *spi)
 {
     SPIRVIDs spid_data = { 0 }, *id = &spid_data;
     id->priv = p;
@@ -1089,80 +1112,98 @@ static int emit_shader(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
     spi_OpLabel(spi, merge_label);
 
     /* Initialize main data state */
-    const SwsPixelType type0 = ff_sws_op_output_type(&ops->ops[0]);
+    const SwsPixelType type0 = uops->ops[0].type;
     const int zero0 = const_zero(id, type0);
     int data = spi_OpCompositeConstruct(spi, type_vec4(id, type0),
                                         zero0, zero0, zero0, zero0);
 
     /* Operations */
-    for (int n = 0; n < ops->num_ops; n++) {
-        const SwsOp *op = &ops->ops[n];
-        SwsPixelType type_in  = ff_sws_op_input_type(op);
-        SwsPixelType type_out = ff_sws_op_output_type(op);
-        if (op->op == SWS_OP_WRITE)
-            type_out = type_in;
-        int type_v = type_vec4(id, type_out);
+    for (int n = 0; n < uops->num_ops; n++) {
+        const SwsUOp *uop = &uops->ops[n];
+        const int type_v = type_vec4(id, uop->type);
 
-        switch (op->op) {
-        case SWS_OP_READ:
-            err = emit_read(spi, id, op, &data);
+        switch (uop->uop) {
+        case SWS_UOP_READ_PLANAR:
+        case SWS_UOP_READ_PLANAR_FH:
+        case SWS_UOP_READ_PLANAR_FV:
+        case SWS_UOP_READ_PACKED:
+            err = emit_read(spi, id, uop, &data);
             break;
-        case SWS_OP_WRITE:
-            err = emit_write(spi, id, op, &data);
+        case SWS_UOP_WRITE_PLANAR:
+        case SWS_UOP_WRITE_PACKED:
+            err = emit_write(spi, id, uop, &data);
             break;
-        case SWS_OP_CLEAR:
+        case SWS_UOP_CLEAR:
             for (int i = 0; i < 4; i++) {
-                if (!SWS_COMP_TEST(op->clear.mask, i))
+                if (!SWS_COMP_TEST(uop->mask, i))
                     continue;
-                int val = const_pixel(spi, id, op->clear.type[i],
-                                      op->clear.value[i]);
+                int val = const_pixel(spi, id, uop->type, uop->data.vec4[i]);
                 data = spi_OpCompositeInsert(spi, type_v, val, data, i);
             }
             break;
-        case SWS_OP_SWIZZLE:
+        case SWS_UOP_PERMUTE:
+        case SWS_UOP_COPY: {
+            const SwsMoveUOp *move = &uop->par.move;
+            int idx[5] = { -1, 0, 1, 2, 3 }; /* tmp, x, y, z, w */
+            for (int i = 0; i < move->num_moves; i++)
+                idx[move->dst[i] + 1] = idx[move->src[i] + 1];
+
             data = spi_OpVectorShuffle(spi, type_v, data, data,
-                                       op->swizzle.in[0],
-                                       op->swizzle.in[1],
-                                       op->swizzle.in[2],
-                                       op->swizzle.in[3]);
+                                       idx[1], idx[2], idx[3], idx[4]);
             break;
-        case SWS_OP_CONVERT:
-            data = emit_convert(spi, type_in, type_out, type_v, data);
+        }
+        case SWS_UOP_TO_U8:
+        case SWS_UOP_TO_U16:
+        case SWS_UOP_TO_U32:
+            data = emit_convert(spi, uop->type, SWS_PIXEL_U32,
+                                id->u32vec4_type, data);
             break;
-        case SWS_OP_LSHIFT:
-            data = spi_OpShiftLeftLogical(spi, type_v, data,
-                                          const_splat(spi, id, SWS_PIXEL_U32,
-                                                      Q(op->shift.amount)));
+        case SWS_UOP_TO_F32:
+            data = emit_convert(spi, uop->type, SWS_PIXEL_F32,
+                                id->f32vec4_type, data);
             break;
-        case SWS_OP_RSHIFT:
-            data = spi_OpShiftRightLogical(spi, type_v, data,
-                                           const_splat(spi, id, SWS_PIXEL_U32,
-                                                       Q(op->shift.amount)));
+        case SWS_UOP_EXPAND_PAIR:
+        case SWS_UOP_EXPAND_QUAD: {
+            /* The SPIR-V compiler should optimize this */
+            const uint32_t k = uop->uop == SWS_UOP_EXPAND_PAIR ? 0x101 : 
0x1010101;
+            const int k_v = const_splat(spi, id, SWS_PIXEL_U32, (SwsPixel) { 
.u32 = k });
+            data = spi_OpIMul(spi, type_v, data, k_v);
             break;
-        case SWS_OP_SCALE:
-            data = emit_mul(spi, type_in, type_v, data,
-                            const_splat(spi, id, type_in, op->scale.factor));
+        }
+        case SWS_UOP_LSHIFT:
+        case SWS_UOP_RSHIFT: {
+            const SwsPixel amount = { .u32 = uop->par.shift.amount };
+            const int shift_v = const_splat(spi, id, uop->type, amount);
+            if (uop->uop == SWS_UOP_LSHIFT)
+                data = spi_OpShiftLeftLogical(spi, type_v, data, shift_v);
+            else
+                data = spi_OpShiftRightLogical(spi, type_v, data, shift_v);
             break;
-        case SWS_OP_MIN:
-        case SWS_OP_MAX:
-            err = emit_clamp(spi, id, op, &data);
+        }
+        case SWS_UOP_SCALE:
+            data = emit_mul(spi, uop->type, type_v, data,
+                            const_splat(spi, id, uop->type, uop->data.scalar));
             break;
-        case SWS_OP_DITHER:
-            err = emit_dither(spi, id, op, &data);
+        case SWS_UOP_MIN:
+        case SWS_UOP_MAX:
+            err = emit_clamp(spi, id, uop, &data);
             break;
-        case SWS_OP_LINEAR:
-            err = emit_linear(spi, id, op, &data);
+        case SWS_UOP_DITHER:
+            err = emit_dither(spi, id, uop, &data);
             break;
-        case SWS_OP_UNPACK: {
+        case SWS_UOP_LINEAR:
+            err = emit_linear(spi, id, uop, &data);
+            break;
+        case SWS_UOP_UNPACK: {
             int shift, mask;
-            define_pack_consts(spi, id, op, &shift, &mask);
+            define_pack_consts(spi, id, uop, &shift, &mask);
             data = spi_OpVectorShuffle(spi, type_v, data, data, 0, 0, 0, 0);
             data = spi_OpShiftRightLogical(spi, type_v, data, shift);
             data = spi_OpBitwiseAnd(spi, type_v, data, mask);
             break;
         }
-        case SWS_OP_PACK:
-            err = emit_pack(spi, id, op, &data);
+        case SWS_UOP_PACK:
+            err = emit_pack(spi, id, uop, &data);
             break;
         default:
             return AVERROR(ENOTSUP);
@@ -1185,13 +1226,14 @@ static int emit_shader(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
 }
 
 static int add_ops_spirv(SwsContext *sws, VulkanPriv *p, FFVulkanOpsCtx *s,
-                         const SwsOpList *ops, FFVulkanShader *shd)
+                         const SwsOpList *ops, const SwsUOpList *uops,
+                         FFVulkanShader *shd)
 {
     uint8_t *spvbuf = NULL;
     SPICtx spi_context, *spi = &spi_context;
     spi_init(spi);
 
-    int err = emit_shader(sws, p, s, ops, shd, spi);
+    int err = emit_shader(sws, p, s, ops, uops, shd, spi);
     if (err < 0)
         goto fail;
 
@@ -1212,6 +1254,7 @@ fail:
 static int compile_spirv(SwsContext *sws, const SwsOpList *ops,
                          SwsCompiledOp *out)
 {
+    SwsUOpList *uops = NULL;
     int err;
     SwsInternal *c = sws_internal(sws);
     FFVulkanOpsCtx *s = c->hw_priv;
@@ -1228,7 +1271,17 @@ static int compile_spirv(SwsContext *sws, const 
SwsOpList *ops,
     if (err < 0)
         goto fail;
 
-    err = add_ops_spirv(sws, p, s, ops, &p->shd);
+    uops = ff_sws_uop_list_alloc();
+    if (!uops) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    err = ff_sws_ops_translate(sws, ops, 0, uops);
+    if (err < 0)
+        goto fail;
+
+    err = add_ops_spirv(sws, p, s, ops, uops, &p->shd);
     if (err < 0)
         goto fail;
 
@@ -1248,9 +1301,11 @@ static int compile_spirv(SwsContext *sws, const 
SwsOpList *ops,
         .free        = free_fn,
     };
 
+    ff_sws_uop_list_free(&uops);
     return 0;
 
 fail:
+    ff_sws_uop_list_free(&uops);
     free_fn(p);
     return err;
 }
-- 
2.54.0


>From 4f6292d251cdd5de5ce07584d0f2bb869331c024 Mon Sep 17 00:00:00 2001
From: Niklas Haas <[email protected]>
Date: Wed, 21 Oct 2026 00:59:40 +0200
Subject: [PATCH 5/6] swscale/vulkan/ops: log compiled micro-ops

Same as the other backends.

Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/vulkan/ops.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 22f0bbd113d..0d4cbad052e 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -1301,6 +1301,13 @@ static int compile_spirv(SwsContext *sws, const 
SwsOpList *ops,
         .free        = free_fn,
     };
 
+    av_log(sws, AV_LOG_DEBUG, "Compiled micro-ops:\n");
+    for (int i = 0; i < uops->num_ops; i++) {
+        char name[SWS_UOP_NAME_MAX];
+        ff_sws_uop_name(&uops->ops[i], name);
+        av_log(sws, AV_LOG_DEBUG, "    %s\n", name);
+    }
+
     ff_sws_uop_list_free(&uops);
     return 0;
 
-- 
2.54.0


>From 49ae386c8dfe36ed05ee23b5c05f13f0fa4c59d7 Mon Sep 17 00:00:00 2001
From: Niklas Haas <[email protected]>
Date: Thu, 22 Oct 2026 00:36:02 +0200
Subject: [PATCH 6/6] swscale/vulkan/ops: implement SWS_UOP_ADD

This replaces 1x1 dither matrices by a constant addition.

Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/vulkan/ops.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/libswscale/vulkan/ops.c b/libswscale/vulkan/ops.c
index 0d4cbad052e..7a014f609c1 100644
--- a/libswscale/vulkan/ops.c
+++ b/libswscale/vulkan/ops.c
@@ -1184,6 +1184,19 @@ static int emit_shader(SwsContext *sws, VulkanPriv *p, 
FFVulkanOpsCtx *s,
             data = emit_mul(spi, uop->type, type_v, data,
                             const_splat(spi, id, uop->type, uop->data.scalar));
             break;
+        case SWS_UOP_ADD: {
+            const int zero = const_zero(id, uop->type);
+            int arg[4] = { zero, zero, zero, zero };
+            for (int i = 0; i < 4; i++) {
+                if (!SWS_COMP_TEST(uop->mask, i))
+                    continue;
+                arg[i] = const_pixel(spi, id, uop->type, uop->data.vec4[i]);
+            }
+
+            int arg_v = spi_OpConstantComposite(spi, type_v, arg[0], arg[1], 
arg[2], arg[3]);
+            data = emit_add(spi, uop->type, type_v, data, arg_v);
+            break;
+        }
         case SWS_UOP_MIN:
         case SWS_UOP_MAX:
             err = emit_clamp(spi, id, uop, &data);
@@ -1277,7 +1290,7 @@ static int compile_spirv(SwsContext *sws, const SwsOpList 
*ops,
         goto fail;
     }
 
-    err = ff_sws_ops_translate(sws, ops, 0, uops);
+    err = ff_sws_ops_translate(sws, ops, SWS_UOP_FLAG_ADD, uops);
     if (err < 0)
         goto fail;
 
-- 
2.54.0

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

Reply via email to