Prep work to convert from deref chains to deref instruction chains, add a accessors so we can start moving code away from direct access to deref chain just for the sake of finding the nir_variable.
After conversion to deref instructions, this would be converted to chase the deref instruction ssa links back to the originating nir_variable. We probably could do the same for nir_call_instr, but there aren't many places in the code that deal with the params/return derefs, and currently functions are inlined before the driver back-end so it would not effect any nir consumers. --- src/compiler/nir/nir.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 6a51b7c4ab1..1e2ab459bd6 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1003,6 +1003,10 @@ typedef struct { int const_index[NIR_INTRINSIC_MAX_CONST_INDEX]; + /** + * Note: drivers should not access intr->variables[n]->var directly, but + * instead use nir_intrinsic_var() + */ nir_deref_var *variables[2]; nir_src src[]; @@ -1166,6 +1170,20 @@ INTRINSIC_IDX_ACCESSORS(interp_mode, INTERP_MODE, unsigned) INTRINSIC_IDX_ACCESSORS(reduction_op, REDUCTION_OP, unsigned) INTRINSIC_IDX_ACCESSORS(cluster_size, CLUSTER_SIZE, unsigned) +/** + * Access the nir_variable that an intrinsic refers to. + * + * Drivers should use this rather than directly accessing + * intr->variables[n]->var to prepare for conversion of deref chains + * to deref instructions. + */ +static inline nir_variable * +nir_intrinsic_var(nir_intrinsic_instr *intr, unsigned n) +{ + assert(n < nir_intrinsic_infos[intr->intrinsic].num_variables); + return intr->variables[n]->var; +} + /** * \group texture information * @@ -1274,6 +1292,22 @@ typedef struct { nir_deref_var *sampler; } nir_tex_instr; +static inline nir_variable * +nir_tex_texture_var(nir_tex_instr *instr) +{ + if (instr->texture) + return instr->texture->var; + return NULL; +} + +static inline nir_variable * +nir_tex_sampler_var(nir_tex_instr *instr) +{ + if (instr->sampler) + return instr->sampler->var; + return NULL; +} + static inline unsigned nir_tex_instr_dest_size(const nir_tex_instr *instr) { -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev