aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorMike Weiblen <mikew@lunarg.com>2017-01-24 13:08:42 -0700
committerMike Weiblen <mikew@lunarg.com>2017-01-27 10:41:56 -0700
commit0bb17d975de61f7b223797e1772b81cd0ab8d43c (patch)
treea885910732f0e1dc553ffc370087beb30f3263be /layers/core_validation.cpp
parent8d5226c619572dacf4778aa95dc51a98557f9554 (diff)
downloadusermoji-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.cpp39
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();