[vulkan] Incorporate resource tracker and resource-aware encoder

bug: 111137294
bug: 119104304
bug: 119157982

This CL updates the repo to include the newly autogenerated code for
resource tracker and encoder that is aware of resource management.

This contains an additional piece that is manually written:

- hal: Create the resource tracker when the Vulkan device is opened.

Change-Id: Ic2e20a1d6a994425c7e99372b85f8c42560979fb
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
new file mode 100644
index 0000000..3ab8514
--- /dev/null
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -0,0 +1,1080 @@
+// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Autogenerated module ResourceTracker
+// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// Please do not modify directly;
+// re-run android/scripts/generate-vulkan-sources.sh,
+// or directly from Python by defining:
+// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// CEREAL_OUTPUT_DIR: Where to put the generated sources.
+// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+
+#include "ResourceTracker.h"
+
+
+#include "Resources.h"
+
+
+namespace goldfish_vk {
+
+class CreateMapping : public VulkanHandleMapping {
+public:
+    virtual ~CreateMapping() { }
+    void mapHandles_VkBuffer(VkBuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkBuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkBufferView(VkBufferView* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkBufferView(handles[i]);
+        }
+    }
+    void mapHandles_VkCommandBuffer(VkCommandBuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkCommandBuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkCommandPool(VkCommandPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkCommandPool(handles[i]);
+        }
+    }
+    void mapHandles_VkDebugReportCallbackEXT(VkDebugReportCallbackEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDebugReportCallbackEXT(handles[i]);
+        }
+    }
+    void mapHandles_VkDebugUtilsMessengerEXT(VkDebugUtilsMessengerEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDebugUtilsMessengerEXT(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorPool(VkDescriptorPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDescriptorPool(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorSet(VkDescriptorSet* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDescriptorSet(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorSetLayout(VkDescriptorSetLayout* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDescriptorSetLayout(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorUpdateTemplate(VkDescriptorUpdateTemplate* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDescriptorUpdateTemplate(handles[i]);
+        }
+    }
+    void mapHandles_VkDevice(VkDevice* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDevice(handles[i]);
+        }
+    }
+    void mapHandles_VkDeviceMemory(VkDeviceMemory* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDeviceMemory(handles[i]);
+        }
+    }
+    void mapHandles_VkDisplayKHR(VkDisplayKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDisplayKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkDisplayModeKHR(VkDisplayModeKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkDisplayModeKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkEvent(VkEvent* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkEvent(handles[i]);
+        }
+    }
+    void mapHandles_VkFence(VkFence* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkFence(handles[i]);
+        }
+    }
+    void mapHandles_VkFramebuffer(VkFramebuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkFramebuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkImage(VkImage* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkImage(handles[i]);
+        }
+    }
+    void mapHandles_VkImageView(VkImageView* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkImageView(handles[i]);
+        }
+    }
+    void mapHandles_VkIndirectCommandsLayoutNVX(VkIndirectCommandsLayoutNVX* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkIndirectCommandsLayoutNVX(handles[i]);
+        }
+    }
+    void mapHandles_VkInstance(VkInstance* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkInstance(handles[i]);
+        }
+    }
+    void mapHandles_VkObjectTableNVX(VkObjectTableNVX* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkObjectTableNVX(handles[i]);
+        }
+    }
+    void mapHandles_VkPhysicalDevice(VkPhysicalDevice* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkPhysicalDevice(handles[i]);
+        }
+    }
+    void mapHandles_VkPipeline(VkPipeline* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkPipeline(handles[i]);
+        }
+    }
+    void mapHandles_VkPipelineCache(VkPipelineCache* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkPipelineCache(handles[i]);
+        }
+    }
+    void mapHandles_VkPipelineLayout(VkPipelineLayout* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkPipelineLayout(handles[i]);
+        }
+    }
+    void mapHandles_VkQueryPool(VkQueryPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkQueryPool(handles[i]);
+        }
+    }
+    void mapHandles_VkQueue(VkQueue* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkQueue(handles[i]);
+        }
+    }
+    void mapHandles_VkRenderPass(VkRenderPass* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkRenderPass(handles[i]);
+        }
+    }
+    void mapHandles_VkSampler(VkSampler* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkSampler(handles[i]);
+        }
+    }
+    void mapHandles_VkSamplerYcbcrConversion(VkSamplerYcbcrConversion* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkSamplerYcbcrConversion(handles[i]);
+        }
+    }
+    void mapHandles_VkSemaphore(VkSemaphore* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkSemaphore(handles[i]);
+        }
+    }
+    void mapHandles_VkShaderModule(VkShaderModule* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkShaderModule(handles[i]);
+        }
+    }
+    void mapHandles_VkSurfaceKHR(VkSurfaceKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkSurfaceKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkSwapchainKHR(VkSwapchainKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkSwapchainKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkValidationCacheEXT(VkValidationCacheEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = new_from_host_VkValidationCacheEXT(handles[i]);
+        }
+    }
+};
+class UnwrapMapping : public VulkanHandleMapping {
+public:
+    virtual ~UnwrapMapping() { }
+    void mapHandles_VkBuffer(VkBuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkBuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkBufferView(VkBufferView* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkBufferView(handles[i]);
+        }
+    }
+    void mapHandles_VkCommandBuffer(VkCommandBuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkCommandBuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkCommandPool(VkCommandPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkCommandPool(handles[i]);
+        }
+    }
+    void mapHandles_VkDebugReportCallbackEXT(VkDebugReportCallbackEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDebugReportCallbackEXT(handles[i]);
+        }
+    }
+    void mapHandles_VkDebugUtilsMessengerEXT(VkDebugUtilsMessengerEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDebugUtilsMessengerEXT(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorPool(VkDescriptorPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDescriptorPool(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorSet(VkDescriptorSet* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDescriptorSet(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorSetLayout(VkDescriptorSetLayout* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDescriptorSetLayout(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorUpdateTemplate(VkDescriptorUpdateTemplate* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDescriptorUpdateTemplate(handles[i]);
+        }
+    }
+    void mapHandles_VkDevice(VkDevice* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDevice(handles[i]);
+        }
+    }
+    void mapHandles_VkDeviceMemory(VkDeviceMemory* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDeviceMemory(handles[i]);
+        }
+    }
+    void mapHandles_VkDisplayKHR(VkDisplayKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDisplayKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkDisplayModeKHR(VkDisplayModeKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkDisplayModeKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkEvent(VkEvent* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkEvent(handles[i]);
+        }
+    }
+    void mapHandles_VkFence(VkFence* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkFence(handles[i]);
+        }
+    }
+    void mapHandles_VkFramebuffer(VkFramebuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkFramebuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkImage(VkImage* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkImage(handles[i]);
+        }
+    }
+    void mapHandles_VkImageView(VkImageView* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkImageView(handles[i]);
+        }
+    }
+    void mapHandles_VkIndirectCommandsLayoutNVX(VkIndirectCommandsLayoutNVX* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkIndirectCommandsLayoutNVX(handles[i]);
+        }
+    }
+    void mapHandles_VkInstance(VkInstance* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkInstance(handles[i]);
+        }
+    }
+    void mapHandles_VkObjectTableNVX(VkObjectTableNVX* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkObjectTableNVX(handles[i]);
+        }
+    }
+    void mapHandles_VkPhysicalDevice(VkPhysicalDevice* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkPhysicalDevice(handles[i]);
+        }
+    }
+    void mapHandles_VkPipeline(VkPipeline* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkPipeline(handles[i]);
+        }
+    }
+    void mapHandles_VkPipelineCache(VkPipelineCache* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkPipelineCache(handles[i]);
+        }
+    }
+    void mapHandles_VkPipelineLayout(VkPipelineLayout* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkPipelineLayout(handles[i]);
+        }
+    }
+    void mapHandles_VkQueryPool(VkQueryPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkQueryPool(handles[i]);
+        }
+    }
+    void mapHandles_VkQueue(VkQueue* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkQueue(handles[i]);
+        }
+    }
+    void mapHandles_VkRenderPass(VkRenderPass* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkRenderPass(handles[i]);
+        }
+    }
+    void mapHandles_VkSampler(VkSampler* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkSampler(handles[i]);
+        }
+    }
+    void mapHandles_VkSamplerYcbcrConversion(VkSamplerYcbcrConversion* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkSamplerYcbcrConversion(handles[i]);
+        }
+    }
+    void mapHandles_VkSemaphore(VkSemaphore* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkSemaphore(handles[i]);
+        }
+    }
+    void mapHandles_VkShaderModule(VkShaderModule* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkShaderModule(handles[i]);
+        }
+    }
+    void mapHandles_VkSurfaceKHR(VkSurfaceKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkSurfaceKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkSwapchainKHR(VkSwapchainKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkSwapchainKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkValidationCacheEXT(VkValidationCacheEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            handles[i] = get_host_VkValidationCacheEXT(handles[i]);
+        }
+    }
+};
+class DestroyMapping : public VulkanHandleMapping {
+public:
+    virtual ~DestroyMapping() { }
+    void mapHandles_VkBuffer(VkBuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkBuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkBufferView(VkBufferView* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkBufferView(handles[i]);
+        }
+    }
+    void mapHandles_VkCommandBuffer(VkCommandBuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkCommandBuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkCommandPool(VkCommandPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkCommandPool(handles[i]);
+        }
+    }
+    void mapHandles_VkDebugReportCallbackEXT(VkDebugReportCallbackEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDebugReportCallbackEXT(handles[i]);
+        }
+    }
+    void mapHandles_VkDebugUtilsMessengerEXT(VkDebugUtilsMessengerEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDebugUtilsMessengerEXT(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorPool(VkDescriptorPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDescriptorPool(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorSet(VkDescriptorSet* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDescriptorSet(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorSetLayout(VkDescriptorSetLayout* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDescriptorSetLayout(handles[i]);
+        }
+    }
+    void mapHandles_VkDescriptorUpdateTemplate(VkDescriptorUpdateTemplate* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDescriptorUpdateTemplate(handles[i]);
+        }
+    }
+    void mapHandles_VkDevice(VkDevice* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDevice(handles[i]);
+        }
+    }
+    void mapHandles_VkDeviceMemory(VkDeviceMemory* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDeviceMemory(handles[i]);
+        }
+    }
+    void mapHandles_VkDisplayKHR(VkDisplayKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDisplayKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkDisplayModeKHR(VkDisplayModeKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkDisplayModeKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkEvent(VkEvent* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkEvent(handles[i]);
+        }
+    }
+    void mapHandles_VkFence(VkFence* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkFence(handles[i]);
+        }
+    }
+    void mapHandles_VkFramebuffer(VkFramebuffer* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkFramebuffer(handles[i]);
+        }
+    }
+    void mapHandles_VkImage(VkImage* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkImage(handles[i]);
+        }
+    }
+    void mapHandles_VkImageView(VkImageView* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkImageView(handles[i]);
+        }
+    }
+    void mapHandles_VkIndirectCommandsLayoutNVX(VkIndirectCommandsLayoutNVX* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkIndirectCommandsLayoutNVX(handles[i]);
+        }
+    }
+    void mapHandles_VkInstance(VkInstance* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkInstance(handles[i]);
+        }
+    }
+    void mapHandles_VkObjectTableNVX(VkObjectTableNVX* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkObjectTableNVX(handles[i]);
+        }
+    }
+    void mapHandles_VkPhysicalDevice(VkPhysicalDevice* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkPhysicalDevice(handles[i]);
+        }
+    }
+    void mapHandles_VkPipeline(VkPipeline* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkPipeline(handles[i]);
+        }
+    }
+    void mapHandles_VkPipelineCache(VkPipelineCache* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkPipelineCache(handles[i]);
+        }
+    }
+    void mapHandles_VkPipelineLayout(VkPipelineLayout* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkPipelineLayout(handles[i]);
+        }
+    }
+    void mapHandles_VkQueryPool(VkQueryPool* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkQueryPool(handles[i]);
+        }
+    }
+    void mapHandles_VkQueue(VkQueue* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkQueue(handles[i]);
+        }
+    }
+    void mapHandles_VkRenderPass(VkRenderPass* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkRenderPass(handles[i]);
+        }
+    }
+    void mapHandles_VkSampler(VkSampler* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkSampler(handles[i]);
+        }
+    }
+    void mapHandles_VkSamplerYcbcrConversion(VkSamplerYcbcrConversion* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkSamplerYcbcrConversion(handles[i]);
+        }
+    }
+    void mapHandles_VkSemaphore(VkSemaphore* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkSemaphore(handles[i]);
+        }
+    }
+    void mapHandles_VkShaderModule(VkShaderModule* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkShaderModule(handles[i]);
+        }
+    }
+    void mapHandles_VkSurfaceKHR(VkSurfaceKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkSurfaceKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkSwapchainKHR(VkSwapchainKHR* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkSwapchainKHR(handles[i]);
+        }
+    }
+    void mapHandles_VkValidationCacheEXT(VkValidationCacheEXT* handles, size_t count) override
+    {
+        for (size_t i = 0; i < count; ++i)
+        {
+            delete_goldfish_VkValidationCacheEXT(handles[i]);
+        }
+    }
+};
+
+class ResourceTracker::Impl {
+public:
+    Impl() = default;
+    CreateMapping createMapping;
+    UnwrapMapping unwrapMapping;
+    DestroyMapping destroyMapping;
+};
+
+ResourceTracker::ResourceTracker() : mImpl(new ResourceTracker::Impl()) { }
+ResourceTracker::~ResourceTracker() { }
+
+VulkanHandleMapping* ResourceTracker::createMapping() {
+    return &mImpl->createMapping;
+}
+
+VulkanHandleMapping* ResourceTracker::unwrapMapping() {
+    return &mImpl->unwrapMapping;
+}
+
+VulkanHandleMapping* ResourceTracker::destroyMapping() {
+    return &mImpl->destroyMapping;
+}
+
+static ResourceTracker* sTracker = nullptr;
+
+// static
+ResourceTracker* ResourceTracker::get() {
+    if (!sTracker) {
+        // To be initialized once on vulkan device open.
+        sTracker = new ResourceTracker;
+    }
+    return sTracker;
+}
+#ifdef VK_VERSION_1_0
+#endif
+#ifdef VK_VERSION_1_1
+#endif
+#ifdef VK_KHR_surface
+#endif
+#ifdef VK_KHR_swapchain
+#endif
+#ifdef VK_KHR_display
+#endif
+#ifdef VK_KHR_display_swapchain
+#endif
+#ifdef VK_KHR_xlib_surface
+#endif
+#ifdef VK_KHR_xcb_surface
+#endif
+#ifdef VK_KHR_wayland_surface
+#endif
+#ifdef VK_KHR_mir_surface
+#endif
+#ifdef VK_KHR_android_surface
+#endif
+#ifdef VK_KHR_win32_surface
+#endif
+#ifdef VK_KHR_sampler_mirror_clamp_to_edge
+#endif
+#ifdef VK_KHR_multiview
+#endif
+#ifdef VK_KHR_get_physical_device_properties2
+#endif
+#ifdef VK_KHR_device_group
+#endif
+#ifdef VK_KHR_shader_draw_parameters
+#endif
+#ifdef VK_KHR_maintenance1
+#endif
+#ifdef VK_KHR_device_group_creation
+#endif
+#ifdef VK_KHR_external_memory_capabilities
+#endif
+#ifdef VK_KHR_external_memory
+#endif
+#ifdef VK_KHR_external_memory_win32
+#endif
+#ifdef VK_KHR_external_memory_fd
+#endif
+#ifdef VK_KHR_win32_keyed_mutex
+#endif
+#ifdef VK_KHR_external_semaphore_capabilities
+#endif
+#ifdef VK_KHR_external_semaphore
+#endif
+#ifdef VK_KHR_external_semaphore_win32
+#endif
+#ifdef VK_KHR_external_semaphore_fd
+#endif
+#ifdef VK_KHR_push_descriptor
+#endif
+#ifdef VK_KHR_16bit_storage
+#endif
+#ifdef VK_KHR_incremental_present
+#endif
+#ifdef VK_KHR_descriptor_update_template
+#endif
+#ifdef VK_KHR_create_renderpass2
+#endif
+#ifdef VK_KHR_shared_presentable_image
+#endif
+#ifdef VK_KHR_external_fence_capabilities
+#endif
+#ifdef VK_KHR_external_fence
+#endif
+#ifdef VK_KHR_external_fence_win32
+#endif
+#ifdef VK_KHR_external_fence_fd
+#endif
+#ifdef VK_KHR_maintenance2
+#endif
+#ifdef VK_KHR_get_surface_capabilities2
+#endif
+#ifdef VK_KHR_variable_pointers
+#endif
+#ifdef VK_KHR_get_display_properties2
+#endif
+#ifdef VK_KHR_dedicated_allocation
+#endif
+#ifdef VK_KHR_storage_buffer_storage_class
+#endif
+#ifdef VK_KHR_relaxed_block_layout
+#endif
+#ifdef VK_KHR_get_memory_requirements2
+#endif
+#ifdef VK_KHR_image_format_list
+#endif
+#ifdef VK_KHR_sampler_ycbcr_conversion
+#endif
+#ifdef VK_KHR_bind_memory2
+#endif
+#ifdef VK_KHR_maintenance3
+#endif
+#ifdef VK_KHR_draw_indirect_count
+#endif
+#ifdef VK_KHR_8bit_storage
+#endif
+#ifdef VK_EXT_debug_report
+#endif
+#ifdef VK_NV_glsl_shader
+#endif
+#ifdef VK_EXT_depth_range_unrestricted
+#endif
+#ifdef VK_IMG_filter_cubic
+#endif
+#ifdef VK_AMD_rasterization_order
+#endif
+#ifdef VK_AMD_shader_trinary_minmax
+#endif
+#ifdef VK_AMD_shader_explicit_vertex_parameter
+#endif
+#ifdef VK_EXT_debug_marker
+#endif
+#ifdef VK_AMD_gcn_shader
+#endif
+#ifdef VK_NV_dedicated_allocation
+#endif
+#ifdef VK_AMD_draw_indirect_count
+#endif
+#ifdef VK_AMD_negative_viewport_height
+#endif
+#ifdef VK_AMD_gpu_shader_half_float
+#endif
+#ifdef VK_AMD_shader_ballot
+#endif
+#ifdef VK_AMD_texture_gather_bias_lod
+#endif
+#ifdef VK_AMD_shader_info
+#endif
+#ifdef VK_AMD_shader_image_load_store_lod
+#endif
+#ifdef VK_IMG_format_pvrtc
+#endif
+#ifdef VK_NV_external_memory_capabilities
+#endif
+#ifdef VK_NV_external_memory
+#endif
+#ifdef VK_NV_external_memory_win32
+#endif
+#ifdef VK_NV_win32_keyed_mutex
+#endif
+#ifdef VK_EXT_validation_flags
+#endif
+#ifdef VK_NN_vi_surface
+#endif
+#ifdef VK_EXT_shader_subgroup_ballot
+#endif
+#ifdef VK_EXT_shader_subgroup_vote
+#endif
+#ifdef VK_EXT_conditional_rendering
+#endif
+#ifdef VK_NVX_device_generated_commands
+#endif
+#ifdef VK_NV_clip_space_w_scaling
+#endif
+#ifdef VK_EXT_direct_mode_display
+#endif
+#ifdef VK_EXT_acquire_xlib_display
+#endif
+#ifdef VK_EXT_display_surface_counter
+#endif
+#ifdef VK_EXT_display_control
+#endif
+#ifdef VK_GOOGLE_display_timing
+#endif
+#ifdef VK_NV_sample_mask_override_coverage
+#endif
+#ifdef VK_NV_geometry_shader_passthrough
+#endif
+#ifdef VK_NV_viewport_array2
+#endif
+#ifdef VK_NVX_multiview_per_view_attributes
+#endif
+#ifdef VK_NV_viewport_swizzle
+#endif
+#ifdef VK_EXT_discard_rectangles
+#endif
+#ifdef VK_EXT_conservative_rasterization
+#endif
+#ifdef VK_EXT_swapchain_colorspace
+#endif
+#ifdef VK_EXT_hdr_metadata
+#endif
+#ifdef VK_MVK_ios_surface
+#endif
+#ifdef VK_MVK_macos_surface
+#endif
+#ifdef VK_EXT_external_memory_dma_buf
+#endif
+#ifdef VK_EXT_queue_family_foreign
+#endif
+#ifdef VK_EXT_debug_utils
+#endif
+#ifdef VK_ANDROID_external_memory_android_hardware_buffer
+#endif
+#ifdef VK_EXT_sampler_filter_minmax
+#endif
+#ifdef VK_AMD_gpu_shader_int16
+#endif
+#ifdef VK_AMD_mixed_attachment_samples
+#endif
+#ifdef VK_AMD_shader_fragment_mask
+#endif
+#ifdef VK_EXT_shader_stencil_export
+#endif
+#ifdef VK_EXT_sample_locations
+#endif
+#ifdef VK_EXT_blend_operation_advanced
+#endif
+#ifdef VK_NV_fragment_coverage_to_color
+#endif
+#ifdef VK_NV_framebuffer_mixed_samples
+#endif
+#ifdef VK_NV_fill_rectangle
+#endif
+#ifdef VK_EXT_post_depth_coverage
+#endif
+#ifdef VK_EXT_validation_cache
+#endif
+#ifdef VK_EXT_descriptor_indexing
+#endif
+#ifdef VK_EXT_shader_viewport_index_layer
+#endif
+#ifdef VK_EXT_global_priority
+#endif
+#ifdef VK_EXT_external_memory_host
+#endif
+#ifdef VK_AMD_buffer_marker
+#endif
+#ifdef VK_AMD_shader_core_properties
+#endif
+#ifdef VK_EXT_vertex_attribute_divisor
+#endif
+#ifdef VK_NV_shader_subgroup_partitioned
+#endif
+#ifdef VK_NV_device_diagnostic_checkpoints
+#endif
+
+} // namespace goldfish_vk