From 82177dbd6a4da311c2447a51414f31145d3e2fc0 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 25 Oct 2016 09:36:53 -0600 Subject: layers:Refactor CreateDescriptorSetLayout Update CreateDescriptorSetLayout() to use Pre/Post pattern and split out validation of createInfo for the layout to occur before the creation of the layout. --- layers/core_validation.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 71d140ba..c2b78c08 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6715,17 +6715,32 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCre return result; } +static bool PreCallValidateCreateDescriptorSetLayout(layer_data *dev_data, const VkDescriptorSetLayoutCreateInfo *create_info) { + if (dev_data->instance_data->disabled.create_descriptor_set_layout) + return false; + return cvdescriptorset::DescriptorSetLayout::ValidateCreateInfo(dev_data->report_data, create_info); +} + +static void PostCallRecordCreateDescriptorSetLayout(layer_data *dev_data, const VkDescriptorSetLayoutCreateInfo *create_info, + VkDescriptorSetLayout set_layout) { + // TODOSC : Capture layout bindings set + dev_data->descriptorSetLayoutMap[set_layout] = new cvdescriptorset::DescriptorSetLayout(create_info, set_layout); +} + VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - // TODO: Need to validate create state prior to calling down the chain - VkResult result = dev_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout); - if (VK_SUCCESS == result) { - // TODOSC : Capture layout bindings set - std::lock_guard lock(global_lock); - dev_data->descriptorSetLayoutMap[*pSetLayout] = - new cvdescriptorset::DescriptorSetLayout(dev_data->report_data, pCreateInfo, *pSetLayout); + VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; + std::unique_lock lock(global_lock); + bool skip = PreCallValidateCreateDescriptorSetLayout(dev_data, pCreateInfo); + if (!skip) { + lock.unlock(); + result = dev_data->dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout); + if (VK_SUCCESS == result) { + lock.lock(); + PostCallRecordCreateDescriptorSetLayout(dev_data, pCreateInfo, *pSetLayout); + } } return result; } -- cgit v1.2.3