From a9ab53fbe227acee971a5fb67d4ca91526100ec4 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 1 Nov 2022 10:24:36 +0100 Subject: [PATCH] radv: stop emulating number of generated primitives by GS on GFX11 According to RadeonSI, only GFX10 and GFX10.3 need to emulate. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_device.c | 3 +++ src/amd/vulkan/radv_private.h | 3 +++ src/amd/vulkan/radv_query.c | 5 +++-- src/amd/vulkan/radv_shader_info.c | 3 ++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 9639e460e35..45ada569c0c 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -874,6 +874,9 @@ radv_physical_device_try_create(struct radv_instance *instance, drmDevicePtr drm (device->rad_info.gfx_level >= GFX11 || (device->instance->perftest_flags & RADV_PERFTEST_NGG_STREAMOUT)); + device->emulate_ngg_gs_query_pipeline_stat = + device->use_ngg && device->rad_info.gfx_level < GFX11; + /* Determine the number of threads per wave for all stages. */ device->cs_wave_size = 64; device->ps_wave_size = 64; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 6dc5e360f77..ac85089c227 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -290,6 +290,9 @@ struct radv_physical_device { /* Whether to enable NGG streamout. */ bool use_ngg_streamout; + /* Whether to emulate the number of primitives generated by GS. */ + bool emulate_ngg_gs_query_pipeline_stat; + /* Number of threads per wave. */ uint8_t ps_wave_size; uint8_t cs_wave_size; diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index 389e5938bf1..e931616a7e0 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1091,8 +1091,9 @@ radv_CreateQueryPool(VkDevice _device, const VkQueryPoolCreateInfo *pCreateInfo, * hardware if GS uses the legacy path. When NGG GS is used, the hardware can't know the number * of generated primitives and we have to increment it from the shader using a plain GDS atomic. */ - pool->uses_gds = device->physical_device->use_ngg && - ((pool->pipeline_stats_mask & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT) || + pool->uses_gds = (device->physical_device->emulate_ngg_gs_query_pipeline_stat && + (pool->pipeline_stats_mask & VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT)) || + (device->physical_device->use_ngg && pCreateInfo->queryType == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT); switch (pCreateInfo->queryType) { diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c index 979dd28ba44..8e8ec56c1ad 100644 --- a/src/amd/vulkan/radv_shader_info.c +++ b/src/amd/vulkan/radv_shader_info.c @@ -1205,7 +1205,8 @@ gfx10_get_ngg_query_info(const struct radv_device *device, struct radv_pipeline_ { struct radv_shader_info *info = gs_stage ? &gs_stage->info : &es_stage->info; - info->gs.has_ngg_pipeline_stat_query = !!gs_stage; + info->gs.has_ngg_pipeline_stat_query = + device->physical_device->emulate_ngg_gs_query_pipeline_stat && !!gs_stage; info->has_ngg_xfb_query = gs_stage ? !!gs_stage->nir->xfb_info : !!es_stage->nir->xfb_info; info->has_ngg_prim_query = pipeline_key->primitives_generated_query || info->has_ngg_xfb_query; }