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 is the start of the conversion. I have almost everything working for i965. The two remaining gaps are nir_lower_locals_to_regs and nir_lower_samplers. However, those two passes are a bit less practical to change in the same additive fashion that I've done for most of core NIR. Instead, my plan is to just change them for everyone all at the same time. Before we can do that, however, we need to get other drivers to the same point as i965. I don't think I've broken anyone else's drivers in this process since they just lower derefs away immediately. My next project will be Vulkan. Unfortunately, that means reworking the way that NIR functions work so that we can use deref instructions with them. My plan there is to vastly simplify them so that they just have a list of SSA defs which get filled out at the start of the function call. Those SSA defs may be derefs or regular values. Return parameters are handled by passing a deref into the function as a parameter and then writing to it from within the function. This should map fairly naturally to SPIR-V but it'll be a fairly big change. I've already started hacking on this and I think I really like it. One result is that function inlining is now basically trivial. If you're the owner of a GL driver and would like to work on converting it, that would be awesome. I'm happy to take a crack but there's enough work to do to get core Vulkan bits working that it'd be nice if I didn't do all the work. :-) Bas, I'm afraid Vulkan is blocking on the function reworks; I'll let you know once I have something. The other thing that's left to do after we get all the drivers moved over is to rip out legacy deref chains and do a final rework of a few of the core optimization/lowering passes. Some passes such as vars_to_ssa still use deref chains internally by converting deref instructions to deref chains on-the-fly. I've got a plan for converting them but we need to make deref chains an artifact of history first. 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> Jason Ekstrand (38): 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 nir/validator: Validate that all used variables exist nir: Rename image intrinsics to image_var 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 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 src/amd/common/ac_nir_to_llvm.c | 42 +-- src/amd/vulkan/radv_meta_bufimage.c | 8 +- src/amd/vulkan/radv_meta_fast_clear.c | 2 +- src/amd/vulkan/radv_meta_resolve_cs.c | 2 +- src/amd/vulkan/radv_shader.c | 2 + src/amd/vulkan/radv_shader_info.c | 40 +-- src/compiler/Makefile.sources | 2 + src/compiler/glsl/glsl_to_nir.cpp | 264 +++++--------- src/compiler/nir/meson.build | 2 + src/compiler/nir/nir.c | 52 ++- src/compiler/nir/nir.h | 129 ++++++- src/compiler/nir/nir_builder.h | 201 +++++++++++ src/compiler/nir/nir_clone.c | 41 +++ src/compiler/nir/nir_deref.c | 392 +++++++++++++++++++++ src/compiler/nir/nir_deref.h | 55 +++ src/compiler/nir/nir_gather_info.c | 26 +- src/compiler/nir/nir_instr_set.c | 76 ++++ src/compiler/nir/nir_intrinsics.h | 108 +++++- src/compiler/nir/nir_linking_helpers.c | 50 +-- src/compiler/nir/nir_lower_atomics.c | 133 ++++++- .../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_samplers_as_deref.c | 22 +- src/compiler/nir/nir_lower_system_values.c | 13 +- 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_ytransform.c | 29 +- src/compiler/nir/nir_opt_copy_prop_vars.c | 19 +- src/compiler/nir/nir_opt_copy_propagate.c | 18 + src/compiler/nir/nir_opt_dce.c | 7 + src/compiler/nir/nir_print.c | 52 +++ src/compiler/nir/nir_propagate_invariant.c | 23 +- src/compiler/nir/nir_remove_dead_variables.c | 99 ++++++ src/compiler/nir/nir_serialize.c | 79 +++++ src/compiler/nir/nir_split_var_copies.c | 42 +++ src/compiler/nir/nir_validate.c | 90 ++++- src/compiler/spirv/spirv_to_nir.c | 4 +- src/gallium/drivers/freedreno/ir3/ir3_cmdline.c | 3 + .../drivers/freedreno/ir3/ir3_compiler_nir.c | 38 +- src/gallium/drivers/freedreno/ir3/ir3_nir.c | 4 +- src/gallium/drivers/radeonsi/si_shader_nir.c | 18 +- src/intel/compiler/brw_fs_nir.cpp | 46 +-- src/intel/compiler/brw_nir.c | 4 +- src/intel/vulkan/anv_nir_apply_pipeline_layout.c | 24 +- src/intel/vulkan/anv_nir_lower_input_attachments.c | 2 +- src/intel/vulkan/anv_pipeline.c | 2 + 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 | 1 + 53 files changed, 2365 insertions(+), 508 deletions(-) create mode 100644 src/compiler/nir/nir_deref.c create mode 100644 src/compiler/nir/nir_deref.h -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev