anv/device: keep track of 'device lost' state
The Vulkan specs say: "A logical device may become lost because of hardware errors, execution timeouts, power management events and/or platform-specific events. This may cause pending and future command execution to fail and cause hardware resources to be corrupted. When this happens, certain commands will return VK_ERROR_DEVICE_LOST (see Error Codes for a list of such commands). After any such event, the logical device is considered lost. It is not possible to reset the logical device to a non-lost state, however the lost state is specific to a logical device (VkDevice), and the corresponding physical device (VkPhysicalDevice) may be otherwise unaffected. In some cases, the physical device may also be lost, and attempting to create a new logical device will fail, returning VK_ERROR_DEVICE_LOST." This means that we need to track if a logical device has been lost so we can have the commands referenced by the spec return VK_ERROR_DEVICE_LOST immediately. Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -929,6 +929,7 @@ anv_device_submit_simple_batch(struct anv_device *device,
|
||||
ret = anv_gem_wait(device, bo.gem_handle, &timeout);
|
||||
if (ret != 0) {
|
||||
/* We don't know the real error. */
|
||||
device->lost = true;
|
||||
result = vk_errorf(VK_ERROR_DEVICE_LOST, "execbuf2 failed: %m");
|
||||
goto fail;
|
||||
}
|
||||
@@ -973,6 +974,7 @@ VkResult anv_CreateDevice(
|
||||
device->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
|
||||
device->instance = physical_device->instance;
|
||||
device->chipset_id = physical_device->chipset_id;
|
||||
device->lost = false;
|
||||
|
||||
if (pAllocator)
|
||||
device->alloc = *pAllocator;
|
||||
@@ -1250,6 +1252,7 @@ anv_device_execbuf(struct anv_device *device,
|
||||
int ret = anv_gem_execbuffer(device, execbuf);
|
||||
if (ret != 0) {
|
||||
/* We don't know the real error. */
|
||||
device->lost = true;
|
||||
return vk_errorf(VK_ERROR_DEVICE_LOST, "execbuf2 failed: %m");
|
||||
}
|
||||
|
||||
@@ -1339,6 +1342,7 @@ out:
|
||||
* submit the same job again to this device.
|
||||
*/
|
||||
result = VK_ERROR_DEVICE_LOST;
|
||||
device->lost = true;
|
||||
|
||||
/* If we return VK_ERROR_DEVICE LOST here, we need to ensure that
|
||||
* vkWaitForFences() and vkGetFenceStatus() return a valid result
|
||||
@@ -1865,6 +1869,7 @@ VkResult anv_WaitForFences(
|
||||
return VK_TIMEOUT;
|
||||
} else if (ret == -1) {
|
||||
/* We don't know the real error. */
|
||||
device->lost = true;
|
||||
return vk_errorf(VK_ERROR_DEVICE_LOST, "gem wait failed: %m");
|
||||
} else {
|
||||
fence->state = ANV_FENCE_STATE_SIGNALED;
|
||||
|
@@ -619,6 +619,7 @@ struct anv_device {
|
||||
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t queue_submit;
|
||||
bool lost;
|
||||
};
|
||||
|
||||
static void inline
|
||||
|
Reference in New Issue
Block a user