diff options
author | Iago Toral Quiroga <[email protected]> | 2017-03-22 08:46:04 +0100 |
---|---|---|
committer | Iago Toral Quiroga <[email protected]> | 2017-03-24 08:11:53 +0100 |
commit | 50c8d2c1f71944688ebf753af3866981a07c4e9c (patch) | |
tree | a060f6041cf5d8adb61ab4e17491b32e8f2b2401 | |
parent | 70194c9f1ab56f1ebe8f69cc4631df6e960e62ae (diff) |
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 <[email protected]>
-rw-r--r-- | src/intel/vulkan/anv_device.c | 5 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 1 |
2 files changed, 6 insertions, 0 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 2a2a470ec99..193db01b920 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -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; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index fd82ce92df6..68f7359d71d 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -619,6 +619,7 @@ struct anv_device { pthread_mutex_t mutex; pthread_cond_t queue_submit; + bool lost; }; static void inline |