libvulkan: Return error if an unsupported instance extension is requested

Change-Id: I93d4a2a0b991682160c0ffe401f2b2b19f6e2be3
(cherry picked from commit 8a69c0845de6884377da2221ae3272b8dac03d55)
diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
index be0ce03..ee1e9ac 100644
--- a/vulkan/libvulkan/loader.cpp
+++ b/vulkan/libvulkan/loader.cpp
@@ -529,13 +529,33 @@
         const char** names =
             static_cast<const char**>(alloca(max_names * sizeof(char*)));
         for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) {
-            InstanceExtension id = InstanceExtensionFromName(
-                create_info->ppEnabledExtensionNames[i]);
-            if (id != kInstanceExtensionCount &&
-                g_driver_instance_extensions[id]) {
-                names[driver_create_info.enabledExtensionCount++] =
-                    create_info->ppEnabledExtensionNames[i];
-                enabled_extensions.set(id);
+            const char* name = create_info->ppEnabledExtensionNames[i];
+            InstanceExtension id = InstanceExtensionFromName(name);
+            if (id != kInstanceExtensionCount) {
+                if (g_driver_instance_extensions[id]) {
+                    names[driver_create_info.enabledExtensionCount++] = name;
+                    enabled_extensions.set(id);
+                    continue;
+                }
+                if (id == kKHR_surface || id == kKHR_android_surface ||
+                    id == kEXT_debug_report) {
+                    enabled_extensions.set(id);
+                    continue;
+                }
+            }
+
+            bool supported = false;
+            for (const auto& layer : instance.active_layers) {
+                if (layer.SupportsExtension(name))
+                    supported = true;
+            }
+            if (!supported) {
+                ALOGE(
+                    "requested instance extension '%s' not supported by "
+                    "loader, driver, or any active layers",
+                    name);
+                DestroyInstance_Bottom(instance.handle, allocator);
+                return VK_ERROR_EXTENSION_NOT_PRESENT;
             }
         }
         driver_create_info.ppEnabledExtensionNames = names;
@@ -806,17 +826,20 @@
         alloca(create_info->enabledExtensionCount * sizeof(const char*)));
     for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) {
         const char* name = create_info->ppEnabledExtensionNames[i];
-
         DeviceExtension id = DeviceExtensionFromName(name);
-        if (id < kDeviceExtensionCount &&
-            (instance.physical_device_driver_extensions[gpu_idx][id] ||
-             id == kKHR_swapchain)) {
-            if (id == kKHR_swapchain)
-                name = VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME;
-            driver_extensions[num_driver_extensions++] = name;
-            continue;
+        if (id != kDeviceExtensionCount) {
+            if (instance.physical_device_driver_extensions[gpu_idx][id]) {
+                driver_extensions[num_driver_extensions++] = name;
+                continue;
+            }
+            if (id == kKHR_swapchain &&
+                instance.physical_device_driver_extensions
+                    [gpu_idx][kANDROID_native_buffer]) {
+                driver_extensions[num_driver_extensions++] =
+                    VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME;
+                continue;
+            }
         }
-
         bool supported = false;
         for (const auto& layer : device->active_layers) {
             if (layer.SupportsExtension(name))
@@ -824,8 +847,8 @@
         }
         if (!supported) {
             ALOGE(
-                "requested device extension '%s' not supported by driver or "
-                "any active layers",
+                "requested device extension '%s' not supported by loader, "
+                "driver, or any active layers",
                 name);
             DestroyDevice(device);
             return VK_ERROR_EXTENSION_NOT_PRESENT;
diff --git a/vulkan/tools/vkinfo.cpp b/vulkan/tools/vkinfo.cpp
index a2f4e8f..6a63667 100644
--- a/vulkan/tools/vkinfo.cpp
+++ b/vulkan/tools/vkinfo.cpp
@@ -202,10 +202,11 @@
                                     &info->layer_extensions[i]);
     }
 
-    const std::array<const char*, 1> kDesiredExtensions = {
-        {VK_EXT_DEBUG_REPORT_EXTENSION_NAME},
+    const char* kDesiredExtensions[] = {
+        VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
     };
-    const char* extensions[kDesiredExtensions.size()];
+    const char*
+        extensions[sizeof(kDesiredExtensions) / sizeof(kDesiredExtensions[0])];
     uint32_t num_extensions = 0;
     for (const auto& desired_ext : kDesiredExtensions) {
         bool available = HasExtension(info->extensions, desired_ext);