aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp63
1 files changed, 62 insertions, 1 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index daa0360d..220b5a8c 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -11360,6 +11360,64 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi
return instance_data->dispatch_table.EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
}
+VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHX(
+ VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX *pPhysicalDeviceGroupProperties) {
+ bool skip_call = false;
+ instance_layer_data *instance_data = GetLayerDataPtr(get_dispatch_key(instance), instance_layer_data_map);
+
+ if (instance_data) {
+ // For this instance, flag when EnumeratePhysicalDeviceGroupsKHX goes to QUERY_COUNT and then QUERY_DETAILS.
+ if (NULL == pPhysicalDeviceGroupProperties) {
+ instance_data->vkEnumeratePhysicalDeviceGroupsState = QUERY_COUNT;
+ } else {
+ if (UNCALLED == instance_data->vkEnumeratePhysicalDeviceGroupsState) {
+ // Flag warning here. You can call this without having queried the count, but it may not be
+ // robust on platforms with multiple physical devices.
+ skip_call |= log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, __LINE__, DEVLIMITS_MISSING_QUERY_COUNT, "DL",
+ "Call sequence has vkEnumeratePhysicalDeviceGroupsKHX() w/ non-NULL "
+ "pPhysicalDeviceGroupProperties. You should first "
+ "call vkEnumeratePhysicalDeviceGroupsKHX() w/ NULL pPhysicalDeviceGroupProperties to query "
+ "pPhysicalDeviceGroupCount.");
+ } // TODO : Could also flag a warning if re-calling this function in QUERY_DETAILS state
+ else if (instance_data->physical_device_groups_count != *pPhysicalDeviceGroupCount) {
+ // Having actual count match count from app is not a requirement, so this can be a warning
+ skip_call |=
+ log_msg(instance_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVLIMITS_COUNT_MISMATCH, "DL",
+ "Call to vkEnumeratePhysicalDeviceGroupsKHX() w/ pPhysicalDeviceGroupCount value %u, but actual count "
+ "supported by this instance is %u.",
+ *pPhysicalDeviceGroupCount, instance_data->physical_device_groups_count);
+ }
+ instance_data->vkEnumeratePhysicalDeviceGroupsState = QUERY_DETAILS;
+ }
+ if (skip_call) {
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+ }
+ VkResult result = instance_data->dispatch_table.EnumeratePhysicalDeviceGroupsKHX(instance, pPhysicalDeviceGroupCount,
+ pPhysicalDeviceGroupProperties);
+ if (NULL == pPhysicalDeviceGroupProperties) {
+ instance_data->physical_device_groups_count = *pPhysicalDeviceGroupCount;
+ } else if (result == VK_SUCCESS) { // Save physical devices
+ for (uint32_t i = 0; i < *pPhysicalDeviceGroupCount; i++) {
+ for (uint32_t j = 0; j < pPhysicalDeviceGroupProperties[i].physicalDeviceCount; j++) {
+ VkPhysicalDevice cur_phys_dev = pPhysicalDeviceGroupProperties[i].physicalDevices[j];
+ auto &phys_device_state = instance_data->physical_device_map[cur_phys_dev];
+ phys_device_state.phys_device = cur_phys_dev;
+ // Init actual features for each physical device
+ instance_data->dispatch_table.GetPhysicalDeviceFeatures(cur_phys_dev, &phys_device_state.features);
+ }
+ }
+ }
+ return result;
+ } else {
+ log_msg(instance_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, __LINE__,
+ DEVLIMITS_INVALID_INSTANCE, "DL",
+ "Invalid instance (0x%" PRIxLEAST64 ") passed into vkEnumeratePhysicalDeviceGroupsKHX().", (uint64_t)instance);
+ }
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
static PFN_vkVoidFunction intercept_core_instance_command(const char *name);
static PFN_vkVoidFunction intercept_core_device_command(const char *name);
@@ -11368,7 +11426,8 @@ static PFN_vkVoidFunction intercept_khr_swapchain_command(const char *name, VkDe
static PFN_vkVoidFunction intercept_khr_surface_command(const char *name, VkInstance instance);
-static PFN_vkVoidFunction intercept_extension_instance_commands(const char *name, VkInstance instance);
+static PFN_vkVoidFunction
+intercept_extension_instance_commands(const char *name, VkInstance instance);
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice dev, const char *funcName) {
PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
@@ -11672,6 +11731,8 @@ static PFN_vkVoidFunction intercept_extension_instance_commands(const char *name
} instance_extension_commands[] = {
{"vkGetPhysicalDeviceQueueFamilyProperties2KHR",
reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceQueueFamilyProperties2KHR)},
+ {"vkEnumeratePhysicalDeviceGroupsKHX",
+ reinterpret_cast<PFN_vkVoidFunction>(EnumeratePhysicalDeviceGroupsKHX)},
};
for (size_t i = 0; i < ARRAY_SIZE(instance_extension_commands); i++) {