anv: Return VK_ERROR_DEVICE_LOST from anv_device_set_lost
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 26 Oct 2018 13:32:39 +0000 (08:32 -0500)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 26 Oct 2018 18:27:21 +0000 (13:27 -0500)
This lets us get rid of a bunch of duplicated error messages.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
src/intel/vulkan/anv_device.c
src/intel/vulkan/anv_private.h
src/intel/vulkan/anv_queue.c
src/intel/vulkan/genX_query.c

index 70fc51ff306bafec169eaed8d3f407e8b533ac7e..ee35e013329005671391f8fb80dc57b23dbd377d 100644 (file)
@@ -2048,21 +2048,26 @@ void anv_GetDeviceQueue2(
       *pQueue = NULL;
 }
 
-void
-anv_device_set_lost(struct anv_device *device, const char *msg, ...)
+VkResult
+_anv_device_set_lost(struct anv_device *device,
+                     const char *file, int line,
+                     const char *msg, ...)
 {
-   device->_lost = true;
+   VkResult err;
+   va_list ap;
 
-   if (env_var_as_boolean("ANV_ABORT_ON_DEVICE_LOSS", false)) {
-      intel_loge("Device lost!");
+   device->_lost = true;
 
-      va_list ap;
-      va_start(ap, msg);
-      intel_loge_v(msg, ap);
-      va_end(ap);
+   va_start(ap, msg);
+   err = __vk_errorv(device->instance, device,
+                     VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
+                     VK_ERROR_DEVICE_LOST, file, line, msg, ap);
+   va_end(ap);
 
+   if (env_var_as_boolean("ANV_ABORT_ON_DEVICE_LOSS", false))
       abort();
-   }
+
+   return err;
 }
 
 VkResult
@@ -2079,19 +2084,13 @@ anv_device_query_status(struct anv_device *device)
    int ret = anv_gem_gpu_get_reset_stats(device, &active, &pending);
    if (ret == -1) {
       /* We don't know the real error. */
-      anv_device_set_lost(device, "get_reset_stats failed: %m");
-      return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                       "get_reset_stats failed: %m");
+      return anv_device_set_lost(device, "get_reset_stats failed: %m");
    }
 
    if (active) {
-      anv_device_set_lost(device, "GPU hung on one of our command buffers");
-      return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                       "GPU hung on one of our command buffers");
+      return anv_device_set_lost(device, "GPU hung on one of our command buffers");
    } else if (pending) {
-      anv_device_set_lost(device, "GPU hung with commands in-flight");
-      return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                       "GPU hung with commands in-flight");
+      return anv_device_set_lost(device, "GPU hung with commands in-flight");
    }
 
    return VK_SUCCESS;
@@ -2109,9 +2108,7 @@ anv_device_bo_busy(struct anv_device *device, struct anv_bo *bo)
       return VK_NOT_READY;
    } else if (ret == -1) {
       /* We don't know the real error. */
-      anv_device_set_lost(device, "gem wait failed: %m");
-      return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                       "gem wait failed: %m");
+      return anv_device_set_lost(device, "gem wait failed: %m");
    }
 
    /* Query for device status after the busy call.  If the BO we're checking
@@ -2132,9 +2129,7 @@ anv_device_wait(struct anv_device *device, struct anv_bo *bo,
       return VK_TIMEOUT;
    } else if (ret == -1) {
       /* We don't know the real error. */
-      anv_device_set_lost(device, "gem wait failed: %m");
-      return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                       "gem wait failed: %m");
+      return anv_device_set_lost(device, "gem wait failed: %m");
    }
 
    /* Query for device status after the wait.  If the BO we're waiting on got
@@ -3111,9 +3106,8 @@ VkResult anv_GetCalibratedTimestampsEXT(
                                 &pTimestamps[d]);
 
          if (ret != 0) {
-            anv_device_set_lost(device, "Failed to get a timestamp");
-            return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                             "Failed to read the TIMESTAMP register: %m");
+            return anv_device_set_lost(device, "Failed to read the TIMESTAMP "
+                                               "register: %m");
          }
          uint64_t device_period = DIV_ROUND_UP(1000000000, timestamp_frequency);
          max_clock_period = MAX2(max_clock_period, device_period);
index c5d636fef8d2f2835b3390fbcdb00c02ab4c13a4..25e290ed112fd3b4c4d53a04399d2a120ec85cc9 100644 (file)
@@ -1083,8 +1083,11 @@ anv_state_flush(struct anv_device *device, struct anv_state state)
 void anv_device_init_blorp(struct anv_device *device);
 void anv_device_finish_blorp(struct anv_device *device);
 
-void anv_device_set_lost(struct anv_device *device,
-                         const char *msg, ...);
+VkResult _anv_device_set_lost(struct anv_device *device,
+                              const char *file, int line,
+                              const char *msg, ...);
+#define anv_device_set_lost(dev, ...) \
+   _anv_device_set_lost(dev, __FILE__, __LINE__, __VA_ARGS__)
 
 static inline bool
 anv_device_is_lost(struct anv_device *device)
index 8e9f743fcb7a953a1f8fc97c5d766f265246331f..6247ba8751e1fc3d24115284d730468067ab91b5 100644 (file)
@@ -42,9 +42,7 @@ anv_device_execbuf(struct anv_device *device,
    int ret = device->no_hw ? 0 : anv_gem_execbuffer(device, execbuf);
    if (ret != 0) {
       /* We don't know the real error. */
-      anv_device_set_lost(device, "execbuf2 failed: %m");
-      return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                       "execbuf2 failed: %m");
+      return anv_device_set_lost(device, "execbuf2 failed: %m");
    }
 
    struct drm_i915_gem_exec_object2 *objects =
@@ -243,9 +241,7 @@ out:
        * VK_ERROR_DEVICE_LOST to ensure that clients do not attempt to
        * submit the same job again to this device.
        */
-      result = vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                         "vkQueueSubmit() failed");
-      anv_device_set_lost(device, "vkQueueSubmit() failed");
+      result = anv_device_set_lost(device, "vkQueueSubmit() failed");
    }
 
    pthread_mutex_unlock(&device->mutex);
@@ -438,9 +434,7 @@ VkResult anv_GetFenceStatus(
             return VK_NOT_READY;
          } else {
             /* We don't know the real error. */
-            anv_device_set_lost(device, "drm_syncobj_wait failed: %m");
-            return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                             "drm_syncobj_wait failed: %m");
+            return anv_device_set_lost(device, "drm_syncobj_wait failed: %m");
          }
       } else {
          return VK_SUCCESS;
@@ -526,9 +520,7 @@ anv_wait_for_syncobj_fences(struct anv_device *device,
          return VK_TIMEOUT;
       } else {
          /* We don't know the real error. */
-         anv_device_set_lost(device, "drm_syncobj_wait failed: %m");
-         return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                          "drm_syncobj_wait failed: %m");
+         return anv_device_set_lost(device, "drm_syncobj_wait failed: %m");
       }
    } else {
       return VK_SUCCESS;
index 7dd9112d296228f1c7d53253569681014af96d34..ce8757f2643127a40c52a7f93a4d5806543595fd 100644 (file)
@@ -181,9 +181,7 @@ wait_for_available(struct anv_device *device,
          continue;
       } else if (ret == -1) {
          /* We don't know the real error. */
-         anv_device_set_lost(device, "gem wait failed: %m");
-         return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
-                          "gem wait failed: %m");
+         return anv_device_set_lost(device, "gem wait failed: %m");
       } else {
          assert(ret == 0);
          /* The BO is no longer busy. */