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]
