summaryrefslogtreecommitdiff
path: root/vulkan
diff options
context:
space:
mode:
authorYiwei Zhang <zzyiwei@google.com>2020-07-05 15:17:32 -0700
committerYiwei Zhang <zzyiwei@google.com>2020-07-07 16:55:52 -0700
commite4f64170c9c754b7c87ce138a5d7493964bd9204 (patch)
tree7f2954b671422f81173467ba3b41262a3f6c76e3 /vulkan
parent7c0c07c4e86c5224e12fdff04f2ec4153dd288bb (diff)
downloadnative-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.cpp17
-rw-r--r--vulkan/libvulkan/driver_gen.cpp2
-rw-r--r--vulkan/libvulkan/driver_gen.h2
-rw-r--r--vulkan/scripts/driver_generator.py4
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.