diff options
| author | John Zulauf <jzulauf@lunarg.com> | 2018-04-04 14:54:11 -0600 |
|---|---|---|
| committer | jzulauf-lunarg <32470354+jzulauf-lunarg@users.noreply.github.com> | 2018-04-05 10:29:18 -0600 |
| commit | a2d035a724fb5c031da4b9732a3d5ad438ce8a94 (patch) | |
| tree | 15f3e619217420b3fc56ac3b0bd629b8dcbc368b /layers/core_validation.cpp | |
| parent | 3adfafb3f10c49aebd2ca0fec32e602c7df252b4 (diff) | |
| download | usermoji-a2d035a724fb5c031da4b9732a3d5ad438ce8a94.tar.xz | |
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
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 78 |
1 files changed, 68 insertions, 10 deletions
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<uint32_t>(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; } |
