[vulkan] expose only appropriate function pointers

bug: 111137294
Change-Id: I552f1034c91d4c687d763b8cd14d4223c6eefcc4
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index a1b8c14..5769776 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -29,6 +29,7 @@
 
 #include <string>
 #include <unordered_map>
+#include <set>
 
 #include <log/log.h>
 #include <stdlib.h>
@@ -113,11 +114,18 @@
 
     GOLDFISH_VK_LIST_TRIVIAL_HANDLE_TYPES(HANDLE_DEFINE_TRIVIAL_INFO_STRUCT)
 
+    struct VkInstance_Info {
+        uint32_t highestApiVersion;
+        std::set<std::string> enabledExtensions;
+    };
+
     struct VkDevice_Info {
         VkPhysicalDevice physdev;
         VkPhysicalDeviceProperties props;
         VkPhysicalDeviceMemoryProperties memProps;
         HostMemAlloc hostMemAllocs[VK_MAX_MEMORY_TYPES] = {};
+        uint32_t apiVersion;
+        std::set<std::string> enabledExtensions;
     };
 
     struct VkDeviceMemory_Info {
@@ -148,6 +156,16 @@
     GOLDFISH_VK_LIST_HANDLE_TYPES(HANDLE_REGISTER_IMPL_IMPL)
     GOLDFISH_VK_LIST_TRIVIAL_HANDLE_TYPES(HANDLE_UNREGISTER_IMPL_IMPL)
 
+    void unregister_VkInstance(VkInstance instance) {
+        AutoLock lock(mLock);
+
+        auto it = info_VkInstance.find(instance);
+        if (it == info_VkInstance.end()) return;
+        auto info = it->second;
+        info_VkInstance.erase(instance);
+        lock.unlock();
+    }
+
     void unregister_VkDevice(VkDevice device) {
         AutoLock lock(mLock);
 
@@ -181,10 +199,30 @@
         info_VkDeviceMemory.erase(mem);
     }
 
+    // TODO: Upgrade to 1.1
+    static constexpr uint32_t kMaxApiVersion = VK_MAKE_VERSION(1, 0, 65);
+    static constexpr uint32_t kMinApiVersion = VK_MAKE_VERSION(1, 0, 0);
+
+    void setInstanceInfo(VkInstance instance,
+                         uint32_t enabledExtensionCount,
+                         const char* const* ppEnabledExtensionNames) {
+        AutoLock lock(mLock);
+        auto& info = info_VkInstance[instance];
+        info.highestApiVersion = kMaxApiVersion;
+
+        if (!ppEnabledExtensionNames) return;
+
+        for (uint32_t i = 0; i < enabledExtensionCount; ++i) {
+            info.enabledExtensions.insert(ppEnabledExtensionNames[i]);
+        }
+    }
+
     void setDeviceInfo(VkDevice device,
                        VkPhysicalDevice physdev,
                        VkPhysicalDeviceProperties props,
-                       VkPhysicalDeviceMemoryProperties memProps) {
+                       VkPhysicalDeviceMemoryProperties memProps,
+                       uint32_t enabledExtensionCount,
+                       const char* const* ppEnabledExtensionNames) {
         AutoLock lock(mLock);
         auto& info = info_VkDevice[device];
         info.physdev = physdev;
@@ -194,6 +232,13 @@
             physdev, &memProps,
             mFeatureInfo->hasDirectMem,
             &mHostVisibleMemoryVirtInfo);
+        info.apiVersion = props.apiVersion;
+
+        if (!ppEnabledExtensionNames) return;
+
+        for (uint32_t i = 0; i < enabledExtensionCount; ++i) {
+            info.enabledExtensions.insert(ppEnabledExtensionNames[i]);
+        }
     }
 
     void setDeviceMemoryInfo(VkDevice device,
@@ -425,7 +470,7 @@
         VkResult,
         uint32_t* apiVersion) {
         if (apiVersion) {
-            *apiVersion = VK_MAKE_VERSION(1, 0, 0);
+            *apiVersion = kMaxApiVersion;
         }
         return VK_SUCCESS;
     }
@@ -580,12 +625,28 @@
         }
     }
 
+    VkResult on_vkCreateInstance(
+        void*,
+        VkResult input_result,
+        const VkInstanceCreateInfo* createInfo,
+        const VkAllocationCallbacks*,
+        VkInstance* pInstance) {
+
+        if (input_result != VK_SUCCESS) return input_result;
+
+        setInstanceInfo(
+            *pInstance,
+            createInfo->enabledExtensionCount,
+            createInfo->ppEnabledExtensionNames);
+
+        return input_result;
+    }
 
     VkResult on_vkCreateDevice(
         void* context,
         VkResult input_result,
         VkPhysicalDevice physicalDevice,
-        const VkDeviceCreateInfo*,
+        const VkDeviceCreateInfo* pCreateInfo,
         const VkAllocationCallbacks*,
         VkDevice* pDevice) {
 
@@ -598,7 +659,9 @@
         enc->vkGetPhysicalDeviceProperties(physicalDevice, &props);
         enc->vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProps);
 
-        setDeviceInfo(*pDevice, physicalDevice, props, memProps);
+        setDeviceInfo(
+            *pDevice, physicalDevice, props, memProps,
+            pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames);
 
         return input_result;
     }
@@ -958,6 +1021,51 @@
         return input_result;
     }
 
+    uint32_t getApiVersionFromInstance(VkInstance instance) const {
+        AutoLock lock(mLock);
+        uint32_t api = kMinApiVersion;
+
+        auto it = info_VkInstance.find(instance);
+        if (it == info_VkInstance.end()) return api;
+
+        api = it->second.highestApiVersion;
+
+        return api;
+    }
+
+    uint32_t getApiVersionFromDevice(VkDevice device) const {
+        AutoLock lock(mLock);
+
+        uint32_t api = kMinApiVersion;
+
+        auto it = info_VkDevice.find(device);
+        if (it == info_VkDevice.end()) return api;
+
+        api = it->second.apiVersion;
+
+        return api;
+    }
+
+    bool hasInstanceExtension(VkInstance instance, const std::string& name) const {
+        AutoLock lock(mLock);
+
+        auto it = info_VkInstance.find(instance);
+        if (it == info_VkInstance.end()) return false;
+
+        return it->second.enabledExtensions.find(name) !=
+               it->second.enabledExtensions.end();
+    }
+
+    bool hasDeviceExtension(VkDevice device, const std::string& name) const {
+        AutoLock lock(mLock);
+
+        auto it = info_VkDevice.find(device);
+        if (it == info_VkDevice.end()) return false;
+
+        return it->second.enabledExtensions.find(name) !=
+               it->second.enabledExtensions.end();
+    }
+
 private:
     mutable Lock mLock;
     HostVisibleMemoryVirtualizationInfo mHostVisibleMemoryVirtInfo;
@@ -1002,14 +1110,6 @@
 
 GOLDFISH_VK_LIST_HANDLE_TYPES(HANDLE_REGISTER_IMPL)
 
-void ResourceTracker::setDeviceInfo(
-    VkDevice device,
-    VkPhysicalDevice physdev,
-    VkPhysicalDeviceProperties props,
-    VkPhysicalDeviceMemoryProperties memProps) {
-    mImpl->setDeviceInfo(device, physdev, props, memProps);
-}
-
 bool ResourceTracker::isMemoryTypeHostVisible(
     VkDevice device, uint32_t typeIndex) const {
     return mImpl->isMemoryTypeHostVisible(device, typeIndex);
@@ -1067,6 +1167,20 @@
         typeBits, typeBitsCount);
 }
 
+uint32_t ResourceTracker::getApiVersionFromInstance(VkInstance instance) const {
+    return mImpl->getApiVersionFromInstance(instance);
+}
+
+uint32_t ResourceTracker::getApiVersionFromDevice(VkDevice device) const {
+    return mImpl->getApiVersionFromDevice(device);
+}
+bool ResourceTracker::hasInstanceExtension(VkInstance instance, const std::string &name) const {
+    return mImpl->hasInstanceExtension(instance, name);
+}
+bool ResourceTracker::hasDeviceExtension(VkDevice device, const std::string &name) const {
+    return mImpl->hasDeviceExtension(device, name);
+}
+
 VkResult ResourceTracker::on_vkEnumerateInstanceVersion(
     void* context,
     VkResult input_result,
@@ -1119,6 +1233,16 @@
         context, physicalDevice, pMemoryProperties);
 }
 
+VkResult ResourceTracker::on_vkCreateInstance(
+    void* context,
+    VkResult input_result,
+    const VkInstanceCreateInfo* pCreateInfo,
+    const VkAllocationCallbacks* pAllocator,
+    VkInstance* pInstance) {
+    return mImpl->on_vkCreateInstance(
+        context, input_result, pCreateInfo, pAllocator, pInstance);
+}
+
 VkResult ResourceTracker::on_vkCreateDevice(
     void* context,
     VkResult input_result,