[vulkan] Implement sync fd's in the guest only

bug: 111137294
bug: 128832984

Do not touch host side opaque fd's or win32 handles
to get external semaphores when sync fd's are involved.

Change-Id: If58b06009f8c4ff88831a049070dec01fa9ec939
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 6b08602..baee1e1 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -2340,18 +2340,13 @@
 #endif
 
 #ifdef VK_USE_PLATFORM_ANDROID_KHR
-        VkImportSemaphoreFdInfoKHR* importSempahoreFdPtr =
-            (VkImportSemaphoreFdInfoKHR*)vk_find_struct(
-                (vk_struct_common*)pCreateInfo,
-                VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR);
-
         bool exportSyncFd = exportSemaphoreInfoPtr &&
             (exportSemaphoreInfoPtr->handleTypes &
              VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT);
-        bool importSyncFd = importSempahoreFdPtr &&
-            (importSempahoreFdPtr->handleType &
-             VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT);
 
+        if (exportSyncFd) {
+            finalCreateInfo.pNext = nullptr;
+        }
 #endif
         input_result = enc->vkCreateSemaphore(
             device, &finalCreateInfo, pAllocator, pSemaphore);
@@ -2375,7 +2370,7 @@
         info.eventHandle = event_handle;
 
 #ifdef VK_USE_PLATFORM_ANDROID_KHR
-        if (exportSyncFd || importSyncFd) {
+        if (exportSyncFd) {
 
             ensureSyncDeviceFd();
 
@@ -2388,10 +2383,6 @@
                     &syncFd);
                 info.syncFd = syncFd;
             }
-
-            if (importSyncFd) {
-                info.syncFd = importSempahoreFdPtr->fd;
-            }
         }
 #endif
 
@@ -2425,17 +2416,17 @@
             auto& semInfo = it->second;
             *pFd = dup(semInfo.syncFd);
             return VK_SUCCESS;
+        } else {
+            // opaque fd
+            int hostFd = 0;
+            VkResult result = enc->vkGetSemaphoreFdKHR(device, pGetFdInfo, &hostFd);
+            if (result != VK_SUCCESS) {
+                return result;
+            }
+            *pFd = memfd_create("vk_opaque_fd", 0);
+            write(*pFd, &hostFd, sizeof(hostFd));
+            return VK_SUCCESS;
         }
-
-        // opaque fd
-        int hostFd = 0;
-        VkResult result = enc->vkGetSemaphoreFdKHR(device, pGetFdInfo, &hostFd);
-        if (result != VK_SUCCESS) {
-            return result;
-        }
-        *pFd = memfd_create("vk_opaque_fd", 0);
-        write(*pFd, &hostFd, sizeof(hostFd));
-        return VK_SUCCESS;
 #else
         (void)context;
         (void)device;
@@ -2454,18 +2445,37 @@
         if (input_result != VK_SUCCESS) {
             return input_result;
         }
-        int fd = pImportSemaphoreFdInfo->fd;
-        int err = lseek(fd, 0, SEEK_SET);
-        if (err == -1) {
-            ALOGE("lseek fail on import semaphore");
+
+        if (pImportSemaphoreFdInfo->handleType &
+            VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT) {
+            VkImportSemaphoreFdInfoKHR tmpInfo = *pImportSemaphoreFdInfo;
+
+            AutoLock lock(mLock);
+
+            auto semaphoreIt = info_VkSemaphore.find(pImportSemaphoreFdInfo->semaphore);
+            auto& info = semaphoreIt->second;
+
+            if (info.syncFd >= 0) {
+                close(info.syncFd);
+            }
+
+            info.syncFd = pImportSemaphoreFdInfo->fd;
+
+            return VK_SUCCESS;
+        } else {
+            int fd = pImportSemaphoreFdInfo->fd;
+            int err = lseek(fd, 0, SEEK_SET);
+            if (err == -1) {
+                ALOGE("lseek fail on import semaphore");
+            }
+            int hostFd = 0;
+            read(fd, &hostFd, sizeof(hostFd));
+            VkImportSemaphoreFdInfoKHR tmpInfo = *pImportSemaphoreFdInfo;
+            tmpInfo.fd = hostFd;
+            VkResult result = enc->vkImportSemaphoreFdKHR(device, &tmpInfo);
+            close(fd);
+            return result;
         }
-        int hostFd = 0;
-        read(fd, &hostFd, sizeof(hostFd));
-        VkImportSemaphoreFdInfoKHR tmpInfo = *pImportSemaphoreFdInfo;
-        tmpInfo.fd = hostFd;
-        VkResult result = enc->vkImportSemaphoreFdKHR(device, &tmpInfo);
-        close(fd);
-        return result;
 #else
         (void)context;
         (void)input_result;