[Mesa-dev] [PATCH 2/2] radeonsi: use re-Z
Marek Olšák
maraeo at gmail.com
Wed Feb 24 11:47:21 UTC 2016
On Wed, Feb 24, 2016 at 12:22 PM, Grigori Goronzy <greg at chown.ath.cx> wrote:
> On 2016-02-23 17:45, Marek Olšák wrote:
>>
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> This can increase perf for shaders that kill pixels (kill, alpha-test,
>> alpha-to-coverage).
>> ---
>> src/gallium/drivers/radeonsi/si_shader.h | 1 +
>> src/gallium/drivers/radeonsi/si_state.c | 6 +++---
>> src/gallium/drivers/radeonsi/si_state_shaders.c | 16 +++++++++++++---
>> 3 files changed, 17 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_shader.h
>> b/src/gallium/drivers/radeonsi/si_shader.h
>> index ff5c24d..637d264 100644
>> --- a/src/gallium/drivers/radeonsi/si_shader.h
>> +++ b/src/gallium/drivers/radeonsi/si_shader.h
>> @@ -365,6 +365,7 @@ struct si_shader {
>> struct r600_resource *scratch_bo;
>> union si_shader_key key;
>> bool is_binary_shared;
>> + unsigned z_order;
>>
>> /* The following data is all that's needed for binary shaders. */
>> struct radeon_shader_binary binary;
>> diff --git a/src/gallium/drivers/radeonsi/si_state.c
>> b/src/gallium/drivers/radeonsi/si_state.c
>> index 2dfdbeb..b23b17a 100644
>> --- a/src/gallium/drivers/radeonsi/si_state.c
>> +++ b/src/gallium/drivers/radeonsi/si_state.c
>> @@ -1339,10 +1339,10 @@ static void si_emit_db_render_state(struct
>> si_context *sctx, struct r600_atom *s
>> sctx->ps_db_shader_control;
>>
>> /* Bug workaround for smoothing (overrasterization) on SI. */
>> - if (sctx->b.chip_class == SI && sctx->smoothing_enabled)
>> + if (sctx->b.chip_class == SI && sctx->smoothing_enabled) {
>> + db_shader_control &= C_02880C_Z_ORDER;
>> 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);
>> + }
>>
>> /* Disable the gl_SampleMask fragment shader output if MSAA is
>> disabled. */
>> if (sctx->framebuffer.nr_samples <= 1 || (rs &&
>> !rs->multisample_enable))
>> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c
>> b/src/gallium/drivers/radeonsi/si_state_shaders.c
>> index a6753a7..c220185 100644
>> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
>> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
>> @@ -789,6 +789,13 @@ static void si_shader_ps(struct si_shader *shader)
>> S_00B02C_EXTRA_LDS_SIZE(shader->config.lds_size) |
>> S_00B02C_USER_SGPR(num_user_sgprs) |
>>
>> S_00B32C_SCRATCH_EN(shader->config.scratch_bytes_per_wave > 0));
>> +
>> + /* Prefer RE_Z if the shader is complex enough. */
>> + if (info->num_memory_instructions >= 2 ||
>> + shader->binary.code_size > 100*4)
>> + shader->z_order = V_02880C_EARLY_Z_THEN_RE_Z;
>> + else
>> + shader->z_order = V_02880C_EARLY_Z_THEN_LATE_Z;
>> }
>>
>
> Are these thresholds for switching to re-Z based on measurements, feedback
> by the HW team or are they just a shot in the dark?
> Either way, the magic numbers don't look particularly nice. Maybe
> preprocessor constants should be introduced for them?
They are not so magic. The meaning is 2 memory instructions or
instruction count between 50 and 100. They are based on my estimates
and expectations.
No benchmarking has been done, but there is a potential to gain some
performance with shaders killing pixels.
Marek
More information about the mesa-dev
mailing list