[Mesa-dev] [PATCH] radeonsi: pass ARB_conservative_depth parameters to the hardware

Marek Olšák maraeo at gmail.com
Mon Jun 16 08:08:13 PDT 2014


From: Marek Olšák <marek.olsak at amd.com>

---
 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 4ed5906..4c23090 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 6609788..81997c0 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 52ecf26..01564eb 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 558da10..e3f788e 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)
-- 
1.9.1



More information about the mesa-dev mailing list