}
if (instance->app_info.api_version == 0)
- anv_EnumerateInstanceVersion(&instance->app_info.api_version);
+ instance->app_info.api_version = VK_API_VERSION_1_0;
instance->enabled_extensions = enabled_extensions;
break;
}
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT: {
+ VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *features =
+ (VkPhysicalDeviceScalarBlockLayoutFeaturesEXT *)ext;
+ features->scalarBlockLayout = true;
+ break;
+ }
+
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES: {
VkPhysicalDeviceShaderDrawParameterFeatures *features = (void *)ext;
features->shaderDrawParameters = true;
device->instance = physical_device->instance;
device->chipset_id = physical_device->chipset_id;
device->no_hw = physical_device->no_hw;
- device->lost = false;
+ device->_lost = false;
if (pAllocator)
device->alloc = *pAllocator;
*pQueue = NULL;
}
+VkResult
+_anv_device_set_lost(struct anv_device *device,
+ const char *file, int line,
+ const char *msg, ...)
+{
+ VkResult err;
+ va_list ap;
+
+ device->_lost = true;
+
+ 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
anv_device_query_status(struct anv_device *device)
{
* for it. However, it doesn't hurt to check and it potentially lets us
* avoid an ioctl.
*/
- if (unlikely(device->lost))
+ if (anv_device_is_lost(device))
return VK_ERROR_DEVICE_LOST;
uint32_t active, pending;
int ret = anv_gem_gpu_get_reset_stats(device, &active, &pending);
if (ret == -1) {
/* We don't know the real error. */
- device->lost = true;
- 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) {
- device->lost = true;
- 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) {
- device->lost = true;
- 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;
return VK_NOT_READY;
} else if (ret == -1) {
/* We don't know the real error. */
- device->lost = true;
- 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
return VK_TIMEOUT;
} else if (ret == -1) {
/* We don't know the real error. */
- device->lost = true;
- 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
VkDevice _device)
{
ANV_FROM_HANDLE(anv_device, device, _device);
- if (unlikely(device->lost))
+ if (anv_device_is_lost(device))
return VK_ERROR_DEVICE_LOST;
struct anv_batch batch;
VkFence fence)
{
ANV_FROM_HANDLE(anv_queue, queue, _queue);
- if (unlikely(queue->device->lost))
+ if (anv_device_is_lost(queue->device))
return VK_ERROR_DEVICE_LOST;
return vk_error(VK_ERROR_FEATURE_NOT_PRESENT);
ANV_FROM_HANDLE(anv_device, device, _device);
ANV_FROM_HANDLE(anv_event, event, _event);
- if (unlikely(device->lost))
+ if (anv_device_is_lost(device))
return VK_ERROR_DEVICE_LOST;
if (!device->info.has_llc) {
&pTimestamps[d]);
if (ret != 0) {
- device->lost = TRUE;
- return VK_ERROR_DEVICE_LOST;
+ 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);