From d2518b09656bca5200d8e020dfcdb3a6783d8ebe Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Mon, 6 Feb 2017 10:22:26 -0700 Subject: layers: Refactor CmdResolveImage for PreCalls Moved validation and state updates into separate helper functions. Change-Id: I496d2e4e97f7c58372ebe51dcc4c4f10e456a5f2 --- layers/core_validation.cpp | 60 +++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 25 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 12194cb6..52431c25 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8436,10 +8436,41 @@ VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuff } } +bool PreCallValidateCmdResolveImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, + IMAGE_STATE *dst_image_state) { + bool skip = false; + if (cb_node && src_image_state && dst_image_state) { + skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02541); + skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02542); + skip |= ValidateCmd(device_data, cb_node, CMD_RESOLVEIMAGE, "vkCmdResolveImage()"); + skip |= insideRenderPass(device_data, cb_node, "vkCmdResolveImage()", VALIDATION_ERROR_01335); + } else { + assert(0); + } + return skip; +} + +void PreCallRecordCmdResolveImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, + IMAGE_STATE *dst_image_state) { + // Update bindings between images and cmd buffer + AddCommandBufferBindingImage(device_data, cb_node, src_image_state); + AddCommandBufferBindingImage(device_data, cb_node, dst_image_state); + + std::function function = [=]() { + return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdResolveImage()"); + }; + cb_node->validate_functions.push_back(function); + function = [=]() { + SetImageMemoryValid(device_data, dst_image_state, true); + return false; + }; + cb_node->validate_functions.push_back(function); + UpdateCmdBufferLastCmd(device_data, cb_node, CMD_RESOLVEIMAGE); +} + VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) { - bool skip = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); std::unique_lock lock(global_lock); @@ -8447,32 +8478,11 @@ VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImag auto src_image_state = getImageState(dev_data, srcImage); auto dst_image_state = getImageState(dev_data, dstImage); - if (cb_node && src_image_state && dst_image_state) { - skip |= ValidateMemoryIsBoundToImage(dev_data, src_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02541); - skip |= ValidateMemoryIsBoundToImage(dev_data, dst_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02542); - skip |= ValidateCmd(dev_data, cb_node, CMD_RESOLVEIMAGE, "vkCmdResolveImage()"); - skip |= insideRenderPass(dev_data, cb_node, "vkCmdResolveImage()", VALIDATION_ERROR_01335); + bool skip = PreCallValidateCmdResolveImage(dev_data, cb_node, src_image_state, dst_image_state); - if (!skip) { - // Update bindings between images and cmd buffer - AddCommandBufferBindingImage(dev_data, cb_node, src_image_state); - AddCommandBufferBindingImage(dev_data, cb_node, dst_image_state); - std::function function = [=]() { - return ValidateImageMemoryIsValid(dev_data, src_image_state, "vkCmdResolveImage()"); - }; - cb_node->validate_functions.push_back(function); - function = [=]() { - SetImageMemoryValid(dev_data, dst_image_state, true); - return false; - }; - cb_node->validate_functions.push_back(function); - UpdateCmdBufferLastCmd(dev_data, cb_node, CMD_RESOLVEIMAGE); - } - } else { - assert(0); - } - lock.unlock(); if (!skip) { + PreCallRecordCmdResolveImage(dev_data, cb_node, src_image_state, dst_image_state); + lock.unlock(); dev_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions); } -- cgit v1.2.3