diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-02-06 11:06:26 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-02-07 14:02:48 -0700 |
| commit | 917253c6001e311d44b87f9f5d036f8775c02936 (patch) | |
| tree | e6b5899755fecbfb688021ba685323b0c6dd966b | |
| parent | 7e72b26d49907e21554e961bb714924e79d4a6af (diff) | |
| download | usermoji-917253c6001e311d44b87f9f5d036f8775c02936.tar.xz | |
layers: Move CmdBlit/ResolveImage helpers out of CV
Moved to the buffer validation module.
Change-Id: Ic80b327e7ddd4c2e699587bd0b664b91462ee8da
| -rw-r--r-- | layers/buffer_validation.cpp | 74 | ||||
| -rw-r--r-- | layers/buffer_validation.h | 13 | ||||
| -rw-r--r-- | layers/core_validation.cpp | 80 | ||||
| -rw-r--r-- | layers/core_validation_types.h | 6 |
4 files changed, 97 insertions, 76 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 8731c48b..066bcd89 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -1234,4 +1234,76 @@ bool PreCallValidateCmdClearAttachments(core_validation::layer_data *device_data } } return skip; -}
\ No newline at end of file +} + +bool PreCallValidateCmdResolveImage(core_validation::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(core_validation::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<bool()> 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); +} + +bool PreCallValidateCmdBlitImage(core_validation::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 |= ValidateImageSampleCount(device_data, src_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): srcImage", + VALIDATION_ERROR_02194); + skip |= ValidateImageSampleCount(device_data, dst_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): dstImage", + VALIDATION_ERROR_02195); + skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02539); + skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02540); + skip |= ValidateImageUsageFlags(device_data, src_image_state, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, true, VALIDATION_ERROR_02182, + "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_SRC_BIT"); + skip |= ValidateImageUsageFlags(device_data, dst_image_state, VK_IMAGE_USAGE_TRANSFER_DST_BIT, true, VALIDATION_ERROR_02186, + "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_DST_BIT"); + skip |= ValidateCmd(device_data, cb_node, CMD_BLITIMAGE, "vkCmdBlitImage()"); + skip |= insideRenderPass(device_data, cb_node, "vkCmdBlitImage()", VALIDATION_ERROR_01300); + } else { + assert(0); + } + return skip; +} + +void PreCallRecordCmdBlitImage(core_validation::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<bool()> function = [=]() { return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdBlitImage()"); }; + 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_BLITIMAGE); +} + + diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h index ae2b54c1..8622f099 100644 --- a/layers/buffer_validation.h +++ b/layers/buffer_validation.h @@ -128,4 +128,17 @@ bool PreCallValidateCmdClearAttachments(core_validation::layer_data *device_data uint32_t attachmentCount, const VkClearAttachment *pAttachments, uint32_t rectCount, const VkClearRect *pRects); +bool PreCallValidateCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, + IMAGE_STATE *dst_image_state); + +void PreCallRecordCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, + IMAGE_STATE *dst_image_state); + +bool PreCallValidateCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, + IMAGE_STATE *dst_image_state); + +void PreCallRecordCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_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 e63b36a0..560b0e99 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -460,8 +460,8 @@ static bool validate_usage_flags(layer_data *my_data, VkFlags actual, VkFlags de // Helper function to validate usage flags for buffers // For given buffer_state send actual vs. desired usage off to helper above where // an error will be flagged if usage is not correct -static bool ValidateImageUsageFlags(layer_data *dev_data, IMAGE_STATE const *image_state, VkFlags desired, VkBool32 strict, - int32_t const msgCode, char const *func_name, char const *usage_string) { +bool ValidateImageUsageFlags(layer_data *dev_data, IMAGE_STATE const *image_state, VkFlags desired, VkBool32 strict, + int32_t const msgCode, char const *func_name, char const *usage_string) { return validate_usage_flags(dev_data, image_state->createInfo.usage, desired, strict, reinterpret_cast<const uint64_t &>(image_state->image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, msgCode, "image", func_name, usage_string); @@ -553,7 +553,7 @@ static bool ValidateMemoryIsValid(layer_data *dev_data, VkDeviceMemory mem, uint // For given image_state // If mem is special swapchain key, then verify that image_state valid member is true // Else verify that the image's bound memory range is valid -static bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, const char *functionName) { +bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, const char *functionName) { if (image_state->binding.mem == MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) { if (!image_state->valid) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, @@ -8172,8 +8172,8 @@ VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage s } // Validate that an image's sampleCount matches the requirement for a specific API call -static inline bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *image_state, VkSampleCountFlagBits sample_count, - const char *location, UNIQUE_VALIDATION_ERROR_CODE msgCode) { +bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *image_state, VkSampleCountFlagBits sample_count, + const char *location, UNIQUE_VALIDATION_ERROR_CODE msgCode) { bool skip = false; if (image_state->createInfo.samples != sample_count) { skip = @@ -8186,44 +8186,6 @@ static inline bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *i return skip; } -bool PreCallValidateCmdBlitImage(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 |= ValidateImageSampleCount(device_data, src_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): srcImage", - VALIDATION_ERROR_02194); - skip |= ValidateImageSampleCount(device_data, dst_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): dstImage", - VALIDATION_ERROR_02195); - skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02539); - skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02540); - skip |= ValidateImageUsageFlags(device_data, src_image_state, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, true, VALIDATION_ERROR_02182, - "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_SRC_BIT"); - skip |= ValidateImageUsageFlags(device_data, dst_image_state, VK_IMAGE_USAGE_TRANSFER_DST_BIT, true, VALIDATION_ERROR_02186, - "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_DST_BIT"); - skip |= ValidateCmd(device_data, cb_node, CMD_BLITIMAGE, "vkCmdBlitImage()"); - skip |= insideRenderPass(device_data, cb_node, "vkCmdBlitImage()", VALIDATION_ERROR_01300); - } else { - assert(0); - } - return skip; -} - -void PreCallRecordCmdBlitImage(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<bool()> function = [=]() { return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdBlitImage()"); }; - 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_BLITIMAGE); -} - VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) { @@ -8443,38 +8405,6 @@ 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<bool()> 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) { diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index c89b0232..f346f752 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -763,6 +763,12 @@ bool outsideRenderPass(const layer_data *my_data, GLOBAL_CB_NODE *pCB, const cha void SetLayout(GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair, const IMAGE_CMD_BUF_LAYOUT_NODE &node); void SetLayout(GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair, const VkImageLayout &layout); VkPhysicalDeviceLimits GetPhysicalDeviceLimits(layer_data const *); +bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, const char *functionName); +bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *image_state, VkSampleCountFlagBits sample_count, + const char *location, UNIQUE_VALIDATION_ERROR_CODE msgCode); +bool ValidateImageUsageFlags(layer_data *dev_data, IMAGE_STATE const *image_state, VkFlags desired, VkBool32 strict, + int32_t const msgCode, char const *func_name, char const *usage_string); + // Prototypes for layer_data accessor functions. These should be in their own header file at some point PFN_vkGetPhysicalDeviceFormatProperties GetFormatPropertiesPointer(layer_data *); |
