diff options
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_draw.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/sid.h | 4 |
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) |