mesa/src/compiler
Lionel Landwerlin 0b8a2de2a1 anv: add dynamic buffer offsets support with independent sets
With independent sets, we're not able to compute immediate values for
the index at which to read anv_push_constants::dynamic_offsets to get
the offset of a dynamic buffer. This is because the pipeline layout
may not have all the descriptor set layouts when we compile the
shader.

To solve that issue, we insert a layer of indirection.

This reworks the dynamic buffer offset storage with a 2D array in
anv_cmd_pipeline_state :

   dynamic_offsets[MAX_SETS][MAX_DYN_BUFFERS]

When the pipeline or the dynamic buffer offsets are updated, we
flatten that array into the
anv_push_constants::dynamic_offsets[MAX_DYN_BUFFERS] array.

For shaders compiled with independent sets, the bottom 6 bits of
element X in anv_push_constants::desc_sets[] is used to specify the
base offsets into the anv_push_constants::dynamic_offsets[] for the
set X.

The computation in the shader is now something like :

  base_dyn_buffer_set_idx = anv_push_constants::desc_sets[set_idx] & 0x3f
  dyn_buffer_offset = anv_push_constants::dynamic_offsets[base_dyn_buffer_set_idx + dynamic_buffer_idx]

It was suggested by Faith to use a different push constant buffer with
dynamic_offsets prepared for each stage when using independent sets
instead, but it feels easier to understand this way. And there is some
room for optimization if you are set X and that you know all the sets in
the range [0, X], then you can still avoid the indirection. Separate
push constant allocations per stage do have a CPU cost.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15637>
2023-04-17 22:43:37 +00:00
..
clc clc: add clc_validate_spirv 2023-04-13 02:54:21 +00:00
glsl glsl: move some GL ES checks to the NIR linker 2023-04-06 08:07:35 +00:00
isaspec ir3, isaspec: add raw instruction to assembler/disassembler. 2023-01-26 14:26:11 +00:00
nir anv: add dynamic buffer offsets support with independent sets 2023-04-17 22:43:37 +00:00
spirv spirv/tests: Add test for single-block loop 2023-04-15 00:17:15 +00:00
builtin_type_macros.h glsl: add texture subpass variants 2022-11-10 10:21:34 +00:00
glsl_types.cpp compiler: Handle nested arrays correctly for computing CL size/alignment 2022-12-02 09:52:44 -08:00
glsl_types.h glsl: Remove the need of _MTX_INITIALIZER_NP by using simple_mtx_t/SIMPLE_MTX_INITIALIZER 2022-11-09 04:38:28 +00:00
meson.build meson: inline gtest_test_protocol now that it's always 'gtest' 2023-03-10 07:20:29 +00:00
nir_gl_types.h mesa: #include "util/glheader.h" instead GL/gl.h in shared code 2022-11-03 16:07:31 +00:00
nir_types.cpp nir/types: Add some asserts to glsl_get_struct_field() 2022-11-01 14:48:41 +00:00
nir_types.h nir: Add a pass to lower mediump temps and shared mem. 2022-09-01 22:39:39 +00:00
shader_enums.c nir, spirv: Add support for VK_EXT_fragment_density_map 2023-04-04 13:14:35 +00:00
shader_enums.h nir, spirv: Add support for VK_EXT_fragment_density_map 2023-04-04 13:14:35 +00:00
shader_info.h nir, spirv: Add support for VK_EXT_fragment_density_map 2023-04-04 13:14:35 +00:00