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:
Jason Ekstrand
2020-05-27 17:08:28 -05:00
committed by Marge Bot
parent 7a2b4ce22e
commit ac7537f155
2 changed files with 22 additions and 3 deletions

View File

@@ -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)

View File

@@ -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,7 +1183,8 @@ build_explicit_io_load(nir_builder *b, nir_intrinsic_instr *intrin,
bit_size = 32;
}
nir_intrinsic_set_align(load, align_mul, align_offset);
if (nir_intrinsic_has_align(load))
nir_intrinsic_set_align(load, align_mul, align_offset);
if (nir_intrinsic_has_range_base(load)) {
unsigned base, range;