aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2017-05-10 09:46:30 -0600
committerMark Lobodzinski <mark@lunarg.com>2017-05-11 12:29:27 -0600
commit1b1df2e44f1b3f6c75f77ed52c1f0f64f2864351 (patch)
treed1672644a165bc941e5793c92929ebceeb8a3024 /layers/core_validation.cpp
parent3df9ec0f6416052e36ab85f3d937a9836aa7d767 (diff)
downloadusermoji-1b1df2e44f1b3f6c75f77ed52c1f0f64f2864351.tar.xz
layers: LX652, Layout check for pipelinebarrier in RP
Covers VU 2080, oldlayout must equal newlayout if barrier in an active renderPass. Change-Id: I2bfbd27a5938615d9274ecea8799451b5134f237
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp197
1 files changed, 101 insertions, 96 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 46d2ef4b..2ce055d2 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -7666,114 +7666,119 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui
}
for (uint32_t i = 0; i < imageMemBarrierCount; ++i) {
auto mem_barrier = &pImageMemBarriers[i];
- if (mem_barrier) {
- auto image_data = GetImageState(dev_data, mem_barrier->image);
- if (image_data) {
- uint32_t src_q_f_index = mem_barrier->srcQueueFamilyIndex;
- uint32_t dst_q_f_index = mem_barrier->dstQueueFamilyIndex;
- if (image_data->createInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) {
- // 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 |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
- VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t>(cmdBuffer),
- __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
- // dstQueueFamilyIndex must either both be VK_QUEUE_FAMILY_IGNORED,
- // 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 |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
- VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t>(cmdBuffer),
- __LINE__, DRAWSTATE_INVALID_QUEUE_INDEX, "DS",
- "%s: Image 0x%" PRIx64
- " was created with sharingMode "
- "of VK_SHARING_MODE_EXCLUSIVE. If one of src- or "
- "dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
- "must be.",
- funcName, reinterpret_cast<const uint64_t &>(mem_barrier->image));
- } 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 |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
- VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t>(cmdBuffer),
- __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());
- }
+ auto image_data = GetImageState(dev_data, mem_barrier->image);
+ if (image_data) {
+ uint32_t src_q_f_index = mem_barrier->srcQueueFamilyIndex;
+ uint32_t dst_q_f_index = mem_barrier->dstQueueFamilyIndex;
+ if (image_data->createInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) {
+ // 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 |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t>(cmdBuffer), __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
+ // dstQueueFamilyIndex must either both be VK_QUEUE_FAMILY_IGNORED,
+ // 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 |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t>(cmdBuffer), __LINE__,
+ DRAWSTATE_INVALID_QUEUE_INDEX, "DS",
+ "%s: Image 0x%" PRIx64
+ " was created with sharingMode "
+ "of VK_SHARING_MODE_EXCLUSIVE. If one of src- or "
+ "dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
+ "must be.",
+ funcName, reinterpret_cast<const uint64_t &>(mem_barrier->image));
+ } 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 |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t>(cmdBuffer), __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->oldLayout != mem_barrier->newLayout) {
- skip |=
- ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->srcAccessMask, mem_barrier->oldLayout, "Source");
- skip |=
- ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->dstAccessMask, mem_barrier->newLayout, "Dest");
+ if (mem_barrier->oldLayout != mem_barrier->newLayout) {
+ if (pCB->activeRenderPass) {
+ skip |= log_msg(
+ dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ reinterpret_cast<uint64_t>(cmdBuffer), __LINE__, VALIDATION_ERROR_02080, "DS",
+ "%s: As the Image Barrier for image 0x%" PRIx64
+ " is being executed within a render pass instance, oldLayout must equal newLayout yet they are "
+ "%s and %s. %s",
+ funcName, reinterpret_cast<const uint64_t &>(mem_barrier->image), string_VkImageLayout(mem_barrier->oldLayout),
+ string_VkImageLayout(mem_barrier->newLayout), validation_error_map[VALIDATION_ERROR_02080]);
}
- if (mem_barrier->newLayout == VK_IMAGE_LAYOUT_UNDEFINED || mem_barrier->newLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) {
- skip |=
- log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ skip |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->srcAccessMask, mem_barrier->oldLayout, "Source");
+ 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) {
+ skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
reinterpret_cast<uint64_t>(cmdBuffer), __LINE__, DRAWSTATE_INVALID_BARRIER, "DS",
"%s: Image Layout cannot be transitioned to UNDEFINED or "
"PREINITIALIZED.",
funcName);
- }
- VkFormat format = VK_FORMAT_UNDEFINED;
- uint32_t arrayLayers = 0, mipLevels = 0;
- bool imageFound = false;
- if (image_data) {
- format = image_data->createInfo.format;
- arrayLayers = image_data->createInfo.arrayLayers;
- mipLevels = image_data->createInfo.mipLevels;
- imageFound = true;
- } else if (dev_data->device_extensions.khr_swapchain) {
- auto imageswap_data = GetSwapchainFromImage(dev_data, mem_barrier->image);
- if (imageswap_data) {
- auto swapchain_data = GetSwapchainNode(dev_data, imageswap_data);
- if (swapchain_data) {
- format = swapchain_data->createInfo.imageFormat;
- arrayLayers = swapchain_data->createInfo.imageArrayLayers;
- mipLevels = 1;
- imageFound = true;
- }
+ }
+ VkFormat format = VK_FORMAT_UNDEFINED;
+ uint32_t arrayLayers = 0, mipLevels = 0;
+ bool imageFound = false;
+ if (image_data) {
+ format = image_data->createInfo.format;
+ arrayLayers = image_data->createInfo.arrayLayers;
+ mipLevels = image_data->createInfo.mipLevels;
+ imageFound = true;
+ } else if (dev_data->device_extensions.khr_swapchain) {
+ auto imageswap_data = GetSwapchainFromImage(dev_data, mem_barrier->image);
+ if (imageswap_data) {
+ auto swapchain_data = GetSwapchainNode(dev_data, imageswap_data);
+ if (swapchain_data) {
+ format = swapchain_data->createInfo.imageFormat;
+ arrayLayers = swapchain_data->createInfo.imageArrayLayers;
+ mipLevels = 1;
+ imageFound = true;
}
}
- if (imageFound) {
- skip |= ValidateImageSubrangeLevelLayerCounts(dev_data, mem_barrier->subresourceRange, funcName);
- auto aspect_mask = mem_barrier->subresourceRange.aspectMask;
- skip |= ValidateImageAspectMask(dev_data, image_data->image, format, aspect_mask, funcName);
+ }
+ if (imageFound) {
+ skip |= ValidateImageSubrangeLevelLayerCounts(dev_data, mem_barrier->subresourceRange, funcName);
+ auto aspect_mask = mem_barrier->subresourceRange.aspectMask;
+ skip |= ValidateImageAspectMask(dev_data, image_data->image, format, aspect_mask, funcName);
- uint32_t layer_count = ResolveRemainingLayers(&mem_barrier->subresourceRange, image_data->createInfo.arrayLayers);
- if ((mem_barrier->subresourceRange.baseArrayLayer + layer_count) > arrayLayers) {
- skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
- VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast<uint64_t>(cmdBuffer), __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, layer_count, arrayLayers);
- }
+ uint32_t layer_count = ResolveRemainingLayers(&mem_barrier->subresourceRange, image_data->createInfo.arrayLayers);
+ if ((mem_barrier->subresourceRange.baseArrayLayer + layer_count) > arrayLayers) {
+ skip |=
+ log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ reinterpret_cast<uint64_t>(cmdBuffer), __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, layer_count, arrayLayers);
+ }
- uint32_t level_count = ResolveRemainingLevels(&mem_barrier->subresourceRange, image_data->createInfo.mipLevels);
- if ((mem_barrier->subresourceRange.baseMipLevel + level_count) > mipLevels) {
- skip |= log_msg(
- dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
- reinterpret_cast<uint64_t>(cmdBuffer), __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, level_count, mipLevels);
- }
+ uint32_t level_count = ResolveRemainingLevels(&mem_barrier->subresourceRange, image_data->createInfo.mipLevels);
+ if ((mem_barrier->subresourceRange.baseMipLevel + level_count) > mipLevels) {
+ skip |= log_msg(
+ dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ reinterpret_cast<uint64_t>(cmdBuffer), __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, level_count, mipLevels);
}
}
}