Mesa (master): anv: Check for device loss at the end of WaitForFences

Jason Ekstrand jekstrand at kemper.freedesktop.org
Wed Apr 5 01:34:56 UTC 2017


Module: Mesa
Branch: master
Commit: 82573d0f752f20f76cef773de01efda8a7cc0a31
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=82573d0f752f20f76cef773de01efda8a7cc0a31

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Mon Mar 27 16:01:42 2017 -0700

anv: Check for device loss at the end of WaitForFences

It's possible that the device could have been lost while we were
waiting.  We should let the user know if this has happened.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/intel/vulkan/anv_device.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 37b6f7273b..45a6e33368 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -1857,6 +1857,7 @@ VkResult anv_WaitForFences(
     */
    int64_t timeout = MIN2(_timeout, INT64_MAX);
 
+   VkResult result = VK_SUCCESS;
    uint32_t pending_fences = fenceCount;
    while (pending_fences) {
       pending_fences = 0;
@@ -1877,8 +1878,10 @@ VkResult anv_WaitForFences(
             /* This fence is not pending.  If waitAll isn't set, we can return
              * early.  Otherwise, we have to keep going.
              */
-            if (!waitAll)
-               return VK_SUCCESS;
+            if (!waitAll) {
+               result = VK_SUCCESS;
+               goto done;
+            }
             continue;
 
          case ANV_FENCE_STATE_SUBMITTED:
@@ -1887,7 +1890,8 @@ VkResult anv_WaitForFences(
              */
             ret = anv_gem_wait(device, fence->bo.gem_handle, &timeout);
             if (ret == -1 && errno == ETIME) {
-               return VK_TIMEOUT;
+               result = VK_TIMEOUT;
+               goto done;
             } else if (ret == -1) {
                /* We don't know the real error. */
                 device->lost = true;
@@ -1950,7 +1954,8 @@ VkResult anv_WaitForFences(
 
             if (time_elapsed >= timeout) {
                pthread_mutex_unlock(&device->mutex);
-               return VK_TIMEOUT;
+               result = VK_TIMEOUT;
+               goto done;
             }
 
             timeout -= time_elapsed;
@@ -1960,7 +1965,11 @@ VkResult anv_WaitForFences(
       }
    }
 
-   return VK_SUCCESS;
+done:
+   if (unlikely(device->lost))
+      return VK_ERROR_DEVICE_LOST;
+
+   return result;
 }
 
 // Queue semaphore functions




More information about the mesa-commit mailing list