nir: Add mode filtering to lower_mem_access_bit_sizes

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Reviewed-by: M Henning <drawoc@darkrefraction.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21524>
This commit is contained in:
Faith Ekstrand
2023-02-21 11:45:49 -06:00
committed by Marge Bot
parent 4b06b1a7c5
commit 116a851264
3 changed files with 49 additions and 2 deletions

View File

@@ -4947,6 +4947,7 @@ typedef nir_mem_access_size_align
const void *cb_data);
bool nir_lower_mem_access_bit_sizes(nir_shader *shader,
nir_variable_mode modes,
nir_lower_mem_access_bit_sizes_cb cb,
const void *cb_data);

View File

@@ -285,10 +285,43 @@ lower_mem_store(nir_builder *b, nir_intrinsic_instr *intrin,
}
struct lower_mem_access_state {
nir_variable_mode modes;
nir_lower_mem_access_bit_sizes_cb cb;
const void *cb_data;
};
static nir_variable_mode
intrin_to_variable_mode(nir_intrinsic_op intrin)
{
switch (intrin) {
case nir_intrinsic_load_global:
case nir_intrinsic_store_global:
return nir_var_mem_global;
case nir_intrinsic_load_global_constant:
return nir_var_mem_constant;
case nir_intrinsic_load_ssbo:
case nir_intrinsic_store_ssbo:
return nir_var_mem_ssbo;
case nir_intrinsic_load_shared:
case nir_intrinsic_store_shared:
return nir_var_mem_shared;
case nir_intrinsic_load_scratch:
case nir_intrinsic_store_scratch:
return nir_var_shader_temp | nir_var_function_temp;
case nir_intrinsic_load_task_payload:
case nir_intrinsic_store_task_payload:
return nir_var_mem_task_payload;
default:
return 0;
}
}
static bool
lower_mem_access_instr(nir_builder *b, nir_instr *instr, void *_data)
{
@@ -297,9 +330,12 @@ lower_mem_access_instr(nir_builder *b, nir_instr *instr, void *_data)
if (instr->type != nir_instr_type_intrinsic)
return false;
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
if (!(state->modes & intrin_to_variable_mode(intrin->intrinsic)))
return false;
b->cursor = nir_after_instr(instr);
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
switch (intrin->intrinsic) {
case nir_intrinsic_load_global:
case nir_intrinsic_load_global_constant:
@@ -323,10 +359,12 @@ lower_mem_access_instr(nir_builder *b, nir_instr *instr, void *_data)
bool
nir_lower_mem_access_bit_sizes(nir_shader *shader,
nir_variable_mode modes,
nir_lower_mem_access_bit_sizes_cb cb,
const void *cb_data)
{
struct lower_mem_access_state state = {
.modes = modes,
.cb = cb,
.cb_data = cb_data
};