From 93e402828567b4312dbbbd15bcdba4c6a7df18d5 Mon Sep 17 00:00:00 2001 From: Mike Schuchardt Date: Wed, 17 May 2017 07:54:02 -0600 Subject: layers: Record results from ext surface queries Update core validation to save the results of vkGetPhysicalDeviceSurfaceCapabilities2KHR, vkGetPhysicalDeviceSurfaceCapabilities2EXT, and vkGetPhysicalDeviceSurfaceFormats2KHR so they can be used to validate swapchain creation. Change-Id: Iea112df509a35d9bf606b35d4da8d680ae0d76a6 --- layers/core_validation.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++++++ layers/device_extensions.h | 4 +- 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 371aca7a..c7c125ea 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -11185,6 +11185,62 @@ VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysica return result; } +static void PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(instance_layer_data *instanceData, + VkPhysicalDevice physicalDevice, + VkSurfaceCapabilities2KHR *pSurfaceCapabilities) { + std::unique_lock lock(global_lock); + auto physicalDeviceState = GetPhysicalDeviceState(instanceData, physicalDevice); + physicalDeviceState->vkGetPhysicalDeviceSurfaceCapabilitiesKHRState = QUERY_DETAILS; + physicalDeviceState->surfaceCapabilities = pSurfaceCapabilities->surfaceCapabilities; +} + +VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, + VkSurfaceCapabilities2KHR *pSurfaceCapabilities) { + auto instanceData = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map); + + auto result = + instanceData->dispatch_table.GetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, pSurfaceInfo, pSurfaceCapabilities); + + if (result == VK_SUCCESS) { + PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(instanceData, physicalDevice, pSurfaceCapabilities); + } + + return result; +} + +static void PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(instance_layer_data *instanceData, + VkPhysicalDevice physicalDevice, + VkSurfaceCapabilities2EXT *pSurfaceCapabilities) { + std::unique_lock lock(global_lock); + auto physicalDeviceState = GetPhysicalDeviceState(instanceData, physicalDevice); + physicalDeviceState->vkGetPhysicalDeviceSurfaceCapabilitiesKHRState = QUERY_DETAILS; + physicalDeviceState->surfaceCapabilities.minImageCount = pSurfaceCapabilities->minImageCount; + physicalDeviceState->surfaceCapabilities.maxImageCount = pSurfaceCapabilities->maxImageCount; + physicalDeviceState->surfaceCapabilities.currentExtent = pSurfaceCapabilities->currentExtent; + physicalDeviceState->surfaceCapabilities.minImageExtent = pSurfaceCapabilities->minImageExtent; + physicalDeviceState->surfaceCapabilities.maxImageExtent = pSurfaceCapabilities->maxImageExtent; + physicalDeviceState->surfaceCapabilities.maxImageArrayLayers = pSurfaceCapabilities->maxImageArrayLayers; + physicalDeviceState->surfaceCapabilities.supportedTransforms = pSurfaceCapabilities->supportedTransforms; + physicalDeviceState->surfaceCapabilities.currentTransform = pSurfaceCapabilities->currentTransform; + physicalDeviceState->surfaceCapabilities.supportedCompositeAlpha = pSurfaceCapabilities->supportedCompositeAlpha; + physicalDeviceState->surfaceCapabilities.supportedUsageFlags = pSurfaceCapabilities->supportedUsageFlags; +} + +VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceCapabilities2EXT(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, + VkSurfaceCapabilities2EXT *pSurfaceCapabilities) { + auto instanceData = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map); + + auto result = + instanceData->dispatch_table.GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities); + + if (result == VK_SUCCESS) { + PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(instanceData, physicalDevice, pSurfaceCapabilities); + } + + return result; +} + VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32 *pSupported) { bool skip = false; @@ -11336,6 +11392,40 @@ VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevi return result; } +static void PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(instance_layer_data *instanceData, VkPhysicalDevice physicalDevice, + uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) { + std::unique_lock lock(global_lock); + auto physicalDeviceState = GetPhysicalDeviceState(instanceData, physicalDevice); + if (*pSurfaceFormatCount) { + if (physicalDeviceState->vkGetPhysicalDeviceSurfaceFormatsKHRState < QUERY_COUNT) { + physicalDeviceState->vkGetPhysicalDeviceSurfaceFormatsKHRState = QUERY_COUNT; + } + if (*pSurfaceFormatCount > physicalDeviceState->surface_formats.size()) + physicalDeviceState->surface_formats.resize(*pSurfaceFormatCount); + } + if (pSurfaceFormats) { + if (physicalDeviceState->vkGetPhysicalDeviceSurfaceFormatsKHRState < QUERY_DETAILS) { + physicalDeviceState->vkGetPhysicalDeviceSurfaceFormatsKHRState = QUERY_DETAILS; + } + for (uint32_t i = 0; i < *pSurfaceFormatCount; i++) { + physicalDeviceState->surface_formats[i] = pSurfaceFormats[i].surfaceFormat; + } + } +} + +VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, + uint32_t *pSurfaceFormatCount, + VkSurfaceFormat2KHR *pSurfaceFormats) { + auto instanceData = GetLayerDataPtr(get_dispatch_key(physicalDevice), instance_layer_data_map); + auto result = instanceData->dispatch_table.GetPhysicalDeviceSurfaceFormats2KHR(physicalDevice, pSurfaceInfo, + pSurfaceFormatCount, pSurfaceFormats); + if (result == VK_SUCCESS || result == VK_INCOMPLETE) { + PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(instanceData, physicalDevice, pSurfaceFormatCount, pSurfaceFormats); + } + return result; +} + VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, @@ -11819,12 +11909,18 @@ static PFN_vkVoidFunction intercept_khr_surface_command(const char *name, VkInst {"vkDestroySurfaceKHR", reinterpret_cast(DestroySurfaceKHR), &E::khr_surface}, {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR", reinterpret_cast(GetPhysicalDeviceSurfaceCapabilitiesKHR), &E::khr_surface}, + {"vkGetPhysicalDeviceSurfaceCapabilities2KHR", + reinterpret_cast(GetPhysicalDeviceSurfaceCapabilities2KHR), &E::khr_get_surface_capabilities2}, + {"vkGetPhysicalDeviceSurfaceCapabilities2EXT", + reinterpret_cast(GetPhysicalDeviceSurfaceCapabilities2EXT), &E::ext_display_surface_counter}, {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast(GetPhysicalDeviceSurfaceSupportKHR), &E::khr_surface}, {"vkGetPhysicalDeviceSurfacePresentModesKHR", reinterpret_cast(GetPhysicalDeviceSurfacePresentModesKHR), &E::khr_surface}, {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast(GetPhysicalDeviceSurfaceFormatsKHR), &E::khr_surface}, + {"vkGetPhysicalDeviceSurfaceFormats2KHR", reinterpret_cast(GetPhysicalDeviceSurfaceFormats2KHR), + &E::khr_get_surface_capabilities2}, }; instance_layer_data *instance_data = nullptr; diff --git a/layers/device_extensions.h b/layers/device_extensions.h index ad1e7d08..d4ed8c54 100644 --- a/layers/device_extensions.h +++ b/layers/device_extensions.h @@ -114,6 +114,7 @@ struct InstanceExtensions { bool khr_wayland_surface; bool khr_mir_surface; bool khr_get_physical_device_properties2; + bool khr_get_surface_capabilities2; bool khx_device_group_creation; bool khx_external_memory_capabilities; bool khx_external_semaphore_capabilities; @@ -147,6 +148,7 @@ struct InstanceExtensions { {VK_KHR_MIR_SURFACE_EXTENSION_NAME, &E::khr_mir_surface}, #endif {VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, &E::khr_get_physical_device_properties2}, + {VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, &E::khr_get_surface_capabilities2}, {VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME, &E::khx_device_group_creation}, {VK_KHX_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, &E::khx_external_memory_capabilities}, {VK_KHX_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, &E::khx_external_semaphore_capabilities}, @@ -173,4 +175,4 @@ struct InstanceExtensions { } }; -#endif \ No newline at end of file +#endif -- cgit v1.2.3