summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2014-06-14 17:58:30 +0200
committerMarek Olšák <marek.olsak@amd.com>2014-06-19 00:17:36 +0200
commit6a2b38381ee90b7fc9584b05b84284c0e609bb6d (patch)
treef54d113d9f784d93c07fc1b0ccbc56ee83639f09
parent1df7199fc933facf2e74304976c3798e474929a1 (diff)
radeonsi: pass ARB_conservative_depth parameters to the hardware
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.c21
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.h1
-rw-r--r--src/gallium/drivers/radeonsi/si_state_draw.c4
-rw-r--r--src/gallium/drivers/radeonsi/sid.h4
4 files changed, 29 insertions, 1 deletions
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)