nir/lower_io: Add support for push constants
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5275>
This commit is contained in:

committed by
Marge Bot

parent
7a2b4ce22e
commit
ac7537f155
@@ -1897,7 +1897,7 @@ nir_intrinsic_set_##name(nir_intrinsic_instr *instr, type val) \
|
||||
instr->const_index[info->index_map[NIR_INTRINSIC_##flag] - 1] = val; \
|
||||
} \
|
||||
static inline bool \
|
||||
nir_intrinsic_has_##name(nir_intrinsic_instr *instr) \
|
||||
nir_intrinsic_has_##name(const nir_intrinsic_instr *instr) \
|
||||
{ \
|
||||
const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic]; \
|
||||
return info->index_map[NIR_INTRINSIC_##flag] > 0; \
|
||||
@@ -1959,6 +1959,13 @@ nir_intrinsic_align(const nir_intrinsic_instr *intrin)
|
||||
return align_offset ? 1 << (ffs(align_offset) - 1) : align_mul;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
nir_intrinsic_has_align(const nir_intrinsic_instr *intrin)
|
||||
{
|
||||
return nir_intrinsic_has_align_mul(intrin) &&
|
||||
nir_intrinsic_has_align_offset(intrin);
|
||||
}
|
||||
|
||||
static inline void
|
||||
nir_intrinsic_set_io_semantics(nir_intrinsic_instr *intrin,
|
||||
nir_io_semantics semantics)
|
||||
|
@@ -849,7 +849,7 @@ build_addr_for_var(nir_builder *b, nir_variable *var,
|
||||
{
|
||||
assert(var->data.mode & (nir_var_uniform | nir_var_mem_shared |
|
||||
nir_var_shader_temp | nir_var_function_temp |
|
||||
nir_var_mem_constant));
|
||||
nir_var_mem_push_const | nir_var_mem_constant));
|
||||
|
||||
const unsigned num_comps = nir_address_format_num_components(addr_format);
|
||||
const unsigned bit_size = nir_address_format_bit_size(addr_format);
|
||||
@@ -1134,6 +1134,10 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin,
|
||||
op = nir_intrinsic_load_global;
|
||||
}
|
||||
break;
|
||||
case nir_var_mem_push_const:
|
||||
assert(addr_format == nir_address_format_32bit_offset);
|
||||
op = nir_intrinsic_load_push_constant;
|
||||
break;
|
||||
case nir_var_mem_constant:
|
||||
if (addr_format_is_offset(addr_format)) {
|
||||
op = nir_intrinsic_load_constant;
|
||||
@@ -1164,6 +1168,13 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin,
|
||||
if (op == nir_intrinsic_load_constant) {
|
||||
nir_intrinsic_set_base(load, 0);
|
||||
nir_intrinsic_set_range(load, b->shader->constant_data_size);
|
||||
} else if (mode == nir_var_mem_push_const) {
|
||||
/* Push constants are required to be able to be chased back to the
|
||||
* variable so we can provide a base/range.
|
||||
*/
|
||||
nir_variable *var = nir_deref_instr_get_variable(deref);
|
||||
nir_intrinsic_set_base(load, 0);
|
||||
nir_intrinsic_set_range(load, glsl_get_explicit_size(var->type, false));
|
||||
}
|
||||
|
||||
unsigned bit_size = intrin->dest.ssa.bit_size;
|
||||
@@ -1172,6 +1183,7 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin,
|
||||
bit_size = 32;
|
||||
}
|
||||
|
||||
if (nir_intrinsic_has_align(load))
|
||||
nir_intrinsic_set_align(load, align_mul, align_offset);
|
||||
|
||||
if (nir_intrinsic_has_range_base(load)) {
|
||||
|
Reference in New Issue
Block a user