diff options
author | Samuel Pitoiset <[email protected]> | 2019-07-11 00:25:28 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2019-07-15 11:30:05 +0200 |
commit | f0a90eddb68183119f39d2fd3f8a2e5e7f296d4d (patch) | |
tree | d579e70fa45ff402645d372336a4a9dfc0dcd00b /src | |
parent | 4478f143278b31887b7d363e76c5c8ca8d13468d (diff) |
radv/gfx10: allocate ESGS ring space for exporting PrimitiveID
Only VS needs that. We shouldn't hardcode these values but
that's complicated to not do that for now.
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/amd/vulkan/radv_shader.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index d055b6c96ca..f6b0297d4a3 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -921,15 +921,34 @@ radv_shader_variant_create(struct radv_device *device, unsigned num_lds_symbols = 0; const char *elf_data = (const char *)((struct radv_shader_binary_rtld *)binary)->data; size_t elf_size = ((struct radv_shader_binary_rtld *)binary)->elf_size; + unsigned esgs_ring_size = 0; if (device->physical_device->rad_info.chip_class >= GFX9 && binary->stage == MESA_SHADER_GEOMETRY && !binary->is_gs_copy_shader) { + /* TODO: Do not hardcode this value */ + esgs_ring_size = 32 * 1024; + } + + if (binary->variant_info.is_ngg) { + /* GS stores Primitive IDs into LDS at the address + * corresponding to the ES thread of the provoking + * vertex. All ES threads load and export PrimitiveID + * for their thread. + */ + if (binary->stage == MESA_SHADER_VERTEX && + binary->variant_info.vs.export_prim_id) { + /* TODO: Do not harcode this value */ + esgs_ring_size = 256 /* max_out_verts */ * 4; + } + } + + if (esgs_ring_size) { /* We add this symbol even on LLVM <= 8 to ensure that * shader->config.lds_size is set correctly below. */ struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++]; sym->name = "esgs_ring"; - sym->size = 32 * 1024; + sym->size = esgs_ring_size; sym->align = 64 * 1024; /* Make sure to have LDS space for NGG scratch. */ |