From 0dd40a6100a0be62a504a67f4426b7a0d304ed5b Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 14 Feb 2018 14:39:46 -0800 Subject: layers: add GetDeviceQueue2() support This change add GetDeviceQueue2() support to object tracker and core validation layers. --- layers/core_validation.cpp | 11 +++++++++++ layers/object_tracker_utils.cpp | 14 ++++++++++++++ scripts/mock_icd_generator.py | 4 ++++ scripts/object_tracker_generator.py | 1 + 4 files changed, 30 insertions(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 51223dca..87bb7697 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3318,6 +3318,16 @@ VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyI PostCallRecordGetDeviceQueue(dev_data, queueFamilyIndex, *pQueue); } +VKAPI_ATTR void VKAPI_CALL GetDeviceQueue2(VkDevice device, VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) { + layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + dev_data->dispatch_table.GetDeviceQueue2(device, pQueueInfo, pQueue); + lock_guard_t lock(global_lock); + + if (*pQueue != VK_NULL_HANDLE) { + PostCallRecordGetDeviceQueue(dev_data, pQueueInfo->queueFamilyIndex, *pQueue); + } +} + static bool PreCallValidateQueueWaitIdle(layer_data *dev_data, VkQueue queue, QUEUE_STATE **queue_state) { *queue_state = GetQueueState(dev_data, queue); if (dev_data->instance_data->disabled.queue_wait_idle) return false; @@ -12313,6 +12323,7 @@ static const std::unordered_map name_to_funcptr_map = { {"vkQueueWaitIdle", (void *)QueueWaitIdle}, {"vkDeviceWaitIdle", (void *)DeviceWaitIdle}, {"vkGetDeviceQueue", (void *)GetDeviceQueue}, + {"vkGetDeviceQueue2", (void *)GetDeviceQueue2}, {"vkDestroyDevice", (void *)DestroyDevice}, {"vkDestroyFence", (void *)DestroyFence}, {"vkResetFences", (void *)ResetFences}, diff --git a/layers/object_tracker_utils.cpp b/layers/object_tracker_utils.cpp index 177c1455..e5005646 100644 --- a/layers/object_tracker_utils.cpp +++ b/layers/object_tracker_utils.cpp @@ -446,6 +446,20 @@ VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyI AddQueueInfo(device, queueFamilyIndex, *pQueue); } +VKAPI_ATTR void VKAPI_CALL GetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) { + std::unique_lock lock(global_lock); + ValidateObject(device, device, kVulkanObjectTypeDevice, false, VALIDATION_ERROR_29605601, VALIDATION_ERROR_UNDEFINED); + lock.unlock(); + + get_dispatch_table(ot_device_table_map, device)->GetDeviceQueue2(device, pQueueInfo, pQueue); + + lock.lock(); + if (*pQueue != VK_NULL_HANDLE) { + CreateQueue(device, *pQueue); + AddQueueInfo(device, pQueueInfo->queueFamilyIndex, *pQueue); + } +} + VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) { diff --git a/scripts/mock_icd_generator.py b/scripts/mock_icd_generator.py index 43771e9b..eef6e45c 100644 --- a/scripts/mock_icd_generator.py +++ b/scripts/mock_icd_generator.py @@ -477,6 +477,10 @@ CUSTOM_C_INTERCEPTS = { // TODO: If emulating specific device caps, will need to add intelligence here return; ''', +'vkGetDeviceQueue2': ''' + GetDeviceQueue(device, pQueueInfo->queueFamilyIndex, pQueueInfo->queueIndex, pQueue); + // TODO: Add further support for GetDeviceQueue2 features +''', 'vkEnumerateInstanceLayerProperties': ''' return VK_SUCCESS; ''', diff --git a/scripts/object_tracker_generator.py b/scripts/object_tracker_generator.py index 0d922051..e5475ec7 100644 --- a/scripts/object_tracker_generator.py +++ b/scripts/object_tracker_generator.py @@ -170,6 +170,7 @@ class ObjectTrackerOutputGenerator(OutputGenerator): 'vkNegotiateLoaderLayerInterfaceVersion', 'vkCreateComputePipelines', 'vkGetDeviceQueue', + 'vkGetDeviceQueue2', 'vkGetSwapchainImagesKHR', 'vkCreateDescriptorSetLayout', 'vkCreateDebugUtilsMessengerEXT', -- cgit v1.2.3