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);