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

Commit 4b62e4fd authored by Jesse Hall's avatar Jesse Hall
Browse files

libvulkan: Fix dEQP-VK.api.device_init.create_instance_unsupported_extensions

The existing check was only executed if the driver reported at least
one instance extension, because it was part of filtering the extension
list down to just the ones supported by the driver. Now do it
separately, and before we do anything else.

Also changed the null driver to not report any extensions; reporting
an extension masked the bug for me when I ran this test before.

Change-Id: I2b62229c6acbc9406c036f1f1b766a21c03922d4
(cherry picked from commit 1f7e9e0e771ac4045c5f669290dc01b01dd01342)
parent 54e6f086
Loading
Loading
Loading
Loading
+40 −28
Original line number Original line Diff line number Diff line
@@ -515,25 +515,15 @@ VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info,
    Instance& instance = GetDispatchParent(*vkinstance);
    Instance& instance = GetDispatchParent(*vkinstance);
    VkResult result;
    VkResult result;


    VkInstanceCreateInfo driver_create_info = *create_info;
    // Check that all enabled extensions are supported
    driver_create_info.enabledLayerCount = 0;
    driver_create_info.ppEnabledLayerNames = nullptr;

    InstanceExtensionSet enabled_extensions;
    InstanceExtensionSet enabled_extensions;
    driver_create_info.enabledExtensionCount = 0;
    uint32_t num_driver_extensions = 0;
    driver_create_info.ppEnabledExtensionNames = nullptr;
    size_t max_names =
        std::min(static_cast<size_t>(create_info->enabledExtensionCount),
                 g_driver_instance_extensions.count());
    if (max_names > 0) {
        const char** names =
            static_cast<const char**>(alloca(max_names * sizeof(char*)));
    for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) {
    for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) {
        const char* name = create_info->ppEnabledExtensionNames[i];
        const char* name = create_info->ppEnabledExtensionNames[i];
        InstanceExtension id = InstanceExtensionFromName(name);
        InstanceExtension id = InstanceExtensionFromName(name);
        if (id != kInstanceExtensionCount) {
        if (id != kInstanceExtensionCount) {
            if (g_driver_instance_extensions[id]) {
            if (g_driver_instance_extensions[id]) {
                    names[driver_create_info.enabledExtensionCount++] = name;
                num_driver_extensions++;
                enabled_extensions.set(id);
                enabled_extensions.set(id);
                continue;
                continue;
            }
            }
@@ -543,7 +533,6 @@ VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info,
                continue;
                continue;
            }
            }
        }
        }

        bool supported = false;
        bool supported = false;
        for (const auto& layer : instance.active_layers) {
        for (const auto& layer : instance.active_layers) {
            if (layer.SupportsExtension(name))
            if (layer.SupportsExtension(name))
@@ -558,7 +547,30 @@ VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info,
            return VK_ERROR_EXTENSION_NOT_PRESENT;
            return VK_ERROR_EXTENSION_NOT_PRESENT;
        }
        }
    }
    }

    VkInstanceCreateInfo driver_create_info = *create_info;
    driver_create_info.enabledLayerCount = 0;
    driver_create_info.ppEnabledLayerNames = nullptr;
    driver_create_info.enabledExtensionCount = 0;
    driver_create_info.ppEnabledExtensionNames = nullptr;
    if (num_driver_extensions > 0) {
        const char** names = static_cast<const char**>(
            alloca(num_driver_extensions * sizeof(char*)));
        for (uint32_t i = 0; i < create_info->enabledExtensionCount; 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;
                    continue;
                }
            }
        }
        driver_create_info.ppEnabledExtensionNames = names;
        driver_create_info.ppEnabledExtensionNames = names;
        ALOG_ASSERT(
            driver_create_info.enabledExtensionCount == num_driver_extensions,
            "counted enabled driver instance extensions twice and got "
            "different answers!");
    }
    }


    result = g_hwdevice->CreateInstance(&driver_create_info, instance.alloc,
    result = g_hwdevice->CreateInstance(&driver_create_info, instance.alloc,
+8 −2
Original line number Original line Diff line number Diff line
@@ -214,10 +214,15 @@ VkResult EnumerateInstanceExtensionProperties(
            "Driver vkEnumerateInstanceExtensionProperties shouldn't be called "
            "Driver vkEnumerateInstanceExtensionProperties shouldn't be called "
            "with a layer name ('%s')",
            "with a layer name ('%s')",
            layer_name);
            layer_name);
        *count = 0;
        return VK_SUCCESS;
    }
    }


// NOTE: Change this to zero to report and extension, which can be useful
// for testing changes to the loader.
#if 1
    (void)properties;  // unused
    *count = 0;
    return VK_SUCCESS;
#else
    const VkExtensionProperties kExtensions[] = {
    const VkExtensionProperties kExtensions[] = {
        {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
        {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
    const uint32_t kExtensionsCount =
    const uint32_t kExtensionsCount =
@@ -228,6 +233,7 @@ VkResult EnumerateInstanceExtensionProperties(
    if (properties)
    if (properties)
        std::copy(kExtensions, kExtensions + *count, properties);
        std::copy(kExtensions, kExtensions + *count, properties);
    return *count < kExtensionsCount ? VK_INCOMPLETE : VK_SUCCESS;
    return *count < kExtensionsCount ? VK_INCOMPLETE : VK_SUCCESS;
#endif
}
}


VKAPI_ATTR
VKAPI_ATTR