layers: Separate val/state updates in buff-img copy
Moved state updates out of precallvalidate routines into
precallrecord routines.
Change-Id: If13e8a14cabc2b63a53f5369c33b1e632b15ff3a
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 9bec038..cb8bc2a 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -2742,14 +2742,28 @@
VALIDATION_ERROR_01249);
skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdCopyImageToBuffer()", VALIDATION_ERROR_02537);
skip |= ValidateMemoryIsBoundToBuffer(device_data, dst_buff_state, "vkCmdCopyImageToBuffer()", VALIDATION_ERROR_02538);
- // Update bindings between buffer/image and cmd buffer
- AddCommandBufferBindingImage(device_data, cb_node, src_image_state);
- AddCommandBufferBindingBuffer(device_data, cb_node, dst_buff_state);
+
// Validate that SRC image & DST buffer have correct usage flags set
skip |= ValidateImageUsageFlags(device_data, src_image_state, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, true, VALIDATION_ERROR_01248,
"vkCmdCopyImageToBuffer()", "VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
skip |= ValidateBufferUsageFlags(device_data, dst_buff_state, VK_BUFFER_USAGE_TRANSFER_DST_BIT, true, VALIDATION_ERROR_01252,
"vkCmdCopyImageToBuffer()", "VK_BUFFER_USAGE_TRANSFER_DST_BIT");
+ skip |= insideRenderPass(device_data, cb_node, "vkCmdCopyImageToBuffer()", VALIDATION_ERROR_01260);
+ for (uint32_t i = 0; i < regionCount; ++i) {
+ skip |= VerifySourceImageLayout(device_data, cb_node, src_image_state->image, pRegions[i].imageSubresource, srcImageLayout,
+ VALIDATION_ERROR_01251);
+ skip |= ValidateCopyBufferImageTransferGranularityRequirements(device_data, cb_node, src_image_state, &pRegions[i], i,
+ "CmdCopyImageToBuffer");
+ }
+ return skip;
+}
+
+void PreCallRecordCmdCopyImageToBuffer(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ BUFFER_STATE *dst_buff_state) {
+ // Update bindings between buffer/image and cmd buffer
+ AddCommandBufferBindingImage(device_data, cb_node, src_image_state);
+ AddCommandBufferBindingBuffer(device_data, cb_node, dst_buff_state);
+
std::function<bool()> function = [=]() {
return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdCopyImageToBuffer()");
};
@@ -2761,14 +2775,6 @@
cb_node->validate_functions.push_back(function);
core_validation::UpdateCmdBufferLastCmd(cb_node, CMD_COPYIMAGETOBUFFER);
- skip |= insideRenderPass(device_data, cb_node, "vkCmdCopyImageToBuffer()", VALIDATION_ERROR_01260);
- for (uint32_t i = 0; i < regionCount; ++i) {
- skip |= VerifySourceImageLayout(device_data, cb_node, src_image_state->image, pRegions[i].imageSubresource, srcImageLayout,
- VALIDATION_ERROR_01251);
- skip |= ValidateCopyBufferImageTransferGranularityRequirements(device_data, cb_node, src_image_state, &pRegions[i], i,
- "CmdCopyImageToBuffer");
- }
- return skip;
}
bool PreCallValidateCmdCopyBufferToImage(layer_data *device_data, VkImageLayout dstImageLayout, GLOBAL_CB_NODE *cb_node,
@@ -2805,12 +2811,24 @@
VALIDATION_ERROR_01232);
skip |= ValidateMemoryIsBoundToBuffer(device_data, src_buff_state, "vkCmdCopyBufferToImage()", VALIDATION_ERROR_02535);
skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdCopyBufferToImage()", VALIDATION_ERROR_02536);
- AddCommandBufferBindingBuffer(device_data, cb_node, src_buff_state);
- AddCommandBufferBindingImage(device_data, cb_node, dst_image_state);
skip |= ValidateBufferUsageFlags(device_data, src_buff_state, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, true, VALIDATION_ERROR_01230,
"vkCmdCopyBufferToImage()", "VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
skip |= ValidateImageUsageFlags(device_data, dst_image_state, VK_IMAGE_USAGE_TRANSFER_DST_BIT, true, VALIDATION_ERROR_01231,
"vkCmdCopyBufferToImage()", "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
+ skip |= insideRenderPass(device_data, cb_node, "vkCmdCopyBufferToImage()", VALIDATION_ERROR_01242);
+ for (uint32_t i = 0; i < regionCount; ++i) {
+ skip |= VerifyDestImageLayout(device_data, cb_node, dst_image_state->image, pRegions[i].imageSubresource, dstImageLayout,
+ VALIDATION_ERROR_01234);
+ skip |= ValidateCopyBufferImageTransferGranularityRequirements(device_data, cb_node, dst_image_state, &pRegions[i], i,
+ "vkCmdCopyBufferToImage()");
+ }
+ return skip;
+}
+
+void PreCallRecordCmdCopyBufferToImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, BUFFER_STATE *src_buff_state,
+ IMAGE_STATE *dst_image_state) {
+ AddCommandBufferBindingBuffer(device_data, cb_node, src_buff_state);
+ AddCommandBufferBindingImage(device_data, cb_node, dst_image_state);
std::function<bool()> function = [=]() {
SetImageMemoryValid(device_data, dst_image_state, true);
return false;
@@ -2820,12 +2838,4 @@
cb_node->validate_functions.push_back(function);
core_validation::UpdateCmdBufferLastCmd(cb_node, CMD_COPYBUFFERTOIMAGE);
- skip |= insideRenderPass(device_data, cb_node, "vkCmdCopyBufferToImage()", VALIDATION_ERROR_01242);
- for (uint32_t i = 0; i < regionCount; ++i) {
- skip |= VerifyDestImageLayout(device_data, cb_node, dst_image_state->image, pRegions[i].imageSubresource, dstImageLayout,
- VALIDATION_ERROR_01234);
- skip |= ValidateCopyBufferImageTransferGranularityRequirements(device_data, cb_node, dst_image_state, &pRegions[i], i,
- "vkCmdCopyBufferToImage()");
- }
- return skip;
}
diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h
index 98164e2..2769f3d 100644
--- a/layers/buffer_validation.h
+++ b/layers/buffer_validation.h
@@ -216,8 +216,14 @@
IMAGE_STATE *src_image_state, BUFFER_STATE *dst_buff_state, uint32_t regionCount,
const VkBufferImageCopy *pRegions, const char *func_name);
+void PreCallRecordCmdCopyImageToBuffer(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ BUFFER_STATE *dst_buff_state);
+
bool PreCallValidateCmdCopyBufferToImage(layer_data *dev_data, VkImageLayout dstImageLayout, GLOBAL_CB_NODE *cb_node,
BUFFER_STATE *src_buff_state, IMAGE_STATE *dst_image_state, uint32_t regionCount,
const VkBufferImageCopy *pRegions, const char *func_name);
+void PreCallRecordCmdCopyBufferToImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, BUFFER_STATE *src_buff_state,
+ IMAGE_STATE *dst_image_state);
+
#endif // CORE_VALIDATION_BUFFER_VALIDATION_H_
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 96f3628..1d74ceb 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -7732,12 +7732,15 @@
skip_call = PreCallValidateCmdCopyBufferToImage(dev_data, dstImageLayout, cb_node, src_buff_state, dst_image_state,
regionCount, pRegions, "vkCmdCopyBufferToImage()");
} else {
+ lock.unlock();
assert(0);
// TODO: report VU01244 here, or put in object tracker?
}
- lock.unlock();
- if (!skip_call)
+ if (!skip_call) {
+ PreCallRecordCmdCopyBufferToImage(dev_data, cb_node, src_buff_state, dst_image_state);
+ lock.unlock();
dev_data->dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
+ }
}
VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
@@ -7753,12 +7756,15 @@
skip_call = PreCallValidateCmdCopyImageToBuffer(dev_data, srcImageLayout, cb_node, src_image_state, dst_buff_state,
regionCount, pRegions, "vkCmdCopyImageToBuffer()");
} else {
+ lock.unlock();
assert(0);
// TODO: report VU01262 here, or put in object tracker?
}
- lock.unlock();
- if (!skip_call)
+ if (!skip_call) {
+ PreCallRecordCmdCopyImageToBuffer(dev_data, cb_node, src_image_state, dst_buff_state);
+ lock.unlock();
dev_data->dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
+ }
}
VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,