From 6a2b38381ee90b7fc9584b05b84284c0e609bb6d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 14 Jun 2014 17:58:30 +0200 Subject: [PATCH] radeonsi: pass ARB_conservative_depth parameters to the hardware MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Michel Dänzer --- src/gallium/drivers/radeonsi/si_shader.c | 21 +++++++++++++++++++- src/gallium/drivers/radeonsi/si_shader.h | 1 + src/gallium/drivers/radeonsi/si_state_draw.c | 4 ++++ src/gallium/drivers/radeonsi/sid.h | 4 ++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 4ed5906d178..4c23090e2a0 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2745,10 +2745,29 @@ int si_pipe_shader_create( } break; } - case TGSI_PROCESSOR_FRAGMENT: + case TGSI_PROCESSOR_FRAGMENT: { + int i; + si_shader_ctx.radeon_bld.load_input = declare_input_fs; bld_base->emit_epilogue = si_llvm_emit_fs_epilogue; + shader->shader.ps_conservative_z = V_02880C_EXPORT_ANY_Z; + + for (i = 0; i < shader_info.num_properties; i++) { + switch (shader_info.properties[i].name) { + case TGSI_PROPERTY_FS_DEPTH_LAYOUT: + switch (shader_info.properties[i].data[0]) { + case TGSI_FS_DEPTH_LAYOUT_GREATER: + shader->shader.ps_conservative_z = V_02880C_EXPORT_GREATER_THAN_Z; + break; + case TGSI_FS_DEPTH_LAYOUT_LESS: + shader->shader.ps_conservative_z = V_02880C_EXPORT_LESS_THAN_Z; + break; + } + break; + } + } break; + } default: assert(!"Unsupported shader type"); return -1; diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 66097888237..81997c0b586 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -138,6 +138,7 @@ struct si_shader { unsigned gs_input_prim; unsigned gs_output_prim; unsigned gs_max_out_vertices; + unsigned ps_conservative_z; unsigned nparam; bool uses_kill; diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 52ecf264ecb..01564eba843 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -269,6 +269,10 @@ static void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *s if (shader->shader.uses_kill || shader->key.ps.alpha_func != PIPE_FUNC_ALWAYS) db_shader_control |= S_02880C_KILL_ENABLE(1); + if (sctx->b.chip_class >= CIK) + db_shader_control |= + S_02880C_CONSERVATIVE_Z_EXPORT(shader->shader.ps_conservative_z); + spi_ps_in_control = S_0286D8_NUM_INTERP(shader->shader.nparam) | S_0286D8_BC_OPTIMIZE_DISABLE(1); diff --git a/src/gallium/drivers/radeonsi/sid.h b/src/gallium/drivers/radeonsi/sid.h index 558da1048dc..e3f788ef6a7 100644 --- a/src/gallium/drivers/radeonsi/sid.h +++ b/src/gallium/drivers/radeonsi/sid.h @@ -6712,6 +6712,10 @@ #define S_02880C_CONSERVATIVE_Z_EXPORT(x) (((x) & 0x03) << 13) #define G_02880C_CONSERVATIVE_Z_EXPORT(x) (((x) >> 13) & 0x03) #define C_02880C_CONSERVATIVE_Z_EXPORT 0xFFFF9FFF +#define V_02880C_EXPORT_ANY_Z 0 +#define V_02880C_EXPORT_LESS_THAN_Z 1 +#define V_02880C_EXPORT_GREATER_THAN_Z 2 +#define V_02880C_EXPORT_RESERVED 3 /* */ #define R_028810_PA_CL_CLIP_CNTL 0x028810 #define S_028810_UCP_ENA_0(x) (((x) & 0x1) << 0) -- 2.30.2