Mesa (main): v3dv: fix query error handling

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 27 07:45:58 UTC 2021


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

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Fri Jul 23 13:45:54 2021 +0200

v3dv: fix query error handling

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12034>

---

 src/broadcom/vulkan/v3dv_query.c | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_query.c b/src/broadcom/vulkan/v3dv_query.c
index 373dea30b00..0deb430fc16 100644
--- a/src/broadcom/vulkan/v3dv_query.c
+++ b/src/broadcom/vulkan/v3dv_query.c
@@ -137,12 +137,13 @@ write_query_result(void *dst, uint32_t idx, bool do_64bit, uint64_t value)
    }
 }
 
-static uint64_t
+static VkResult
 get_occlusion_query_result(struct v3dv_device *device,
                            struct v3dv_query_pool *pool,
                            uint32_t query,
                            bool do_wait,
-                           bool *available)
+                           bool *available,
+                           uint64_t *value)
 {
    assert(pool && pool->query_type == VK_QUERY_TYPE_OCCLUSION);
 
@@ -169,15 +170,17 @@ get_occlusion_query_result(struct v3dv_device *device,
    }
 
    const uint8_t *query_addr = ((uint8_t *) q->bo->map) + q->offset;
-   return (uint64_t) *((uint32_t *)query_addr);
+   *value = (uint64_t) *((uint32_t *)query_addr);
+   return VK_SUCCESS;
 }
 
-static uint64_t
+static VkResult
 get_timestamp_query_result(struct v3dv_device *device,
                            struct v3dv_query_pool *pool,
                            uint32_t query,
                            bool do_wait,
-                           bool *available)
+                           bool *available,
+                           uint64_t *value)
 {
    assert(pool && pool->query_type == VK_QUERY_TYPE_TIMESTAMP);
 
@@ -199,21 +202,25 @@ get_timestamp_query_result(struct v3dv_device *device,
       *available = q->maybe_available;
    }
 
-   return q->value;
+   *value = q->value;
+   return VK_SUCCESS;
 }
 
-static uint64_t
+static VkResult
 get_query_result(struct v3dv_device *device,
                  struct v3dv_query_pool *pool,
                  uint32_t query,
                  bool do_wait,
-                 bool *available)
+                 bool *available,
+                 uint64_t *value)
 {
    switch (pool->query_type) {
    case VK_QUERY_TYPE_OCCLUSION:
-      return get_occlusion_query_result(device, pool, query, do_wait, available);
+      return get_occlusion_query_result(device, pool, query, do_wait,
+                                        available, value);
    case VK_QUERY_TYPE_TIMESTAMP:
-      return get_timestamp_query_result(device, pool, query, do_wait, available);
+      return get_timestamp_query_result(device, pool, query, do_wait,
+                                        available, value);
    default:
       unreachable("Unsupported query type");
    }
@@ -239,7 +246,11 @@ v3dv_get_query_pool_results_cpu(struct v3dv_device *device,
    VkResult result = VK_SUCCESS;
    for (uint32_t i = first; i < first + count; i++) {
       bool available = false;
-      uint64_t value = get_query_result(device, pool, i, do_wait, &available);
+      uint64_t value = 0;
+      VkResult query_result =
+         get_query_result(device, pool, i, do_wait, &available, &value);
+      if (query_result == VK_ERROR_DEVICE_LOST)
+         result = VK_ERROR_DEVICE_LOST;
 
       /**
        * From the Vulkan 1.0 spec:
@@ -261,7 +272,7 @@ v3dv_get_query_pool_results_cpu(struct v3dv_device *device,
       if (flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT)
          write_query_result(data, slot++, do_64bit, available ? 1u : 0u);
 
-      if (!write_result)
+      if (!write_result && result != VK_ERROR_DEVICE_LOST)
          result = VK_NOT_READY;
 
       data += stride;



More information about the mesa-commit mailing list