diff options
| -rw-r--r-- | layers/core_validation.cpp | 96 | ||||
| -rw-r--r-- | layers/device_extensions.h | 4 |
2 files changed, 99 insertions, 1 deletions
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<std::mutex> 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<std::mutex> 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<std::mutex> 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<PFN_vkVoidFunction>(DestroySurfaceKHR), &E::khr_surface}, {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR), &E::khr_surface}, + {"vkGetPhysicalDeviceSurfaceCapabilities2KHR", + reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilities2KHR), &E::khr_get_surface_capabilities2}, + {"vkGetPhysicalDeviceSurfaceCapabilities2EXT", + reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilities2EXT), &E::ext_display_surface_counter}, {"vkGetPhysicalDeviceSurfaceSupportKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceSupportKHR), &E::khr_surface}, {"vkGetPhysicalDeviceSurfacePresentModesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR), &E::khr_surface}, {"vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR), &E::khr_surface}, + {"vkGetPhysicalDeviceSurfaceFormats2KHR", reinterpret_cast<PFN_vkVoidFunction>(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 |
