[Mesa-dev] [PATCH 00/12] anv: Add support for the variablePointers feature

Jason Ekstrand jason at jlekstrand.net
Thu Oct 19 18:04:02 UTC 2017

Not to be confused with variablePointersStorageBuffer which is the
subset of VK_KHR_variable_pointers required to enable the extension.
This gives us "full" support for variable pointers.

The approach chosen here was to do the lowering to _shared intrinsics
directly in spirv_to_nir instead of using the _var intrinsics and using
nir_lower_io.  Pointers with a storage class of Workgroup are given an
implicit std430 layout and now go through the same offset pointer paths as
UBO and SSBO access.  The whole thing really ended up working out rather

There are some downsides to this approach.  One, is that we can't delete
unused shared variables post-optimization.  Also, the driver may be able to
handle better than std430.  Both of these can lead to some waisted SLM
space.  This also means that we can't do any deref-based load/store
elimination optimizations on SLM but we didn't really before so that's no
great loss; SLM is now exactly as hard to optimize as SSBOs.

Connor, Yes, I know that this is not quite the approach you were suggesting
on IRC.  I considered how we might add some sort of deref intrinsic and I
don't see a good way of doing so without rewriting large chunks of NIR.  I
think that rewrite is probably worth it some day but that day is not today.
We people asking for this feature so I really don't want to delay on a
major NIR rewrite.

Cc: Connor Abbott <cwabbott0 at gmail.com>
Cc: Chad Versace <chadversary at chromium.org>
Cc: Dave Airlie <airlied at redhat.com>

Jason Ekstrand (12):
  spirv: Drop the impl field from vtn_builder
  spirv: Only emit functions which are actually used
  spirv: Use a dereference instead of vtn_variable_resource_index
  spirv: Add a switch statement for the block store opcode
  spirv: Refactor the base case of offset_pointer_dereference
  spirv: Convert the supported_extensions struct to spirv_options
  spirv: Refactor a couple of pointer query helpers
  spirv: Use offset_pointer_dereference to instead of
  spirv: Add theoretical support for single component pointers
  spirv: Rename get_shared_nir_atomic_op to get_var_nir_atomic_op
  spirv: Add support for lowering workgroup access to offsets
  anv: Add support for the variablePointers feature

 src/amd/vulkan/radv_shader.c       |  23 ++--
 src/compiler/spirv/nir_spirv.h     |  34 ++++--
 src/compiler/spirv/spirv_to_nir.c  | 180 ++++++++++++++++++++++++-----
 src/compiler/spirv/vtn_cfg.c       |   4 +-
 src/compiler/spirv/vtn_private.h   |  30 +++--
 src/compiler/spirv/vtn_variables.c | 229 ++++++++++++++++++++++++-------------
 src/intel/vulkan/anv_device.c      |   2 +-
 src/intel/vulkan/anv_pipeline.c    |  25 ++--
 8 files changed, 372 insertions(+), 155 deletions(-)


More information about the mesa-dev mailing list