vulkan: allow drivers to see image acquire/release

Change-Id: I8143aeebd1f65142486cc55662c685d081ba41eb
(cherry picked from commit 58b4df743ecad9f1a0fc7cb7c0f5340dd8365308)
diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp
index 6d9f6c8..53c13a9 100644
--- a/vulkan/libvulkan/swapchain.cpp
+++ b/vulkan/libvulkan/swapchain.cpp
@@ -588,14 +588,24 @@
     }
 
     const DeviceVtbl& driver_vtbl = GetDriverVtbl(device);
-    result =
-        driver_vtbl.ImportNativeFenceANDROID(device, semaphore, fence_clone);
+    if (driver_vtbl.AcquireImageANDROID) {
+        result = driver_vtbl.AcquireImageANDROID(
+            device, swapchain.images[idx].image, fence_clone, semaphore);
+    } else {
+        ALOG_ASSERT(driver_vtbl.ImportNativeFenceANDROID,
+                    "Have neither vkAcquireImageANDROID nor "
+                    "vkImportNativeFenceANDROID");
+        result = driver_vtbl.ImportNativeFenceANDROID(device, semaphore,
+                                                      fence_clone);
+    }
     if (result != VK_SUCCESS) {
-        // NOTE: we're relying on ImportNativeFenceANDROID to close
-        // fence_clone, even if the call fails. We could close it ourselves on
-        // failure, but that would create a race condition if the driver closes
-        // it on a failure path. We must assume one of: the driver *always*
-        // closes it even on failure, or *never* closes it on failure.
+        // NOTE: we're relying on AcquireImageANDROID to close fence_clone,
+        // even if the call fails. We could close it ourselves on failure, but
+        // that would create a race condition if the driver closes it on a
+        // failure path: some other thread might create an fd with the same
+        // number between the time the driver closes it and the time we close
+        // it. We must assume one of: the driver *always* closes it even on
+        // failure, or *never* closes it on failure.
         swapchain.window->cancelBuffer(swapchain.window.get(), buffer, fence);
         swapchain.images[idx].dequeued = false;
         swapchain.images[idx].dequeue_fence = -1;
@@ -627,9 +637,17 @@
         int err;
 
         int fence = -1;
-        result = driver_vtbl.QueueSignalNativeFenceANDROID(queue, &fence);
+        if (driver_vtbl.QueueSignalReleaseImageANDROID) {
+            result = driver_vtbl.QueueSignalReleaseImageANDROID(
+                queue, img.image, &fence);
+        } else {
+            ALOG_ASSERT(driver_vtbl.QueueSignalNativeFenceANDROID,
+                        "Have neither vkQueueSignalReleaseImageANDROID nor "
+                        "vkQueueSignalNativeFenceANDROID");
+            result = driver_vtbl.QueueSignalNativeFenceANDROID(queue, &fence);
+        }
         if (result != VK_SUCCESS) {
-            ALOGE("vkQueueSignalNativeFenceANDROID failed: %d", result);
+            ALOGE("QueueSignalReleaseImageANDROID failed: %d", result);
             if (final_result == VK_SUCCESS)
                 final_result = result;
             // TODO(jessehall): What happens to the buffer here? Does the app