From ac7537f155b65801fa41773c8024c335c006c8bb Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 27 May 2020 17:08:28 -0500 Subject: [PATCH] nir/lower_io: Add support for push constants Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/nir/nir.h | 9 ++++++++- src/compiler/nir/nir_lower_io.c | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 2f9409c857d..1ac0ba45cee 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -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) diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index 9fb49c1b466..c4284022752 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -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;