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.
Right now, we still have a fully "logical" pointer model where pointer chains eventually terminate at variable dereferences. In future, we'd like to be able to use nir_deref_instrs for things like UBOs and SSBOs where tha tmay not be the case. There are still a couple open questions around how we want to handle "raw" pointers in SPIR-V for OpenCL drivers particularly around casting. However, the hard part is getting the deref instructions and getting everything switched over to them. Now that we've done that, some of those other details can be sorted out later. This series is, as far as Rob, Bas, and I can tell, a complete and correct transition for all NIR-based drivers. The final patch deletes the data structures and helpers for the older deref chains. A massive thank you goes out to Rob for putting the final patch set together and trying to get things in an order that will hopefully not regress anyone. Thanks also to Bas for fixing up the radeon and radv bits. This series can be found as a branch on gitlab: https://gitlab.freedesktop.org/jekstrand/mesa/commits/review/nir-deref-instr-v4 Ideally, I'd like the series to get some amount of real review before it lands. Honestly, it's been baking long enough and tested by enough people on enough drivers that we can probably throw a bunch of Acked-by and Tested-bys on it and call it a day but I'd rather not. I plan to review all of the patches I didn't write but that will have to wait until tomorrow. At the very least, I'd like some sort of an ACK from a variety of the people that use NIR on the core concept and the sort of general shape of things at the end of the series. A lot of work has gone into this but it's also a big change and the more positive feedback it gets, the more comfortable I'll be pulling the trigger. Thanks, --Jason Ekstrand 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> Cc: Matt Turner <matts...@gmail.com> Cc: Kenneth Graunke <kenn...@whitecape.org> Cc: Ian Romanick <ian.d.roman...@intel.com> Bas Nieuwenhuizen (16): ac/nir: Implement the deref instr for shared memory. ac/nir: Support deref instructions in get_sampler_desc. ac/nir: Support deref instructions in tex instructions. ac/nir: Implement derefs for integer gather4 lowering. ac/nir: Add deref support to image intrinsics. radv: Add shader info support for image deref instructions. ac/nir: Add deref based var loads/stores. radv: Gather info for deref instr based load/store. ac/nir: Add shared atomic deref instr support. ac/nir: Add deref interp support. radv: Use deref instructions for tex derefs in meta shaders. radv: Remove image_var stores. radeonsi: Add deref support to the nir scan pass. ac/nir: Remove deref chain support. radv: Remove deref chain support in radv shader info pass. radeonsi: Remove deref chain support in nir scan pass. Eric Anholt (1): broadcom/vc4: Remove deref chain support from nir_lower_txf_ms. Jason Ekstrand (98): nir/validate: Rework intrinsic type validation 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 nir/deref: Add some deref cleanup functions 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: Use deref instructions for params 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: 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 nir: Support deref instructions in loop_analyze nir: Support deref instructions in lower_alpha_test nir: Support deref instructions in lower_clamp_color_outputs nir: Support deref instructions in lower_drawpixels nir: Consider deref instructions in lower_phis_to_scalar nir: Consider deref instructions in opt_peephole_select nir: Support deref instructions in opt_undef intel,ir3: Disable nir_opt_copy_prop_vars intel/nir: Fixup deref modes after lowering patch vertices nir/lower_tex: Always copy deref and offset sources 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/spirv: Pass nir_variable_data into apply_var_decoration 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/pipeline: Convert lower_multiview to deref instructions 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 intel/blorp: Stop setting tex->texture/sampler nir/lower_samplers: Clean up function arguments nir: Use derefs in nir_lower_samplers nir/builder: Use deref instructions for load/store/copy_var nir: Use deref instructions in lower_constant_initializers nir/vars_to_ssa: Add an is_direct field to deref_node nir/vars_to_ssa: Rework to entirely use deref instructions nir: Rework gather_info to entirely use deref instructions nir: Remove deref chain support from lower_indirect_derefs nir: Remove deref chain support from lower_clip_cull_distance_arrays nir: Remove deref chain support from lower_atomics nir: Remove deref chain support from lower_alpha_test nir: Remove deref chain support from lower_clamp_color_outputs nir: Remove deref chain support from lower_global_vars_to_local nir/lower_io: Convert atomic lowering to deref instructions nir: Convert lower_io to deref instructions nir: Remove deref chain support from lower_phis_to_scalar nir: Delete lower_io_types nir: Remove deref chain support from remove_unused_varyings nir: Remove deref chain support from lower_system_values nir: Remove deref chain support from lower_wpos_center nir: Remove deref chain support from lower_wpos_ytransform nir: Remove deref chain support from lower_tex nir: Remove deref chain support from opt_peephole_select nir: Remove deref chain support from lower_drawpixels nir: Remove deref chain support from lower_var_copies nir: Remove deref chain support from propagate_invariant nir: Remove deref chain support from dead_variables nir: Remove deref chain support from split_var_copies nir: Remove deref chain support from opt_undef nir: Remove deref chain support from split_per_member_structs nir/copy_prop_vars: Re-order some logic in compare_derefs nir: Rework opt_copy_prop_vars to use deref instructions intel,ir3: Re-enable nir_opt_copy_prop_vars nir: Rework lower_locals_to_regs to use deref instructions nir: Remove deref chain support from analyze_loops nir: Remove old-school deref chain support nir/lower_system_values: Assert/assume direct var derefs Rob Clark (14): nir: add deref lowering sanity checking ttn: convert to deref instructions nir/lower_samplers: split out _legacy version for deref chains move lower_deref_instrs nir: convert lower_io_to_scalar to deref instructions mesa/st: temporarily disable lower_io_to_elements() mesa/st/nir: convert lower_builtins to deref instructions nir: convert lower_io_arrays_to_elements to deref instructions mesa/st: re-enable lower_io_to_elements() nir: convert lower_samplers_as_deref to deref instructions nir/lower_samplers: remove legacy version st,ir3,radeonsi: push lower_deref_instrs back into driver nir: promote intrinsic_get_var() to helper freedreno/ir3: convert to deref instructions src/amd/common/ac_nir_to_llvm.c | 547 ++++++++++---------- src/amd/vulkan/radv_meta.c | 20 +- src/amd/vulkan/radv_meta_blit.c | 30 +- src/amd/vulkan/radv_meta_blit2d.c | 21 +- src/amd/vulkan/radv_meta_bufimage.c | 62 +-- src/amd/vulkan/radv_meta_fast_clear.c | 17 +- src/amd/vulkan/radv_meta_resolve_cs.c | 10 +- src/amd/vulkan/radv_shader.c | 8 + src/amd/vulkan/radv_shader_info.c | 139 ++--- src/compiler/Makefile.sources | 4 +- src/compiler/glsl/gl_nir_lower_atomics.c | 137 ++--- src/compiler/glsl/gl_nir_lower_samplers.c | 162 +++--- src/compiler/glsl/gl_nir_lower_samplers_as_deref.c | 180 ++++--- src/compiler/glsl/glsl_to_nir.cpp | 267 ++++------ src/compiler/nir/meson.build | 4 +- src/compiler/nir/nir.c | 423 +++------------- src/compiler/nir/nir.h | 207 ++++---- src/compiler/nir/nir_builder.h | 254 ++++++++-- src/compiler/nir/nir_clone.c | 143 ++---- src/compiler/nir/nir_deref.c | 165 ++++++ src/compiler/nir/nir_deref.h | 55 ++ src/compiler/nir/nir_gather_info.c | 51 +- src/compiler/nir/nir_inline_functions.c | 193 ++----- src/compiler/nir/nir_instr_set.c | 101 +++- src/compiler/nir/nir_intrinsics.py | 99 ++-- src/compiler/nir/nir_intrinsics_c.py | 1 - src/compiler/nir/nir_linking_helpers.c | 47 +- src/compiler/nir/nir_loop_analyze.c | 70 ++- src/compiler/nir/nir_lower_alpha_test.c | 7 +- src/compiler/nir/nir_lower_clamp_color_outputs.c | 9 +- .../nir/nir_lower_clip_cull_distance_arrays.c | 85 ++-- src/compiler/nir/nir_lower_constant_initializers.c | 57 ++- src/compiler/nir/nir_lower_drawpixels.c | 10 +- src/compiler/nir/nir_lower_global_vars_to_local.c | 45 +- src/compiler/nir/nir_lower_indirect_derefs.c | 174 +++---- src/compiler/nir/nir_lower_io.c | 185 ++++--- src/compiler/nir/nir_lower_io_arrays_to_elements.c | 154 +++--- src/compiler/nir/nir_lower_io_to_scalar.c | 90 ++-- src/compiler/nir/nir_lower_io_to_temporaries.c | 2 + src/compiler/nir/nir_lower_io_types.c | 176 ------- src/compiler/nir/nir_lower_locals_to_regs.c | 186 ++++--- src/compiler/nir/nir_lower_phis_to_scalar.c | 14 +- src/compiler/nir/nir_lower_system_values.c | 31 +- src/compiler/nir/nir_lower_tex.c | 47 +- src/compiler/nir/nir_lower_var_copies.c | 165 +++--- src/compiler/nir/nir_lower_vars_to_ssa.c | 330 ++++++------ src/compiler/nir/nir_lower_wpos_center.c | 8 +- src/compiler/nir/nir_lower_wpos_ytransform.c | 33 +- src/compiler/nir/nir_opt_constant_folding.c | 53 -- src/compiler/nir/nir_opt_copy_prop_vars.c | 316 ++++++------ src/compiler/nir/nir_opt_copy_propagate.c | 95 ++-- src/compiler/nir/nir_opt_dce.c | 7 + src/compiler/nir/nir_opt_peephole_select.c | 4 +- src/compiler/nir/nir_opt_undef.c | 2 +- src/compiler/nir/nir_print.c | 252 +++++---- src/compiler/nir/nir_propagate_invariant.c | 17 +- src/compiler/nir/nir_remove_dead_variables.c | 152 +++--- src/compiler/nir/nir_serialize.c | 234 ++++----- src/compiler/nir/nir_split_per_member_structs.c | 208 ++++++++ src/compiler/nir/nir_split_var_copies.c | 234 ++------- src/compiler/nir/nir_sweep.c | 4 - src/compiler/nir/nir_validate.c | 247 ++++----- src/compiler/spirv/spirv_to_nir.c | 184 ++++--- src/compiler/spirv/vtn_cfg.c | 231 ++++----- src/compiler/spirv/vtn_glsl450.c | 19 +- src/compiler/spirv/vtn_private.h | 26 +- src/compiler/spirv/vtn_variables.c | 563 +++++++-------------- src/gallium/auxiliary/nir/tgsi_to_nir.c | 52 +- src/gallium/drivers/freedreno/ir3/ir3_cmdline.c | 1 - .../drivers/freedreno/ir3/ir3_compiler_nir.c | 49 +- src/gallium/drivers/freedreno/ir3/ir3_nir.c | 4 +- .../freedreno/ir3/ir3_nir_lower_tg4_to_tex.c | 4 +- src/gallium/drivers/radeonsi/si_shader_nir.c | 72 ++- src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c | 1 - src/intel/blorp/blorp_blit.c | 2 - src/intel/compiler/brw_fs.h | 2 +- src/intel/compiler/brw_fs_nir.cpp | 157 +++--- 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_multiview.c | 17 +- src/intel/vulkan/anv_nir_lower_ycbcr_textures.c | 34 +- src/intel/vulkan/anv_pipeline.c | 7 + src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp | 2 + src/mesa/drivers/dri/i965/brw_program.c | 5 +- src/mesa/program/prog_to_nir.c | 41 +- src/mesa/state_tracker/st_nir_lower_builtin.c | 62 ++- 86 files changed, 4183 insertions(+), 4620 deletions(-) create mode 100644 src/compiler/nir/nir_deref.c create mode 100644 src/compiler/nir/nir_deref.h delete mode 100644 src/compiler/nir/nir_lower_io_types.c 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