From 59adbdf4c9c5adf8333f86cba7a5dce76f72fc45 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 15 Mar 2017 12:18:31 -0600 Subject: layers:Refactor image layout verify/set VerifyImageLayout had a side effect of setting image layout state if the layout had not been seen by the cmd buffer. This update moves the code to set the layout outside of the verify function and instead puts it into new SetLayout* functions that are now called in the appropriate PreCallRecord* functions. Note that the previous behavior caused a side effect where layouts could be updated even when the call down the chain did not occur. The updated behavior will always update the layout to what is passed as the explicit layout for any image copy operations whenever the call down the chain is made. This is desirable b/c if the layout didn't match the app saw the error during the Validate* portion of the call and if they chose to ignore it then validation should reflect the layout state of the image that was set by the call. Since the side effect mentioned above is no longer present, this change includes an update to InvalidImageLayout test where a second call to vkCmdCopyImage() is made in order to actually transition the initial image layout state so that expected errors are correct going fwd. --- layers/buffer_validation.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'layers/buffer_validation.h') diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h index c318fb21..9315ff63 100644 --- a/layers/buffer_validation.h +++ b/layers/buffer_validation.h @@ -52,6 +52,10 @@ void ResolveRemainingLevelsLayers(layer_data *dev_data, uint32_t *levels, uint32 bool VerifyClearImageLayout(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *image_state, VkImageSubresourceRange range, VkImageLayout dest_image_layout, const char *func_name); +bool VerifyImageLayout(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *image_state, + VkImageSubresourceLayers subLayers, VkImageLayout explicit_layout, VkImageLayout optimal_layout, + const char *caller, UNIQUE_VALIDATION_ERROR_CODE msg_code); + void RecordClearImageLayout(layer_data *dev_data, GLOBAL_CB_NODE *cb_node, VkImage image, VkImageSubresourceRange range, VkImageLayout dest_image_layout); @@ -193,7 +197,8 @@ bool ValidateCopyBufferImageTransferGranularityRequirements(layer_data *device_d const uint32_t i, const char *function); void PreCallRecordCmdCopyImage(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 VkImageCopy *regions, + VkImageLayout src_image_layout, VkImageLayout dst_image_layout); bool PreCallValidateCmdCopyBuffer(layer_data *device_data, GLOBAL_CB_NODE *cb_node, BUFFER_STATE *src_buffer_state, BUFFER_STATE *dst_buffer_state); @@ -226,14 +231,16 @@ bool PreCallValidateCmdCopyImageToBuffer(layer_data *device_data, VkImageLayout 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); + BUFFER_STATE *dst_buff_state, uint32_t region_count, const VkBufferImageCopy *regions, + VkImageLayout src_image_layout); 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); + IMAGE_STATE *dst_image_state, uint32_t region_count, const VkBufferImageCopy *regions, + VkImageLayout dst_image_layout); bool PreCallValidateGetImageSubresourceLayout(layer_data *device_data, VkImage image, const VkImageSubresource *pSubresource); -- cgit v1.2.3