diff options
author | Jason Ekstrand <[email protected]> | 2017-08-08 12:25:38 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-08-28 19:33:43 -0700 |
commit | 49c59c88eb725cba113ea51307ba66223e411e9a (patch) | |
tree | ea184ae29a596e94dfeb01c6595777b305ad39c2 /src/intel/vulkan/anv_batch_chain.c | |
parent | 5f372d93a9088afdbd97c0668f9684f369bc33a2 (diff) |
anv: Implement VK_KHR_external_fence
Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/intel/vulkan/anv_batch_chain.c')
-rw-r--r-- | src/intel/vulkan/anv_batch_chain.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 52c45104b22..4f5137c2ecf 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1549,8 +1549,20 @@ anv_cmd_buffer_execbuf(struct anv_device *device, } if (fence) { - assert(fence->temporary.type == ANV_FENCE_TYPE_NONE); - struct anv_fence_impl *impl = &fence->permanent; + /* Under most circumstances, out fences won't be temporary. However, + * the spec does allow it for opaque_fd. From the Vulkan 1.0.53 spec: + * + * "If the import is temporary, the implementation must restore the + * semaphore to its prior permanent state after submitting the next + * semaphore wait operation." + * + * The spec says nothing whatsoever about signal operations on + * temporarily imported semaphores so it appears they are allowed. + * There are also CTS tests that require this to work. + */ + struct anv_fence_impl *impl = + fence->temporary.type != ANV_FENCE_TYPE_NONE ? + &fence->temporary : &fence->permanent; switch (impl->type) { case ANV_FENCE_TYPE_BO: @@ -1617,6 +1629,9 @@ anv_cmd_buffer_execbuf(struct anv_device *device, } if (fence && fence->permanent.type == ANV_FENCE_TYPE_BO) { + /* BO fences can't be shared, so they can't be temporary. */ + assert(fence->temporary.type == ANV_FENCE_TYPE_NONE); + /* Once the execbuf has returned, we need to set the fence state to * SUBMITTED. We can't do this before calling execbuf because * anv_GetFenceStatus does take the global device lock before checking |