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.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 37cceb51..60e7842b 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -2260,7 +2260,8 @@ void PreCallRecordCmdResolveImage(layer_data *device_data, GLOBAL_CB_NODE *cb_no
}
bool PreCallValidateCmdBlitImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
- IMAGE_STATE *dst_image_state, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
+ IMAGE_STATE *dst_image_state, uint32_t region_count, const VkImageBlit *regions,
+ VkImageLayout src_image_layout, VkImageLayout dst_image_layout, VkFilter filter) {
const debug_report_data *report_data = core_validation::GetReportData(device_data);
bool skip = false;
@@ -2423,8 +2424,15 @@ bool PreCallValidateCmdBlitImage(layer_data *device_data, GLOBAL_CB_NODE *cb_nod
} // Depth or Stencil
// Do per-region checks
- for (uint32_t i = 0; i < regionCount; i++) {
- VkImageBlit rgn = pRegions[i];
+ for (uint32_t i = 0; i < region_count; i++) {
+ const VkImageBlit rgn = regions[i];
+ bool hit_error = false;
+ skip |=
+ VerifyImageLayout(device_data, cb_node, src_image_state, rgn.srcSubresource, src_image_layout,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "vkCmdBlitImage()", VALIDATION_ERROR_184001bc, &hit_error);
+ skip |=
+ VerifyImageLayout(device_data, cb_node, dst_image_state, rgn.dstSubresource, dst_image_layout,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "vkCmdBlitImage()", VALIDATION_ERROR_184001c6, &hit_error);
// Warn for zero-sized regions
if ((rgn.srcOffsets[0].x == rgn.srcOffsets[1].x) || (rgn.srcOffsets[0].y == rgn.srcOffsets[1].y) ||
@@ -2629,7 +2637,13 @@ bool PreCallValidateCmdBlitImage(layer_data *device_data, GLOBAL_CB_NODE *cb_nod
}
void PreCallRecordCmdBlitImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
- IMAGE_STATE *dst_image_state) {
+ IMAGE_STATE *dst_image_state, uint32_t region_count, const VkImageBlit *regions,
+ VkImageLayout src_image_layout, VkImageLayout dst_image_layout) {
+ // Make sure that all image slices are updated to correct layout
+ for (uint32_t i = 0; i < region_count; ++i) {
+ SetImageLayout(device_data, cb_node, src_image_state, regions[i].srcSubresource, src_image_layout);
+ SetImageLayout(device_data, cb_node, dst_image_state, regions[i].dstSubresource, dst_image_layout);
+ }
// Update bindings between images and cmd buffer
AddCommandBufferBindingImage(device_data, cb_node, src_image_state);
AddCommandBufferBindingImage(device_data, cb_node, dst_image_state);