<div dir="ltr"><div>I ran shader-db on the whole series and this is what I got on KBL:<br><br>total instructions in shared programs: 15201981 -> 15231264 (0.19%)<br>instructions in affected programs: 315139 -> 344422 (9.29%)<br>helped: 33<br>HURT: 1253<br><br></div>This should by and large be a no-op but clearly something is amiss.  I'll take a look later.<br><br><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 3, 2018 at 11:32 AM, Jason Ekstrand <span dir="ltr"><<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This is something that Connor and I have been talking about for some time<br>
now.  The basic idea is to replace the current singly linked nir_deref list<br>
with deref instructions.  This is similar to what LLVM does and it offers<br>
quite a bit more freedom when we start getting more realistic pointers from<br>
compute applications.<br>
<br>
This series implements a complete conversion for both i965 and anv.  As can<br>
be seen in the penultimate patch, there are three core NIR passes remaining<br>
to be converted.  None of those three passes is used by any of the Intel<br>
drivers so I have no ability to test them.  The final patch deletes support<br>
for old-school deref chains from NIR entirely.  The only NIR-using drivers<br>
which build with that patch are i965 and anv but it shows that the<br>
conversion for those two is complete and has also been very useful in<br>
finding things I missed the first time around.<br>
<br>
Somehow, this series manages to shave off 700 lines of code but I wouldn't<br>
take that to mean much.  Some of that is whole-sale deleting lower_io_types<br>
(170 lines).  Some of it is that deref instructions and the new function<br>
call mechanism are more efficient from a data structure perspective because<br>
you don't have deref chains attached to texture ops and intrinsics.  I've<br>
also been modernizing as I go and converting some things to use nir_builder<br>
instead of building instructions manually.  The ammount that deref<br>
instructions make things easier over deref chains is totally a wash.<br>
<br>
Clearly, this can't really proceed until other drivers have added the bits<br>
(which should be small at this point) to do the conversion.  Someone also<br>
needs to add "Support deref instructions in..." and "Remove deref chain<br>
support from..." patches for the three remaining core NIR passes.<br>
<br>
My next plan is to try and start experimenting with more advanced<br>
load/store elimination on shared variables and maybe even SSBOs.  This will<br>
require properly handling barriers and, thanks to Vulkan's pointer support,<br>
cast derefs where the source may have come from a phi node or variable.<br>
<br>
This series can be found as a branch on gitlab:<br>
<br>
<a href="https://gitlab.freedesktop.org/jekstrand/mesa/commits/review/nir-deref-instr-v3" rel="noreferrer" target="_blank">https://gitlab.freedesktop.<wbr>org/jekstrand/mesa/commits/<wbr>review/nir-deref-instr-v3</a><br>
<br>
Cc: Rob Clark <<a href="mailto:robdclark@gmail.com">robdclark@gmail.com</a>><br>
Cc: Timothy Arceri <<a href="mailto:tarceri@itsqueeze.com">tarceri@itsqueeze.com</a>><br>
Cc: Eric Anholt <<a href="mailto:eric@anholt.net">eric@anholt.net</a>><br>
Cc: Connor Abbott <<a href="mailto:cwabbott0@gmail.com">cwabbott0@gmail.com</a>><br>
Cc: Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl">bas@basnieuwenhuizen.nl</a>><br>
Cc: Karol Herbst <<a href="mailto:kherbst@redhat.com">kherbst@redhat.com</a>><br>
<br>
Jason Ekstrand (104):<br>
  nir/validate: Rework intrinsic type validation<br>
  nir: Add a deref instruction type<br>
  nir/builder: Add deref building helpers<br>
  nir: Add _deref versions of all of the _var intrinsics<br>
  nir: Add deref sources to texture instructions<br>
  nir: Add helpers for working with deref instructions<br>
  anv,i965,radv,st,ir3: Call nir_lower_deref_instrs<br>
  glsl/nir: Only claim to handle intrinsic functions<br>
  glsl/nir: Use deref instructions instead of dref chains<br>
  prog/nir: Simplify some load/store operations<br>
  prog/nir: Use deref instructions for params<br>
  nir/lower_atomics: Rework the main walker loop a bit<br>
  nir: Support deref instructions in remove_dead_variables<br>
  nir: Add a pass for fixing deref modes<br>
  nir: Support deref instructions in lower_global_vars_to_local<br>
  nir: Use nir_builder in lower_io_to_temporaries<br>
  nir: Support deref instructions in lower_io_to_temporaries<br>
  nir: Add a deref path helper struct<br>
  nir: Support deref instructions in lower_var_copies<br>
  nir: Support deref instructions in split_var_copies<br>
  nir: Support deref instructions in lower_vars_to_ssa<br>
  nir: Support deref instructions in lower_indirect_derefs<br>
  nir/deref: Add a deref cleanup function<br>
  nir: Support deref instructions in lower_system_values<br>
  nir: Support deref instructions in lower_clip_cull<br>
  nir: Support deref instructions in propagate_invariant<br>
  nir: Support deref instructions in gather_info<br>
  nir: Support deref instructions in lower_io<br>
  nir: Support deref instructions in lower_atomics<br>
  nir: Support deref instructions in lower_wpos_ytransform<br>
  nir: Support deref instructions in lower_pos_center<br>
  nir: Support deref instructions in remove_unused_varyings<br>
  nir: Support deref instructions in loop_analyze<br>
  nir: Support deref instructions in lower_alpha_test<br>
  nir: Support deref instructions in lower_clamp_color_outputs<br>
  nir: Support deref instructions in lower_drawpixels<br>
  nir: Consider deref instructions in lower_phis_to_scalar<br>
  nir: Consider deref instructions in opt_peephole_select<br>
  nir: Support deref instructions in opt_undef<br>
  intel,ir3: Disable nir_opt_copy_prop_vars<br>
  intel/nir: Fixup deref modes after lowering patch vertices<br>
  i965: Move nir_lower_deref_instrs to right before locals_to_regs<br>
  st/nir: Move lower_deref_instrs later<br>
  spirv: Use deref instructions for most variables<br>
  nir: Add a concept of per-member structs and a lowering pass<br>
  nir/lower_system_values: Support SYSTEM_VALUE_LOCAL_GROUP_SIZE<br>
  spirv: Use the LOCAL_GROUP_SIZE system value<br>
  nir/spirv: Pass nir_variable_data into apply_var_decoration<br>
  anv/pipeline: Lower more constant initializers earlier<br>
  spirv: Use NIR per-member splitting<br>
  spirv: Make push constants an offset-based pointer<br>
  spirv: Clean up vtn_pointer_to_offset<br>
  spirv: Allow pointers to have a deref at the base<br>
  spirv: Update vtn_pointer_to/from_ssa to handle deref pointers<br>
  spirv: Record the type of functions<br>
  spirv/cfg: Make the builder fully capable for both walks<br>
  nir,spirv: Rework function calls<br>
  anv/pipeline: Do less deref instruction lowering<br>
  anv/pipeline: Convert lower_input_attachments to deref instructions<br>
  anv/pipeline: Convert YCbCr lowering to deref instructiosn<br>
  anv/pipeline: Convert lower_multiview to deref instructions<br>
  anv/apply_pipeline_layout: Simplify extract_tex_src_plane<br>
  anv/pipeline: Convert apply_pipeline_layout to deref instructions<br>
  intel/fs: Use image_deref intrinsics instead of image_var<br>
  intel/nir: Only lower load/store derefs<br>
  intel/blorp: Stop setting tex->texture/sampler<br>
  nir/lower_samplers: Clean up function arguments<br>
  nir: Use derefs in nir_lower_samplers<br>
  nir/builder: Use deref instructions for load/store/copy_var<br>
  nir: Use deref instructions in lower_constant_initializers<br>
  nir/vars_to_ssa: Add an is_direct field to deref_node<br>
  nir/vars_to_ssa: Rework to entirely use deref instructions<br>
  nir: Remove deref chain support from analyze_loops<br>
  nir: Rework gather_info to entirely use deref instructions<br>
  nir: Remove deref chain support from lower_indirect_derefs<br>
  nir: Remove deref chain support from lower_clip_cull_distance_<wbr>arrays<br>
  nir: Remove deref chain support from lower_atomics<br>
  nir: Remove deref chain support from lower_alpha_test<br>
  nir: Remove deref chain support from lower_clamp_color_outputs<br>
  nir: Remove deref chain support from lower_global_vars_to_local<br>
  nir/lower_io: Convert atomic lowering to deref instructions<br>
  nir: Convert lower_io to deref instructions<br>
  nir: Remove deref chain support from lower_phis_to_scalar<br>
  nir: Delete lower_io_types<br>
  nir: Remove deref chain support from remove_unused_varyings<br>
  nir: Remove deref chain support from lower_system_values<br>
  nir: Remove deref chain support from lower_wpos_center<br>
  nir: Remove deref chain support from lower_wpos_ytransform<br>
  nir/lower_tex: Always copy deref and offset sources<br>
  nir: Remove deref chain support from lower_tex<br>
  nir: Remove deref chain support from opt_peephole_select<br>
  nir: Remove deref chain support from lower_drawpixels<br>
  nir: Remove deref chain support from lower_var_copies<br>
  nir: Remove deref chain support from propagate_invariant<br>
  nir: Remove deref chain support from dead_variables<br>
  nir: Remove deref chain support from split_var_copies<br>
  nir: Remove deref chain support from opt_undef<br>
  nir: Remove deref chain support from split_per_member_structs<br>
  nir/copy_prop_vars: Re-order some logic in compare_derefs<br>
  nir: Rework opt_copy_prop_vars to use deref instructions<br>
  intel,ir3: Re-enable nir_opt_copy_prop_vars<br>
  nir: Rework lower_locals_to_regs to use deref instructions<br>
  HACK! nir: Disable building a couple passes<br>
  nir: Remove old-school deref chain support<br>
<br>
 src/amd/vulkan/radv_shader.c                       |  10 +<br>
 src/compiler/Makefile.sources                      |   7 +-<br>
 src/compiler/glsl/glsl_to_nir.<wbr>cpp                  | 267 ++++------<br>
 src/compiler/nir/meson.build                       |  10 +-<br>
 src/compiler/nir/nir.c                             | 423 +++------------<br>
 src/compiler/nir/nir.h                             | 211 ++++----<br>
 src/compiler/nir/nir_builder.h                     | 254 +++++++--<br>
 src/compiler/nir/nir_clone.c                       | 143 ++---<br>
 src/compiler/nir/nir_deref.c                       | 117 +++++<br>
 src/compiler/nir/nir_deref.h                       |  55 ++<br>
 src/compiler/nir/nir_gather_<wbr>info.c                 |  51 +-<br>
 src/compiler/nir/nir_inline_<wbr>functions.c            | 193 ++-----<br>
 src/compiler/nir/nir_instr_<wbr>set.c                   | 101 +++-<br>
 src/compiler/nir/nir_<wbr>intrinsics.py                 |  99 ++--<br>
 src/compiler/nir/nir_<wbr>intrinsics_c.py               |   1 -<br>
 src/compiler/nir/nir_linking_<wbr>helpers.c             |  47 +-<br>
 src/compiler/nir/nir_loop_<wbr>analyze.c                |  70 ++-<br>
 src/compiler/nir/nir_lower_<wbr>alpha_test.c            |   7 +-<br>
 src/compiler/nir/nir_lower_<wbr>atomics.c               | 154 +++---<br>
 src/compiler/nir/nir_lower_<wbr>clamp_color_outputs.c   |   9 +-<br>
 .../nir/nir_lower_clip_cull_<wbr>distance_arrays.c      |  85 +--<br>
 src/compiler/nir/nir_lower_<wbr>constant_initializers.c |  57 +-<br>
 src/compiler/nir/nir_lower_<wbr>drawpixels.c            |  10 +-<br>
 src/compiler/nir/nir_lower_<wbr>global_vars_to_local.c  |  45 +-<br>
 src/compiler/nir/nir_lower_<wbr>indirect_derefs.c       | 175 +++----<br>
 src/compiler/nir/nir_lower_io.<wbr>c                    | 186 +++----<br>
 src/compiler/nir/nir_lower_io_<wbr>to_temporaries.c     |  39 +-<br>
 src/compiler/nir/nir_lower_io_<wbr>types.c              | 176 -------<br>
 src/compiler/nir/nir_lower_<wbr>locals_to_regs.c        | 186 ++++---<br>
 src/compiler/nir/nir_lower_<wbr>phis_to_scalar.c        |  14 +-<br>
 src/compiler/nir/nir_lower_<wbr>samplers.c              | 162 +++---<br>
 src/compiler/nir/nir_lower_<wbr>system_values.c         |  27 +-<br>
 src/compiler/nir/nir_lower_<wbr>tex.c                   |  47 +-<br>
 src/compiler/nir/nir_lower_<wbr>var_copies.c            | 164 +++---<br>
 src/compiler/nir/nir_lower_<wbr>vars_to_ssa.c           | 350 +++++++------<br>
 src/compiler/nir/nir_lower_<wbr>wpos_center.c           |   8 +-<br>
 src/compiler/nir/nir_lower_<wbr>wpos_ytransform.c       |  33 +-<br>
 src/compiler/nir/nir_opt_<wbr>constant_folding.c        |  53 --<br>
 src/compiler/nir/nir_opt_copy_<wbr>prop_vars.c          | 316 ++++++-----<br>
 src/compiler/nir/nir_opt_copy_<wbr>propagate.c          |  95 ++--<br>
 src/compiler/nir/nir_opt_dce.c                     |   7 +<br>
 src/compiler/nir/nir_opt_<wbr>peephole_select.c         |   4 +-<br>
 src/compiler/nir/nir_opt_<wbr>undef.c                   |   2 +-<br>
 src/compiler/nir/nir_print.c                       | 192 ++-----<br>
 src/compiler/nir/nir_<wbr>propagate_invariant.c         |  23 +-<br>
 src/compiler/nir/nir_remove_<wbr>dead_variables.c       | 152 +++---<br>
 src/compiler/nir/nir_<wbr>serialize.c                   | 234 ++++-----<br>
 src/compiler/nir/nir_split_<wbr>per_member_structs.c    | 207 ++++++++<br>
 src/compiler/nir/nir_split_<wbr>var_copies.c            | 234 ++-------<br>
 src/compiler/nir/nir_sweep.c                       |   4 -<br>
 src/compiler/nir/nir_validate.<wbr>c                    | 247 ++++-----<br>
 src/compiler/spirv/spirv_to_<wbr>nir.c                  | 184 ++++---<br>
 src/compiler/spirv/vtn_cfg.c                       | 231 ++++----<br>
 src/compiler/spirv/vtn_<wbr>glsl450.c                   |  19 +-<br>
 src/compiler/spirv/vtn_<wbr>private.h                   |  26 +-<br>
 src/compiler/spirv/vtn_<wbr>variables.c                 | 580 +++++++--------------<br>
 src/gallium/drivers/freedreno/<wbr>ir3/ir3_cmdline.c    |   4 +-<br>
 src/intel/blorp/blorp_blit.c                       |   2 -<br>
 src/intel/compiler/brw_fs.h                        |   2 +-<br>
 src/intel/compiler/brw_fs_nir.<wbr>cpp                  | 157 +++---<br>
 src/intel/vulkan/anv_nir_<wbr>apply_pipeline_layout.c   | 187 +++----<br>
 src/intel/vulkan/anv_nir_<wbr>lower_input_attachments.c |  31 +-<br>
 src/intel/vulkan/anv_nir_<wbr>lower_multiview.c         |  17 +-<br>
 src/intel/vulkan/anv_nir_<wbr>lower_ycbcr_textures.c    |  34 +-<br>
 src/intel/vulkan/anv_pipeline.<wbr>c                    |  19 +-<br>
 src/mesa/drivers/dri/i965/brw_<wbr>nir_uniforms.cpp     |   2 +<br>
 src/mesa/drivers/dri/i965/brw_<wbr>program.c            |   5 +-<br>
 src/mesa/program/prog_to_nir.c                     |  94 +---<br>
 src/mesa/state_tracker/st_<wbr>glsl_to_nir.cpp          |   2 +<br>
 69 files changed, 3335 insertions(+), 4024 deletions(-)<br>
 create mode 100644 src/compiler/nir/nir_deref.c<br>
 create mode 100644 src/compiler/nir/nir_deref.h<br>
 delete mode 100644 src/compiler/nir/nir_lower_io_<wbr>types.c<br>
 create mode 100644 src/compiler/nir/nir_split_<wbr>per_member_structs.c<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.5.0.400.gff86faf<br>
<br>
</font></span></blockquote></div><br></div>