diff options
author | Yiwei Zhang <zzyiwei@google.com> | 2020-07-05 15:17:32 -0700 |
---|---|---|
committer | Yiwei Zhang <zzyiwei@google.com> | 2020-07-07 16:55:52 -0700 |
commit | e4f64170c9c754b7c87ce138a5d7493964bd9204 (patch) | |
tree | 7f2954b671422f81173467ba3b41262a3f6c76e3 /vulkan | |
parent | 7c0c07c4e86c5224e12fdff04f2ec4153dd288bb (diff) | |
download | native-e4f64170c9c754b7c87ce138a5d7493964bd9204.tar.gz |
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
Diffstat (limited to 'vulkan')
-rw-r--r-- | vulkan/libvulkan/driver.cpp | 17 | ||||
-rw-r--r-- | vulkan/libvulkan/driver_gen.cpp | 2 | ||||
-rw-r--r-- | vulkan/libvulkan/driver_gen.h | 2 | ||||
-rw-r--r-- | vulkan/scripts/driver_generator.py | 4 |
4 files changed, 21 insertions, 4 deletions
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index c48d1eebf7..f2712d1f99 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -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 { - result = data.driver.EnumeratePhysicalDeviceGroups( - instance, pPhysicalDeviceGroupCount, - pPhysicalDeviceGroupProperties); + 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++) { diff --git a/vulkan/libvulkan/driver_gen.cpp b/vulkan/libvulkan/driver_gen.cpp index 39fd15a6cc..36577c2622 100644 --- a/vulkan/libvulkan/driver_gen.cpp +++ b/vulkan/libvulkan/driver_gen.cpp @@ -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; diff --git a/vulkan/libvulkan/driver_gen.h b/vulkan/libvulkan/driver_gen.h index 4669c25dd8..dda9bb1194 100644 --- a/vulkan/libvulkan/driver_gen.h +++ b/vulkan/libvulkan/driver_gen.h @@ -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 }; diff --git a/vulkan/scripts/driver_generator.py b/vulkan/scripts/driver_generator.py index 5e78c62df8..1db1a3715b 100644 --- a/vulkan/scripts/driver_generator.py +++ b/vulkan/scripts/driver_generator.py @@ -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. |