Module: Mesa Branch: main Commit: b7d668a819d896f66502d3efb6999ce264415b25 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b7d668a819d896f66502d3efb6999ce264415b25
Author: Samuel Pitoiset <samuel.pitoi...@gmail.com> Date: Thu Sep 21 10:29:23 2023 +0200 radv: add support for mesh shader invocations queries on GFX10.3 Also emulated with a GDS atomic counter in shaders. Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25950> --- src/amd/vulkan/radv_cmd_buffer.c | 3 ++- src/amd/vulkan/radv_query.c | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 95d7c72f0fb..9801b358f41 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -5014,7 +5014,8 @@ radv_flush_shader_query_state(struct radv_cmd_buffer *cmd_buffer) */ if (cmd_buffer->state.active_pipeline_gds_queries || (cmd_buffer->state.inherited_pipeline_statistics & (VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT | - VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT))) + VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT | + VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT))) shader_query_state |= radv_shader_query_pipeline_stat; if (cmd_buffer->state.active_prims_gen_gds_queries) diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index 0a58fd931f6..0e32c641b9e 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1218,7 +1218,8 @@ radv_create_query_pool(struct radv_device *device, const VkQueryPoolCreateInfo * VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT))) || (device->physical_device->use_ngg && pCreateInfo->queryType == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT) || (device->physical_device->emulate_mesh_shader_queries && - pCreateInfo->queryType == VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT); + (pCreateInfo->queryType == VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT || + pool->vk.pipeline_statistics & VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT)); switch (pCreateInfo->queryType) { case VK_QUERY_TYPE_OCCLUSION: @@ -1976,6 +1977,13 @@ emit_begin_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *poo gfx10_copy_gds_query(cmd_buffer, RADV_SHADER_QUERY_GS_INVOCATION_OFFSET, va + gs_invoc_offset); } + if (pool->vk.pipeline_statistics & VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT) { + uint32_t mesh_invoc_offset = + radv_get_pipelinestat_query_offset(VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT); + + gfx10_copy_gds_query(cmd_buffer, RADV_SHADER_QUERY_MS_INVOCATION_OFFSET, va + mesh_invoc_offset); + } + /* Record that the command buffer needs GDS. */ cmd_buffer->gds_needed = true; @@ -2150,6 +2158,13 @@ emit_end_query(struct radv_cmd_buffer *cmd_buffer, struct radv_query_pool *pool, gfx10_copy_gds_query(cmd_buffer, RADV_SHADER_QUERY_GS_INVOCATION_OFFSET, va + gs_invoc_offset); } + if (pool->vk.pipeline_statistics & VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT) { + uint32_t mesh_invoc_offset = + radv_get_pipelinestat_query_offset(VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT); + + gfx10_copy_gds_query(cmd_buffer, RADV_SHADER_QUERY_MS_INVOCATION_OFFSET, va + mesh_invoc_offset); + } + cmd_buffer->state.active_pipeline_gds_queries--; if (!cmd_buffer->state.active_pipeline_gds_queries)