vk: Add new vk_errorf that takes a format string
authorKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Wed, 26 Aug 2015 11:03:38 +0000 (04:03 -0700)
committerKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Thu, 3 Sep 2015 18:53:08 +0000 (11:53 -0700)
This allows us to annotate error cases in debug builds.

Signed-off-by: Kristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
src/vulkan/anv_device.c
src/vulkan/anv_image.c
src/vulkan/anv_private.h
src/vulkan/anv_query.c
src/vulkan/anv_util.c
src/vulkan/anv_x11.c

index 19f3c1ed3cccd8a6010005e77901fac1ab161020..37cf7d3cea98907d637a7b675078a4c44a6a8864 100644 (file)
@@ -36,38 +36,53 @@ anv_physical_device_init(struct anv_physical_device *device,
                          struct anv_instance *instance,
                          const char *path)
 {
+   VkResult result;
    int fd;
 
    fd = open(path, O_RDWR | O_CLOEXEC);
    if (fd < 0)
-      return vk_error(VK_ERROR_UNAVAILABLE);
+      return vk_errorf(VK_ERROR_UNAVAILABLE, "failed to open %s: %m", path);
 
    device->instance = instance;
    device->path = path;
    
    device->chipset_id = anv_gem_get_param(fd, I915_PARAM_CHIPSET_ID);
-   if (!device->chipset_id)
+   if (!device->chipset_id) {
+      result = vk_errorf(VK_ERROR_UNAVAILABLE, "failed to get chipset id: %m");
       goto fail;
+   }
 
    device->name = brw_get_device_name(device->chipset_id);
    device->info = brw_get_device_info(device->chipset_id, -1);
-   if (!device->info)
+   if (!device->info) {
+      result = vk_errorf(VK_ERROR_UNAVAILABLE, "failed to get device info");
       goto fail;
+   }
    
-   if (anv_gem_get_aperture(fd, &device->aperture_size) == -1)
+   if (anv_gem_get_aperture(fd, &device->aperture_size) == -1) {
+      result = vk_errorf(VK_ERROR_UNAVAILABLE, "failed to get aperture size: %m");
       goto fail;
+   }
 
-   if (!anv_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT))
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT)) {
+      result = vk_errorf(VK_ERROR_UNAVAILABLE, "kernel missing gem wait");
       goto fail;
+   }
 
-   if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2))
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2)) {
+      result = vk_errorf(VK_ERROR_UNAVAILABLE, "kernel missing execbuf2");
       goto fail;
+   }
 
-   if (!anv_gem_get_param(fd, I915_PARAM_HAS_LLC))
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_LLC)) {
+      result = vk_errorf(VK_ERROR_UNAVAILABLE, "non-llc gpu");
       goto fail;
+   }
 
-   if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_CONSTANTS))
+   if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_CONSTANTS)) {
+      result = vk_errorf(VK_ERROR_UNAVAILABLE, "kernel missing exec constants");
       goto fail;
+   }
    
    close(fd);
 
@@ -75,7 +90,7 @@ anv_physical_device_init(struct anv_physical_device *device,
    
 fail:
    close(fd);
-   return vk_error(VK_ERROR_UNAVAILABLE);
+   return result;
 }
 
 static void *default_alloc(
@@ -729,12 +744,12 @@ VkResult anv_QueueSubmit(
 
       ret = anv_gem_execbuffer(device, &cmd_buffer->execbuf2.execbuf);
       if (ret != 0)
-         return vk_error(VK_ERROR_UNKNOWN);
+         return vk_errorf(VK_ERROR_UNKNOWN, "execbuf2 failed: %m");
 
       if (fence) {
          ret = anv_gem_execbuffer(device, &fence->execbuf);
          if (ret != 0)
-            return vk_error(VK_ERROR_UNKNOWN);
+            return vk_errorf(VK_ERROR_UNKNOWN, "execbuf2 failed: %m");
       }
 
       for (uint32_t i = 0; i < cmd_buffer->execbuf2.bo_count; i++)
@@ -797,14 +812,14 @@ VkResult anv_DeviceWaitIdle(
 
    ret = anv_gem_execbuffer(device, &execbuf);
    if (ret != 0) {
-      result = vk_error(VK_ERROR_UNKNOWN);
+      result = vk_errorf(VK_ERROR_UNKNOWN, "execbuf2 failed: %m");
       goto fail;
    }
 
    timeout = INT64_MAX;
    ret = anv_gem_wait(device, bo->gem_handle, &timeout);
    if (ret != 0) {
-      result = vk_error(VK_ERROR_UNKNOWN);
+      result = vk_errorf(VK_ERROR_UNKNOWN, "execbuf2 failed: %m");
       goto fail;
    }
 
@@ -1211,7 +1226,7 @@ VkResult anv_WaitForFences(
       if (ret == -1 && errno == ETIME)
          return VK_TIMEOUT;
       else if (ret == -1)
-         return vk_error(VK_ERROR_UNKNOWN);
+         return vk_errorf(VK_ERROR_UNKNOWN, "gem wait failed: %m");
    }
 
    return VK_SUCCESS;
index 7a37497d0ccc55cae54d32b0488d2d68e0fe2754..fbcd435a1a0596f39e183996e081fa4cb239e4dd 100644 (file)
@@ -259,8 +259,7 @@ anv_image_create(VkDevice _device,
        extent->height > limits->height ||
        extent->depth > limits->depth) {
       /* TODO(chadv): What is the correct error? */
-      anv_loge("image extent is too large");
-      return vk_error(VK_ERROR_INVALID_MEMORY_SIZE);
+      return vk_errorf(VK_ERROR_INVALID_MEMORY_SIZE, "image extent is too large");
    }
 
    image = anv_device_alloc(device, sizeof(*image), 8,
index b662af6cf5fa7cd97cf119e7804551d0f2e10373..ca62dc487d73ef59b1bee957b9cae602024c17c0 100644 (file)
@@ -120,10 +120,11 @@ struct anv_common {
  * propagating errors. Might be useful to plug in a stack trace here.
  */
 
-VkResult __vk_error(VkResult error, const char *file, int line);
+VkResult __vk_errorf(VkResult error, const char *file, int line, const char *format, ...);
 
 #ifdef DEBUG
-#define vk_error(error) __vk_error(error, __FILE__, __LINE__);
+#define vk_error(error) __vk_errorf(error, __FILE__, __LINE__, NULL);
+#define vk_errorf(error, format, ...) __vk_errorf(error, __FILE__, __LINE__, format, ## __VA_ARGS__);
 #else
 #define vk_error(error) error
 #endif
index 3785560dc3bed195ca444cf55d5f7c1d0a39a006..4ef9d8c4b0c8a57e8bee84e5f0ebe06a9045fb88 100644 (file)
@@ -123,7 +123,7 @@ VkResult anv_GetQueryPoolResults(
    if (flags & VK_QUERY_RESULT_WAIT_BIT) {
       ret = anv_gem_wait(device, pool->bo.gem_handle, &timeout);
       if (ret == -1)
-         return vk_error(VK_ERROR_UNKNOWN);
+         return vk_errorf(VK_ERROR_UNKNOWN, "gem_wait failed %m");
    }
 
    for (uint32_t i = 0; i < queryCount; i++) {
index a78847acec6e4bffd9817b6bdffe7334042054c9..94f14f98f8fcc275788eb745a4ebff48b38541ca 100644 (file)
@@ -83,8 +83,11 @@ anv_abortfv(const char *format, va_list va)
 }
 
 VkResult
-__vk_error(VkResult error, const char *file, int line)
+__vk_errorf(VkResult error, const char *file, int line, const char *format, ...)
 {
+   va_list ap;
+   char buffer[256];
+
    static const char *error_names[] = {
       "VK_ERROR_UNKNOWN",
       "VK_ERROR_UNAVAILABLE",
@@ -120,11 +123,18 @@ __vk_error(VkResult error, const char *file, int line)
       "VK_ERROR_INVALID_LAYER",
    };
 
-   if (error <= VK_ERROR_UNKNOWN && error >= VK_ERROR_INVALID_LAYER)
-      fprintf(stderr, "%s:%d: %s\n",
-              file, line, error_names[-error - VK_ERROR_UNKNOWN]);
-   else
-      fprintf(stderr, "%s:%d: vk error %d\n", file, line, error);
+   assert(error <= VK_ERROR_UNKNOWN && error >= VK_ERROR_INVALID_LAYER);
+
+   if (format) {
+      va_start(ap, format);
+      vsnprintf(buffer, sizeof(buffer), format, ap);
+      va_end(ap);
+
+      fprintf(stderr, "%s:%d: %s (%s)\n", file, line,
+              buffer, error_names[-error - 1]);
+   } else {
+      fprintf(stderr, "%s:%d: %s\n", file, line, error_names[-error - 1]);
+   }
 
    return error;
 }
index f65a86487cbffa78a9d983e1621e30a3e9fe1569..3c6d41aa79e4354458eb4d979bdde1476c86224a 100644 (file)
@@ -163,13 +163,13 @@ VkResult anv_CreateSwapChainWSI(
       ret = anv_gem_set_tiling(device, memory->bo.gem_handle,
                                surface->stride, I915_TILING_X);
       if (ret) {
-         result = vk_error(VK_ERROR_UNKNOWN);
+         result = vk_errorf(VK_ERROR_UNKNOWN, "set_tiling failed: %m");
          goto fail;
       }
 
       int fd = anv_gem_handle_to_fd(device, memory->bo.gem_handle);
       if (fd == -1) {
-         result = vk_error(VK_ERROR_UNKNOWN);
+         result = vk_errorf(VK_ERROR_UNKNOWN, "handle_to_fd failed: %m");
          goto fail;
       }