From 8bdb2b730f8fa028d03f00d86327b59f8be238e0 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Mon, 6 Feb 2017 15:29:37 -0700 Subject: [PATCH] layers: Move CmdResolveImage from image layer Added the validation from this API to the existing pre-call routine in the buffer validation module. Change-Id: I31eb2c9851b310c38ae2bc573dfaa5c147dac6d6 --- layers/buffer_validation.cpp | 62 +++++++++++++++++++++++++++++++++++- layers/buffer_validation.h | 2 +- layers/core_validation.cpp | 2 +- layers/core_validation_error_enums.h | 1 + layers/image.cpp | 61 ----------------------------------- 5 files changed, 64 insertions(+), 64 deletions(-) diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 0d5df23..6aea8a1 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -1237,13 +1237,73 @@ bool PreCallValidateCmdClearAttachments(core_validation::layer_data *device_data } bool PreCallValidateCmdResolveImage(core_validation::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 regionCount, const VkImageResolve *pRegions) { + const debug_report_data *report_data = core_validation::GetReportData(device_data); 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); + + // For each region, the number of layers in the image subresource should not be zero + // For each region, src and dest image aspect must be color only + for (uint32_t i = 0; i < regionCount; i++) { + if (pRegions[i].srcSubresource.layerCount == 0) { + char const str[] = "vkCmdResolveImage: number of layers in source subresource is zero"; + // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's + // invalid/error + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + reinterpret_cast(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_ASPECT, + "IMAGE", str); + } + + if (pRegions[i].dstSubresource.layerCount == 0) { + char const str[] = "vkCmdResolveImage: number of layers in destination subresource is zero"; + + // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's + // invalid/error + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + reinterpret_cast(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_ASPECT, + "IMAGE", str); + } + + // TODO: VALIDATION_ERROR_01339 + + if ((pRegions[i].srcSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) || + (pRegions[i].dstSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT)) { + char const str[] = + "vkCmdResolveImage: src and dest aspectMasks for each region must specify only VK_IMAGE_ASPECT_COLOR_BIT"; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + reinterpret_cast(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_01338, "IMAGE", + "%s. %s", str, validation_error_map[VALIDATION_ERROR_01338]); + } + } + + if (src_image_state->createInfo.format != dst_image_state->createInfo.format) { + char const str[] = "vkCmdResolveImage called with unmatched source and dest formats."; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + reinterpret_cast(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_FORMAT, + "IMAGE", str); + } + if (src_image_state->createInfo.imageType != dst_image_state->createInfo.imageType) { + char const str[] = "vkCmdResolveImage called with unmatched source and dest image types."; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + reinterpret_cast(cb_node->commandBuffer), __LINE__, DRAWSTATE_MISMATCHED_IMAGE_TYPE, "IMAGE", + str); + } + if (src_image_state->createInfo.samples == VK_SAMPLE_COUNT_1_BIT) { + char const str[] = "vkCmdResolveImage called with source sample count less than 2."; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + reinterpret_cast(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_01320, "IMAGE", "%s. %s", + str, validation_error_map[VALIDATION_ERROR_01320]); + } + if (dst_image_state->createInfo.samples != VK_SAMPLE_COUNT_1_BIT) { + char const str[] = "vkCmdResolveImage called with dest sample count greater than 1."; + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + reinterpret_cast(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_01321, "IMAGE", "%s. %s", + str, validation_error_map[VALIDATION_ERROR_01321]); + } } else { assert(0); } diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h index bd196e3..7722cc9 100644 --- a/layers/buffer_validation.h +++ b/layers/buffer_validation.h @@ -129,7 +129,7 @@ bool PreCallValidateCmdClearAttachments(core_validation::layer_data *device_data 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); + IMAGE_STATE *dst_image_state, uint32_t regionCount, const VkImageResolve *pRegions); void PreCallRecordCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state, IMAGE_STATE *dst_image_state); diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 0d335d6..7ffff87 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8415,7 +8415,7 @@ 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); - bool skip = PreCallValidateCmdResolveImage(dev_data, cb_node, src_image_state, dst_image_state); + bool skip = PreCallValidateCmdResolveImage(dev_data, cb_node, src_image_state, dst_image_state, regionCount, pRegions); if (!skip) { PreCallRecordCmdResolveImage(dev_data, cb_node, src_image_state, dst_image_state); diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h index 4b5a542..f831310 100644 --- a/layers/core_validation_error_enums.h +++ b/layers/core_validation_error_enums.h @@ -139,6 +139,7 @@ enum DRAW_STATE_ERROR { DRAWSTATE_MISMATCHED_IMAGE_FORMAT, DRAWSTATE_MISMATCHED_IMAGE_ASPECT, DRAWSTATE_INVALID_IMAGE_FILTER, + DRAWSTATE_MISMATCHED_IMAGE_TYPE, DRAWSTATE_SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, DRAWSTATE_SWAPCHAIN_INVALID_IMAGE, DRAWSTATE_SWAPCHAIN_IMAGE_NOT_ACQUIRED, diff --git a/layers/image.cpp b/layers/image.cpp index 0b34837..44eb58d 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -349,67 +349,6 @@ VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImag const VkImageResolve *pRegions) { bool skipCall = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - auto srcImageEntry = getImageState(device_data, srcImage); - auto dstImageEntry = getImageState(device_data, dstImage); - - // For each region, the number of layers in the image subresource should not be zero - // For each region, src and dest image aspect must be color only - for (uint32_t i = 0; i < regionCount; i++) { - if (pRegions[i].srcSubresource.layerCount == 0) { - char const str[] = "vkCmdResolveImage: number of layers in source subresource is zero"; - // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error - skipCall |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str); - } - - if (pRegions[i].dstSubresource.layerCount == 0) { - char const str[] = "vkCmdResolveImage: number of layers in destination subresource is zero"; - - // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid/error - skipCall |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_ASPECT, "IMAGE", str); - } - - // TODO: VALIDATION_ERROR_01339 - - if ((pRegions[i].srcSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) || - (pRegions[i].dstSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT)) { - char const str[] = - "vkCmdResolveImage: src and dest aspectMasks for each region must specify only VK_IMAGE_ASPECT_COLOR_BIT"; - skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)commandBuffer, __LINE__, - VALIDATION_ERROR_01338, "IMAGE", "%s. %s", str, validation_error_map[VALIDATION_ERROR_01338]); - } - } - - if (srcImageEntry && dstImageEntry) { - if (srcImageEntry->format != dstImageEntry->format) { - char const str[] = "vkCmdResolveImage called with unmatched source and dest formats."; - skipCall |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); - } - if (srcImageEntry->imageType != dstImageEntry->imageType) { - char const str[] = "vkCmdResolveImage called with unmatched source and dest image types."; - skipCall |= - log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str); - } - if (srcImageEntry->samples == VK_SAMPLE_COUNT_1_BIT) { - char const str[] = "vkCmdResolveImage called with source sample count less than 2."; - skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)commandBuffer, __LINE__, - VALIDATION_ERROR_01320, "IMAGE", "%s. %s", str, validation_error_map[VALIDATION_ERROR_01320]); - } - if (dstImageEntry->samples != VK_SAMPLE_COUNT_1_BIT) { - char const str[] = "vkCmdResolveImage called with dest sample count greater than 1."; - skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)commandBuffer, __LINE__, - VALIDATION_ERROR_01321, "IMAGE", "%s. %s", str, validation_error_map[VALIDATION_ERROR_01321]); - } - } if (!skipCall) { device_data->device_dispatch_table->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, -- 2.7.4