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)

Reply via email to