diff options
| author | Petros Bantolas <petros.bantolas@imgtec.com> | 2016-04-15 11:02:59 +0100 |
|---|---|---|
| committer | Jon Ashburn <jon@lunarg.com> | 2016-06-30 11:18:44 -0600 |
| commit | a79223bcf3c4f554400ea2e2748be77a93691aea (patch) | |
| tree | 6704606c59c70aa4bbf178ae6a4f49b95dac7a09 | |
| parent | 4adf813386db856e56c147bc3faf1bf3425930ce (diff) | |
| download | usermoji-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.h | 14 | ||||
| -rw-r--r-- | layers/swapchain.cpp | 314 | ||||
| -rw-r--r-- | layers/swapchain.h | 10 | ||||
| -rw-r--r-- | layers/unique_objects.h | 1 | ||||
| -rwxr-xr-x | vk-generate.py | 3 | ||||
| -rwxr-xr-x | vk-layer-generate.py | 65 | ||||
| -rw-r--r-- | vulkan.py | 66 |
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' @@ -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 = [] |
