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

Commit e4f64170 authored by Yiwei Zhang's avatar Yiwei Zhang
Browse files

libvulkan: fix support for 1.1 vkEnumeratePhysicalDeviceGroups

When the icd instance is 1.0, VK_KHR_device_group_creation will be
enabled by the loader if the extension is advertised. Then we will try
to use vkEnumeratePhysicalDeviceGroupsKHR as a fallback.

Bug: 160276146
Test: adb shell cmd gpu vkjson
Test: dEQP-VK.api.info.instance.physical_device_groups
Change-Id: I9e2d9af66e80244f1d43b54ac2800316200c0d00
parent 7c0c07c4
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -633,6 +633,7 @@ void CreateInfoWrapper::FilterExtension(const char* name) {
                hook_extensions_.set(ext_bit);
                break;
            case ProcHook::KHR_get_physical_device_properties2:
            case ProcHook::KHR_device_group_creation:
            case ProcHook::EXTENSION_UNKNOWN:
                // Extensions we don't need to do anything about at this level
                break;
@@ -689,6 +690,7 @@ void CreateInfoWrapper::FilterExtension(const char* name) {

            case ProcHook::KHR_android_surface:
            case ProcHook::KHR_get_physical_device_properties2:
            case ProcHook::KHR_device_group_creation:
            case ProcHook::KHR_get_surface_capabilities2:
            case ProcHook::KHR_surface:
            case ProcHook::EXT_debug_report:
@@ -1266,7 +1268,8 @@ VkResult EnumeratePhysicalDeviceGroups(
    VkResult result = VK_SUCCESS;
    const auto& data = GetData(instance);

    if (!data.driver.EnumeratePhysicalDeviceGroups) {
    if (!data.driver.EnumeratePhysicalDeviceGroups &&
        !data.driver.EnumeratePhysicalDeviceGroupsKHR) {
        uint32_t device_count = 0;
        result = EnumeratePhysicalDevices(instance, &device_count, nullptr);
        if (result < 0)
@@ -1298,9 +1301,15 @@ VkResult EnumeratePhysicalDeviceGroups(
            pPhysicalDeviceGroupProperties[i].subsetAllocation = 0;
        }
    } else {
        if (data.driver.EnumeratePhysicalDeviceGroups) {
            result = data.driver.EnumeratePhysicalDeviceGroups(
                instance, pPhysicalDeviceGroupCount,
                pPhysicalDeviceGroupProperties);
        } else {
            result = data.driver.EnumeratePhysicalDeviceGroupsKHR(
                instance, pPhysicalDeviceGroupCount,
                pPhysicalDeviceGroupProperties);
        }
        if ((result == VK_SUCCESS || result == VK_INCOMPLETE) &&
            *pPhysicalDeviceGroupCount && pPhysicalDeviceGroupProperties) {
            for (uint32_t i = 0; i < *pPhysicalDeviceGroupCount; i++) {
+2 −0
Original line number Diff line number Diff line
@@ -505,6 +505,7 @@ ProcHook::Extension GetProcHookExtension(const char* name) {
    if (strcmp(name, "VK_ANDROID_external_memory_android_hardware_buffer") == 0) return ProcHook::ANDROID_external_memory_android_hardware_buffer;
    if (strcmp(name, "VK_KHR_bind_memory2") == 0) return ProcHook::KHR_bind_memory2;
    if (strcmp(name, "VK_KHR_get_physical_device_properties2") == 0) return ProcHook::KHR_get_physical_device_properties2;
    if (strcmp(name, "VK_KHR_device_group_creation") == 0) return ProcHook::KHR_device_group_creation;
    // clang-format on
    return ProcHook::EXTENSION_UNKNOWN;
}
@@ -546,6 +547,7 @@ bool InitDriverTable(VkInstance instance,
    INIT_PROC(false, instance, GetPhysicalDeviceProperties2);
    INIT_PROC_EXT(KHR_get_physical_device_properties2, true, instance, GetPhysicalDeviceProperties2KHR);
    INIT_PROC(false, instance, EnumeratePhysicalDeviceGroups);
    INIT_PROC_EXT(KHR_device_group_creation, true, instance, EnumeratePhysicalDeviceGroupsKHR);
    // clang-format on

    return success;
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ struct ProcHook {
        ANDROID_external_memory_android_hardware_buffer,
        KHR_bind_memory2,
        KHR_get_physical_device_properties2,
        KHR_device_group_creation,

        EXTENSION_CORE_1_0,
        EXTENSION_CORE_1_1,
@@ -79,6 +80,7 @@ struct InstanceDriverTable {
    PFN_vkGetPhysicalDeviceProperties2 GetPhysicalDeviceProperties2;
    PFN_vkGetPhysicalDeviceProperties2KHR GetPhysicalDeviceProperties2KHR;
    PFN_vkEnumeratePhysicalDeviceGroups EnumeratePhysicalDeviceGroups;
    PFN_vkEnumeratePhysicalDeviceGroupsKHR EnumeratePhysicalDeviceGroupsKHR;
    // clang-format on
};

+4 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ _KNOWN_EXTENSIONS = _INTERCEPTED_EXTENSIONS + [
    'VK_ANDROID_external_memory_android_hardware_buffer',
    'VK_KHR_bind_memory2',
    'VK_KHR_get_physical_device_properties2',
    'VK_KHR_device_group_creation',
]

# Functions needed at vulkan::driver level.
@@ -77,6 +78,9 @@ _NEEDED_COMMANDS = [
    # VK_KHR_swapchain v69 requirement
    'vkBindImageMemory2',
    'vkBindImageMemory2KHR',

    # For promoted VK_KHR_device_group_creation
    'vkEnumeratePhysicalDeviceGroupsKHR',
]

# Functions intercepted at vulkan::driver level.