Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae3b70de authored by Jesse Hall's avatar Jesse Hall
Browse files

libvulkan: Return error if an unsupported instance extension is requested

Change-Id: I93d4a2a0b991682160c0ffe401f2b2b19f6e2be3
(cherry picked from commit 8a69c0845de6884377da2221ae3272b8dac03d55)
parent c55fa944
Loading
Loading
Loading
Loading
+41 −18
Original line number Diff line number Diff line
@@ -529,13 +529,33 @@ VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info,
        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];
            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 @@ VkResult CreateDevice_Bottom(VkPhysicalDevice gpu,
        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;
        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 @@ VkResult CreateDevice_Bottom(VkPhysicalDevice gpu,
        }
        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;
+4 −3
Original line number Diff line number Diff line
@@ -202,10 +202,11 @@ void GatherInfo(VulkanInfo* info) {
                                    &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);