diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index a16a70c3088..c7e0eb0a403 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -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 {