aboutsummaryrefslogtreecommitdiff
path: root/layers/buffer_validation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers/buffer_validation.cpp')
-rw-r--r--layers/buffer_validation.cpp54
1 files changed, 22 insertions, 32 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 975af3aa..a6d62e5e 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -264,52 +264,41 @@ bool ValidateImageAttributes(core_validation::layer_data *device_data, IMAGE_STA
return skip;
}
-void ResolveRemainingLevelsLayers(core_validation::layer_data *dev_data, VkImageSubresourceRange *range, VkImage image) {
- // Expects global_lock to be held by caller
-
- auto image_state = getImageState(dev_data, image);
- if (image_state) {
- // If the caller used the special values VK_REMAINING_MIP_LEVELS and VK_REMAINING_ARRAY_LAYERS, resolve them now in our
- // internal state to the actual values.
- if (range->levelCount == VK_REMAINING_MIP_LEVELS) {
- range->levelCount = image_state->createInfo.mipLevels - range->baseMipLevel;
- }
+void ResolveRemainingLevelsLayers(core_validation::layer_data *dev_data, VkImageSubresourceRange *range, IMAGE_STATE *image_state) {
+ // If the caller used the special values VK_REMAINING_MIP_LEVELS and VK_REMAINING_ARRAY_LAYERS, resolve them now in our
+ // internal state to the actual values.
+ if (range->levelCount == VK_REMAINING_MIP_LEVELS) {
+ range->levelCount = image_state->createInfo.mipLevels - range->baseMipLevel;
+ }
- if (range->layerCount == VK_REMAINING_ARRAY_LAYERS) {
- range->layerCount = image_state->createInfo.arrayLayers - range->baseArrayLayer;
- }
+ if (range->layerCount == VK_REMAINING_ARRAY_LAYERS) {
+ range->layerCount = image_state->createInfo.arrayLayers - range->baseArrayLayer;
}
}
// Return the correct layer/level counts if the caller used the special values VK_REMAINING_MIP_LEVELS or VK_REMAINING_ARRAY_LAYERS.
void ResolveRemainingLevelsLayers(core_validation::layer_data *dev_data, uint32_t *levels, uint32_t *layers,
- VkImageSubresourceRange range, VkImage image) {
- // Expects global_lock to be held by caller
-
+ VkImageSubresourceRange range, IMAGE_STATE *image_state) {
*levels = range.levelCount;
*layers = range.layerCount;
- auto image_state = getImageState(dev_data, image);
- if (image_state) {
- if (range.levelCount == VK_REMAINING_MIP_LEVELS) {
- *levels = image_state->createInfo.mipLevels - range.baseMipLevel;
- }
- if (range.layerCount == VK_REMAINING_ARRAY_LAYERS) {
- *layers = image_state->createInfo.arrayLayers - range.baseArrayLayer;
- }
+ if (range.levelCount == VK_REMAINING_MIP_LEVELS) {
+ *levels = image_state->createInfo.mipLevels - range.baseMipLevel;
+ }
+ if (range.layerCount == VK_REMAINING_ARRAY_LAYERS) {
+ *layers = image_state->createInfo.arrayLayers - range.baseArrayLayer;
}
}
-bool VerifyClearImageLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, VkImage image,
+bool VerifyClearImageLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *image_state,
VkImageSubresourceRange range, VkImageLayout dest_image_layout, const char *func_name) {
bool skip = false;
const debug_report_data *report_data = core_validation::GetReportData(device_data);
VkImageSubresourceRange resolved_range = range;
- ResolveRemainingLevelsLayers(device_data, &resolved_range, image);
+ ResolveRemainingLevelsLayers(device_data, &resolved_range, image_state);
if (dest_image_layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
if (dest_image_layout == VK_IMAGE_LAYOUT_GENERAL) {
- auto image_state = getImageState(device_data, image);
if (image_state->createInfo.tiling != VK_IMAGE_TILING_LINEAR) {
// LAYOUT_GENERAL is allowed, but may not be performance optimal, flag as perf warning.
skip |= log_msg(report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0,
@@ -337,7 +326,7 @@ bool VerifyClearImageLayout(core_validation::layer_data *device_data, GLOBAL_CB_
uint32_t layer = layer_index + resolved_range.baseArrayLayer;
VkImageSubresource sub = {resolved_range.aspectMask, level, layer};
IMAGE_CMD_BUF_LAYOUT_NODE node;
- if (core_validation::FindLayout(cb_node, image, sub, node)) {
+ if (core_validation::FindLayout(cb_node, image_state->image, sub, node)) {
if (node.layout != dest_image_layout) {
UNIQUE_VALIDATION_ERROR_CODE error_code = VALIDATION_ERROR_01085;
if (strcmp(func_name, "vkCmdClearDepthStencilImage()") == 0) {
@@ -359,10 +348,10 @@ bool VerifyClearImageLayout(core_validation::layer_data *device_data, GLOBAL_CB_
return skip;
}
-void RecordClearImageLayout(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *cb_node, VkImage image,
+void RecordClearImageLayout(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, VkImage image,
VkImageSubresourceRange range, VkImageLayout dest_image_layout) {
VkImageSubresourceRange resolved_range = range;
- ResolveRemainingLevelsLayers(dev_data, &resolved_range, image);
+ ResolveRemainingLevelsLayers(device_data, &resolved_range, getImageState(device_data, image));
for (uint32_t level_index = 0; level_index < resolved_range.levelCount; ++level_index) {
uint32_t level = level_index + resolved_range.baseMipLevel;
@@ -389,7 +378,7 @@ bool PreCallValidateCmdClearColorImage(core_validation::layer_data *dev_data, Vk
skip |= insideRenderPass(dev_data, cb_node, "vkCmdClearColorImage()", VALIDATION_ERROR_01096);
for (uint32_t i = 0; i < rangeCount; ++i) {
skip |= ValidateImageAttributes(dev_data, image_state, pRanges[i]);
- skip |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearColorImage()");
+ skip |= VerifyClearImageLayout(dev_data, cb_node, image_state, pRanges[i], imageLayout, "vkCmdClearColorImage()");
}
}
return skip;
@@ -429,7 +418,8 @@ bool PreCallValidateCmdClearDepthStencilImage(core_validation::layer_data *devic
skip |= ValidateCmd(device_data, cb_node, CMD_CLEARDEPTHSTENCILIMAGE, "vkCmdClearDepthStencilImage()");
skip |= insideRenderPass(device_data, cb_node, "vkCmdClearDepthStencilImage()", VALIDATION_ERROR_01111);
for (uint32_t i = 0; i < rangeCount; ++i) {
- skip |= VerifyClearImageLayout(device_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearDepthStencilImage()");
+ skip |=
+ VerifyClearImageLayout(device_data, cb_node, image_state, pRanges[i], imageLayout, "vkCmdClearDepthStencilImage()");
// Image aspect must be depth or stencil or both
if (((pRanges[i].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) &&
((pRanges[i].aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT)) {