diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-10-26 14:13:46 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-10-27 07:59:34 -0600 |
| commit | 8782fe817c9cde64bc062781c535bf60af9c6199 (patch) | |
| tree | cb542269c8b4c123343fff22af308fcc67927133 /layers/core_validation.cpp | |
| parent | cd92219253b508f28a2b7e5b68b4cbf07cdf042f (diff) | |
| download | usermoji-8782fe817c9cde64bc062781c535bf60af9c6199.tar.xz | |
layers:Share image aspect validation code
Mult-purpose the image aspect mask validation code to run both at
CreateImageView time and at ValidateBarriers time. There was some basic
image aspect mask validation at ValidateBarriers, but this makes it
more complete and will catch some escapes.
Update the tests related to these checks to account changes in error
messages and also trying to remove some unexpected errors.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 289 |
1 files changed, 128 insertions, 161 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 21c2a90b..7cd51a4a 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6494,6 +6494,68 @@ static void ResolveRemainingLevelsLayers(layer_data *dev_data, uint32_t *levels, } } +// For the given format verify that the aspect masks make sense +static bool ValidateImageAspectMask(layer_data *dev_data, VkImage image, VkFormat format, VkImageAspectFlags aspect_mask, + const char *func_name) { + bool skip = false; + if (vk_format_is_color(format)) { + if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", + "%s: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set. %s", func_name, + validation_error_map[VALIDATION_ERROR_00741]); + } + if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != aspect_mask) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", + "%s: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set. %s", func_name, + validation_error_map[VALIDATION_ERROR_00741]); + } + } else if (vk_format_is_depth_and_stencil(format)) { + if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) == 0) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s: Depth/stencil image formats must have " + "at least one of VK_IMAGE_ASPECT_DEPTH_BIT " + "and VK_IMAGE_ASPECT_STENCIL_BIT set. %s", + func_name, validation_error_map[VALIDATION_ERROR_00741]); + } + if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != aspect_mask) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", + "%s: Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and " + "VK_IMAGE_ASPECT_STENCIL_BIT set. %s", + func_name, validation_error_map[VALIDATION_ERROR_00741]); + } + } else if (vk_format_is_depth_only(format)) { + if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", + "%s: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set. %s", func_name, + validation_error_map[VALIDATION_ERROR_00741]); + } + if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != aspect_mask) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", + "%s: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set. %s", func_name, + validation_error_map[VALIDATION_ERROR_00741]); + } + } else if (vk_format_is_stencil_only(format)) { + if ((aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", + "%s: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set. %s", func_name, + validation_error_map[VALIDATION_ERROR_00741]); + } + if ((aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != aspect_mask) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", + "%s: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set. %s", func_name, + validation_error_map[VALIDATION_ERROR_00741]); + } + } + return skip; +} + static bool PreCallValidateCreateImageView(layer_data *dev_data, const VkImageViewCreateInfo *create_info) { bool skip = false; IMAGE_STATE *image_state = getImageState(dev_data, create_info->image); @@ -6525,14 +6587,14 @@ static bool PreCallValidateCreateImageView(layer_data *dev_data, const VkImageVi // TODO: Need new valid usage language for levelCount == 0 & layerCount == 0 if (!create_info->subresourceRange.levelCount) { std::stringstream ss; - ss << "vkCreateImageView called with 0 in create_info->subresourceRange.levelCount."; + ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.levelCount."; skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, VALIDATION_ERROR_00768, "IMAGE", "%s %s", ss.str().c_str(), validation_error_map[VALIDATION_ERROR_00768]); } if (!create_info->subresourceRange.layerCount) { std::stringstream ss; - ss << "vkCreateImageView called with 0 in create_info->subresourceRange.layerCount."; + ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.layerCount."; skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, VALIDATION_ERROR_00769, "IMAGE", "%s %s", ss.str().c_str(), validation_error_map[VALIDATION_ERROR_00769]); @@ -6570,80 +6632,18 @@ static bool PreCallValidateCreateImageView(layer_data *dev_data, const VkImageVi } // Validate correct image aspect bits for desired formats and format consistency - if (vk_format_is_color(image_format)) { - if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) { - std::stringstream ss; - ss << "vkCreateImageView: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } - if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != aspect_mask) { - std::stringstream ss; - ss << "vkCreateImageView: Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } - if (!vk_format_is_color(view_format)) { - std::stringstream ss; - ss << "vkCreateImageView: The image view's format can differ from the parent image's format, but both must be " - << "color formats. ImageFormat is " << string_VkFormat(image_format) << " ImageViewFormat is " - << string_VkFormat(view_format); - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_02171, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_02171]); - } + skip |= ValidateImageAspectMask(dev_data, image_state->image, image_format, aspect_mask, "vkCreateImageView()"); + if (vk_format_is_color(image_format) && !vk_format_is_color(view_format)) { + std::stringstream ss; + ss << "vkCreateImageView: The image view's format can differ from the parent image's format, but both must be " + << "color formats. ImageFormat is " << string_VkFormat(image_format) << " ImageViewFormat is " + << string_VkFormat(view_format); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_02171, "IMAGE", "%s %s", ss.str().c_str(), + validation_error_map[VALIDATION_ERROR_02171]); // TODO: Uncompressed formats are compatible if they occupy they same number of bits per pixel. // Compressed formats are compatible if the only difference between them is the numerical type of // the uncompressed pixels (e.g. signed vs. unsigned, or sRGB vs. UNORM encoding). - } else if (vk_format_is_depth_and_stencil(image_format)) { - if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) == 0) { - std::stringstream ss; - ss << "vkCreateImageView: Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and " - "VK_IMAGE_ASPECT_STENCIL_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } - if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != aspect_mask) { - std::stringstream ss; - ss << "vkCreateImageView: Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and " - "VK_IMAGE_ASPECT_STENCIL_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } - } else if (vk_format_is_depth_only(image_format)) { - if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != VK_IMAGE_ASPECT_DEPTH_BIT) { - std::stringstream ss; - ss << "vkCreateImageView: Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } - if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != aspect_mask) { - std::stringstream ss; - ss << "vkCreateImageView: Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } - } else if (vk_format_is_stencil_only(image_format)) { - if ((aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != VK_IMAGE_ASPECT_STENCIL_BIT) { - std::stringstream ss; - ss << "vkCreateImageView: Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } - if ((aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != aspect_mask) { - std::stringstream ss; - ss << "vkCreateImageView: Stencil-only image formats can have only the VK_IMAGE_ASPECT_STENCIL_BIT set"; - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)create_info->image, __LINE__, VALIDATION_ERROR_00741, "IMAGE", "%s %s", ss.str().c_str(), - validation_error_map[VALIDATION_ERROR_00741]); - } } } return skip; @@ -9008,15 +9008,15 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui const VkMemoryBarrier *pMemBarriers, uint32_t bufferBarrierCount, const VkBufferMemoryBarrier *pBufferMemBarriers, uint32_t imageMemBarrierCount, const VkImageMemoryBarrier *pImageMemBarriers) { - bool skip_call = false; + bool skip = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); if (pCB->activeRenderPass && memBarrierCount) { if (!pCB->activeRenderPass->hasSelfDependency[pCB->activeSubpass]) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "%s: Barriers cannot be set during subpass %d " - "with no self dependency specified.", - funcName, pCB->activeSubpass); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", "%s: Barriers cannot be set during subpass %d " + "with no self dependency specified.", + funcName, pCB->activeSubpass); } } for (uint32_t i = 0; i < imageMemBarrierCount; ++i) { @@ -9029,12 +9029,12 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui // srcQueueFamilyIndex and dstQueueFamilyIndex must both // be VK_QUEUE_FAMILY_IGNORED if ((src_q_f_index != VK_QUEUE_FAMILY_IGNORED) || (dst_q_f_index != VK_QUEUE_FAMILY_IGNORED)) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_QUEUE_INDEX, "DS", - "%s: Image Barrier for image 0x%" PRIx64 " was created with sharingMode of " - "VK_SHARING_MODE_CONCURRENT. Src and dst " - " queueFamilyIndices must be VK_QUEUE_FAMILY_IGNORED.", - funcName, reinterpret_cast<const uint64_t &>(mem_barrier->image)); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, DRAWSTATE_INVALID_QUEUE_INDEX, "DS", + "%s: Image Barrier for image 0x%" PRIx64 " was created with sharingMode of " + "VK_SHARING_MODE_CONCURRENT. Src and dst " + "queueFamilyIndices must be VK_QUEUE_FAMILY_IGNORED.", + funcName, reinterpret_cast<const uint64_t &>(mem_barrier->image)); } } else { // Sharing mode is VK_SHARING_MODE_EXCLUSIVE. srcQueueFamilyIndex and @@ -9042,7 +9042,7 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui // or both be a valid queue family if (((src_q_f_index == VK_QUEUE_FAMILY_IGNORED) || (dst_q_f_index == VK_QUEUE_FAMILY_IGNORED)) && (src_q_f_index != dst_q_f_index)) { - skip_call |= + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_QUEUE_INDEX, "DS", "%s: Image 0x%" PRIx64 " was created with sharingMode " "of VK_SHARING_MODE_EXCLUSIVE. If one of src- or " @@ -9052,30 +9052,30 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui } else if (((src_q_f_index != VK_QUEUE_FAMILY_IGNORED) && (dst_q_f_index != VK_QUEUE_FAMILY_IGNORED)) && ((src_q_f_index >= dev_data->phys_dev_properties.queue_family_properties.size()) || (dst_q_f_index >= dev_data->phys_dev_properties.queue_family_properties.size()))) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_QUEUE_INDEX, "DS", - "%s: Image 0x%" PRIx64 " was created with sharingMode " - "of VK_SHARING_MODE_EXCLUSIVE, but srcQueueFamilyIndex %d" - " or dstQueueFamilyIndex %d is greater than " PRINTF_SIZE_T_SPECIFIER - "queueFamilies crated for this device.", - funcName, reinterpret_cast<const uint64_t &>(mem_barrier->image), src_q_f_index, - dst_q_f_index, dev_data->phys_dev_properties.queue_family_properties.size()); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, DRAWSTATE_INVALID_QUEUE_INDEX, "DS", + "%s: Image 0x%" PRIx64 " was created with sharingMode " + "of VK_SHARING_MODE_EXCLUSIVE, but srcQueueFamilyIndex %d" + " or dstQueueFamilyIndex %d is greater than " PRINTF_SIZE_T_SPECIFIER + "queueFamilies crated for this device.", + funcName, reinterpret_cast<const uint64_t &>(mem_barrier->image), src_q_f_index, dst_q_f_index, + dev_data->phys_dev_properties.queue_family_properties.size()); } } } if (mem_barrier) { if (mem_barrier->oldLayout != mem_barrier->newLayout) { - skip_call |= + skip |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->srcAccessMask, mem_barrier->oldLayout, "Source"); - skip_call |= + skip |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->dstAccessMask, mem_barrier->newLayout, "Dest"); } if (mem_barrier->newLayout == VK_IMAGE_LAYOUT_UNDEFINED || mem_barrier->newLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "%s: Image Layout cannot be transitioned to UNDEFINED or " - "PREINITIALIZED.", - funcName); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", "%s: Image Layout cannot be transitioned to UNDEFINED or " + "PREINITIALIZED.", + funcName); } auto image_data = getImageState(dev_data, mem_barrier->image); VkFormat format = VK_FORMAT_UNDEFINED; @@ -9100,60 +9100,28 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui } if (imageFound) { auto aspect_mask = mem_barrier->subresourceRange.aspectMask; - if (vk_format_is_depth_or_stencil(format)) { - if (vk_format_is_depth_and_stencil(format)) { - if (!(aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) && !(aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", - "%s: Image is a depth and stencil format and thus must " - "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and " - "VK_IMAGE_ASPECT_STENCIL_BIT set.", - funcName); - } - } else if (vk_format_is_depth_only(format)) { - if (!(aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT)) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", "%s: Image is a depth-only format and thus must " - "have VK_IMAGE_ASPECT_DEPTH_BIT set.", - funcName); - } - } else { // stencil-only case - if (!(aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", "%s: Image is a stencil-only format and thus must " - "have VK_IMAGE_ASPECT_STENCIL_BIT set.", - funcName); - } - } - } else { // image is a color format - if (!(aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT)) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "%s: Image is a color format and thus must " - "have VK_IMAGE_ASPECT_COLOR_BIT set.", - funcName); - } - } + skip |= ValidateImageAspectMask(dev_data, image_data->image, format, aspect_mask, funcName); int layerCount = (mem_barrier->subresourceRange.layerCount == VK_REMAINING_ARRAY_LAYERS) ? 1 : mem_barrier->subresourceRange.layerCount; if ((mem_barrier->subresourceRange.baseArrayLayer + layerCount) > arrayLayers) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "%s: Subresource must have the sum of the " - "baseArrayLayer (%d) and layerCount (%d) be less " - "than or equal to the total number of layers (%d).", - funcName, mem_barrier->subresourceRange.baseArrayLayer, mem_barrier->subresourceRange.layerCount, - arrayLayers); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", "%s: Subresource must have the sum of the " + "baseArrayLayer (%d) and layerCount (%d) be less " + "than or equal to the total number of layers (%d).", + funcName, mem_barrier->subresourceRange.baseArrayLayer, + mem_barrier->subresourceRange.layerCount, arrayLayers); } int levelCount = (mem_barrier->subresourceRange.levelCount == VK_REMAINING_MIP_LEVELS) ? 1 : mem_barrier->subresourceRange.levelCount; if ((mem_barrier->subresourceRange.baseMipLevel + levelCount) > mipLevels) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "%s: Subresource must have the sum of the baseMipLevel " - "(%d) and levelCount (%d) be less than or equal to " - "the total number of levels (%d).", - funcName, mem_barrier->subresourceRange.baseMipLevel, mem_barrier->subresourceRange.levelCount, - mipLevels); + skip |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", "%s: Subresource must have the sum of the baseMipLevel " + "(%d) and levelCount (%d) be less than or equal to " + "the total number of levels (%d).", + funcName, mem_barrier->subresourceRange.baseMipLevel, mem_barrier->subresourceRange.levelCount, mipLevels); } } } @@ -9161,9 +9129,8 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui for (uint32_t i = 0; i < bufferBarrierCount; ++i) { auto mem_barrier = &pBufferMemBarriers[i]; if (pCB->activeRenderPass) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "%s: Buffer Barriers cannot be used during a render pass.", funcName); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", "%s: Buffer Barriers cannot be used during a render pass.", funcName); } if (!mem_barrier) continue; @@ -9173,26 +9140,26 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui mem_barrier->srcQueueFamilyIndex >= dev_data->phys_dev_properties.queue_family_properties.size()) || (mem_barrier->dstQueueFamilyIndex != VK_QUEUE_FAMILY_IGNORED && mem_barrier->dstQueueFamilyIndex >= dev_data->phys_dev_properties.queue_family_properties.size())) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_QUEUE_INDEX, "DS", - "%s: Buffer Barrier 0x%" PRIx64 " has QueueFamilyIndex greater " - "than the number of QueueFamilies (" PRINTF_SIZE_T_SPECIFIER ") for this device.", - funcName, reinterpret_cast<const uint64_t &>(mem_barrier->buffer), - dev_data->phys_dev_properties.queue_family_properties.size()); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_QUEUE_INDEX, "DS", + "%s: Buffer Barrier 0x%" PRIx64 " has QueueFamilyIndex greater " + "than the number of QueueFamilies (" PRINTF_SIZE_T_SPECIFIER ") for this device.", + funcName, reinterpret_cast<const uint64_t &>(mem_barrier->buffer), + dev_data->phys_dev_properties.queue_family_properties.size()); } auto buffer_node = getBufferNode(dev_data, mem_barrier->buffer); if (buffer_node) { auto buffer_size = buffer_node->binding.size; if (mem_barrier->offset >= buffer_size) { - skip_call |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", - "%s: Buffer Barrier 0x%" PRIx64 " has offset 0x%" PRIx64 " which is not less than total size 0x%" PRIx64 ".", - funcName, reinterpret_cast<const uint64_t &>(mem_barrier->buffer), - reinterpret_cast<const uint64_t &>(mem_barrier->offset), reinterpret_cast<const uint64_t &>(buffer_size)); + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", "%s: Buffer Barrier 0x%" PRIx64 " has offset 0x%" PRIx64 + " which is not less than total size 0x%" PRIx64 ".", + funcName, reinterpret_cast<const uint64_t &>(mem_barrier->buffer), + reinterpret_cast<const uint64_t &>(mem_barrier->offset), + reinterpret_cast<const uint64_t &>(buffer_size)); } else if (mem_barrier->size != VK_WHOLE_SIZE && (mem_barrier->offset + mem_barrier->size > buffer_size)) { - skip_call |= log_msg( + skip |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", "%s: Buffer Barrier 0x%" PRIx64 " has offset 0x%" PRIx64 " and size 0x%" PRIx64 " whose sum is greater than total size 0x%" PRIx64 ".", @@ -9202,7 +9169,7 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui } } } - return skip_call; + return skip; } bool validateEventStageMask(VkQueue queue, GLOBAL_CB_NODE *pCB, uint32_t eventCount, size_t firstEventIndex, VkPipelineStageFlags sourceStageMask) { |
