[Mesa-dev] [PATCH 2/2] radeonsi: enable WQM in PS prolog when needed

Marek Olšák maraeo at gmail.com
Wed Jun 1 12:29:51 UTC 2016


For the series:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Jun 1, 2016 at 1:28 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> WQM is needed when the PS prolog computes a VGPR that is consumed by a shader
> with (implicit or explicit) derivatives.
>
> Depends on http://reviews.llvm.org/D20839.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95130
> Cc: 12.0 <mesa-dev at lists.freedesktop.org>
> ---
>  src/gallium/drivers/radeonsi/si_shader.c | 9 +++++++++
>  src/gallium/drivers/radeonsi/si_shader.h | 1 +
>  2 files changed, 10 insertions(+)
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 5e5bf68..6e8eefb 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -7197,6 +7197,12 @@ static bool si_compile_ps_prolog(struct si_screen *sscreen,
>                                                    linear_sample[i], base + 10 + i, "");
>         }
>
> +       /* Tell LLVM to insert WQM instruction sequence when needed. */
> +       if (key->ps_prolog.wqm) {
> +               LLVMAddTargetDependentFunctionAttr(func,
> +                                                  "amdgpu-ps-wqm-outputs", "");
> +       }
> +
>         /* Compile. */
>         LLVMBuildRet(gallivm->builder, ret);
>         radeon_llvm_finalize_module(&ctx.radeon_bld);
> @@ -7347,6 +7353,9 @@ static bool si_shader_select_ps_parts(struct si_screen *sscreen,
>         prolog_key.ps_prolog.colors_read = info->colors_read;
>         prolog_key.ps_prolog.num_input_sgprs = shader->info.num_input_sgprs;
>         prolog_key.ps_prolog.num_input_vgprs = shader->info.num_input_vgprs;
> +       prolog_key.ps_prolog.wqm = info->uses_derivatives &&
> +               (prolog_key.ps_prolog.colors_read ||
> +                prolog_key.ps_prolog.states.force_persample_interp);
>
>         if (info->colors_read) {
>                 unsigned *color = shader->selector->color_attr_index;
> diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
> index 9425b1e..e16bc9c 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.h
> +++ b/src/gallium/drivers/radeonsi/si_shader.h
> @@ -355,6 +355,7 @@ union si_shader_part_key {
>                 unsigned        colors_read:8; /* color input components read */
>                 unsigned        num_interp_inputs:5; /* BCOLOR is at this location */
>                 unsigned        face_vgpr_index:5;
> +               unsigned        wqm:1;
>                 char            color_attr_index[2];
>                 char            color_interp_vgpr_index[2]; /* -1 == constant */
>         } ps_prolog;
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list