aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetros Bantolas <petros.bantolas@imgtec.com>2016-04-15 11:02:59 +0100
committerJon Ashburn <jon@lunarg.com>2016-06-30 11:18:44 -0600
commita79223bcf3c4f554400ea2e2748be77a93691aea (patch)
tree6704606c59c70aa4bbf178ae6a4f49b95dac7a09
parent4adf813386db856e56c147bc3faf1bf3425930ce (diff)
downloadusermoji-a79223bcf3c4f554400ea2e2748be77a93691aea.tar.xz
Added WSI KHR_display support to validation
Add support for this extension to object_tracker and swapchain layers. Change-Id: Ifdf6095958a9d9d01720fde92e0bbd0a8a9a3216
-rw-r--r--layers/object_tracker.h14
-rw-r--r--layers/swapchain.cpp314
-rw-r--r--layers/swapchain.h10
-rw-r--r--layers/unique_objects.h1
-rwxr-xr-xvk-generate.py3
-rwxr-xr-xvk-layer-generate.py65
-rw-r--r--vulkan.py66
7 files changed, 424 insertions, 49 deletions
diff --git a/layers/object_tracker.h b/layers/object_tracker.h
index 7c00c249..ac62f036 100644
--- a/layers/object_tracker.h
+++ b/layers/object_tracker.h
@@ -153,6 +153,20 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreate
(PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
pDisp->GetPhysicalDeviceSurfacePresentModesKHR =
(PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
+ pDisp->GetPhysicalDeviceDisplayPropertiesKHR =
+ (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR");
+ pDisp->GetPhysicalDeviceDisplayPlanePropertiesKHR =
+ (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
+ pDisp->GetDisplayPlaneSupportedDisplaysKHR =
+ (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)gpa(instance, "vkGetDisplayPlaneSupportedDisplaysKHR");
+ pDisp->GetDisplayModePropertiesKHR =
+ (PFN_vkGetDisplayModePropertiesKHR)gpa(instance, "vkGetDisplayModePropertiesKHR");
+ pDisp->CreateDisplayModeKHR =
+ (PFN_vkCreateDisplayModeKHR)gpa(instance, "vkCreateDisplayModeKHR");
+ pDisp->GetDisplayPlaneCapabilitiesKHR =
+ (PFN_vkGetDisplayPlaneCapabilitiesKHR)gpa(instance, "vkGetDisplayPlaneCapabilitiesKHR");
+ pDisp->CreateDisplayPlaneSurfaceKHR =
+ (PFN_vkCreateDisplayPlaneSurfaceKHR)gpa(instance, "vkCreateDisplayPlaneSurfaceKHR");
#if VK_USE_PLATFORM_WIN32_KHR
pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR");
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp
index 4271120f..1488febe 100644
--- a/layers/swapchain.cpp
+++ b/layers/swapchain.cpp
@@ -129,11 +129,26 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreate
(PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
pDisp->GetPhysicalDeviceSurfacePresentModesKHR =
(PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
+ pDisp->CreateDisplayPlaneSurfaceKHR =
+ (PFN_vkCreateDisplayPlaneSurfaceKHR)gpa(instance, "vkCreateDisplayPlaneSurfaceKHR");
+ pDisp->GetPhysicalDeviceDisplayPropertiesKHR =
+ (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR");
+ pDisp->GetPhysicalDeviceDisplayPlanePropertiesKHR =
+ (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)gpa(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
+ pDisp->GetDisplayPlaneSupportedDisplaysKHR =
+ (PFN_vkGetDisplayPlaneSupportedDisplaysKHR)gpa(instance, "vkGetDisplayPlaneSupportedDisplaysKHR");
+ pDisp->GetDisplayModePropertiesKHR =
+ (PFN_vkGetDisplayModePropertiesKHR)gpa(instance, "vkGetDisplayModePropertiesKHR");
+ pDisp->CreateDisplayModeKHR =
+ (PFN_vkCreateDisplayModeKHR)gpa(instance, "vkCreateDisplayModeKHR");
+ pDisp->GetDisplayPlaneCapabilitiesKHR =
+ (PFN_vkGetDisplayPlaneCapabilitiesKHR)gpa(instance, "vkGetDisplayPlaneCapabilitiesKHR");
// Remember this instance, and whether the VK_KHR_surface extension
// was enabled for it:
my_data->instanceMap[instance].instance = instance;
my_data->instanceMap[instance].surfaceExtensionEnabled = false;
+ my_data->instanceMap[instance].displayExtensionEnabled = false;
#ifdef VK_USE_PLATFORM_ANDROID_KHR
my_data->instanceMap[instance].androidSurfaceExtensionEnabled = false;
#endif // VK_USE_PLATFORM_ANDROID_KHR
@@ -166,6 +181,10 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreate
my_data->instanceMap[instance].surfaceExtensionEnabled = true;
}
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
+
+ my_data->instanceMap[instance].displayExtensionEnabled = true;
+ }
#ifdef VK_USE_PLATFORM_ANDROID_KHR
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
@@ -913,6 +932,294 @@ VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceXlibPresentationSupportKHR(VkPhy
}
#endif // VK_USE_PLATFORM_XLIB_KHR
+VKAPI_ATTR VkResult VKAPI_CALL
+GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties) {
+ VkResult result = VK_SUCCESS;
+ bool skipCall = false;
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
+ std::unique_lock<std::mutex> lock(global_lock);
+ SwpPhysicalDevice *pPhysicalDevice = NULL;
+ {
+ auto it = my_data->physicalDeviceMap.find(physicalDevice);
+ pPhysicalDevice = (it == my_data->physicalDeviceMap.end()) ? NULL : &it->second;
+ }
+
+ if (pPhysicalDevice && pPhysicalDevice->pInstance && !pPhysicalDevice->pInstance->displayExtensionEnabled) {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "VkInstance",
+ SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
+ "%s() called even though the %s extension was not enabled for this VkInstance.", __FUNCTION__,
+ VK_KHR_DISPLAY_EXTENSION_NAME);
+ }
+
+ if (!pPropertyCount) {
+ skipCall |= LOG_ERROR_NULL_POINTER(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "pPropertyCount");
+ }
+ lock.unlock();
+
+ if (!skipCall) {
+ result = my_data->instance_dispatch_table->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
+ return result;
+ }
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
+static uint32_t gDisplayPlanePropertyCount = 0;
+static bool gDisplayPlanePropertyCountInit = false;
+VKAPI_ATTR VkResult VKAPI_CALL
+GetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties) {
+ VkResult result = VK_SUCCESS;
+ bool skipCall = false;
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
+ std::unique_lock<std::mutex> lock(global_lock);
+ SwpPhysicalDevice *pPhysicalDevice = NULL;
+ {
+ auto it = my_data->physicalDeviceMap.find(physicalDevice);
+ pPhysicalDevice = (it == my_data->physicalDeviceMap.end()) ? NULL : &it->second;
+ }
+
+ if (pPhysicalDevice && pPhysicalDevice->pInstance && !pPhysicalDevice->pInstance->displayExtensionEnabled) {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "VkInstance",
+ SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
+ "%s() called even though the %s extension was not enabled for this VkInstance.", __FUNCTION__,
+ VK_KHR_DISPLAY_EXTENSION_NAME);
+ }
+
+ if (!pPropertyCount) {
+ skipCall |= LOG_ERROR_NULL_POINTER(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "pPropertyCount");
+ }
+ lock.unlock();
+
+ if (!skipCall) {
+ result = my_data->instance_dispatch_table->GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
+
+ lock.lock();
+ if (!pPhysicalDevice->gotDisplayPlanePropertyCount)
+ {
+ pPhysicalDevice->displayPlanePropertyCount = *pPropertyCount;
+ pPhysicalDevice->gotDisplayPlanePropertyCount = true;
+ }
+ lock.unlock();
+
+ return result;
+ }
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays) {
+ VkResult result = VK_SUCCESS;
+ bool skipCall = false;
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
+ std::unique_lock<std::mutex> lock(global_lock);
+ SwpPhysicalDevice *pPhysicalDevice = NULL;
+ {
+ auto it = my_data->physicalDeviceMap.find(physicalDevice);
+ pPhysicalDevice = (it == my_data->physicalDeviceMap.end()) ? NULL : &it->second;
+ }
+
+ if (pPhysicalDevice && pPhysicalDevice->pInstance && !pPhysicalDevice->pInstance->displayExtensionEnabled) {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "VkInstance",
+ SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
+ "%s() called even though the %s extension was not enabled for this VkInstance.", __FUNCTION__,
+ VK_KHR_DISPLAY_EXTENSION_NAME);
+ }
+
+ if (!pDisplayCount) {
+ skipCall |= LOG_ERROR_NULL_POINTER(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "pDisplayCount");
+ }
+
+ if (!gDisplayPlanePropertyCountInit)
+ {
+ LOG_WARNING(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "planeIndex",
+ SWAPCHAIN_GET_SUPPORTED_DISPLAYS_WITHOUT_QUERY,
+ "Potential problem with calling %s() without first querying vkGetPhysicalDeviceDisplayPlanePropertiesKHR.",
+ __FUNCTION__);
+ }
+
+ if (gDisplayPlanePropertyCountInit && planeIndex >= gDisplayPlanePropertyCount)
+ {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "planeIndex",
+ SWAPCHAIN_PLANE_INDEX_TOO_LARGE,
+ "%s(): %s must be in the range [0, %d] that was returned by vkGetPhysicalDeviceDisplayPlanePropertiesKHR. Do you have the plane index hardcoded?",
+ __FUNCTION__,
+ "planeIndex",
+ gDisplayPlanePropertyCount - 1);
+ }
+ lock.unlock();
+
+ if (!skipCall) {
+ result = my_data->instance_dispatch_table->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
+
+ return result;
+ }
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) {
+ VkResult result = VK_SUCCESS;
+ bool skipCall = false;
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
+ std::unique_lock<std::mutex> lock(global_lock);
+ SwpPhysicalDevice *pPhysicalDevice = NULL;
+ {
+ auto it = my_data->physicalDeviceMap.find(physicalDevice);
+ pPhysicalDevice = (it == my_data->physicalDeviceMap.end()) ? NULL : &it->second;
+ }
+
+ if (pPhysicalDevice && pPhysicalDevice->pInstance && !pPhysicalDevice->pInstance->displayExtensionEnabled) {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "VkInstance",
+ SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
+ "%s() called even though the %s extension was not enabled for this VkInstance.", __FUNCTION__,
+ VK_KHR_DISPLAY_EXTENSION_NAME);
+ }
+
+ if (!pPropertyCount) {
+ skipCall |= LOG_ERROR_NULL_POINTER(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "pPropertyCount");
+ }
+ lock.unlock();
+
+ if (!skipCall) {
+ result = my_data->instance_dispatch_table->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
+ return result;
+ }
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) {
+ VkResult result = VK_SUCCESS;
+ bool skipCall = false;
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
+ std::unique_lock<std::mutex> lock(global_lock);
+ SwpPhysicalDevice *pPhysicalDevice = NULL;
+ {
+ auto it = my_data->physicalDeviceMap.find(physicalDevice);
+ pPhysicalDevice = (it == my_data->physicalDeviceMap.end()) ? NULL : &it->second;
+ }
+
+ if (pPhysicalDevice && pPhysicalDevice->pInstance && !pPhysicalDevice->pInstance->displayExtensionEnabled) {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "VkInstance",
+ SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
+ "%s() called even though the %s extension was not enabled for this VkInstance.", __FUNCTION__,
+ VK_KHR_DISPLAY_EXTENSION_NAME);
+ }
+
+ if (!pCreateInfo) {
+ skipCall |= LOG_ERROR_NULL_POINTER(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "pCreateInfo");
+ }
+ lock.unlock();
+
+ if (!skipCall) {
+ result = my_data->instance_dispatch_table->CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
+ return result;
+ }
+
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) {
+ VkResult result = VK_SUCCESS;
+ bool skipCall = false;
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
+ std::unique_lock<std::mutex> lock(global_lock);
+ SwpPhysicalDevice *pPhysicalDevice = NULL;
+ {
+ auto it = my_data->physicalDeviceMap.find(physicalDevice);
+ pPhysicalDevice = (it == my_data->physicalDeviceMap.end()) ? NULL : &it->second;
+ }
+
+ if (pPhysicalDevice && pPhysicalDevice->pInstance && !pPhysicalDevice->pInstance->displayExtensionEnabled) {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "VkInstance",
+ SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
+ "%s() called even though the %s extension was not enabled for this VkInstance.", __FUNCTION__,
+ VK_KHR_DISPLAY_EXTENSION_NAME);
+ }
+
+ if (!gDisplayPlanePropertyCountInit)
+ {
+ LOG_WARNING(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "planeIndex",
+ SWAPCHAIN_GET_SUPPORTED_DISPLAYS_WITHOUT_QUERY,
+ "Potential problem with calling %s() without first querying vkGetPhysicalDeviceDisplayPlanePropertiesKHR.",
+ __FUNCTION__);
+ }
+
+ if (gDisplayPlanePropertyCountInit && planeIndex >= gDisplayPlanePropertyCount)
+ {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "planeIndex",
+ SWAPCHAIN_PLANE_INDEX_TOO_LARGE,
+ "%s(): %s must be in the range [0, %d] that was returned by vkGetPhysicalDeviceDisplayPlanePropertiesKHR. Do you have the plane index hardcoded?",
+ __FUNCTION__,
+ "planeIndex",
+ gDisplayPlanePropertyCount - 1);
+ }
+
+ if (!pCapabilities) {
+ skipCall |= LOG_ERROR_NULL_POINTER(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pPhysicalDevice->pInstance, "pCapabilities");
+ }
+ lock.unlock();
+
+ if (!skipCall) {
+ result = my_data->instance_dispatch_table->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
+ return result;
+ }
+
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator,
+ VkSurfaceKHR *pSurface) {
+ VkResult result = VK_SUCCESS;
+ bool skipCall = false;
+ layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
+ std::unique_lock<std::mutex> lock(global_lock);
+ SwpInstance *pInstance = &(my_data->instanceMap[instance]);
+
+ // Validate that the platform extension was enabled:
+ if (pInstance && !pInstance->displayExtensionEnabled) {
+ skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, pInstance, "VkInstance", SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
+ "%s() called even though the %s extension was not enabled for this VkInstance.", __FUNCTION__,
+ VK_KHR_DISPLAY_EXTENSION_NAME);
+ }
+
+ if (!pCreateInfo) {
+ skipCall |= LOG_ERROR_NULL_POINTER(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, device, "pCreateInfo");
+ } else {
+ if (pCreateInfo->sType != VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR) {
+ skipCall |= LOG_ERROR_WRONG_STYPE(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, device, "pCreateInfo",
+ "VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR");
+ }
+ if (pCreateInfo->pNext != NULL) {
+ skipCall |= LOG_INFO_WRONG_NEXT(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, device, "pCreateInfo");
+ }
+ }
+
+ if (!skipCall) {
+ // Call down the call chain:
+ lock.unlock();
+ result = my_data->instance_dispatch_table->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+ lock.lock();
+
+ // Obtain this pointer again after locking:
+ pInstance = &(my_data->instanceMap[instance]);
+ if ((result == VK_SUCCESS) && pInstance && pSurface) {
+ // Record the VkSurfaceKHR returned by the ICD:
+ my_data->surfaceMap[*pSurface].surface = *pSurface;
+ my_data->surfaceMap[*pSurface].pInstance = pInstance;
+ my_data->surfaceMap[*pSurface].usedAllocatorToCreate = (pAllocator != NULL);
+ my_data->surfaceMap[*pSurface].numQueueFamilyIndexSupport = 0;
+ my_data->surfaceMap[*pSurface].pQueueFamilyIndexSupport = NULL;
+ // Point to the associated SwpInstance:
+ pInstance->surfaces[*pSurface] = &my_data->surfaceMap[*pSurface];
+ }
+ lock.unlock();
+ return result;
+ }
+ return VK_ERROR_VALIDATION_FAILED_EXT;
+}
+
VKAPI_ATTR void VKAPI_CALL
DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator) {
bool skipCall = false;
@@ -2299,6 +2606,13 @@ intercept_khr_surface_command(const char *name, VkInstance instance) {
{ "vkGetPhysicalDeviceSurfaceCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceCapabilitiesKHR) },
{ "vkGetPhysicalDeviceSurfaceFormatsKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfaceFormatsKHR) },
{ "vkGetPhysicalDeviceSurfacePresentModesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceSurfacePresentModesKHR) },
+ { "vkGetPhysicalDeviceDisplayPropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPropertiesKHR) },
+ { "vkGetPhysicalDeviceDisplayPlanePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetPhysicalDeviceDisplayPlanePropertiesKHR) },
+ { "vkGetDisplayPlaneSupportedDisplaysKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneSupportedDisplaysKHR) },
+ { "vkGetDisplayModePropertiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayModePropertiesKHR) },
+ { "vkCreateDisplayModeKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayModeKHR) },
+ { "vkGetDisplayPlaneCapabilitiesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetDisplayPlaneCapabilitiesKHR) },
+ { "vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateDisplayPlaneSurfaceKHR) },
};
// do not check if VK_KHR_*_surface is enabled (why?)
diff --git a/layers/swapchain.h b/layers/swapchain.h
index ec1e39b3..8991d809 100644
--- a/layers/swapchain.h
+++ b/layers/swapchain.h
@@ -74,6 +74,9 @@ enum SWAPCHAIN_ERROR {
SWAPCHAIN_SURFACE_NOT_SUPPORTED_WITH_QUEUE, // A surface is not supported by a given queueFamilyIndex, as seen by
// vkGetPhysicalDeviceSurfaceSupportKHR()
SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, // vkAcquireNextImageKHR should be called with a valid semaphore and/or fence
+ SWAPCHAIN_GET_SUPPORTED_DISPLAYS_WITHOUT_QUERY, // vkGetDisplayPlaneSupportedDisplaysKHR should be called after querying
+ // device display plane properties
+ SWAPCHAIN_PLANE_INDEX_TOO_LARGE, // a planeIndex value is larger than what vkGetDisplayPlaneSupportedDisplaysKHR returns
};
// The following is for logging error messages:
@@ -161,6 +164,9 @@ struct SwpInstance {
// Set to true if VK_KHR_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
bool surfaceExtensionEnabled;
+ // Set to true if VK_KHR_DISPLAY_EXTENSION_NAME was enabled for this VkInstance:
+ bool displayExtensionEnabled;
+
// TODO: Add additional booleans for platform-specific extensions:
#ifdef VK_USE_PLATFORM_ANDROID_KHR
// Set to true if VK_KHR_ANDROID_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
@@ -251,6 +257,10 @@ struct SwpPhysicalDevice {
// Count and VkPresentModeKHR's returned by vkGetPhysicalDeviceSurfacePresentModesKHR():
uint32_t presentModeCount;
VkPresentModeKHR *pPresentModes;
+
+ // Count returned by vkGetPhysicalDeviceDisplayPlanePropertiesKHR():
+ uint32_t displayPlanePropertyCount;
+ bool gotDisplayPlanePropertyCount;
};
// Create one of these for each VkDevice within a VkInstance:
diff --git a/layers/unique_objects.h b/layers/unique_objects.h
index 942724f1..5cadf2e0 100644
--- a/layers/unique_objects.h
+++ b/layers/unique_objects.h
@@ -85,6 +85,7 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreate
(PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)gpa(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR");
pDisp->GetPhysicalDeviceSurfacePresentModesKHR =
(PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)gpa(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR");
+ pDisp->CreateDisplayPlaneSurfaceKHR = (PFN_vkCreateDisplayPlaneSurfaceKHR)gpa(instance, "vkCreateDisplayPlaneSurfaceKHR");
#ifdef VK_USE_PLATFORM_WIN32_KHR
pDisp->CreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)gpa(instance, "vkCreateWin32SurfaceKHR");
pDisp->GetPhysicalDeviceWin32PresentationSupportKHR =
diff --git a/vk-generate.py b/vk-generate.py
index c740494c..6fafc19e 100755
--- a/vk-generate.py
+++ b/vk-generate.py
@@ -243,7 +243,8 @@ def main():
"Xcb",
"Xlib",
"Wayland",
- "Mir"
+ "Mir",
+ "Display"
}
subcommands = {
"dispatch-table-ops": DispatchTableOpsSubcommand,
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 5a5e6a12..14354df9 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -44,6 +44,7 @@ def proto_is_global(proto):
"EnumerateInstanceExtensionProperties",
"EnumerateDeviceLayerProperties",
"EnumerateDeviceExtensionProperties",
+ "CreateDisplayPlaneSurfaceKHR",
"CreateXcbSurfaceKHR",
"GetPhysicalDeviceXcbPresentationSupportKHR",
"CreateXlibSurfaceKHR",
@@ -1198,6 +1199,7 @@ class ObjectTrackerSubcommand(Subcommand):
'AcquireNextImageKHR' : ['fence', 'semaphore' ],
'UpdateDescriptorSets' : ['pTexelBufferView'],
'CreateSwapchainKHR' : ['oldSwapchain'],
+ 'CreateDisplayModeKHR': ['pAllocator'],
}
param_count = 'NONE' # keep track of arrays passed directly into API functions
for p in proto.params:
@@ -1264,7 +1266,7 @@ class ObjectTrackerSubcommand(Subcommand):
'}' % (qual, decl, proto.c_call()))
return "".join(funcs)
# Temporarily prevent DestroySurface call from being generated until WSI layer support is fleshed out
- elif 'DestroyInstance' in proto.name or 'DestroyDevice' in proto.name:
+ elif 'DestroyInstance' in proto.name or 'DestroyDevice' in proto.name or 'CreateDisplayModeKHR' in proto.name:
return ""
else:
if create_func:
@@ -1355,34 +1357,27 @@ class ObjectTrackerSubcommand(Subcommand):
['vkCreateSwapchainKHR',
'vkDestroySwapchainKHR', 'vkGetSwapchainImagesKHR',
'vkAcquireNextImageKHR', 'vkQueuePresentKHR'])]
+ additional_instance_extensions = [
+ 'vkDestroySurfaceKHR',
+ 'vkGetPhysicalDeviceSurfaceSupportKHR',
+ 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
+ 'vkGetPhysicalDeviceSurfaceFormatsKHR',
+ 'vkGetPhysicalDeviceSurfacePresentModesKHR',
+ 'vkCreateDisplayPlaneSurfaceKHR',
+ ]
if self.wsi == 'Win32':
instance_extensions=[('msg_callback_get_proc_addr', []),
('wsi_enabled',
- ['vkDestroySurfaceKHR',
- 'vkGetPhysicalDeviceSurfaceSupportKHR',
- 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
- 'vkGetPhysicalDeviceSurfaceFormatsKHR',
- 'vkGetPhysicalDeviceSurfacePresentModesKHR',
- 'vkCreateWin32SurfaceKHR',
- 'vkGetPhysicalDeviceWin32PresentationSupportKHR'])]
+ ['vkCreateWin32SurfaceKHR',
+ 'vkGetPhysicalDeviceWin32PresentationSupportKHR'] + additional_instance_extensions)]
elif self.wsi == 'Android':
instance_extensions=[('msg_callback_get_proc_addr', []),
('wsi_enabled',
- ['vkDestroySurfaceKHR',
- 'vkGetPhysicalDeviceSurfaceSupportKHR',
- 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
- 'vkGetPhysicalDeviceSurfaceFormatsKHR',
- 'vkGetPhysicalDeviceSurfacePresentModesKHR',
- 'vkCreateAndroidSurfaceKHR'])]
+ ['vkCreateAndroidSurfaceKHR'] + additional_instance_extensions)]
elif self.wsi == 'Xcb' or self.wsi == 'Xlib' or self.wsi == 'Wayland' or self.wsi == 'Mir':
instance_extensions=[('msg_callback_get_proc_addr', []),
('wsi_enabled',
- ['vkDestroySurfaceKHR',
- 'vkGetPhysicalDeviceSurfaceSupportKHR',
- 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
- 'vkGetPhysicalDeviceSurfaceFormatsKHR',
- 'vkGetPhysicalDeviceSurfacePresentModesKHR',
- 'vkCreateXcbSurfaceKHR',
+ additional_instance_extensions + ['vkCreateXcbSurfaceKHR',
'vkGetPhysicalDeviceXcbPresentationSupportKHR',
'vkCreateXlibSurfaceKHR',
'vkGetPhysicalDeviceXlibPresentationSupportKHR',
@@ -1671,31 +1666,23 @@ class UniqueObjectsSubcommand(Subcommand):
['vkCreateSwapchainKHR',
'vkDestroySwapchainKHR', 'vkGetSwapchainImagesKHR',
'vkAcquireNextImageKHR', 'vkQueuePresentKHR'])]
+ additional_instance_extensions = [
+ 'vkDestroySurfaceKHR',
+ 'vkGetPhysicalDeviceSurfaceSupportKHR',
+ 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
+ 'vkGetPhysicalDeviceSurfaceFormatsKHR',
+ 'vkGetPhysicalDeviceSurfacePresentModesKHR',
+ 'vkCreateDisplayPlaneSurfaceKHR']
if self.wsi == 'Win32':
instance_extensions=[('wsi_enabled',
- ['vkDestroySurfaceKHR',
- 'vkGetPhysicalDeviceSurfaceSupportKHR',
- 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
- 'vkGetPhysicalDeviceSurfaceFormatsKHR',
- 'vkGetPhysicalDeviceSurfacePresentModesKHR',
- 'vkCreateWin32SurfaceKHR'
- ])]
+ additional_instance_extensions + ['vkCreateWin32SurfaceKHR'])]
elif self.wsi == 'Android':
instance_extensions=[('wsi_enabled',
- ['vkDestroySurfaceKHR',
- 'vkGetPhysicalDeviceSurfaceSupportKHR',
- 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
- 'vkGetPhysicalDeviceSurfaceFormatsKHR',
- 'vkGetPhysicalDeviceSurfacePresentModesKHR',
- 'vkCreateAndroidSurfaceKHR'])]
+ additional_instance_extensions + ['vkCreateAndroidSurfaceKHR'])]
elif self.wsi == 'Xcb' or self.wsi == 'Xlib' or self.wsi == 'Wayland' or self.wsi == 'Mir':
instance_extensions=[('wsi_enabled',
- ['vkDestroySurfaceKHR',
- 'vkGetPhysicalDeviceSurfaceSupportKHR',
- 'vkGetPhysicalDeviceSurfaceCapabilitiesKHR',
- 'vkGetPhysicalDeviceSurfaceFormatsKHR',
- 'vkGetPhysicalDeviceSurfacePresentModesKHR',
- 'vkCreateXcbSurfaceKHR',
+ additional_instance_extensions +
+ ['vkCreateXcbSurfaceKHR',
'vkCreateXlibSurfaceKHR',
'vkCreateWaylandSurfaceKHR',
'vkCreateMirSurfaceKHR'
diff --git a/vulkan.py b/vulkan.py
index a623f4ab..0048cbde 100644
--- a/vulkan.py
+++ b/vulkan.py
@@ -1054,6 +1054,54 @@ ext_khr_surface = Extension(
],
)
+ext_khr_display = Extension(
+ name="VK_KHR_display",
+ headers=["vulkan/vulkan.h"],
+ objects=['VkSurfaceKHR', 'VkDisplayModeKHR'],
+ protos=[
+ Proto("VkResult", "GetPhysicalDeviceDisplayPropertiesKHR",
+ [Param("VkPhysicalDevice", "physicalDevice"),
+ Param("uint32_t*", "pPropertyCount"),
+ Param("VkDisplayPropertiesKHR*", "pProperties")]),
+
+ Proto("VkResult", "GetPhysicalDeviceDisplayPlanePropertiesKHR",
+ [Param("VkPhysicalDevice", "physicalDevice"),
+ Param("uint32_t*", "pPropertyCount"),
+ Param("VkDisplayPlanePropertiesKHR*", "pProperties")]),
+
+ Proto("VkResult", "GetDisplayPlaneSupportedDisplaysKHR",
+ [Param("VkPhysicalDevice", "physicalDevice"),
+ Param("uint32_t", "planeIndex"),
+ Param("uint32_t*", "pDisplayCount"),
+ Param("VkDisplayKHR*", "pDisplays")]),
+
+ Proto("VkResult", "GetDisplayModePropertiesKHR",
+ [Param("VkPhysicalDevice", "physicalDevice"),
+ Param("VkDisplayKHR", "display"),
+ Param("uint32_t*", "pPropertyCount"),
+ Param("VkDisplayModePropertiesKHR*", "pProperties")]),
+
+ Proto("VkResult", "CreateDisplayModeKHR",
+ [Param("VkPhysicalDevice", "physicalDevice"),
+ Param("VkDisplayKHR", "display"),
+ Param("const VkDisplayModeCreateInfoKHR*", "pCreateInfo"),
+ Param("const VkAllocationCallbacks*", "pAllocator"),
+ Param("VkDisplayModeKHR*", "pMode")]),
+
+ Proto("VkResult", "GetDisplayPlaneCapabilitiesKHR",
+ [Param("VkPhysicalDevice", "physicalDevice"),
+ Param("VkDisplayModeKHR", "mode"),
+ Param("uint32_t", "planeIndex"),
+ Param("VkDisplayPlaneCapabilitiesKHR*", "pCapabilities")]),
+
+ Proto("VkResult", "CreateDisplayPlaneSurfaceKHR",
+ [Param("VkInstance", "instance"),
+ Param("const VkDisplaySurfaceCreateInfoKHR*", "pCreateInfo"),
+ Param("const VkAllocationCallbacks*", "pAllocator"),
+ Param("VkSurfaceKHR*", "pSurface")]),
+ ],
+)
+
ext_khr_device_swapchain = Extension(
name="VK_KHR_swapchain",
headers=["vulkan/vulkan.h"],
@@ -1223,24 +1271,24 @@ import sys
if len(sys.argv) > 3:
# TODO : Need to clean this up to more seemlessly handle building different targets than the platform you're on
if sys.platform.startswith('win32') and sys.argv[1] != 'Android':
- extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface]
- extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface, lunarg_debug_report]
+ extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface, ext_khr_display]
+ extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface, ext_khr_display, lunarg_debug_report]
elif sys.platform.startswith('linux') and sys.argv[1] != 'Android':
- extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface]
- extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface, lunarg_debug_report]
+ extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface, ext_khr_display]
+ extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface, ext_khr_display, lunarg_debug_report]
else: # android
extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_android_surface]
extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_android_surface, lunarg_debug_report]
else :
if sys.argv[1] == 'Win32':
- extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface]
- extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface, lunarg_debug_report]
+ extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface, ext_khr_display]
+ extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_win32_surface, ext_khr_display, lunarg_debug_report]
elif sys.argv[1] == 'Android':
extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_android_surface]
extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_android_surface, lunarg_debug_report]
- elif sys.argv[1] == 'Xcb' or sys.argv[1] == 'Xlib' or sys.argv[1] == 'Wayland' or sys.argv[1] == 'Mir':
- extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface]
- extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface, lunarg_debug_report]
+ elif sys.argv[1] == 'Xcb' or sys.argv[1] == 'Xlib' or sys.argv[1] == 'Wayland' or sys.argv[1] == 'Mir' or sys.argv[1] == 'Display':
+ extensions = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface, ext_khr_display]
+ extensions_all = [core, ext_khr_surface, ext_khr_device_swapchain, ext_khr_xcb_surface, ext_khr_xlib_surface, ext_khr_wayland_surface, ext_khr_mir_surface, ext_khr_display, lunarg_debug_report]
else:
print('Error: Undefined DisplayServer')
extensions = []