diff options
author | Lionel Landwerlin <[email protected]> | 2019-12-12 01:51:37 +0200 |
---|---|---|
committer | Lionel Landwerlin <[email protected]> | 2019-12-12 10:10:48 +0000 |
commit | 2c5eb1df681e28c23e24219eab803b6d4da5aa38 (patch) | |
tree | 86c649565395392a0b627a291edfd8c3114c9f58 | |
parent | 52bc235f2adcae8a3f40c74b15c9aad9e2b5c5b9 (diff) |
anv: fix assumptions about temporary fence payload
Since f9a3d9738b12 temporary BO_WSI are definitely a thing so we have
an assert wrong.
Take that opportunity to expand a bit on an existing comment.
Signed-off-by: Lionel Landwerlin <[email protected]>
Fixes: f9a3d9738b12 ("anv: Use BO fences/semaphores for AcquireNextImage")
Reviewed-by: Jason Ekstrand <[email protected]>
Reviewed-by: Ivan Briano <[email protected]>
-rw-r--r-- | src/intel/vulkan/anv_queue.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c index b7f97b962f5..76fc93fde37 100644 --- a/src/intel/vulkan/anv_queue.c +++ b/src/intel/vulkan/anv_queue.c @@ -907,7 +907,16 @@ anv_queue_submit(struct anv_queue *queue, goto error; if (fence && fence->permanent.type == ANV_FENCE_TYPE_BO) { - /* BO fences can't be shared, so they can't be temporary. */ + /* If we have permanent BO fence, the only type of temporary possible + * would be BO_WSI (because BO fences are not shareable). The Vulkan spec + * also requires that the fence passed to vkQueueSubmit() be : + * + * * unsignaled + * * not be associated with any other queue command that has not yet + * completed execution on that queue + * + * So the only acceptable type for the temporary is NONE. + */ assert(fence->temporary.type == ANV_FENCE_TYPE_NONE); /* Once the execbuf has returned, we need to set the fence state to @@ -1234,8 +1243,6 @@ VkResult anv_GetFenceStatus( switch (impl->type) { case ANV_FENCE_TYPE_BO: case ANV_FENCE_TYPE_WSI_BO: - /* BO fences don't support import/export */ - assert(fence->temporary.type == ANV_FENCE_TYPE_NONE); switch (impl->bo.state) { case ANV_BO_FENCE_STATE_RESET: /* If it hasn't even been sent off to the GPU yet, it's not ready */ @@ -1440,12 +1447,9 @@ done: static VkResult anv_wait_for_wsi_fence(struct anv_device *device, - const VkFence _fence, + struct anv_fence_impl *impl, uint64_t abs_timeout) { - ANV_FROM_HANDLE(anv_fence, fence, _fence); - struct anv_fence_impl *impl = &fence->permanent; - return impl->fence_wsi->wait(impl->fence_wsi, abs_timeout); } @@ -1476,7 +1480,7 @@ anv_wait_for_fences(struct anv_device *device, true, abs_timeout); break; case ANV_FENCE_TYPE_WSI: - result = anv_wait_for_wsi_fence(device, pFences[i], abs_timeout); + result = anv_wait_for_wsi_fence(device, impl, abs_timeout); break; case ANV_FENCE_TYPE_NONE: result = VK_SUCCESS; @@ -1517,7 +1521,8 @@ static bool anv_all_fences_bo(uint32_t fenceCount, const VkFence *pFences) struct anv_fence_impl *impl = fence->temporary.type != ANV_FENCE_TYPE_NONE ? &fence->temporary : &fence->permanent; - if (impl->type != ANV_FENCE_TYPE_BO) + if (impl->type != ANV_FENCE_TYPE_BO && + impl->type != ANV_FENCE_TYPE_WSI_BO) return false; } return true; |