Mesa (main): v3dv: implement VK_EXT_host_query_reset

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Oct 15 05:55:51 UTC 2021


Module: Mesa
Branch: main
Commit: 835b98e101fa6aeb6fb8a47059d66f8e48260bac
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=835b98e101fa6aeb6fb8a47059d66f8e48260bac

Author: Ella-0 <estanforth at igalia.com>
Date:   Tue Oct 12 16:58:33 2021 +0000

v3dv: implement VK_EXT_host_query_reset

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13319>

---

 docs/features.txt                  |  2 +-
 src/broadcom/vulkan/v3dv_device.c  |  9 +++++++++
 src/broadcom/vulkan/v3dv_private.h |  5 +++++
 src/broadcom/vulkan/v3dv_query.c   | 38 ++++++++++++++++++++++++++++++++++++++
 src/broadcom/vulkan/v3dv_queue.c   | 19 +------------------
 5 files changed, 54 insertions(+), 19 deletions(-)

diff --git a/docs/features.txt b/docs/features.txt
index 06d3e52e056..bc012ca668e 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -464,7 +464,7 @@ Vulkan 1.2 -- all DONE: anv, vn
   VK_KHR_uniform_buffer_standard_layout                 DONE (anv, lvp, radv, tu, v3dv, vn)
   VK_KHR_vulkan_memory_model                            DONE (anv, radv, tu, vn)
   VK_EXT_descriptor_indexing                            DONE (anv/gen9+, radv, tu, vn)
-  VK_EXT_host_query_reset                               DONE (anv, lvp, radv, tu, vn)
+  VK_EXT_host_query_reset                               DONE (anv, lvp, radv, tu, v3dv, vn)
   VK_EXT_sampler_filter_minmax                          DONE (anv/gen9+, lvp, radv, tu, vn)
   VK_EXT_scalar_block_layout                            DONE (anv, lvp, radv/gfx7+, tu, vn)
   VK_EXT_separate_stencil_usage                         DONE (anv, lvp, tu, vn)
diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c
index 7435499c930..82b94495f0a 100644
--- a/src/broadcom/vulkan/v3dv_device.c
+++ b/src/broadcom/vulkan/v3dv_device.c
@@ -143,6 +143,7 @@ get_device_extensions(const struct v3dv_physical_device *device,
       .EXT_color_write_enable              = true,
       .EXT_custom_border_color             = true,
       .EXT_external_memory_dma_buf         = true,
+      .EXT_host_query_reset                = true,
       .EXT_index_type_uint8                = true,
       .EXT_physical_device_drm             = true,
       .EXT_pipeline_creation_cache_control = true,
@@ -1137,6 +1138,14 @@ v3dv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
          break;
       }
 
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+         VkPhysicalDeviceHostQueryResetFeatures *features =
+            (void *) ext;
+
+         features->hostQueryReset = true;
+         break;
+      }
+
       /* Vulkan 1.1 */
       case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
          VkPhysicalDeviceVulkan11Features *features =
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index d3c07c649c1..68c90a88a4d 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -1270,6 +1270,11 @@ VkResult v3dv_get_query_pool_results_cpu(struct v3dv_device *device,
                                          VkDeviceSize stride,
                                          VkQueryResultFlags flags);
 
+void v3dv_reset_query_pools(struct v3dv_device *device,
+                            struct v3dv_query_pool *query_pool,
+                            uint32_t first,
+                            uint32_t last);
+
 typedef void (*v3dv_cmd_buffer_private_obj_destroy_cb)(VkDevice device,
                                                        uint64_t pobj,
                                                        VkAllocationCallbacks *alloc);
diff --git a/src/broadcom/vulkan/v3dv_query.c b/src/broadcom/vulkan/v3dv_query.c
index 5e4b92fb16e..70d6dac182b 100644
--- a/src/broadcom/vulkan/v3dv_query.c
+++ b/src/broadcom/vulkan/v3dv_query.c
@@ -351,3 +351,41 @@ v3dv_CmdEndQuery(VkCommandBuffer commandBuffer,
 
    v3dv_cmd_buffer_end_query(cmd_buffer, pool, query);
 }
+
+void
+v3dv_reset_query_pools(struct v3dv_device *device,
+                       struct v3dv_query_pool *pool,
+                       uint32_t first,
+                       uint32_t count)
+{
+   for (uint32_t i = first; i < first + count; i++) {
+      assert(i < pool->query_count);
+      struct v3dv_query *q = &pool->queries[i];
+      q->maybe_available = false;
+      switch (pool->query_type) {
+      case VK_QUERY_TYPE_OCCLUSION: {
+         const uint8_t *q_addr = ((uint8_t *) q->bo->map) + q->offset;
+         uint32_t *counter = (uint32_t *) q_addr;
+         *counter = 0;
+         break;
+      }
+      case VK_QUERY_TYPE_TIMESTAMP:
+         q->value = 0;
+         break;
+      default:
+         unreachable("Unsupported query type");
+      }
+   }
+}
+
+VKAPI_ATTR void VKAPI_CALL
+v3dv_ResetQueryPool(VkDevice _device,
+                    VkQueryPool queryPool,
+                    uint32_t firstQuery,
+                    uint32_t queryCount)
+{
+   V3DV_FROM_HANDLE(v3dv_device, device, _device);
+   V3DV_FROM_HANDLE(v3dv_query_pool, pool, queryPool);
+
+   v3dv_reset_query_pools(device, pool, firstQuery, queryCount);
+}
diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c
index 1209031d5d7..baac241e4cd 100644
--- a/src/broadcom/vulkan/v3dv_queue.c
+++ b/src/broadcom/vulkan/v3dv_queue.c
@@ -176,24 +176,7 @@ handle_reset_query_cpu_job(struct v3dv_job *job)
    if (info->pool->query_type == VK_QUERY_TYPE_OCCLUSION)
          v3dv_bo_wait(job->device, info->pool->bo, PIPE_TIMEOUT_INFINITE);
 
-   for (uint32_t i = info->first; i < info->first + info->count; i++) {
-      assert(i < info->pool->query_count);
-      struct v3dv_query *q = &info->pool->queries[i];
-      q->maybe_available = false;
-      switch (info->pool->query_type) {
-      case VK_QUERY_TYPE_OCCLUSION: {
-         const uint8_t *q_addr = ((uint8_t *) q->bo->map) + q->offset;
-         uint32_t *counter = (uint32_t *) q_addr;
-         *counter = 0;
-         break;
-      }
-      case VK_QUERY_TYPE_TIMESTAMP:
-         q->value = 0;
-         break;
-      default:
-         unreachable("Unsupported query type");
-      }
-   }
+   v3dv_reset_query_pools(job->device, info->pool, info->first, info->count);
 
    return VK_SUCCESS;
 }



More information about the mesa-commit mailing list