anv: wire up vk_errorf macro to do debug reporting
Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -361,12 +361,14 @@ anv_block_pool_expand_range(struct anv_block_pool *pool,
|
|||||||
MAP_SHARED | MAP_POPULATE, pool->fd,
|
MAP_SHARED | MAP_POPULATE, pool->fd,
|
||||||
BLOCK_POOL_MEMFD_CENTER - center_bo_offset);
|
BLOCK_POOL_MEMFD_CENTER - center_bo_offset);
|
||||||
if (map == MAP_FAILED)
|
if (map == MAP_FAILED)
|
||||||
return vk_errorf(VK_ERROR_MEMORY_MAP_FAILED, "mmap failed: %m");
|
return vk_errorf(pool->device->instance, pool->device,
|
||||||
|
VK_ERROR_MEMORY_MAP_FAILED, "mmap failed: %m");
|
||||||
|
|
||||||
gem_handle = anv_gem_userptr(pool->device, map, size);
|
gem_handle = anv_gem_userptr(pool->device, map, size);
|
||||||
if (gem_handle == 0) {
|
if (gem_handle == 0) {
|
||||||
munmap(map, size);
|
munmap(map, size);
|
||||||
return vk_errorf(VK_ERROR_TOO_MANY_OBJECTS, "userptr failed: %m");
|
return vk_errorf(pool->device->instance, pool->device,
|
||||||
|
VK_ERROR_TOO_MANY_OBJECTS, "userptr failed: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup->map = map;
|
cleanup->map = map;
|
||||||
@@ -1190,7 +1192,7 @@ anv_bo_cache_init(struct anv_bo_cache *cache)
|
|||||||
|
|
||||||
if (pthread_mutex_init(&cache->mutex, NULL)) {
|
if (pthread_mutex_init(&cache->mutex, NULL)) {
|
||||||
_mesa_hash_table_destroy(cache->bo_map, NULL);
|
_mesa_hash_table_destroy(cache->bo_map, NULL);
|
||||||
return vk_errorf(VK_ERROR_OUT_OF_HOST_MEMORY,
|
return vk_errorf(NULL, NULL, VK_ERROR_OUT_OF_HOST_MEMORY,
|
||||||
"pthread_mutex_init failed: %m");
|
"pthread_mutex_init failed: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -68,7 +68,7 @@ anv_compute_heap_size(int fd, uint64_t *heap_size)
|
|||||||
"Failed to get I915_CONTEXT_PARAM_GTT_SIZE: %m");
|
"Failed to get I915_CONTEXT_PARAM_GTT_SIZE: %m");
|
||||||
|
|
||||||
if (anv_gem_get_aperture(fd, >t_size) == -1) {
|
if (anv_gem_get_aperture(fd, >t_size) == -1) {
|
||||||
return vk_errorf(VK_ERROR_INITIALIZATION_FAILED,
|
return vk_errorf(NULL, NULL, VK_ERROR_INITIALIZATION_FAILED,
|
||||||
"failed to get aperture size: %m");
|
"failed to get aperture size: %m");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -210,13 +210,15 @@ anv_physical_device_init_uuids(struct anv_physical_device *device)
|
|||||||
{
|
{
|
||||||
const struct build_id_note *note = build_id_find_nhdr("libvulkan_intel.so");
|
const struct build_id_note *note = build_id_find_nhdr("libvulkan_intel.so");
|
||||||
if (!note) {
|
if (!note) {
|
||||||
return vk_errorf(VK_ERROR_INITIALIZATION_FAILED,
|
return vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
"Failed to find build-id");
|
"Failed to find build-id");
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned build_id_len = build_id_length(note);
|
unsigned build_id_len = build_id_length(note);
|
||||||
if (build_id_len < 20) {
|
if (build_id_len < 20) {
|
||||||
return vk_errorf(VK_ERROR_INITIALIZATION_FAILED,
|
return vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
"build-id too short. It needs to be a SHA");
|
"build-id too short. It needs to be a SHA");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,7 +300,8 @@ anv_physical_device_init(struct anv_physical_device *device,
|
|||||||
/* Broadwell, Cherryview, Skylake, Broxton, Kabylake is as fully
|
/* Broadwell, Cherryview, Skylake, Broxton, Kabylake is as fully
|
||||||
* supported as anything */
|
* supported as anything */
|
||||||
} else {
|
} else {
|
||||||
result = vk_errorf(VK_ERROR_INCOMPATIBLE_DRIVER,
|
result = vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_INCOMPATIBLE_DRIVER,
|
||||||
"Vulkan not yet supported on %s", device->name);
|
"Vulkan not yet supported on %s", device->name);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@@ -308,27 +311,31 @@ anv_physical_device_init(struct anv_physical_device *device,
|
|||||||
device->cmd_parser_version =
|
device->cmd_parser_version =
|
||||||
anv_gem_get_param(fd, I915_PARAM_CMD_PARSER_VERSION);
|
anv_gem_get_param(fd, I915_PARAM_CMD_PARSER_VERSION);
|
||||||
if (device->cmd_parser_version == -1) {
|
if (device->cmd_parser_version == -1) {
|
||||||
result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED,
|
result = vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
"failed to get command parser version");
|
"failed to get command parser version");
|
||||||
goto fail;
|
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_INITIALIZATION_FAILED,
|
result = vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
"kernel missing gem wait");
|
"kernel missing gem wait");
|
||||||
goto fail;
|
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_INITIALIZATION_FAILED,
|
result = vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
"kernel missing execbuf2");
|
"kernel missing execbuf2");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!device->info.has_llc &&
|
if (!device->info.has_llc &&
|
||||||
anv_gem_get_param(fd, I915_PARAM_MMAP_VERSION) < 1) {
|
anv_gem_get_param(fd, I915_PARAM_MMAP_VERSION) < 1) {
|
||||||
result = vk_errorf(VK_ERROR_INITIALIZATION_FAILED,
|
result = vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_INITIALIZATION_FAILED,
|
||||||
"kernel missing wc mmap");
|
"kernel missing wc mmap");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@@ -475,7 +482,7 @@ VkResult anv_CreateInstance(
|
|||||||
"incompatible driver version",
|
"incompatible driver version",
|
||||||
ctor_cb->pUserData);
|
ctor_cb->pUserData);
|
||||||
|
|
||||||
return vk_errorf(VK_ERROR_INCOMPATIBLE_DRIVER,
|
return vk_errorf(NULL, NULL, VK_ERROR_INCOMPATIBLE_DRIVER,
|
||||||
"Client requested version %d.%d.%d",
|
"Client requested version %d.%d.%d",
|
||||||
VK_VERSION_MAJOR(client_version),
|
VK_VERSION_MAJOR(client_version),
|
||||||
VK_VERSION_MINOR(client_version),
|
VK_VERSION_MINOR(client_version),
|
||||||
@@ -1362,16 +1369,17 @@ anv_device_query_status(struct anv_device *device)
|
|||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
/* We don't know the real error. */
|
/* We don't know the real error. */
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST, "get_reset_stats failed: %m");
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
|
"get_reset_stats failed: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (active) {
|
if (active) {
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST,
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
"GPU hung on one of our command buffers");
|
"GPU hung on one of our command buffers");
|
||||||
} else if (pending) {
|
} else if (pending) {
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST,
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
"GPU hung with commands in-flight");
|
"GPU hung with commands in-flight");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1391,7 +1399,8 @@ anv_device_bo_busy(struct anv_device *device, struct anv_bo *bo)
|
|||||||
} else if (ret == -1) {
|
} else if (ret == -1) {
|
||||||
/* We don't know the real error. */
|
/* We don't know the real error. */
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m");
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
|
"gem wait failed: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query for device status after the busy call. If the BO we're checking
|
/* Query for device status after the busy call. If the BO we're checking
|
||||||
@@ -1413,7 +1422,8 @@ anv_device_wait(struct anv_device *device, struct anv_bo *bo,
|
|||||||
} else if (ret == -1) {
|
} else if (ret == -1) {
|
||||||
/* We don't know the real error. */
|
/* We don't know the real error. */
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m");
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
|
"gem wait failed: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query for device status after the wait. If the BO we're waiting on got
|
/* Query for device status after the wait. If the BO we're waiting on got
|
||||||
|
@@ -730,7 +730,8 @@ VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
|
|||||||
* vkGetPhysicalDeviceImageFormatProperties2KHR returns
|
* vkGetPhysicalDeviceImageFormatProperties2KHR returns
|
||||||
* VK_ERROR_FORMAT_NOT_SUPPORTED.
|
* VK_ERROR_FORMAT_NOT_SUPPORTED.
|
||||||
*/
|
*/
|
||||||
result = vk_errorf(VK_ERROR_FORMAT_NOT_SUPPORTED,
|
result = vk_errorf(physical_device->instance, physical_device,
|
||||||
|
VK_ERROR_FORMAT_NOT_SUPPORTED,
|
||||||
"unsupported VkExternalMemoryTypeFlagBitsKHR 0x%x",
|
"unsupported VkExternalMemoryTypeFlagBitsKHR 0x%x",
|
||||||
external_info->handleType);
|
external_info->handleType);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@@ -303,11 +303,17 @@ vk_to_isl_color(VkClearColorValue color)
|
|||||||
* propagating errors. Might be useful to plug in a stack trace here.
|
* propagating errors. Might be useful to plug in a stack trace here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
VkResult __vk_errorf(VkResult error, const char *file, int line, const char *format, ...);
|
VkResult __vk_errorf(struct anv_instance *instance, const void *object,
|
||||||
|
VkDebugReportObjectTypeEXT type, VkResult error,
|
||||||
|
const char *file, int line, const char *format, ...);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define vk_error(error) __vk_errorf(error, __FILE__, __LINE__, NULL);
|
#define vk_error(error) __vk_errorf(NULL, NULL,\
|
||||||
#define vk_errorf(error, format, ...) __vk_errorf(error, __FILE__, __LINE__, format, ## __VA_ARGS__);
|
VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,\
|
||||||
|
error, __FILE__, __LINE__, NULL);
|
||||||
|
#define vk_errorf(instance, obj, error, format, ...)\
|
||||||
|
__vk_errorf(instance, obj, REPORT_OBJECT_TYPE(obj), error,\
|
||||||
|
__FILE__, __LINE__, format, ## __VA_ARGS__);
|
||||||
#define anv_debug(format, ...) fprintf(stderr, "debug: " format, ##__VA_ARGS__)
|
#define anv_debug(format, ...) fprintf(stderr, "debug: " format, ##__VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define vk_error(error) error
|
#define vk_error(error) error
|
||||||
|
@@ -43,7 +43,8 @@ anv_device_execbuf(struct anv_device *device,
|
|||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
/* We don't know the real error. */
|
/* We don't know the real error. */
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST, "execbuf2 failed: %m");
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
|
"execbuf2 failed: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
struct drm_i915_gem_exec_object2 *objects =
|
struct drm_i915_gem_exec_object2 *objects =
|
||||||
@@ -239,7 +240,8 @@ out:
|
|||||||
* VK_ERROR_DEVICE_LOST to ensure that clients do not attempt to
|
* VK_ERROR_DEVICE_LOST to ensure that clients do not attempt to
|
||||||
* submit the same job again to this device.
|
* submit the same job again to this device.
|
||||||
*/
|
*/
|
||||||
result = vk_errorf(VK_ERROR_DEVICE_LOST, "vkQueueSubmit() failed");
|
result = vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
|
"vkQueueSubmit() failed");
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -429,7 +431,7 @@ VkResult anv_GetFenceStatus(
|
|||||||
} else {
|
} else {
|
||||||
/* We don't know the real error. */
|
/* We don't know the real error. */
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST,
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
"drm_syncobj_wait failed: %m");
|
"drm_syncobj_wait failed: %m");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -509,7 +511,7 @@ anv_wait_for_syncobj_fences(struct anv_device *device,
|
|||||||
} else {
|
} else {
|
||||||
/* We don't know the real error. */
|
/* We don't know the real error. */
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST,
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
"drm_syncobj_wait failed: %m");
|
"drm_syncobj_wait failed: %m");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -751,7 +753,8 @@ VkResult anv_ImportFenceFdKHR(
|
|||||||
|
|
||||||
if (anv_gem_syncobj_import_sync_file(device, new_impl.syncobj, fd)) {
|
if (anv_gem_syncobj_import_sync_file(device, new_impl.syncobj, fd)) {
|
||||||
anv_gem_syncobj_destroy(device, new_impl.syncobj);
|
anv_gem_syncobj_destroy(device, new_impl.syncobj);
|
||||||
return vk_errorf(VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR,
|
return vk_errorf(device->instance, NULL,
|
||||||
|
VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR,
|
||||||
"syncobj sync file import failed: %m");
|
"syncobj sync file import failed: %m");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -93,10 +93,13 @@ __anv_perf_warn(struct anv_instance *instance, const void *object,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VkResult
|
VkResult
|
||||||
__vk_errorf(VkResult error, const char *file, int line, const char *format, ...)
|
__vk_errorf(struct anv_instance *instance, const void *object,
|
||||||
|
VkDebugReportObjectTypeEXT type, VkResult error,
|
||||||
|
const char *file, int line, const char *format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
|
char report[256];
|
||||||
|
|
||||||
const char *error_str = vk_Result_to_str(error);
|
const char *error_str = vk_Result_to_str(error);
|
||||||
|
|
||||||
@@ -105,11 +108,23 @@ __vk_errorf(VkResult error, const char *file, int line, const char *format, ...)
|
|||||||
vsnprintf(buffer, sizeof(buffer), format, ap);
|
vsnprintf(buffer, sizeof(buffer), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
fprintf(stderr, "%s:%d: %s (%s)\n", file, line, buffer, error_str);
|
snprintf(report, sizeof(report), "%s:%d: %s (%s)", file, line, buffer,
|
||||||
|
error_str);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "%s:%d: %s\n", file, line, error_str);
|
snprintf(report, sizeof(report), "%s:%d: %s", file, line, error_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
anv_debug_report(instance,
|
||||||
|
VK_DEBUG_REPORT_ERROR_BIT_EXT,
|
||||||
|
type,
|
||||||
|
(uint64_t) (uintptr_t) object,
|
||||||
|
line,
|
||||||
|
0,
|
||||||
|
"anv",
|
||||||
|
report);
|
||||||
|
|
||||||
|
fprintf(stderr, "%s\n", report);
|
||||||
|
|
||||||
if (error == VK_ERROR_DEVICE_LOST &&
|
if (error == VK_ERROR_DEVICE_LOST &&
|
||||||
env_var_as_boolean("ANV_ABORT_ON_DEVICE_LOSS", false))
|
env_var_as_boolean("ANV_ABORT_ON_DEVICE_LOSS", false))
|
||||||
abort();
|
abort();
|
||||||
|
@@ -248,7 +248,8 @@ anv_wsi_image_create(VkDevice device_h,
|
|||||||
surface->isl.row_pitch, I915_TILING_X);
|
surface->isl.row_pitch, I915_TILING_X);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
/* FINISHME: Choose a better error. */
|
/* FINISHME: Choose a better error. */
|
||||||
result = vk_errorf(VK_ERROR_OUT_OF_DEVICE_MEMORY,
|
result = vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_OUT_OF_DEVICE_MEMORY,
|
||||||
"set_tiling failed: %m");
|
"set_tiling failed: %m");
|
||||||
goto fail_alloc_memory;
|
goto fail_alloc_memory;
|
||||||
}
|
}
|
||||||
@@ -256,7 +257,8 @@ anv_wsi_image_create(VkDevice device_h,
|
|||||||
int fd = anv_gem_handle_to_fd(device, memory->bo->gem_handle);
|
int fd = anv_gem_handle_to_fd(device, memory->bo->gem_handle);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
/* FINISHME: Choose a better error. */
|
/* FINISHME: Choose a better error. */
|
||||||
result = vk_errorf(VK_ERROR_OUT_OF_DEVICE_MEMORY,
|
result = vk_errorf(device->instance, device,
|
||||||
|
VK_ERROR_OUT_OF_DEVICE_MEMORY,
|
||||||
"handle_to_fd failed: %m");
|
"handle_to_fd failed: %m");
|
||||||
goto fail_alloc_memory;
|
goto fail_alloc_memory;
|
||||||
}
|
}
|
||||||
|
@@ -2492,7 +2492,8 @@ verify_cmd_parser(const struct anv_device *device,
|
|||||||
const char *function)
|
const char *function)
|
||||||
{
|
{
|
||||||
if (device->instance->physicalDevice.cmd_parser_version < required_version) {
|
if (device->instance->physicalDevice.cmd_parser_version < required_version) {
|
||||||
return vk_errorf(VK_ERROR_FEATURE_NOT_PRESENT,
|
return vk_errorf(device->instance, device->instance,
|
||||||
|
VK_ERROR_FEATURE_NOT_PRESENT,
|
||||||
"cmd parser version %d is required for %s",
|
"cmd parser version %d is required for %s",
|
||||||
required_version, function);
|
required_version, function);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -167,7 +167,8 @@ wait_for_available(struct anv_device *device,
|
|||||||
} else if (ret == -1) {
|
} else if (ret == -1) {
|
||||||
/* We don't know the real error. */
|
/* We don't know the real error. */
|
||||||
device->lost = true;
|
device->lost = true;
|
||||||
return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m");
|
return vk_errorf(device->instance, device, VK_ERROR_DEVICE_LOST,
|
||||||
|
"gem wait failed: %m");
|
||||||
} else {
|
} else {
|
||||||
assert(ret == 0);
|
assert(ret == 0);
|
||||||
/* The BO is no longer busy. */
|
/* The BO is no longer busy. */
|
||||||
|
Reference in New Issue
Block a user