diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-05-10 09:46:30 -0600 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-05-11 12:29:27 -0600 |
| commit | 1b1df2e44f1b3f6c75f77ed52c1f0f64f2864351 (patch) | |
| tree | d1672644a165bc941e5793c92929ebceeb8a3024 /layers/core_validation.cpp | |
| parent | 3df9ec0f6416052e36ab85f3d937a9836aa7d767 (diff) | |
| download | usermoji-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.cpp | 197 |
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); } } } |
