nir/lower_io: Add support for push constants
authorJason Ekstrand <jason@jlekstrand.net>
Wed, 27 May 2020 22:08:28 +0000 (17:08 -0500)
committerMarge Bot <eric+marge@anholt.net>
Wed, 30 Sep 2020 07:20:38 +0000 (07:20 +0000)
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5275>

src/compiler/nir/nir.h
src/compiler/nir/nir_lower_io.c

index 2f9409c..1ac0ba4 100644 (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)
index 9fb49c1..c428402 100644 (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;