This is something that Connor and I have been talking about for some time now. The basic idea is to replace the current singly linked nir_deref list with deref instructions. This is similar to what LLVM does and it offers quite a bit more freedom when we start getting more realistic pointers from compute applications.
This series implements an almost complete conversion for both i965 and anv. The two remaining gaps are nir_lower_locals_to_regs and nir_lower_samplers. The former will have to wait for ir3 to be converted and the later will have to wait for radeonsi. I've got patches for nir_lower_samplers but not nir_lower_samplers_as_deref which is required by at least radeonsi. Once those are in place, we should be able to drop the lowering pass from the Intel back-end completely. The next step (which I will start on next week) will be removing legacy derefs from core NIR. This will also involve significant reworks in some passes such as vars_to_ssa which still uses legacy derefs internally even for things which use deref instructions. Clearly, we can't remove anything until all of the other drivers are converted. However, this series should be a good basis for anyone wanting to work on converting another driver since almost all of the core NIR passes now work with both types of derefs so you can convert in whatever way makes sense. This series can be found as a branch on gitlab: https://gitlab.freedesktop.org/jekstrand/mesa/commits/review/nir-deref-instrs-v1 Cc: Rob Clark <robdcl...@gmail.com> Cc: Timothy Arceri <tarc...@itsqueeze.com> Cc: Eric Anholt <e...@anholt.net> Cc: Connor Abbott <cwabbo...@gmail.com> Cc: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> Cc: Karol Herbst <kher...@redhat.com> Jason Ekstrand (61): nir: Add src/dest num_components helpers nir: Return a cursor from nir_instr_remove nir/vars_to_ssa: Remove copies from the correct set nir/lower_indirect_derefs: Support interp_var_at intrinsics intel/vec4: Set channel_sizes for MOV_INDIRECT sources nir/validator: Validate that all used variables exist nir: Add a deref instruction type nir/builder: Add deref building helpers nir: Add _deref versions of all of the _var intrinsics nir: Add deref sources to texture instructions nir: Add helpers for working with deref instructions anv,i965,radv,st,ir3: Call nir_lower_deref_instrs glsl/nir: Only claim to handle intrinsic functions glsl/nir: Use deref instructions instead of dref chains prog/nir: Simplify some load/store operations prog/nir: Use deref instructions for params nir/lower_atomics: Rework the main walker loop a bit nir: Support deref instructions in remove_dead_variables nir: Add a pass for fixing deref modes nir: Support deref instructions in lower_global_vars_to_local nir: Support deref instructions in lower_io_to_temporaries nir: Add a deref path helper struct nir: Support deref instructions in lower_var_copies nir: Support deref instructions in split_var_copies nir: Support deref instructions in lower_vars_to_ssa nir: Support deref instructions in lower_indirect_derefs nir/deref: Add a deref cleanup function nir: Support deref instructions in lower_system_values nir: Support deref instructions in lower_clip_cull nir: Support deref instructions in propagate_invariant nir: Support deref instructions in gather_info nir: Support deref instructions in lower_io nir: Support deref instructions in lower_atomics nir: Support deref instructions in lower_wpos_ytransform nir: Support deref instructions in lower_pos_center nir: Support deref instructions in remove_unused_varyings intel,ir3: Disable nir_opt_copy_prop_vars intel/nir: Fixup deref modes after lowering patch vertices i965: Move nir_lower_deref_instrs to right before locals_to_regs st/nir: Move lower_deref_instrs later spirv: Use deref instructions for most variables nir: Add a concept of per-member structs and a lowering pass nir/lower_system_values: Support SYSTEM_VALUE_LOCAL_GROUP_SIZE spirv: Use the LOCAL_GROUP_SIZE system value nir/spirv: Pass nir_variable_data into apply_var_decoration anv/pipeline: Lower more constant initializers earlier spirv: Use NIR per-member splitting spirv: Make push constants an offset-based pointer spirv: Clean up vtn_pointer_to_offset spirv: Allow pointers to have a deref at the base spirv: Update vtn_pointer_to/from_ssa to handle deref pointers spirv: Record the type of functions spirv/cfg: Make the builder fully capable for both walks nir,spirv: Rework function calls anv/pipeline: Do less deref instruction lowering anv/pipeline: Convert lower_input_attachments to deref instructions anv/pipeline: Convert YCbCr lowering to deref instructiosn anv/apply_pipeline_layout: Simplify extract_tex_src_plane anv/pipeline: Convert apply_pipeline_layout to deref instructions intel/fs: Use image_deref intrinsics instead of image_var intel/nir: Only lower load/store derefs src/amd/vulkan/radv_shader.c | 10 + src/compiler/Makefile.sources | 3 + src/compiler/glsl/glsl_to_nir.cpp | 265 ++++------ src/compiler/nir/meson.build | 3 + src/compiler/nir/nir.c | 107 ++-- src/compiler/nir/nir.h | 175 +++++- src/compiler/nir/nir_builder.h | 236 +++++++++ src/compiler/nir/nir_clone.c | 65 ++- src/compiler/nir/nir_deref.c | 393 ++++++++++++++ src/compiler/nir/nir_deref.h | 55 ++ src/compiler/nir/nir_gather_info.c | 26 +- src/compiler/nir/nir_inline_functions.c | 193 +------ src/compiler/nir/nir_instr_set.c | 78 +++ src/compiler/nir/nir_intrinsics.h | 88 ++++ src/compiler/nir/nir_linking_helpers.c | 50 +- src/compiler/nir/nir_lower_atomics.c | 137 ++++- .../nir/nir_lower_clip_cull_distance_arrays.c | 69 ++- src/compiler/nir/nir_lower_global_vars_to_local.c | 62 ++- src/compiler/nir/nir_lower_indirect_derefs.c | 169 +++++- src/compiler/nir/nir_lower_io.c | 70 ++- src/compiler/nir/nir_lower_io_to_temporaries.c | 2 + src/compiler/nir/nir_lower_system_values.c | 23 +- src/compiler/nir/nir_lower_var_copies.c | 90 +++- src/compiler/nir/nir_lower_vars_to_ssa.c | 77 ++- src/compiler/nir/nir_lower_wpos_center.c | 13 +- src/compiler/nir/nir_lower_wpos_ytransform.c | 51 +- src/compiler/nir/nir_opt_copy_prop_vars.c | 19 +- src/compiler/nir/nir_opt_copy_propagate.c | 62 ++- src/compiler/nir/nir_opt_dce.c | 7 + src/compiler/nir/nir_print.c | 119 +++-- src/compiler/nir/nir_propagate_invariant.c | 23 +- src/compiler/nir/nir_remove_dead_variables.c | 117 +++- src/compiler/nir/nir_serialize.c | 137 +++-- src/compiler/nir/nir_split_per_member_structs.c | 289 ++++++++++ src/compiler/nir/nir_split_var_copies.c | 42 ++ src/compiler/nir/nir_sweep.c | 4 - src/compiler/nir/nir_validate.c | 143 +++-- src/compiler/spirv/spirv_to_nir.c | 180 ++++--- src/compiler/spirv/vtn_cfg.c | 231 ++++---- src/compiler/spirv/vtn_glsl450.c | 19 +- src/compiler/spirv/vtn_private.h | 28 +- src/compiler/spirv/vtn_variables.c | 586 +++++++-------------- src/gallium/drivers/freedreno/ir3/ir3_cmdline.c | 3 + src/gallium/drivers/freedreno/ir3/ir3_nir.c | 2 +- src/intel/compiler/brw_fs.h | 2 +- src/intel/compiler/brw_fs_nir.cpp | 157 +++--- src/intel/compiler/brw_nir.c | 4 +- src/intel/compiler/brw_vec4.cpp | 5 +- src/intel/vulkan/anv_nir_apply_pipeline_layout.c | 187 +++---- src/intel/vulkan/anv_nir_lower_input_attachments.c | 31 +- src/intel/vulkan/anv_nir_lower_ycbcr_textures.c | 34 +- src/intel/vulkan/anv_pipeline.c | 19 +- src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp | 2 + src/mesa/drivers/dri/i965/brw_program.c | 1 + src/mesa/program/prog_to_nir.c | 65 +-- src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 + 56 files changed, 3451 insertions(+), 1579 deletions(-) create mode 100644 src/compiler/nir/nir_deref.c create mode 100644 src/compiler/nir/nir_deref.h create mode 100644 src/compiler/nir/nir_split_per_member_structs.c -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev