aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Schuchardt <mikes@lunarg.com>2017-05-17 07:54:02 -0600
committerMike Schuchardt <mikes@lunarg.com>2017-05-17 10:55:21 -0600
commit93e402828567b4312dbbbd15bcdba4c6a7df18d5 (patch)
tree29b89fca00a653b97ed629cbbd5204cb1201c860
parent98183b83386f7b6aeab80c312d4989793001d747 (diff)
downloadusermoji-93e402828567b4312dbbbd15bcdba4c6a7df18d5.tar.xz
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
-rw-r--r--layers/core_validation.cpp96
-rw-r--r--layers/device_extensions.h4
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