From b8b0c3ae1ce0242d9614e27a7a68346ffcee597e Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Tue, 28 Jun 2016 16:59:36 -0600 Subject: layers: FIx object_tracker displayKHR and displayModeKHR creation For displayModeKHR there are two separate Vulkan commands that can create these objects. For displayKHR there is one command that creates the object: GetPhysicalDeviceDisplayPropertiesKHR. GetDisplayPlaneSupportedDisplaysKHR doesn't create new objects but returns existing objects. The existing code had the creation in GetDisplayPlaneSupportedDisplaysKHR rather than in GetPhysicalDeviceDisplayPropertiesKHR. Change-Id: I63df7c41a0d17acd8b06ebb1a5742ac032159a09 --- layers/object_tracker.h | 43 +++++++++++++++++++++++++++++++++++++------ vk-layer-generate.py | 6 ++++-- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/layers/object_tracker.h b/layers/object_tracker.h index a20760f4..4bba6985 100644 --- a/layers/object_tracker.h +++ b/layers/object_tracker.h @@ -290,6 +290,7 @@ static void create_device(VkDevice dispatchable_object, VkDevice object, VkDebug static void create_device(VkPhysicalDevice dispatchable_object, VkDevice object, VkDebugReportObjectTypeEXT objType); static void create_queue(VkDevice dispatchable_object, VkQueue vkObj, VkDebugReportObjectTypeEXT objType); static void create_display_khr(VkPhysicalDevice dispatchable_object, VkDisplayKHR vkObj, VkDebugReportObjectTypeEXT objType); +static void create_display_mode_khr(VkPhysicalDevice dispatchable_object, VkDisplayModeKHR vkObj, VkDebugReportObjectTypeEXT objType); static bool validate_image(VkQueue dispatchable_object, VkImage object, VkDebugReportObjectTypeEXT objType, bool null_allowed); static bool validate_instance(VkInstance dispatchable_object, VkInstance object, VkDebugReportObjectTypeEXT objType, bool null_allowed); @@ -315,6 +316,10 @@ static bool validate_pipeline_layout(VkDevice dispatchable_object, VkPipelineLay bool null_allowed); static bool validate_pipeline(VkDevice dispatchable_object, VkPipeline object, VkDebugReportObjectTypeEXT objType, bool null_allowed); +static bool validate_display_khr(VkPhysicalDevice dispatchable_object, VkDisplayKHR object, VkDebugReportObjectTypeEXT objType, + bool null_allowed); +static bool validate_display_mode_khr(VkInstance dispatchable_object, VkDisplayModeKHR object, VkDebugReportObjectTypeEXT objType, + bool null_allowed); static void destroy_command_pool(VkDevice dispatchable_object, VkCommandPool object); static void destroy_descriptor_pool(VkDevice dispatchable_object, VkDescriptorPool object); static void destroy_descriptor_set(VkDevice dispatchable_object, VkDescriptorSet object); @@ -1027,21 +1032,47 @@ VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchai return result; } -VkResult VKAPI_CALL explicit_GetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays) +VkResult explicit_GetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties) { bool skipCall = false; { std::lock_guard lock(global_lock); - skipCall |= validate_physical_device(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false); + if (physicalDevice) { + skipCall |= validate_physical_device(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false); + } } if (skipCall) return VK_ERROR_VALIDATION_FAILED_EXT; - VkResult result = get_dispatch_table(object_tracker_instance_table_map, physicalDevice)->GetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays); + VkResult result = get_dispatch_table(object_tracker_instance_table_map, physicalDevice)->GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties); + if (VK_SUCCESS == result && pProperties) { + std::lock_guard lock(global_lock); + for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { + if (pProperties[idx0].display) { + create_display_khr(physicalDevice, pProperties[idx0].display, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT); + } + } + } + return result; +} + +VkResult explicit_GetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) +{ + bool skipCall = false; { std::lock_guard lock(global_lock); - if (result == VK_SUCCESS) { - for (uint32_t idx=0; idx<*pDisplayCount; ++idx) { - create_display_khr(physicalDevice, pDisplays[idx], VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT); + skipCall |= validate_display_khr(physicalDevice, display, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, false); + if (physicalDevice) { + skipCall |= validate_physical_device(physicalDevice, physicalDevice, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, false); + } + } + if (skipCall) + return VK_ERROR_VALIDATION_FAILED_EXT; + VkResult result = get_dispatch_table(object_tracker_instance_table_map, physicalDevice)->GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties); + if (VK_SUCCESS == result && pProperties) { + std::lock_guard lock(global_lock); + for (uint32_t idx0=0; idx0<*pPropertyCount; ++idx0) { + if (pProperties[idx0].displayMode) { + create_display_mode_khr(physicalDevice, pProperties[idx0].displayMode, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT); } } } diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 0e459dd5..4d015494 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -1196,7 +1196,8 @@ class ObjectTrackerSubcommand(Subcommand): "FreeMemory", "DestroySwapchainKHR", "GetSwapchainImagesKHR", - "GetDisplayPlaneSupportedDisplaysKHR" + "GetPhysicalDeviceDisplayPropertiesKHR", + "GetDisplayModePropertiesKHR" ] decl = proto.c_func(attr="VKAPI") param0_name = proto.params[0].name @@ -1273,6 +1274,8 @@ class ObjectTrackerSubcommand(Subcommand): if True in [create_txt in proto.name for create_txt in ['Create', 'Allocate']]: create_func = True last_param_index = -1 # For create funcs don't validate last object + if proto.name == 'GetDisplayPlaneSupportedDisplaysKHR': + last_param_index = -1 # don't validate the DisplayKHR objects which are non-created output parameters (struct_uses, local_decls) = get_object_uses(vulkan.object_type_list, proto.params[:last_param_index]) funcs = [] mutex_unlock = False @@ -1283,7 +1286,6 @@ class ObjectTrackerSubcommand(Subcommand): ' return explicit_%s;\n' '}' % (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: return "" else: -- cgit v1.2.3