Merge "[vulkan] Fix GoldfishAddressSpaceHostMemoryAllocator build on Fuchsia"
diff --git a/Android.mk b/Android.mk
index 240c657..9235b63 100644
--- a/Android.mk
+++ b/Android.mk
@@ -72,7 +72,6 @@
 GOLDFISH_OPENGL_SHOULD_BUILD := true
 
 EMUGL_COMMON_CFLAGS += -DPLATFORM_SDK_VERSION=$(PLATFORM_SDK_VERSION)
-EMUGL_COMMON_CFLAGS += -DPLATFORM_VERSION=$(PLATFORM_VERSION)
 
 ifeq (O, $(PLATFORM_VERSION_CODENAME))
 EMUGL_COMMON_CFLAGS += -DGOLDFISH_HIDL_GRALLOC
diff --git a/system/gralloc/gralloc.cpp b/system/gralloc/gralloc.cpp
index 3d08158..725848e 100644
--- a/system/gralloc/gralloc.cpp
+++ b/system/gralloc/gralloc.cpp
@@ -1553,6 +1553,10 @@
         lock: gralloc_lock,
         unlock: gralloc_unlock,
         perform: NULL,
+#if PLATFORM_SDK_VERSION >= 29 // For Q and later
+        validateBufferSize: NULL,
+        getTransportSize: NULL,
+#endif // PLATFORM_SDK_VERSION >= 29
 #if PLATFORM_SDK_VERSION >= 18
         lock_ycbcr: gralloc_lock_ycbcr,
 #endif // PLATFORM_SDK_VERSION >= 18
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index c694ff8..5141bef 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -27,19 +27,10 @@
 
 #include "func_table.h"
 
-#include <array>
-#include <bitset>
-#include <mutex>
-
 // Used when there is no Vulkan support on the host.
 // Copied from frameworks/native/vulkan/libvulkan/stubhal.cpp
 namespace vkstubhal {
 
-const size_t kMaxInstances = 32;
-static std::mutex g_instance_mutex;
-static std::bitset<kMaxInstances> g_instance_used(false);
-static std::array<hwvulkan_dispatch_t, kMaxInstances> g_instances;
-
 [[noreturn]] VKAPI_ATTR void NoOp() {
     LOG_ALWAYS_FATAL("invalid stub function called");
 }
@@ -65,28 +56,19 @@
                         const VkAllocationCallbacks* /*allocator*/,
                         VkInstance* instance) {
     AEMU_SCOPED_TRACE("vkstubhal::CreateInstance");
-    std::lock_guard<std::mutex> lock(g_instance_mutex);
-    for (size_t i = 0; i < kMaxInstances; i++) {
-        if (!g_instance_used[i]) {
-            g_instance_used[i] = true;
-            g_instances[i].magic = HWVULKAN_DISPATCH_MAGIC;
-            *instance = reinterpret_cast<VkInstance>(&g_instances[i]);
-            return VK_SUCCESS;
-        }
-    }
-    ALOGE("no more instances available (max=%zu)", kMaxInstances);
-    return VK_ERROR_INITIALIZATION_FAILED;
+    auto dispatch = new hwvulkan_dispatch_t;
+    dispatch->magic = HWVULKAN_DISPATCH_MAGIC;
+    *instance = reinterpret_cast<VkInstance>(dispatch);
+    return VK_SUCCESS;
 }
 
 void DestroyInstance(VkInstance instance,
                      const VkAllocationCallbacks* /*allocator*/) {
     AEMU_SCOPED_TRACE("vkstubhal::DestroyInstance");
-    std::lock_guard<std::mutex> lock(g_instance_mutex);
-    ssize_t idx =
-        reinterpret_cast<hwvulkan_dispatch_t*>(instance) - &g_instances[0];
-    ALOG_ASSERT(idx >= 0 && static_cast<size_t>(idx) < g_instance_used.size(),
+    auto dispatch = reinterpret_cast<hwvulkan_dispatch_t*>(instance);
+    ALOG_ASSERT(dispatch->magic == HWVULKAN_DISPATCH_MAGIC,
                 "DestroyInstance: invalid instance handle");
-    g_instance_used[static_cast<size_t>(idx)] = false;
+    delete dispatch;
 }
 
 VkResult EnumeratePhysicalDevices(VkInstance /*instance*/,