Module: Mesa
Branch: master
Commit: b42bc90b6add0d0f81d915d49712761d32329afa
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=b42bc90b6add0d0f81d915d49712761d32329afa

Author: Nicolai Hähnle <nicolai.haeh...@amd.com>
Date:   Wed Jun  1 13:24:19 2016 +0200

radeonsi: enable WQM in PS prolog when needed

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 / LLVM r272063 for this to be
effective (otherwise it's just a no-op).

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95130
Cc: 12.0 <mesa-...@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.ol...@amd.com>

---

 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;

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to