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 <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -4213,9 +4213,10 @@ LLVMModuleRef ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm,
|
|||||||
LLVMSetInitializer(ctx.gs_ngg_scratch, LLVMGetUndef(ai32));
|
LLVMSetInitializer(ctx.gs_ngg_scratch, LLVMGetUndef(ai32));
|
||||||
LLVMSetAlignment(ctx.gs_ngg_scratch, 4);
|
LLVMSetAlignment(ctx.gs_ngg_scratch, 4);
|
||||||
|
|
||||||
ctx.gs_ngg_emit = LLVMBuildIntToPtr(ctx.ac.builder, ctx.ac.i32_0,
|
ctx.gs_ngg_emit = LLVMAddGlobalInAddressSpace(ctx.ac.module,
|
||||||
LLVMPointerType(LLVMArrayType(ctx.ac.i32, 0), AC_ADDR_SPACE_LDS),
|
LLVMArrayType(ctx.ac.i32, 0), "ngg_emit", AC_ADDR_SPACE_LDS);
|
||||||
"ngg_emit");
|
LLVMSetLinkage(ctx.gs_ngg_emit, LLVMExternalLinkage);
|
||||||
|
LLVMSetAlignment(ctx.gs_ngg_emit, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.abi.load_inputs = load_gs_input;
|
ctx.abi.load_inputs = load_gs_input;
|
||||||
|
@@ -2338,9 +2338,6 @@ radv_fill_shader_keys(struct radv_device *device,
|
|||||||
* issues still:
|
* issues still:
|
||||||
* * GS primitives in pipeline statistic queries do not get
|
* * GS primitives in pipeline statistic queries do not get
|
||||||
* updates. See dEQP-VK.query_pool.statistics_query.geometry_shader_primitives
|
* 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:
|
* * General issues with the last primitive missing/corrupt:
|
||||||
* https://bugs.freedesktop.org/show_bug.cgi?id=111248
|
* https://bugs.freedesktop.org/show_bug.cgi?id=111248
|
||||||
*
|
*
|
||||||
|
@@ -882,44 +882,33 @@ radv_shader_variant_create(struct radv_device *device,
|
|||||||
variant->ref_count = 1;
|
variant->ref_count = 1;
|
||||||
|
|
||||||
if (binary->type == RADV_BINARY_TYPE_RTLD) {
|
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;
|
unsigned num_lds_symbols = 0;
|
||||||
const char *elf_data = (const char *)((struct radv_shader_binary_rtld *)binary)->data;
|
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;
|
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 &&
|
if (device->physical_device->rad_info.chip_class >= GFX9 &&
|
||||||
binary->stage == MESA_SHADER_GEOMETRY && !binary->is_gs_copy_shader) {
|
(binary->stage == MESA_SHADER_GEOMETRY || binary->info.is_ngg) &&
|
||||||
/* TODO: Do not hardcode this value */
|
!binary->is_gs_copy_shader) {
|
||||||
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) {
|
|
||||||
/* We add this symbol even on LLVM <= 8 to ensure that
|
/* We add this symbol even on LLVM <= 8 to ensure that
|
||||||
* shader->config.lds_size is set correctly below.
|
* 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++];
|
struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++];
|
||||||
sym->name = "esgs_ring";
|
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;
|
sym->align = 64 * 1024;
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure to have LDS space for NGG scratch. */
|
if (binary->info.is_ngg &&
|
||||||
/* TODO: Compute this correctly somehow? */
|
binary->stage == MESA_SHADER_GEOMETRY) {
|
||||||
if (binary->info.is_ngg)
|
struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++];
|
||||||
sym->size -= 32;
|
sym->name = "ngg_emit";
|
||||||
|
sym->size = binary->info.ngg_info.ngg_emit_size * 4;
|
||||||
|
sym->align = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ac_rtld_open_info open_info = {
|
struct ac_rtld_open_info open_info = {
|
||||||
|
Reference in New Issue
Block a user