From 538766792dacde072216cb6d3bbb96e1e859d0e4 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 3 Sep 2019 13:01:54 +0200 Subject: [PATCH] radv/gfx10: declare a LDS symbol for the NGG emit space This fixes some interactions when NGG GS is enabled. It fixes: - dEQP-VK.clipping.user_defined.clip_cull_distance_dynamic_index.*geom* - dEQP-VK.tessellation.geometry_interaction.passthrough.* For some reasons, using the computed ESGS ring size randomly hangs with CTS. For now, just use the maximum LDS size for ESGS. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_nir_to_llvm.c | 7 ++++--- src/amd/vulkan/radv_pipeline.c | 3 --- src/amd/vulkan/radv_shader.c | 41 ++++++++++++++------------------------- 3 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index 178b096..f724991 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -4213,9 +4213,10 @@ LLVMModuleRef ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, LLVMSetInitializer(ctx.gs_ngg_scratch, LLVMGetUndef(ai32)); LLVMSetAlignment(ctx.gs_ngg_scratch, 4); - ctx.gs_ngg_emit = LLVMBuildIntToPtr(ctx.ac.builder, ctx.ac.i32_0, - LLVMPointerType(LLVMArrayType(ctx.ac.i32, 0), AC_ADDR_SPACE_LDS), - "ngg_emit"); + ctx.gs_ngg_emit = LLVMAddGlobalInAddressSpace(ctx.ac.module, + LLVMArrayType(ctx.ac.i32, 0), "ngg_emit", AC_ADDR_SPACE_LDS); + LLVMSetLinkage(ctx.gs_ngg_emit, LLVMExternalLinkage); + LLVMSetAlignment(ctx.gs_ngg_emit, 4); } ctx.abi.load_inputs = load_gs_input; diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 1bcc165..054f6ac 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -2338,9 +2338,6 @@ radv_fill_shader_keys(struct radv_device *device, * issues still: * * GS primitives in pipeline statistic queries do not get * updates. See dEQP-VK.query_pool.statistics_query.geometry_shader_primitives - * * dEQP-VK.clipping.user_defined.clip_cull_distance_dynamic_index.*geom* failures - * * Interactions with tessellation failing: - * dEQP-VK.tessellation.geometry_interaction.passthrough.tessellate_isolines_passthrough_geometry_no_change * * General issues with the last primitive missing/corrupt: * https://bugs.freedesktop.org/show_bug.cgi?id=111248 * diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 146d85a..473b6b0 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -882,44 +882,33 @@ radv_shader_variant_create(struct radv_device *device, variant->ref_count = 1; if (binary->type == RADV_BINARY_TYPE_RTLD) { - struct ac_rtld_symbol lds_symbols[1]; + struct ac_rtld_symbol lds_symbols[2]; 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->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->info.vs.export_prim_id) { - /* TODO: Do not harcode this value */ - esgs_ring_size = 256 /* max_out_verts */ * 4; - } - } - - if (esgs_ring_size) { + (binary->stage == MESA_SHADER_GEOMETRY || binary->info.is_ngg) && + !binary->is_gs_copy_shader) { /* We add this symbol even on LLVM <= 8 to ensure that * shader->config.lds_size is set correctly below. */ + /* TODO: For some reasons, using the computed ESGS ring + * size randomly hangs with CTS. Just use the maximum + * possible LDS size for now. + */ struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++]; sym->name = "esgs_ring"; - sym->size = esgs_ring_size; + sym->size = (32 * 1024) - (binary->info.ngg_info.ngg_emit_size * 4) - 32; /* 32 is NGG scratch */ sym->align = 64 * 1024; + } - /* Make sure to have LDS space for NGG scratch. */ - /* TODO: Compute this correctly somehow? */ - if (binary->info.is_ngg) - sym->size -= 32; + if (binary->info.is_ngg && + binary->stage == MESA_SHADER_GEOMETRY) { + struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++]; + sym->name = "ngg_emit"; + sym->size = binary->info.ngg_info.ngg_emit_size * 4; + sym->align = 4; } struct ac_rtld_open_info open_info = { -- 2.7.4