From f0a90eddb68183119f39d2fd3f8a2e5e7f296d4d Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 11 Jul 2019 00:25:28 +0200 Subject: [PATCH] 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 Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_shader.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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. */ -- 2.30.2