From 77d36cbc8de85ea5c4e8caf071cbc6661e0cd75c Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 15 Nov 2017 09:46:01 +1000 Subject: [PATCH] r600: handle writes_memory properly This implements proper handling for shaders with side effects. Tested-By: Gert Wollny Signed-off-by: Dave Airlie --- 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 2cd162629d2..c00114b6280 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 af79bb74e60..f8a256ca524 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 -- 2.30.2