device->supports_multiview_mask = true;
break;
default:
- result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
- "device %s is unsupported", device->name);
+ result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
+ "device %s is unsupported", device->name);
goto fail;
}
if (tu_device_get_cache_uuid(device->gpu_id, device->cache_uuid)) {
- result = vk_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
- "cannot generate UUID");
+ result = vk_startup_errorf(instance, VK_ERROR_INITIALIZATION_FAILED,
+ "cannot generate UUID");
goto fail;
}
result = tu_wsi_init(device);
if (result != VK_SUCCESS) {
- vk_error(instance, result);
+ vk_startup_errorf(instance, result, "WSI init failure");
goto fail;
}
if (index < 0 || !tu_instance_extensions_supported.extensions[index]) {
vk_object_base_finish(&instance->base);
vk_free2(&default_alloc, pAllocator, instance);
- return vk_error(instance, VK_ERROR_EXTENSION_NOT_PRESENT);
+ return vk_startup_errorf(instance, VK_ERROR_EXTENSION_NOT_PRESENT,
+ "Missing %s", ext_name);
}
instance->enabled_extensions.extensions[index] = true;
if (result != VK_SUCCESS) {
vk_object_base_finish(&instance->base);
vk_free2(&default_alloc, pAllocator, instance);
- return vk_error(instance, result);
+ return vk_startup_errorf(instance, result, "debug_report setup failure");
}
glsl_type_singleton_init_or_ref();
int ret = tu_drm_submitqueue_new(device, 0, &queue->msm_queue_id);
if (ret)
- return VK_ERROR_INITIALIZATION_FAILED;
+ return vk_startup_errorf(device->instance, VK_ERROR_INITIALIZATION_FAILED,
+ "submitqueue create failed");
queue->fence = -1;
sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
for (uint32_t i = 0; i < num_features; i++) {
if (enabled_feature[i] && !supported_feature[i])
- return vk_error(physical_device->instance,
- VK_ERROR_FEATURE_NOT_PRESENT);
+ return vk_startup_errorf(physical_device->instance,
+ VK_ERROR_FEATURE_NOT_PRESENT,
+ "Missing feature bit %d\n", i);
}
}
device = vk_zalloc2(&physical_device->instance->alloc, pAllocator,
sizeof(*device), 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
if (!device)
- return vk_error(physical_device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
+ return vk_startup_errorf(physical_device->instance, VK_ERROR_OUT_OF_HOST_MEMORY, "OOM");
vk_device_init(&device->vk, pCreateInfo,
&physical_device->instance->alloc, pAllocator);
if (index < 0 ||
!physical_device->supported_extensions.extensions[index]) {
vk_free(&device->vk.alloc, device);
- return vk_error(physical_device->instance,
- VK_ERROR_EXTENSION_NOT_PRESENT);
+ return vk_startup_errorf(physical_device->instance,
+ VK_ERROR_EXTENSION_NOT_PRESENT,
+ "Missing device extension '%s'", ext_name);
}
device->enabled_extensions.extensions[index] = true;
&device->vk.alloc, queue_create->queueCount * sizeof(struct tu_queue),
8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
if (!device->queues[qfi]) {
- result = VK_ERROR_OUT_OF_HOST_MEMORY;
+ result = vk_startup_errorf(physical_device->instance,
+ VK_ERROR_OUT_OF_HOST_MEMORY,
+ "OOM");
goto fail_queues;
}
}
device->compiler = ir3_compiler_create(NULL, physical_device->gpu_id);
- if (!device->compiler)
+ if (!device->compiler) {
+ result = vk_startup_errorf(physical_device->instance,
+ VK_ERROR_INITIALIZATION_FAILED,
+ "failed to initialize ir3 compiler");
goto fail_queues;
+ }
/* initial sizes, these will increase if there is overflow */
device->vsc_draw_strm_pitch = 0x1000 + VSC_PAD;
global_size += TU_BORDER_COLOR_COUNT * sizeof(struct bcolor_entry);
result = tu_bo_init_new(device, &device->global_bo, global_size, false);
- if (result != VK_SUCCESS)
+ if (result != VK_SUCCESS) {
+ vk_startup_errorf(device->instance, result, "BO init");
goto fail_global_bo;
+ }
result = tu_bo_map(device, &device->global_bo);
- if (result != VK_SUCCESS)
+ if (result != VK_SUCCESS) {
+ vk_startup_errorf(device->instance, result, "BO map");
goto fail_global_bo_map;
+ }
struct tu6_global *global = device->global_bo.map;
tu_init_clear_blit_shaders(device->global_bo.map);
VkPipelineCache pc;
result =
tu_CreatePipelineCache(tu_device_to_handle(device), &ci, NULL, &pc);
- if (result != VK_SUCCESS)
+ if (result != VK_SUCCESS) {
+ vk_startup_errorf(device->instance, result, "create pipeline cache failed");
goto fail_pipeline_cache;
+ }
device->mem_cache = tu_pipeline_cache_from_handle(pc);
fd = open(path, O_RDWR | O_CLOEXEC);
if (fd < 0) {
- return vk_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
- "failed to open device %s", path);
+ return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
+ "failed to open device %s", path);
}
/* Version 1.6 added SYNCOBJ support. */
version = drmGetVersion(fd);
if (!version) {
close(fd);
- return vk_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
- "failed to query kernel driver version for device %s",
- path);
+ return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
+ "failed to query kernel driver version for device %s",
+ path);
}
if (strcmp(version->name, "msm")) {
drmFreeVersion(version);
close(fd);
- return vk_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
- "device %s does not use the msm kernel driver", path);
+ return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
+ "device %s does not use the msm kernel driver",
+ path);
}
if (version->version_major != min_version_major ||
version->version_minor < min_version_minor) {
- result = vk_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
- "kernel driver for device %s has version %d.%d, "
- "but Vulkan requires version >= %d.%d",
- path, version->version_major, version->version_minor,
- min_version_major, min_version_minor);
+ result = vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
+ "kernel driver for device %s has version %d.%d, "
+ "but Vulkan requires version >= %d.%d",
+ path,
+ version->version_major, version->version_minor,
+ min_version_major, min_version_minor);
drmFreeVersion(version);
close(fd);
return result;
}
if (max_devices < 1)
- return vk_error(instance, VK_ERROR_INCOMPATIBLE_DRIVER);
+ return vk_startup_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
+ "No DRM devices found");
for (unsigned i = 0; i < (unsigned) max_devices; i++) {
if (devices[i]->available_nodes & 1 << DRM_NODE_RENDER &&
VkResult
__vk_errorf(struct tu_instance *instance,
VkResult error,
+ bool force_print,
const char *file,
int line,
const char *format,
- ...) PRINTFLIKE(5, 6);
+ ...) PRINTFLIKE(6, 7);
#define vk_error(instance, error) \
- __vk_errorf(instance, error, __FILE__, __LINE__, NULL);
+ __vk_errorf(instance, error, false, __FILE__, __LINE__, NULL);
#define vk_errorf(instance, error, format, ...) \
- __vk_errorf(instance, error, __FILE__, __LINE__, format, ##__VA_ARGS__);
+ __vk_errorf(instance, error, false, __FILE__, __LINE__, format, ##__VA_ARGS__);
+
+/* Prints startup errors if TU_DEBUG=startup is set.
+ */
+#define vk_startup_errorf(instance, error, format, ...) \
+ __vk_errorf(instance, error, instance->debug_flags & TU_DEBUG_STARTUP, \
+ __FILE__, __LINE__, format, ##__VA_ARGS__)
void
__tu_finishme(const char *file, int line, const char *format, ...)