diff options
| author | Norbert Garnys <Norbert.Garnys@amd.com> | 2017-11-16 10:58:04 +0100 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2017-11-17 15:40:37 -0700 |
| commit | 3e61f4681bc94ce57c95b3856b6417d1102a4e45 (patch) | |
| tree | d5559d843b93e5e85c7b0f3a5b6df4f63f88bc09 | |
| parent | 978799fd689431171dd1457baaf69977570df694 (diff) | |
| download | usermoji-3e61f4681bc94ce57c95b3856b6417d1102a4e45.tar.xz | |
layers: add image layout validation to vkCmdBlitImage()
| -rw-r--r-- | layers/buffer_validation.cpp | 22 | ||||
| -rw-r--r-- | layers/buffer_validation.h | 6 | ||||
| -rw-r--r-- | layers/core_validation.cpp | 6 |
3 files changed, 26 insertions, 8 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); diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h index 0bc7dabf..b8a3a2ff 100644 --- a/layers/buffer_validation.h +++ b/layers/buffer_validation.h @@ -148,10 +148,12 @@ void PreCallRecordCmdResolveImage(layer_data *device_data, GLOBAL_CB_NODE *cb_no IMAGE_STATE *dst_image_state); 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); 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); bool ValidateCmdBufImageLayouts(layer_data *device_data, GLOBAL_CB_NODE *pCB, std::unordered_map<ImageSubresourcePair, IMAGE_LAYOUT_NODE> const &globalImageLayoutMap, diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index b5fa949d..56143924 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6145,10 +6145,12 @@ VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage s auto src_image_state = GetImageState(dev_data, srcImage); auto dst_image_state = GetImageState(dev_data, dstImage); - bool skip = PreCallValidateCmdBlitImage(dev_data, cb_node, src_image_state, dst_image_state, regionCount, pRegions, filter); + bool skip = PreCallValidateCmdBlitImage(dev_data, cb_node, src_image_state, dst_image_state, regionCount, pRegions, + srcImageLayout, dstImageLayout, filter); if (!skip) { - PreCallRecordCmdBlitImage(dev_data, cb_node, src_image_state, dst_image_state); + PreCallRecordCmdBlitImage(dev_data, cb_node, src_image_state, dst_image_state, regionCount, pRegions, srcImageLayout, + dstImageLayout); lock.unlock(); dev_data->dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter); |
