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 <samuel.pitoi...@gmail.com>
---
 src/amd/vulkan/radv_shader.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 79418b401fb..d033ed0da09 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -914,17 +914,37 @@ 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;
                }
+
                struct ac_rtld_open_info open_info = {
                        .info = &device->physical_device->rad_info,
                        .shader_type = binary->stage,
-- 
2.22.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to