nir/lower_io: Add a mode parameter to addr_format_is_*
Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6332>
This commit is contained in:
parent
7007d06898
commit
c50332fbc2
|
@ -935,7 +935,8 @@ addr_to_offset(nir_builder *b, nir_ssa_def *addr,
|
|||
|
||||
/** Returns true if the given address format resolves to a global address */
|
||||
static bool
|
||||
addr_format_is_global(nir_address_format addr_format)
|
||||
addr_format_is_global(nir_address_format addr_format,
|
||||
nir_variable_mode mode)
|
||||
{
|
||||
return addr_format == nir_address_format_32bit_global ||
|
||||
addr_format == nir_address_format_64bit_global ||
|
||||
|
@ -943,7 +944,8 @@ addr_format_is_global(nir_address_format addr_format)
|
|||
}
|
||||
|
||||
static bool
|
||||
addr_format_is_offset(nir_address_format addr_format)
|
||||
addr_format_is_offset(nir_address_format addr_format,
|
||||
nir_variable_mode mode)
|
||||
{
|
||||
return addr_format == nir_address_format_32bit_offset ||
|
||||
addr_format == nir_address_format_32bit_offset_as_64bit;
|
||||
|
@ -1109,30 +1111,30 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||
op = nir_intrinsic_load_ubo;
|
||||
break;
|
||||
case nir_var_mem_ssbo:
|
||||
if (addr_format_is_global(addr_format))
|
||||
if (addr_format_is_global(addr_format, mode))
|
||||
op = nir_intrinsic_load_global;
|
||||
else
|
||||
op = nir_intrinsic_load_ssbo;
|
||||
break;
|
||||
case nir_var_mem_global:
|
||||
assert(addr_format_is_global(addr_format));
|
||||
assert(addr_format_is_global(addr_format, mode));
|
||||
op = nir_intrinsic_load_global;
|
||||
break;
|
||||
case nir_var_uniform:
|
||||
assert(addr_format_is_offset(addr_format));
|
||||
assert(addr_format_is_offset(addr_format, mode));
|
||||
assert(b->shader->info.stage == MESA_SHADER_KERNEL);
|
||||
op = nir_intrinsic_load_kernel_input;
|
||||
break;
|
||||
case nir_var_mem_shared:
|
||||
assert(addr_format_is_offset(addr_format));
|
||||
assert(addr_format_is_offset(addr_format, mode));
|
||||
op = nir_intrinsic_load_shared;
|
||||
break;
|
||||
case nir_var_shader_temp:
|
||||
case nir_var_function_temp:
|
||||
if (addr_format_is_offset(addr_format)) {
|
||||
if (addr_format_is_offset(addr_format, mode)) {
|
||||
op = nir_intrinsic_load_scratch;
|
||||
} else {
|
||||
assert(addr_format_is_global(addr_format));
|
||||
assert(addr_format_is_global(addr_format, mode));
|
||||
op = nir_intrinsic_load_global;
|
||||
}
|
||||
break;
|
||||
|
@ -1141,10 +1143,10 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||
op = nir_intrinsic_load_push_constant;
|
||||
break;
|
||||
case nir_var_mem_constant:
|
||||
if (addr_format_is_offset(addr_format)) {
|
||||
if (addr_format_is_offset(addr_format, mode)) {
|
||||
op = nir_intrinsic_load_constant;
|
||||
} else {
|
||||
assert(addr_format_is_global(addr_format));
|
||||
assert(addr_format_is_global(addr_format, mode));
|
||||
op = nir_intrinsic_load_global_constant;
|
||||
}
|
||||
break;
|
||||
|
@ -1154,9 +1156,9 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||
|
||||
nir_intrinsic_instr *load = nir_intrinsic_instr_create(b->shader, op);
|
||||
|
||||
if (addr_format_is_global(addr_format)) {
|
||||
if (addr_format_is_global(addr_format, mode)) {
|
||||
load->src[0] = nir_src_for_ssa(addr_to_global(b, addr, addr_format));
|
||||
} else if (addr_format_is_offset(addr_format)) {
|
||||
} else if (addr_format_is_offset(addr_format, mode)) {
|
||||
assert(addr->num_components == 1);
|
||||
load->src[0] = nir_src_for_ssa(addr_to_offset(b, addr, addr_format));
|
||||
} else {
|
||||
|
@ -1250,25 +1252,25 @@ build_explicit_io_store(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||
nir_intrinsic_op op;
|
||||
switch (mode) {
|
||||
case nir_var_mem_ssbo:
|
||||
if (addr_format_is_global(addr_format))
|
||||
if (addr_format_is_global(addr_format, mode))
|
||||
op = nir_intrinsic_store_global;
|
||||
else
|
||||
op = nir_intrinsic_store_ssbo;
|
||||
break;
|
||||
case nir_var_mem_global:
|
||||
assert(addr_format_is_global(addr_format));
|
||||
assert(addr_format_is_global(addr_format, mode));
|
||||
op = nir_intrinsic_store_global;
|
||||
break;
|
||||
case nir_var_mem_shared:
|
||||
assert(addr_format_is_offset(addr_format));
|
||||
assert(addr_format_is_offset(addr_format, mode));
|
||||
op = nir_intrinsic_store_shared;
|
||||
break;
|
||||
case nir_var_shader_temp:
|
||||
case nir_var_function_temp:
|
||||
if (addr_format_is_offset(addr_format)) {
|
||||
if (addr_format_is_offset(addr_format, mode)) {
|
||||
op = nir_intrinsic_store_scratch;
|
||||
} else {
|
||||
assert(addr_format_is_global(addr_format));
|
||||
assert(addr_format_is_global(addr_format, mode));
|
||||
op = nir_intrinsic_store_global;
|
||||
}
|
||||
break;
|
||||
|
@ -1294,9 +1296,9 @@ build_explicit_io_store(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||
}
|
||||
|
||||
store->src[0] = nir_src_for_ssa(value);
|
||||
if (addr_format_is_global(addr_format)) {
|
||||
if (addr_format_is_global(addr_format, mode)) {
|
||||
store->src[1] = nir_src_for_ssa(addr_to_global(b, addr, addr_format));
|
||||
} else if (addr_format_is_offset(addr_format)) {
|
||||
} else if (addr_format_is_offset(addr_format, mode)) {
|
||||
assert(addr->num_components == 1);
|
||||
store->src[1] = nir_src_for_ssa(addr_to_offset(b, addr, addr_format));
|
||||
} else {
|
||||
|
@ -1340,17 +1342,17 @@ build_explicit_io_atomic(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||
nir_intrinsic_op op;
|
||||
switch (mode) {
|
||||
case nir_var_mem_ssbo:
|
||||
if (addr_format_is_global(addr_format))
|
||||
if (addr_format_is_global(addr_format, mode))
|
||||
op = global_atomic_for_deref(intrin->intrinsic);
|
||||
else
|
||||
op = ssbo_atomic_for_deref(intrin->intrinsic);
|
||||
break;
|
||||
case nir_var_mem_global:
|
||||
assert(addr_format_is_global(addr_format));
|
||||
assert(addr_format_is_global(addr_format, mode));
|
||||
op = global_atomic_for_deref(intrin->intrinsic);
|
||||
break;
|
||||
case nir_var_mem_shared:
|
||||
assert(addr_format_is_offset(addr_format));
|
||||
assert(addr_format_is_offset(addr_format, mode));
|
||||
op = shared_atomic_for_deref(intrin->intrinsic);
|
||||
break;
|
||||
default:
|
||||
|
@ -1360,9 +1362,9 @@ build_explicit_io_atomic(nir_builder *b, nir_intrinsic_instr *intrin,
|
|||
nir_intrinsic_instr *atomic = nir_intrinsic_instr_create(b->shader, op);
|
||||
|
||||
unsigned src = 0;
|
||||
if (addr_format_is_global(addr_format)) {
|
||||
if (addr_format_is_global(addr_format, mode)) {
|
||||
atomic->src[src++] = nir_src_for_ssa(addr_to_global(b, addr, addr_format));
|
||||
} else if (addr_format_is_offset(addr_format)) {
|
||||
} else if (addr_format_is_offset(addr_format, mode)) {
|
||||
assert(addr->num_components == 1);
|
||||
atomic->src[src++] = nir_src_for_ssa(addr_to_offset(b, addr, addr_format));
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue