[Mesa-dev] [PATCH 06/16] nir: improve convert_yuv_to_rgb when fuse_ffma=true

Nils Wallménius nils.wallmenius at gmail.com
Thu Dec 20 06:28:59 UTC 2018


Den ons 19 dec. 2018 17:44 skrev Jonathan Marek <jonathan at marek.ca>:

> When ffma is available, we can use a different arrangement of constants to
> get a better result. On freedreno/ir3, this reduces the YUV->RGB to 7
> scalar ffma. On freedreno/a2xx, it will allow YUV->RGB to be 3 vec4 ffma.
>
> Signed-off-by: Jonathan Marek <jonathan at marek.ca>
> ---
>  src/compiler/nir/nir_lower_tex.c | 62 ++++++++++++++++++++++----------
>  1 file changed, 43 insertions(+), 19 deletions(-)
>
> diff --git a/src/compiler/nir/nir_lower_tex.c
> b/src/compiler/nir/nir_lower_tex.c
> index 6a6b6c41a7..f7c821bb34 100644
> --- a/src/compiler/nir/nir_lower_tex.c
> +++ b/src/compiler/nir/nir_lower_tex.c
> @@ -342,25 +342,49 @@ convert_yuv_to_rgb(nir_builder *b, nir_tex_instr
> *tex,
>                     nir_ssa_def *y, nir_ssa_def *u, nir_ssa_def *v,
>                     nir_ssa_def *a)
>  {
> -   nir_const_value m[3] = {
> -      { .f32 = { 1.0f,  0.0f,         1.59602678f, 0.0f } },
> -      { .f32 = { 1.0f, -0.39176229f, -0.81296764f, 0.0f } },
> -      { .f32 = { 1.0f,  2.01723214f,  0.0f,        0.0f } }
> -   };
> -
> -   nir_ssa_def *yuv =
> -      nir_vec4(b,
> -               nir_fmul(b, nir_imm_float(b, 1.16438356f),
> -                        nir_fadd(b, y, nir_imm_float(b, -16.0f /
> 255.0f))),
> -               nir_channel(b, nir_fadd(b, u, nir_imm_float(b, -128.0f /
> 255.0f)), 0),
> -               nir_channel(b, nir_fadd(b, v, nir_imm_float(b, -128.0f /
> 255.0f)), 0),
> -               nir_imm_float(b, 0.0));
> -
> -   nir_ssa_def *red = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[0]));
> -   nir_ssa_def *green = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[1]));
> -   nir_ssa_def *blue = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[2]));
> -
> -   nir_ssa_def *result = nir_vec4(b, red, green, blue, a);
> +   nir_ssa_def *result;
> +
> +
> +   if (b->shader->options->fuse_ffma) {
> +      nir_const_value m[4] = {
>

Drive-by comment, but shouldn't this^ be m[3]?

Regards
Nils

+         { .f32 = { 1.16438356f, 1.16438356f, 1.16438356f, 0.0f } },
> +         { .f32 = { 0.0f,       -0.39176229f, 2.01723214f, 0.0f } },
> +         { .f32 = { 1.59602678f,-0.81296764f, 0.0f,        0.0f } },
> +      };
> +      static const float y_off = -16.0f * 1.16438356f / 255.0f;
> +      static const float sc = 128.0f / 255.0f;
> +
> +      nir_ssa_def *offset =
> +         nir_vec4(b,
> +                  nir_imm_float(b, y_off - sc * 1.59602678f),
> +                  nir_imm_float(b, y_off + sc * (0.81296764f +
> 0.39176229f)),
> +                  nir_imm_float(b, y_off - sc * 2.01723214f),
> +                  a);
> +
> +      result = nir_ffma(b, y, nir_build_imm(b, 4, 32, m[0]),
> +                       nir_ffma(b, u, nir_build_imm(b, 4, 32, m[1]),
> +                                nir_ffma(b, v, nir_build_imm(b, 4, 32,
> m[2]), offset)));
> +   } else {
> +      nir_const_value m[3] = {
> +         { .f32 = { 1.0f,  0.0f,         1.59602678f, 0.0f } },
> +         { .f32 = { 1.0f, -0.39176229f, -0.81296764f, 0.0f } },
> +         { .f32 = { 1.0f,  2.01723214f,  0.0f,        0.0f } }
> +      };
> +
> +      nir_ssa_def *yuv =
> +         nir_vec4(b,
> +                  nir_fmul(b, nir_imm_float(b, 1.16438356f),
> +                           nir_fadd(b, y, nir_imm_float(b, -16.0f /
> 255.0f))),
> +                  nir_channel(b, nir_fadd(b, u, nir_imm_float(b, -128.0f
> / 255.0f)), 0),
> +                  nir_channel(b, nir_fadd(b, v, nir_imm_float(b, -128.0f
> / 255.0f)), 0),
> +                  nir_imm_float(b, 0.0));
> +
> +      nir_ssa_def *red = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[0]));
> +      nir_ssa_def *green = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32,
> m[1]));
> +      nir_ssa_def *blue = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32,
> m[2]));
> +
> +      result = nir_vec4(b, red, green, blue, a);
> +   }
>
>     nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_src_for_ssa(result));
>  }
> --
> 2.17.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181220/2b68b824/attachment-0001.html>


More information about the mesa-dev mailing list