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
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 371aca7..c7c125e 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -11185,6 +11185,62 @@
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 @@
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 @@
{"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 ad1e7d0..d4ed8c5 100644
--- a/layers/device_extensions.h
+++ b/layers/device_extensions.h
@@ -114,6 +114,7 @@
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 @@
{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 @@
}
};
-#endif
\ No newline at end of file
+#endif