From 09854fbb01a3c10287b759e88f40e5c05c9be9ba Mon Sep 17 00:00:00 2001 From: Norbert Nopper Date: Fri, 25 Nov 2016 07:55:13 +0100 Subject: [PATCH] layers: Complete support for VK_KHR_Display ext Fixed using display extension only crash. Added vkGetDisplayPlaneCapabilitiesKHR. Fixes, that unique objects works for display extension. Change-Id: I66727a430b9d55bfa40fdddc884f40c91aa29f11 --- layers/core_validation.cpp | 7 +++++++ layers/object_tracker.cpp | 26 ++++++++++++++++++++++++++ layers/object_tracker.h | 1 + layers/unique_objects.cpp | 20 ++++++++++++++++++++ scripts/unique_objects_generator.py | 1 + scripts/vulkan.py | 4 ++-- 6 files changed, 57 insertions(+), 2 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 99542cc..c0fa3b4 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -12303,6 +12303,11 @@ VKAPI_ATTR void VKAPI_CALL DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR s } } +VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { + return CreateSurface(instance, pCreateInfo, pAllocator, pSurface, &VkLayerInstanceDispatchTable::CreateDisplayPlaneSurfaceKHR); +} + #ifdef VK_USE_PLATFORM_ANDROID_KHR VKAPI_ATTR VkResult VKAPI_CALL CreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { @@ -12848,6 +12853,8 @@ intercept_khr_surface_command(const char *name, VkInstance instance) { {"vkCreateXlibSurfaceKHR", reinterpret_cast(CreateXlibSurfaceKHR), &instance_layer_data::xlibSurfaceExtensionEnabled}, #endif // VK_USE_PLATFORM_XLIB_KHR + { "vkCreateDisplayPlaneSurfaceKHR", reinterpret_cast(CreateDisplayPlaneSurfaceKHR), + &instance_layer_data::displayExtensionEnabled}, {"vkDestroySurfaceKHR", reinterpret_cast(DestroySurfaceKHR), &instance_layer_data::surfaceExtensionEnabled}, {"vkGetPhysicalDeviceSurfaceCapabilitiesKHR", reinterpret_cast(GetPhysicalDeviceSurfaceCapabilitiesKHR), diff --git a/layers/object_tracker.cpp b/layers/object_tracker.cpp index 11276f4..b444354 100644 --- a/layers/object_tracker.cpp +++ b/layers/object_tracker.cpp @@ -2726,6 +2726,27 @@ VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInf return result; } +VKAPI_ATTR VkResult VKAPI_CALL CreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { + bool skip_call = false; + { + std::lock_guard lock(global_lock); + skip_call |= ValidateObject(instance, instance, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, false, VALIDATION_ERROR_01878); + } + if (skip_call) { + return VK_ERROR_VALIDATION_FAILED_EXT; + } + VkResult result = get_dispatch_table(ot_instance_table_map, instance) + ->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); + { + std::lock_guard lock(global_lock); + if (result == VK_SUCCESS) { + CreateObject(instance, *pSurface, VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, pAllocator); + } + } + return result; +} + #ifdef VK_USE_PLATFORM_WIN32_KHR VKAPI_ATTR VkResult VKAPI_CALL CreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { @@ -3065,6 +3086,8 @@ static inline PFN_vkVoidFunction InterceptWsiEnabledCommand(const char *name, Vk return reinterpret_cast(GetPhysicalDeviceSurfaceFormatsKHR); if (!strcmp("vkGetPhysicalDeviceSurfacePresentModesKHR", name)) return reinterpret_cast(GetPhysicalDeviceSurfacePresentModesKHR); + if ((instanceExtMap[pTable].display_enabled == true) && !strcmp("vkCreateDisplayPlaneSurfaceKHR", name)) + return reinterpret_cast(CreateDisplayPlaneSurfaceKHR); #ifdef VK_USE_PLATFORM_WIN32_KHR if ((instanceExtMap[pTable].win32_enabled == true) && !strcmp("vkCreateWin32SurfaceKHR", name)) @@ -3133,6 +3156,9 @@ static void CheckInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreateI if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) { instanceExtMap[pDisp].wsi_enabled = true; } + if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_DISPLAY_EXTENSION_NAME) == 0) { + instanceExtMap[pDisp].display_enabled = true; + } #ifdef VK_USE_PLATFORM_XLIB_KHR if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) { instanceExtMap[pDisp].xlib_enabled = true; diff --git a/layers/object_tracker.h b/layers/object_tracker.h index 729e613..bf548e4 100644 --- a/layers/object_tracker.h +++ b/layers/object_tracker.h @@ -81,6 +81,7 @@ struct instance_extension_enables { bool mir_enabled; bool android_enabled; bool win32_enabled; + bool display_enabled; }; typedef std::unordered_map object_map_type; diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp index 3a0945a..b8564f3 100644 --- a/layers/unique_objects.cpp +++ b/layers/unique_objects.cpp @@ -676,6 +676,26 @@ VKAPI_ATTR VkResult VKAPI_CALL GetDisplayModePropertiesKHR(VkPhysicalDevice phys } return result; } + +VKAPI_ATTR VkResult VKAPI_CALL GetDisplayPlaneCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, + uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR *pCapabilities) { + layer_data *dev_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); + { + std::lock_guard lock(global_lock); + auto it = dev_data->unique_id_mapping.find(reinterpret_cast(mode)); + if (it == dev_data->unique_id_mapping.end()) { + uint64_t unique_id = global_unique_id++; + dev_data->unique_id_mapping[unique_id] = reinterpret_cast(mode); + + mode = reinterpret_cast(unique_id); + } else { + mode = reinterpret_cast(it->second); + } + } + VkResult result = + dev_data->instance_dispatch_table->GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities); + return result; +} #endif } // namespace unique_objects diff --git a/scripts/unique_objects_generator.py b/scripts/unique_objects_generator.py index cdd2808..af59da4 100644 --- a/scripts/unique_objects_generator.py +++ b/scripts/unique_objects_generator.py @@ -146,6 +146,7 @@ class UniqueObjectsOutputGenerator(OutputGenerator): 'vkGetPhysicalDeviceDisplayPlanePropertiesKHR', 'vkGetDisplayPlaneSupportedDisplaysKHR', 'vkGetDisplayModePropertiesKHR', + 'vkGetDisplayPlaneCapabilitiesKHR', # DebugReport APIs are hooked, but handled separately in the source file 'vkCreateDebugReportCallbackEXT', 'vkDestroyDebugReportCallbackEXT', diff --git a/scripts/vulkan.py b/scripts/vulkan.py index 9000765..5d71f52 100644 --- a/scripts/vulkan.py +++ b/scripts/vulkan.py @@ -1375,6 +1375,7 @@ win32_wsi_exts = [VK_KHR_win32_surface common_exts = [VK_VERSION_1_0, VK_KHR_surface, VK_KHR_swapchain, + VK_KHR_display, VK_KHR_display_swapchain, ] @@ -1398,8 +1399,7 @@ non_exported_exts = [VK_NV_external_memory_capabilities, # VK_AMD_shader_ballot, # VK_IMG_format_pvrtc, ] -non_android_exts = [VK_KHR_display, - ] + extensions = common_exts extensions_all = non_exported_exts -- 2.7.4