nir: Add an alignment to nir_intrinsic_load_constant
authorJason Ekstrand <jason@jlekstrand.net>
Wed, 8 Apr 2020 20:08:03 +0000 (15:08 -0500)
committerMarge Bot <eric+marge@anholt.net>
Thu, 16 Apr 2020 17:00:13 +0000 (17:00 +0000)
In f1883cc73d4 we tried to pass through alignments from load_constant
intrinsics when rewriting them to load_ubo in iris.  However, those
intrinsics don't have ALIGN_MUL or ALIGN_OFFSET indices.  It's easy
enough to add them.  We just call the size/align function on the vector
type at the end of our deref chain and use the alignment returned from
there.  It's possible we could do better by walking the whole deref
chain but this should be good enough.

Fixes: f1883cc73d4 "iris: Set alignments on cbuf0 and constant reads"
Closes: #2739
Reviewed-by: Eric Anholt <eric@anholt.net>
Tested-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4468>

src/compiler/nir/nir_intrinsics.py
src/compiler/nir/nir_opt_large_constants.c
src/compiler/nir/nir_validate.c

index b2cb0371efce153c45a8a874f1f79652535725dc..fb4c459e0627a1a8933881e30c6e951281d7fb4f 100644 (file)
@@ -747,7 +747,8 @@ load("shared", 1, [BASE, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE])
 # src[] = { offset }.
 load("push_constant", 1, [BASE, RANGE], [CAN_ELIMINATE, CAN_REORDER])
 # src[] = { offset }.
-load("constant", 1, [BASE, RANGE], [CAN_ELIMINATE, CAN_REORDER])
+load("constant", 1, [BASE, RANGE, ALIGN_MUL, ALIGN_OFFSET],
+     [CAN_ELIMINATE, CAN_REORDER])
 # src[] = { address }.
 load("global", 1, [ACCESS, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE])
 # src[] = { address }.
index e32265e50ec3f7801db4d20de1fe4d78391cdedf..7e293ba2c5e6d4950ec1b863b4fbc37a759e412c 100644 (file)
@@ -75,11 +75,15 @@ build_constant_load(nir_builder *b, nir_deref_instr *deref,
    size_align(var->type, &var_size, &var_align);
    assert(var->data.location % var_align == 0);
 
+   UNUSED unsigned deref_size, deref_align;
+   size_align(deref->type, &deref_size, &deref_align);
+
    nir_intrinsic_instr *load =
       nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_constant);
    load->num_components = num_components;
    nir_intrinsic_set_base(load, var->data.location);
    nir_intrinsic_set_range(load, var_size);
+   nir_intrinsic_set_align(load, deref_align, 0);
    load->src[0] = nir_src_for_ssa(nir_build_deref_offset(b, deref, size_align));
    nir_ssa_dest_init(&load->instr, &load->dest,
                      num_components, bit_size, NULL);
index 410f5906c0b1aab0d47fa23377259025ea7e80b0..998017d504ab56959b022f74a56ed29753487bdc 100644 (file)
@@ -575,6 +575,7 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
    case nir_intrinsic_load_shared:
    case nir_intrinsic_load_global:
    case nir_intrinsic_load_scratch:
+   case nir_intrinsic_load_constant:
       /* These memory load operations must have alignments */
       validate_assert(state,
          util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
@@ -589,7 +590,6 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
    case nir_intrinsic_load_output:
    case nir_intrinsic_load_per_vertex_output:
    case nir_intrinsic_load_push_constant:
-   case nir_intrinsic_load_constant:
       /* All memory load operations must load at least a byte */
       validate_assert(state, nir_dest_bit_size(instr->dest) >= 8);
       break;