From: Mark Lobodzinski Date: Thu, 9 Feb 2017 20:06:56 +0000 (-0700) Subject: layers: Refactor CmdCopyBuffer for pre-post style X-Git-Tag: upstream/1.1.92~1588 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=36c21d094bf432258fc4e6b8acc049ba0afcb9e9;p=platform%2Fupstream%2FVulkan-Tools.git layers: Refactor CmdCopyBuffer for pre-post style Change-Id: Ic0004cad00ba04295e8c05a703a085e07d3ad56e --- diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 9e882b6..bb13fe8 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -2275,4 +2275,35 @@ void PostCallRecordCreateImageView(layer_data *device_data, const VkImageViewCre GetImageState(device_data, create_info->image)); } +bool PreCallValidateCmdCopyBuffer(layer_data *device_data, GLOBAL_CB_NODE *cb_node, BUFFER_STATE *src_buffer_state, + BUFFER_STATE *dst_buffer_state) { + bool skip = false; + skip |= ValidateMemoryIsBoundToBuffer(device_data, src_buffer_state, "vkCmdCopyBuffer()", VALIDATION_ERROR_02531); + skip |= ValidateMemoryIsBoundToBuffer(device_data, dst_buffer_state, "vkCmdCopyBuffer()", VALIDATION_ERROR_02532); + // Validate that SRC & DST buffers have correct usage flags set + skip |= ValidateBufferUsageFlags(device_data, src_buffer_state, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, true, VALIDATION_ERROR_01164, + "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_SRC_BIT"); + skip |= ValidateBufferUsageFlags(device_data, dst_buffer_state, VK_BUFFER_USAGE_TRANSFER_DST_BIT, true, VALIDATION_ERROR_01165, + "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_DST_BIT"); + skip |= ValidateCmd(device_data, cb_node, CMD_COPYBUFFER, "vkCmdCopyBuffer()"); + skip |= insideRenderPass(device_data, cb_node, "vkCmdCopyBuffer()", VALIDATION_ERROR_01172); + return skip; +} +void PreCallRecordCmdCopyBuffer(layer_data *device_data, GLOBAL_CB_NODE *cb_node, BUFFER_STATE *src_buffer_state, + BUFFER_STATE *dst_buffer_state) { + // Update bindings between buffers and cmd buffer + AddCommandBufferBindingBuffer(device_data, cb_node, src_buffer_state); + AddCommandBufferBindingBuffer(device_data, cb_node, dst_buffer_state); + + std::function function = [=]() { + return ValidateBufferMemoryIsValid(device_data, src_buffer_state, "vkCmdCopyBuffer()"); + }; + cb_node->validate_functions.push_back(function); + function = [=]() { + SetBufferMemoryValid(device_data, dst_buffer_state, true); + return false; + }; + cb_node->validate_functions.push_back(function); + core_validation::UpdateCmdBufferLastCmd(cb_node, CMD_COPYBUFFER); +} diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h index 6c2398b..8116f3b 100644 --- a/layers/buffer_validation.h +++ b/layers/buffer_validation.h @@ -171,4 +171,10 @@ bool ValidateCopyBufferImageTransferGranularityRequirements(layer_data *device_d void PreCallRecordCmdCopyImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, IMAGE_STATE *dst_image_state); +bool PreCallValidateCmdCopyBuffer(layer_data *device_data, GLOBAL_CB_NODE *cb_node, BUFFER_STATE *src_buffer_state, + BUFFER_STATE *dst_buffer_state); + +void PreCallRecordCmdCopyBuffer(layer_data *device_data, GLOBAL_CB_NODE *cb_node, BUFFER_STATE *src_buffer_state, + BUFFER_STATE *dst_buffer_state); + #endif // CORE_VALIDATION_BUFFER_VALIDATION_H_ diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 2f5ef4f..3080c26 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -519,7 +519,7 @@ bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, return false; } // For given buffer_state, verify that the range it's bound to is valid -static bool ValidateBufferMemoryIsValid(layer_data *dev_data, BUFFER_STATE *buffer_state, const char *functionName) { +bool ValidateBufferMemoryIsValid(layer_data *dev_data, BUFFER_STATE *buffer_state, const char *functionName) { return ValidateMemoryIsValid(dev_data, buffer_state->binding.mem, reinterpret_cast(buffer_state->buffer), VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, functionName); } @@ -541,7 +541,7 @@ void SetImageMemoryValid(layer_data *dev_data, IMAGE_STATE *image_state, bool va } } // For given buffer node set the buffer's bound memory range to valid param value -static void SetBufferMemoryValid(layer_data *dev_data, BUFFER_STATE *buffer_state, bool valid) { +void SetBufferMemoryValid(layer_data *dev_data, BUFFER_STATE *buffer_state, bool valid) { SetMemoryValid(dev_data, buffer_state->binding.mem, reinterpret_cast(buffer_state->buffer), valid); } // Find CB Info and add mem reference to list container @@ -7571,44 +7571,24 @@ VKAPI_ATTR void VKAPI_CALL CmdDispatchIndirect(VkCommandBuffer commandBuffer, Vk VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy *pRegions) { - bool skip_call = false; - layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); + layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); std::unique_lock lock(global_lock); - auto cb_node = GetCBNode(dev_data, commandBuffer); - auto src_buff_state = GetBufferState(dev_data, srcBuffer); - auto dst_buff_state = GetBufferState(dev_data, dstBuffer); - if (cb_node && src_buff_state && dst_buff_state) { - skip_call |= ValidateMemoryIsBoundToBuffer(dev_data, src_buff_state, "vkCmdCopyBuffer()", VALIDATION_ERROR_02531); - skip_call |= ValidateMemoryIsBoundToBuffer(dev_data, dst_buff_state, "vkCmdCopyBuffer()", VALIDATION_ERROR_02532); - // Update bindings between buffers and cmd buffer - AddCommandBufferBindingBuffer(dev_data, cb_node, src_buff_state); - AddCommandBufferBindingBuffer(dev_data, cb_node, dst_buff_state); - // Validate that SRC & DST buffers have correct usage flags set - skip_call |= ValidateBufferUsageFlags(dev_data, src_buff_state, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, true, - VALIDATION_ERROR_01164, "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_SRC_BIT"); - skip_call |= ValidateBufferUsageFlags(dev_data, dst_buff_state, VK_BUFFER_USAGE_TRANSFER_DST_BIT, true, - VALIDATION_ERROR_01165, "vkCmdCopyBuffer()", "VK_BUFFER_USAGE_TRANSFER_DST_BIT"); - - std::function function = [=]() { - return ValidateBufferMemoryIsValid(dev_data, src_buff_state, "vkCmdCopyBuffer()"); - }; - cb_node->validate_functions.push_back(function); - function = [=]() { - SetBufferMemoryValid(dev_data, dst_buff_state, true); - return false; - }; - cb_node->validate_functions.push_back(function); + auto cb_node = GetCBNode(device_data, commandBuffer); + auto src_buffer_state = GetBufferState(device_data, srcBuffer); + auto dst_buffer_state = GetBufferState(device_data, dstBuffer); - skip_call |= ValidateCmd(dev_data, cb_node, CMD_COPYBUFFER, "vkCmdCopyBuffer()"); - UpdateCmdBufferLastCmd(cb_node, CMD_COPYBUFFER); - skip_call |= insideRenderPass(dev_data, cb_node, "vkCmdCopyBuffer()", VALIDATION_ERROR_01172); + if (cb_node && src_buffer_state && dst_buffer_state) { + bool skip = PreCallValidateCmdCopyBuffer(device_data, cb_node, src_buffer_state, dst_buffer_state); + if (!skip) { + PreCallRecordCmdCopyBuffer(device_data, cb_node, src_buffer_state, dst_buffer_state); + lock.unlock(); + device_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions); + } } else { - // Param_checker will flag errors on invalid objects, just assert here as debugging aid + lock.unlock(); assert(0); } - lock.unlock(); - if (!skip_call) dev_data->dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions); } VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 5b09669..f8cea97 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -784,6 +784,10 @@ bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *image_state, VkSampleCountFlagBits sample_count, const char *location, UNIQUE_VALIDATION_ERROR_CODE msgCode); bool rangesIntersect(layer_data const *dev_data, MEMORY_RANGE const *range1, VkDeviceSize offset, VkDeviceSize end); +bool ValidateBufferMemoryIsValid(layer_data *dev_data, BUFFER_STATE *buffer_state, const char *functionName); +void SetBufferMemoryValid(layer_data *dev_data, BUFFER_STATE *buffer_state, bool valid); + + // Prototypes for layer_data accessor functions. These should be in their own header file at some point PFN_vkGetPhysicalDeviceFormatProperties GetFormatPropertiesPointer(layer_data *);