summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>2018-01-04 02:55:39 +0100
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>2018-01-11 21:56:13 +0100
commitb9f4c615f860b1fb00dec2917fcec4df84f6427e (patch)
tree809c7f4a78d28b703d25540c2636428830cd2aa2
parentfe668b5c155aee4443dde0748065241e09293302 (diff)
radv: reset semaphores & fences on sync_file export.
Per spec: "Additionally, exporting a fence payload to a handle with copy transference has the same side effects on the source fence’s payload as executing a fence reset operation. If the fence was using a temporarily imported payload, the fence’s prior permanent payload will be restored." And similar for semaphores: "Additionally, exporting a semaphore payload to a handle with copy transference has the same side effects on the source semaphore’s payload as executing a semaphore wait operation. If the semaphore was using a temporarily imported payload, the semaphore’s prior permanent payload will be restored." Fixes: 42bc25a79c "radv: Advertise sync fd import and export." Reviewed-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--src/amd/vulkan/radv_device.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 24aa861780..55ffebb20a 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -3815,6 +3815,14 @@ VkResult radv_GetSemaphoreFdKHR(VkDevice _device,
break;
case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
ret = device->ws->export_syncobj_to_sync_file(device->ws, syncobj_handle, pFd);
+ if (!ret) {
+ if (sem->temp_syncobj) {
+ close (sem->temp_syncobj);
+ sem->temp_syncobj = 0;
+ } else {
+ device->ws->reset_syncobj(device->ws, syncobj_handle);
+ }
+ }
break;
default:
unreachable("Unhandled semaphore handle type");
@@ -3896,6 +3904,14 @@ VkResult radv_GetFenceFdKHR(VkDevice _device,
break;
case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR:
ret = device->ws->export_syncobj_to_sync_file(device->ws, syncobj_handle, pFd);
+ if (!ret) {
+ if (fence->temp_syncobj) {
+ close (fence->temp_syncobj);
+ fence->temp_syncobj = 0;
+ } else {
+ device->ws->reset_syncobj(device->ws, syncobj_handle);
+ }
+ }
break;
default:
unreachable("Unhandled fence handle type");