diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-10-25 16:56:42 -0600 |
|---|---|---|
| committer | Mike Schuchardt <mikes@lunarg.com> | 2018-03-09 13:54:31 -0700 |
| commit | eb2b110c2d8536fbd8855c0754b5e76d2c0488c9 (patch) | |
| tree | bdaa15119e7506d2954b84f8215d0861c1b7c629 | |
| parent | 3e557722aba9c244a3efb535afed3850e5723abe (diff) | |
| download | usermoji-eb2b110c2d8536fbd8855c0754b5e76d2c0488c9.tar.xz | |
layers: Updated unique objects layer for aliases
UpdateDescriptorSetWithTemplate[KHR]
CreateDescriptorUpdateTemplate[KHR]
DestroyDescriptorUpdateTemplate[KHR]
| -rw-r--r-- | layers/unique_objects.cpp | 68 | ||||
| -rw-r--r-- | scripts/unique_objects_generator.py | 3 |
2 files changed, 69 insertions, 2 deletions
diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp index 951120dc..37003700 100644 --- a/layers/unique_objects.cpp +++ b/layers/unique_objects.cpp @@ -559,6 +559,39 @@ VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInf return result; } +// This is the core version of this routine. The extension version is below. +VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplate(VkDevice device, + const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { + layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + safe_VkDescriptorUpdateTemplateCreateInfo *local_create_info = NULL; + { + std::lock_guard<std::mutex> lock(global_lock); + if (pCreateInfo) { + local_create_info = new safe_VkDescriptorUpdateTemplateCreateInfo(pCreateInfo); + if (pCreateInfo->descriptorSetLayout) { + local_create_info->descriptorSetLayout = Unwrap(dev_data, pCreateInfo->descriptorSetLayout); + } + if (pCreateInfo->pipelineLayout) { + local_create_info->pipelineLayout = Unwrap(dev_data, pCreateInfo->pipelineLayout); + } + } + } + VkResult result = dev_data->dispatch_table.CreateDescriptorUpdateTemplate(device, local_create_info->ptr(), pAllocator, + pDescriptorUpdateTemplate); + if (VK_SUCCESS == result) { + std::lock_guard<std::mutex> lock(global_lock); + *pDescriptorUpdateTemplate = WrapNew(dev_data, *pDescriptorUpdateTemplate); + + // Shadow template createInfo for later updates + std::unique_ptr<TEMPLATE_STATE> template_state(new TEMPLATE_STATE(*pDescriptorUpdateTemplate, local_create_info)); + dev_data->desc_template_map[(uint64_t)*pDescriptorUpdateTemplate] = std::move(template_state); + } + return result; +} + +// This is the extension version of this routine. The core version is above. VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplateKHR(VkDevice device, const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, @@ -590,6 +623,20 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplateKHR(VkDevice device return result; } +// This is the core version of this routine. The extension version is below. +VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplate(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, + const VkAllocationCallbacks *pAllocator) { + layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + std::unique_lock<std::mutex> lock(global_lock); + uint64_t descriptor_update_template_id = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); + dev_data->desc_template_map.erase(descriptor_update_template_id); + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)dev_data->unique_id_mapping[descriptor_update_template_id]; + dev_data->unique_id_mapping.erase(descriptor_update_template_id); + lock.unlock(); + dev_data->dispatch_table.DestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator); +} + +// This is the extension version of this routine. The core version is above. VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplateKHR(VkDevice device, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const VkAllocationCallbacks *pAllocator) { @@ -597,7 +644,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyDescriptorUpdateTemplateKHR(VkDevice device, std::unique_lock<std::mutex> lock(global_lock); uint64_t descriptor_update_template_id = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); dev_data->desc_template_map.erase(descriptor_update_template_id); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplateKHR)unique_id_mapping[descriptor_update_template_id]; + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[descriptor_update_template_id]; unique_id_mapping.erase(descriptor_update_template_id); lock.unlock(); dev_data->dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); @@ -685,6 +732,23 @@ void *BuildUnwrappedUpdateTemplateBuffer(layer_data *dev_data, uint64_t descript return (void *)unwrapped_data; } +// This is the core version of this routine. The extension version is below. +VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet, + VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, + const void *pData) { + layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); + uint64_t template_handle = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); + { + std::lock_guard<std::mutex> lock(global_lock); + descriptorSet = Unwrap(dev_data, descriptorSet); + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)dev_data->unique_id_mapping[template_handle]; + } + void *unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(dev_data, template_handle, pData); + dev_data->dispatch_table.UpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, unwrapped_buffer); + free(unwrapped_buffer); +} + +// This is the extension version of this routine. The core version is above. VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplateKHR descriptorUpdateTemplate, const void *pData) { @@ -694,7 +758,7 @@ VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSetWithTemplateKHR(VkDevice device, V { std::lock_guard<std::mutex> lock(global_lock); descriptorSet = Unwrap(descriptorSet); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplateKHR)unique_id_mapping[template_handle]; + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[template_handle]; unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(dev_data, template_handle, pData); } dev_data->dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, unwrapped_buffer); diff --git a/scripts/unique_objects_generator.py b/scripts/unique_objects_generator.py index c80696a4..78526a3e 100644 --- a/scripts/unique_objects_generator.py +++ b/scripts/unique_objects_generator.py @@ -143,8 +143,11 @@ class UniqueObjectsOutputGenerator(OutputGenerator): 'vkEnumerateInstanceLayerProperties', 'vkEnumerateDeviceLayerProperties', 'vkEnumerateInstanceExtensionProperties', + 'vkCreateDescriptorUpdateTemplate', 'vkCreateDescriptorUpdateTemplateKHR', + 'vkDestroyDescriptorUpdateTemplate', 'vkDestroyDescriptorUpdateTemplateKHR', + 'vkUpdateDescriptorSetWithTemplate', 'vkUpdateDescriptorSetWithTemplateKHR', 'vkCmdPushDescriptorSetWithTemplateKHR', 'vkDebugMarkerSetObjectTagEXT', |
