nir/gather_info: fix per-vertex handling in try_mask_partial_io
pipeline-db (Navi, ACO): Totals from affected shaders: SGPRS: 6432 -> 6432 (0.00 %) VGPRS: 11924 -> 11924 (0.00 %) Spilled SGPRs: 0 -> 0 (0.00 %) Spilled VGPRs: 0 -> 0 (0.00 %) Scratch size: 1596 -> 1596 (0.00 %) dwords per thread Code Size: 575524 -> 518620 (-9.89 %) bytes LDS: 12187 -> 12187 (0.00 %) blocks Max Waves: 2695 -> 2695 (0.00 %) Helps a few hundred Dark Souls 3 shaders. Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> CC: <mesa-stable@lists.freedesktop.org> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4190> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4190>
This commit is contained in:
parent
f1cc13727c
commit
9f4ba2d2b4
|
@ -102,12 +102,15 @@ mark_whole_variable(nir_shader *shader, nir_variable *var, bool is_output_read)
|
|||
}
|
||||
|
||||
static unsigned
|
||||
get_io_offset(nir_deref_instr *deref, bool is_vertex_input)
|
||||
get_io_offset(nir_deref_instr *deref, bool is_vertex_input, bool per_vertex)
|
||||
{
|
||||
unsigned offset = 0;
|
||||
|
||||
for (nir_deref_instr *d = deref; d; d = nir_deref_instr_parent(d)) {
|
||||
if (d->deref_type == nir_deref_type_array) {
|
||||
if (per_vertex && nir_deref_instr_parent(d)->deref_type == nir_deref_type_var)
|
||||
break;
|
||||
|
||||
if (!nir_src_is_const(d->arr.index))
|
||||
return -1;
|
||||
|
||||
|
@ -132,8 +135,9 @@ try_mask_partial_io(nir_shader *shader, nir_variable *var,
|
|||
nir_deref_instr *deref, bool is_output_read)
|
||||
{
|
||||
const struct glsl_type *type = var->type;
|
||||
bool per_vertex = nir_is_per_vertex_io(var, shader->info.stage);
|
||||
|
||||
if (nir_is_per_vertex_io(var, shader->info.stage)) {
|
||||
if (per_vertex) {
|
||||
assert(glsl_type_is_array(type));
|
||||
type = glsl_get_array_element(type);
|
||||
}
|
||||
|
@ -157,7 +161,7 @@ try_mask_partial_io(nir_shader *shader, nir_variable *var,
|
|||
return false;
|
||||
}
|
||||
|
||||
unsigned offset = get_io_offset(deref, false);
|
||||
unsigned offset = get_io_offset(deref, false, per_vertex);
|
||||
if (offset == -1)
|
||||
return false;
|
||||
|
||||
|
|
Loading…
Reference in New Issue