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

Author: Dave Airlie <[email protected]>
Date:   Wed Nov 15 09:46:01 2017 +1000

r600: handle writes_memory properly

This implements proper handling for shaders with side effects.

Tested-By: Gert Wollny <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>

---

 src/gallium/drivers/r600/evergreen_state.c | 10 +++++++---
 src/gallium/drivers/r600/evergreend.h      |  6 ++++++
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c 
b/src/gallium/drivers/r600/evergreen_state.c
index 2cd162629d..c00114b628 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -3173,8 +3173,12 @@ void evergreen_update_ps_state(struct pipe_context *ctx, 
struct r600_pipe_shader
        db_shader_control |= S_02880C_STENCIL_EXPORT_ENABLE(stencil_export);
        db_shader_control |= S_02880C_MASK_EXPORT_ENABLE(mask_export);
 
-       if 
(shader->selector->info.properties[TGSI_PROPERTY_FS_EARLY_DEPTH_STENCIL])
-               db_shader_control |= S_02880C_DEPTH_BEFORE_SHADER(1);
+       if 
(shader->selector->info.properties[TGSI_PROPERTY_FS_EARLY_DEPTH_STENCIL]) {
+               db_shader_control |= S_02880C_DEPTH_BEFORE_SHADER(1) |
+                       
S_02880C_EXEC_ON_NOOP(shader->selector->info.writes_memory);
+       } else if (shader->selector->info.writes_memory) {
+               db_shader_control |= S_02880C_EXEC_ON_HIER_FAIL(1);
+       }
 
        switch (rshader->ps_conservative_z) {
        default: /* fall through */
@@ -3498,7 +3502,7 @@ void evergreen_update_db_shader_control(struct 
r600_context * rctx)
         * get a hang unless you flush the DB in between.  For now just use
         * LATE_Z.
         */
-       if (rctx->alphatest_state.sx_alpha_test_control) {
+       if (rctx->alphatest_state.sx_alpha_test_control || 
rctx->ps_shader->info.writes_memory) {
                db_shader_control |= S_02880C_Z_ORDER(V_02880C_LATE_Z);
        } else {
                db_shader_control |= 
S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
diff --git a/src/gallium/drivers/r600/evergreend.h 
b/src/gallium/drivers/r600/evergreend.h
index af79bb74e6..f8a256ca52 100644
--- a/src/gallium/drivers/r600/evergreend.h
+++ b/src/gallium/drivers/r600/evergreend.h
@@ -988,6 +988,12 @@
 #define   S_02880C_DUAL_EXPORT_ENABLE(x)               (((unsigned)(x) & 0x1) 
<< 9)
 #define   G_02880C_DUAL_EXPORT_ENABLE(x)               (((x) >> 9) & 0x1)
 #define   C_02880C_DUAL_EXPORT_ENABLE                  0xFFFFFDFF
+#define   S_02880C_EXEC_ON_HIER_FAIL(x)                (((unsigned)(x) & 0x1) 
<< 10)
+#define   G_02880C_EXEC_ON_HIER_FAIL(x)                (((x) >> 10) & 0x1)
+#define   C_02880C_EXEC_ON_HIER_FAIL                   0xFFFFFBFF
+#define   S_02880C_EXEC_ON_NOOP(x)                     (((unsigned)(x) & 0x1) 
<< 11)
+#define   G_02880C_EXEC_ON_NOOP(x)                     (((x) >> 11) & 0x1)
+#define   C_02880C_EXEC_ON_NOOP                        0xFFFFF7FF
 #define   S_02880C_DB_SOURCE_FORMAT(x)                 (((unsigned)(x) & 0x3) 
<< 13)
 #define   G_02880C_DB_SOURCE_FORMAT(x)                 (((x) >> 13) & 0x3)
 #define   C_02880C_DB_SOURCE_FORMAT                    0xFFFF9FFF

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to