nir/opt_access: infer CAN_REORDER for global access
fossil-db (Sienna Cichlid): Totals from 352 (0.26% of 134621) affected shaders: VGPRs: 17240 -> 17272 (+0.19%) CodeSize: 1753640 -> 1755744 (+0.12%); split: -0.04%, +0.16% Instrs: 323190 -> 323801 (+0.19%); split: -0.03%, +0.22% Latency: 3241205 -> 3241293 (+0.00%); split: -0.10%, +0.10% InvThroughput: 568927 -> 568067 (-0.15%); split: -0.16%, +0.00% SClause: 12109 -> 10444 (-13.75%); split: -13.76%, +0.01% Copies: 27802 -> 27717 (-0.31%); split: -0.56%, +0.26% PreSGPRs: 14699 -> 14690 (-0.06%) PreVGPRs: 15793 -> 15799 (+0.04%) fossil-db (Polaris10): Totals from 348 (0.26% of 135668) affected shaders: SGPRs: 21446 -> 21574 (+0.60%); split: -0.15%, +0.75% VGPRs: 17004 -> 16996 (-0.05%); split: -0.09%, +0.05% CodeSize: 1782796 -> 1783060 (+0.01%); split: -0.03%, +0.05% Instrs: 337828 -> 337921 (+0.03%); split: -0.03%, +0.06% Latency: 3726328 -> 3726721 (+0.01%); split: -0.09%, +0.10% InvThroughput: 1307917 -> 1299841 (-0.62%); split: -0.62%, +0.00% VClause: 4327 -> 4337 (+0.23%); split: -0.09%, +0.32% SClause: 12178 -> 10529 (-13.54%); split: -13.55%, +0.01% Copies: 40227 -> 40244 (+0.04%); split: -0.19%, +0.24% PreSGPRs: 14946 -> 14937 (-0.06%) PreVGPRs: 15637 -> 15643 (+0.04%) fossil-db (Pitcairn): Totals from 351 (0.26% of 135668) affected shaders: SGPRs: 20382 -> 20619 (+1.16%); split: -0.79%, +1.95% CodeSize: 1789732 -> 1789836 (+0.01%); split: -0.04%, +0.04% MaxWaves: 1947 -> 1949 (+0.10%) Instrs: 352274 -> 352318 (+0.01%); split: -0.04%, +0.06% Latency: 4057829 -> 4058226 (+0.01%); split: -0.08%, +0.09% InvThroughput: 1332245 -> 1317578 (-1.10%); split: -1.11%, +0.01% VClause: 8581 -> 8583 (+0.02%); split: -0.13%, +0.15% SClause: 12187 -> 10552 (-13.42%); split: -13.43%, +0.02% Copies: 44906 -> 44915 (+0.02%); split: -0.24%, +0.26% PreSGPRs: 16571 -> 16562 (-0.05%) Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14227>
This commit is contained in:
parent
403ae3b48e
commit
a65285f54b
|
@ -221,7 +221,7 @@ process_variable(struct access_state *state, nir_variable *var)
|
|||
}
|
||||
|
||||
static bool
|
||||
update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_image, bool is_buffer)
|
||||
update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_buffer, bool is_global)
|
||||
{
|
||||
enum gl_access_qualifier access = nir_intrinsic_access(instr);
|
||||
|
||||
|
@ -230,15 +230,21 @@ update_access(struct access_state *state, nir_intrinsic_instr *instr, bool is_im
|
|||
|
||||
if (instr->intrinsic != nir_intrinsic_bindless_image_load &&
|
||||
instr->intrinsic != nir_intrinsic_bindless_image_store &&
|
||||
instr->intrinsic != nir_intrinsic_bindless_image_sparse_load) {
|
||||
instr->intrinsic != nir_intrinsic_bindless_image_sparse_load &&
|
||||
!is_global) {
|
||||
const nir_variable *var = nir_get_binding_variable(
|
||||
state->shader, nir_chase_binding(instr->src[0]));
|
||||
is_memory_readonly |= var && (var->data.access & ACCESS_NON_WRITEABLE);
|
||||
is_memory_writeonly |= var && (var->data.access & ACCESS_NON_READABLE);
|
||||
}
|
||||
|
||||
is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;
|
||||
is_memory_writeonly |= is_buffer ? !state->buffers_read : !state->images_read;
|
||||
if (is_global) {
|
||||
is_memory_readonly |= !state->buffers_written && !state->images_written;
|
||||
is_memory_writeonly |= !state->buffers_read && !state->images_read;
|
||||
} else {
|
||||
is_memory_readonly |= is_buffer ? !state->buffers_written : !state->images_written;
|
||||
is_memory_writeonly |= is_buffer ? !state->buffers_read : !state->images_read;
|
||||
}
|
||||
|
||||
if (is_memory_readonly)
|
||||
access |= ACCESS_NON_WRITEABLE;
|
||||
|
@ -259,15 +265,17 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
|
|||
case nir_intrinsic_bindless_image_load:
|
||||
case nir_intrinsic_bindless_image_store:
|
||||
case nir_intrinsic_bindless_image_sparse_load:
|
||||
return update_access(state, instr, true,
|
||||
nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF);
|
||||
return update_access(state, instr, nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_BUF,
|
||||
false);
|
||||
|
||||
case nir_intrinsic_load_deref:
|
||||
case nir_intrinsic_store_deref: {
|
||||
if (!nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_ssbo))
|
||||
if (nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_global))
|
||||
return update_access(state, instr, false, true);
|
||||
else if (nir_deref_mode_is(nir_src_as_deref(instr->src[0]), nir_var_mem_ssbo))
|
||||
return update_access(state, instr, true, false);
|
||||
else
|
||||
return false;
|
||||
|
||||
return update_access(state, instr, false, true);
|
||||
}
|
||||
|
||||
case nir_intrinsic_image_deref_load:
|
||||
|
@ -278,7 +286,7 @@ process_intrinsic(struct access_state *state, nir_intrinsic_instr *instr)
|
|||
bool is_buffer =
|
||||
glsl_get_sampler_dim(glsl_without_array(var->type)) == GLSL_SAMPLER_DIM_BUF;
|
||||
|
||||
return update_access(state, instr, true, is_buffer);
|
||||
return update_access(state, instr, is_buffer, false);
|
||||
}
|
||||
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue