diff options
| author | Mike Weiblen <mikew@lunarg.com> | 2017-01-24 13:08:42 -0700 |
|---|---|---|
| committer | Mike Weiblen <mikew@lunarg.com> | 2017-01-27 10:41:56 -0700 |
| commit | 0bb17d975de61f7b223797e1772b81cd0ab8d43c (patch) | |
| tree | a885910732f0e1dc553ffc370087beb30f3263be /layers/core_validation.cpp | |
| parent | 8d5226c619572dacf4778aa95dc51a98557f9554 (diff) | |
| download | usermoji-0bb17d975de61f7b223797e1772b81cd0ab8d43c.tar.xz | |
layers: GH-909 level/layer Valid Usage checking
Refactor subresourceRange.levelCount and subresourceRange.layerCount
checking from PreCallValidateCreateImageView() into a standalone
helper function ValidateImageSubrangeLevelLayerCounts() to facilitate
reuse below.
Add ValidateImageSubrangeLevelLayerCounts() to ValidateBarrier(), to
address GH-909.
This extends the reuse of Valid Usages 00768 and 00769, which are
already tagged as deserving new standalone Valid Usages.
This change is implemented such that it will be simple to modify for
new VUs, once they're available.
Also canonicalize function names passed as parameter to helper
function.
Change-Id: I8346a19e9b2c4df578334c2aebfb78e6492bd1d9
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 3feff509..4ed0803c 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6503,6 +6503,23 @@ static bool ValidateImageAspectMask(layer_data *dev_data, VkImage image, VkForma return skip; } +static bool ValidateImageSubrangeLevelLayerCounts(layer_data *dev_data, const VkImageSubresourceRange &subresourceRange, + const char *func_name, UNIQUE_VALIDATION_ERROR_CODE layer_msg_code, + UNIQUE_VALIDATION_ERROR_CODE level_msg_code) { + bool skip = false; + if (subresourceRange.levelCount == 0) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + VALIDATION_ERROR_00768, "IMAGE", "%s called with 0 in subresourceRange.levelCount. %s", func_name, + validation_error_map[VALIDATION_ERROR_00768]); + } + if (subresourceRange.layerCount == 0) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + VALIDATION_ERROR_00769, "IMAGE", "%s called with 0 in subresourceRange.layerCount. %s", func_name, + validation_error_map[VALIDATION_ERROR_00769]); + } + return skip; +} + static bool PreCallValidateCreateImageView(layer_data *dev_data, const VkImageViewCreateInfo *create_info) { bool skip = false; IMAGE_STATE *image_state = getImageState(dev_data, create_info->image); @@ -6532,20 +6549,8 @@ static bool PreCallValidateCreateImageView(layer_data *dev_data, const VkImageVi VALIDATION_ERROR_00769, "IMAGE", "%s %s", ss.str().c_str(), validation_error_map[VALIDATION_ERROR_00769]); } // TODO: Need new valid usage language for levelCount == 0 & layerCount == 0 - if (!create_info->subresourceRange.levelCount) { - std::stringstream ss; - ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.levelCount."; - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - VALIDATION_ERROR_00768, "IMAGE", "%s %s", ss.str().c_str(), validation_error_map[VALIDATION_ERROR_00768]); - } - if (!create_info->subresourceRange.layerCount) { - std::stringstream ss; - ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.layerCount."; - skip |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - VALIDATION_ERROR_00769, "IMAGE", "%s %s", ss.str().c_str(), validation_error_map[VALIDATION_ERROR_00769]); - } + skip |= ValidateImageSubrangeLevelLayerCounts(dev_data, create_info->subresourceRange, "vkCreateImageView()", + VALIDATION_ERROR_00768, VALIDATION_ERROR_00769); VkImageCreateFlags image_flags = image_state->createInfo.flags; VkFormat image_format = image_state->createInfo.format; @@ -9294,6 +9299,8 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui } } if (imageFound) { + skip |= ValidateImageSubrangeLevelLayerCounts(dev_data, mem_barrier->subresourceRange, funcName, + VALIDATION_ERROR_00768, VALIDATION_ERROR_00769); auto aspect_mask = mem_barrier->subresourceRange.aspectMask; skip |= ValidateImageAspectMask(dev_data, image_data->image, format, aspect_mask, funcName); int layerCount = (mem_barrier->subresourceRange.layerCount == VK_REMAINING_ARRAY_LAYERS) @@ -9526,7 +9533,7 @@ VKAPI_ATTR void VKAPI_CALL CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t skip |= report_error_no_cb_begin(dev_data, commandBuffer, "vkCmdWaitEvents()"); } skip |= TransitionImageLayouts(commandBuffer, imageMemoryBarrierCount, pImageMemoryBarriers); - skip |= ValidateBarriers("vkCmdWaitEvents", commandBuffer, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, + skip |= ValidateBarriers("vkCmdWaitEvents()", commandBuffer, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); } lock.unlock(); @@ -9555,7 +9562,7 @@ VKAPI_ATTR void VKAPI_CALL CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkP VALIDATION_ERROR_00268); UpdateCmdBufferLastCmd(dev_data, cb_state, CMD_PIPELINEBARRIER); skip |= TransitionImageLayouts(commandBuffer, imageMemoryBarrierCount, pImageMemoryBarriers); - skip |= ValidateBarriers("vkCmdPipelineBarrier", commandBuffer, memoryBarrierCount, pMemoryBarriers, + skip |= ValidateBarriers("vkCmdPipelineBarrier()", commandBuffer, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); } lock.unlock(); |
