vulkan: Add skeleton swapchain support

Loader and driver entry points exist and the call chains are hooked up
properly, but functions are just empty stubs for now.

Change-Id: I6ff95e47d1d09ebed41eda8accb71686c8249546
(cherry picked from commit 038c8a740bbda4650bec776023a26a7fcbf93864)
diff --git a/vulkan/nulldrv/null_driver.cpp b/vulkan/nulldrv/null_driver.cpp
index 0a15818..766abc9 100644
--- a/vulkan/nulldrv/null_driver.cpp
+++ b/vulkan/nulldrv/null_driver.cpp
@@ -137,6 +137,11 @@
 
 VkResult CreateInstance(const VkInstanceCreateInfo* create_info,
                         VkInstance* out_instance) {
+    // Assume the loader provided alloc callbacks even if the app didn't.
+    ALOG_ASSERT(
+        !create_info->pAllocCb,
+        "Missing alloc callbacks, loader or app should have provided them");
+
     VkInstance_T* instance =
         static_cast<VkInstance_T*>(create_info->pAllocCb->pfnAlloc(
             create_info->pAllocCb->pUserData, sizeof(VkInstance_T),
@@ -231,7 +236,15 @@
 }
 
 PFN_vkVoidFunction GetDeviceProcAddr(VkDevice, const char* name) {
-    return LookupDeviceProcAddr(name);
+    PFN_vkVoidFunction proc = LookupDeviceProcAddr(name);
+    if (proc)
+        return proc;
+    if (strcmp(name, "vkImportNativeFenceANDROID") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(ImportNativeFenceANDROID);
+    if (strcmp(name, "vkQueueSignalNativeFenceANDROID") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            QueueSignalNativeFenceANDROID);
+    return nullptr;
 }
 
 // -----------------------------------------------------------------------------
@@ -1110,6 +1123,16 @@
 void CmdExecuteCommands(VkCmdBuffer cmdBuffer, uint32_t cmdBuffersCount, const VkCmdBuffer* pCmdBuffers) {
 }
 
+VkResult ImportNativeFenceANDROID(VkDevice device, VkSemaphore semaphore, int nativeFenceFd) {
+    ALOGV("TODO: vk%s", __FUNCTION__);
+    return VK_SUCCESS;
+}
+
+VkResult QueueSignalNativeFenceANDROID(VkQueue queue, int* pNativeFenceFd) {
+    ALOGV("TODO: vk%s", __FUNCTION__);
+    return VK_SUCCESS;
+}
+
 #pragma clang diagnostic pop
 // clang-format on
 
diff --git a/vulkan/nulldrv/null_driver.h b/vulkan/nulldrv/null_driver.h
index c6c7aa6..6bfbda5 100644
--- a/vulkan/nulldrv/null_driver.h
+++ b/vulkan/nulldrv/null_driver.h
@@ -19,6 +19,7 @@
 
 #define VK_PROTOTYPES
 #include <vulkan/vulkan.h>
+#include <vulkan/vk_ext_android_native_buffer.h>
 
 namespace null_driver {
 
@@ -177,6 +178,9 @@
 void CmdNextSubpass(VkCmdBuffer cmdBuffer, VkRenderPassContents contents);
 void CmdEndRenderPass(VkCmdBuffer cmdBuffer);
 void CmdExecuteCommands(VkCmdBuffer cmdBuffer, uint32_t cmdBuffersCount, const VkCmdBuffer* pCmdBuffers);
+
+VkResult ImportNativeFenceANDROID(VkDevice device, VkSemaphore semaphore, int nativeFenceFd);
+VkResult QueueSignalNativeFenceANDROID(VkQueue queue, int* pNativeFenceFd);
 // clang-format on
 
 }  // namespace null_driver