From a2d035a724fb5c031da4b9732a3d5ad438ce8a94 Mon Sep 17 00:00:00 2001 From: John Zulauf Date: Wed, 4 Apr 2018 14:54:11 -0600 Subject: layers: Add checks for CreateDescriptorUpdateTempl Added four validation checks for vkCreateDescriptorUpdateTemplate(KHR) and removed a false positive. VALIDATION_ERROR_052002bc VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350 VALIDATION_ERROR_052002be VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351 VALIDATION_ERROR_052002c0 VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352 VALIDATION_ERROR_052002c2 VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353 Updated autogen of object tracker s.t. that logic for noautovalidation handles matches parameter validation, and spec generation, eliminating a source of false positives. Change-Id: Ib831eabd45a5083168355bca6b0e2beda3a76222 --- layers/core_validation.cpp | 78 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 10 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index c02a9a52..a36cc789 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -11962,6 +11962,48 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHR( return result; } +static bool PreCallValidateCreateDescriptorUpdateTemplate(const char *func_name, layer_data *device_data, + const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { + bool skip = false; + const auto layout = GetDescriptorSetLayout(device_data, pCreateInfo->descriptorSetLayout); + if (VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET == pCreateInfo->templateType && !layout) { + auto ds_uint = HandleToUint64(pCreateInfo->descriptorSetLayout); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + ds_uint, VALIDATION_ERROR_052002bc, "%s: Invalid pCreateInfo->descriptorSetLayout (%" PRIx64 ")", func_name, + ds_uint); + } else if (VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR == pCreateInfo->templateType) { + auto bind_point = pCreateInfo->pipelineBindPoint; + bool valid_bp = (bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS) || (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE); + if (!valid_bp) { + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + VALIDATION_ERROR_052002be, "%s: Invalid pCreateInfo->pipelineBindPoint (%" PRIu32 ").", func_name, + static_cast(bind_point)); + } + const auto pipeline_layout = getPipelineLayout(device_data, pCreateInfo->pipelineLayout); + if (!pipeline_layout) { + uint64_t pl_uint = HandleToUint64(pCreateInfo->pipelineLayout); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pl_uint, VALIDATION_ERROR_052002c0, + "%s: Invalid pCreateInfo->pipelineLayout (%" PRIx64 ")", func_name, pl_uint); + } else { + const uint32_t pd_set = pCreateInfo->set; + if ((pd_set >= pipeline_layout->set_layouts.size()) || !pipeline_layout->set_layouts[pd_set] || + !pipeline_layout->set_layouts[pd_set]->IsPushDescriptor()) { + uint64_t pl_uint = HandleToUint64(pCreateInfo->pipelineLayout); + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, pl_uint, VALIDATION_ERROR_052002c2, + "%s: pCreateInfo->set (%" PRIu32 + ") does not refer to the push descriptor set layout for " + "pCreateInfo->pipelineLayout (%" PRIx64 ").", + func_name, pd_set, pl_uint); + } + } + } + return skip; +} + static void PostCallRecordCreateDescriptorUpdateTemplate(layer_data *device_data, const VkDescriptorUpdateTemplateCreateInfoKHR *pCreateInfo, VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { @@ -11976,11 +12018,19 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplate(VkDevice device, const VkAllocationCallbacks *pAllocator, VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - VkResult result = - device_data->dispatch_table.CreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate); - if (VK_SUCCESS == result) { - lock_guard_t lock(global_lock); - PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + unique_lock_t lock(global_lock); + bool skip = PreCallValidateCreateDescriptorUpdateTemplate("vkCreateDescriptorUpdateTemplate()", device_data, pCreateInfo, + pAllocator, pDescriptorUpdateTemplate); + + VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; + if (!skip) { + lock.unlock(); + result = + device_data->dispatch_table.CreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate); + if (VK_SUCCESS == result) { + lock.lock(); + PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + } } return result; } @@ -11990,11 +12040,19 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorUpdateTemplateKHR(VkDevice device const VkAllocationCallbacks *pAllocator, VkDescriptorUpdateTemplateKHR *pDescriptorUpdateTemplate) { layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); - VkResult result = - device_data->dispatch_table.CreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate); - if (VK_SUCCESS == result) { - lock_guard_t lock(global_lock); - PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + unique_lock_t lock(global_lock); + bool skip = PreCallValidateCreateDescriptorUpdateTemplate("vkCreateDescriptorUpdateTemplateKHR()", device_data, pCreateInfo, + pAllocator, pDescriptorUpdateTemplate); + + VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; + if (!skip) { + lock.unlock(); + result = device_data->dispatch_table.CreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, + pDescriptorUpdateTemplate); + if (VK_SUCCESS == result) { + lock.lock(); + PostCallRecordCreateDescriptorUpdateTemplate(device_data, pCreateInfo, pDescriptorUpdateTemplate); + } } return result; } -- cgit v1.2.3