radv: reset semaphores & fences on sync_file export.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Thu, 4 Jan 2018 01:55:39 +0000 (02:55 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Thu, 11 Jan 2018 20:56:13 +0000 (21:56 +0100)
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>
src/amd/vulkan/radv_device.c

index 24aa86178093d5f2a1ec155bcc786f987d2033d9..55ffebb20ac2d5dd67f41451fd991ab70dc3a56d 100644 (file)
@@ -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");