[Vulkan] Fix several bugs about `RenderPassCreateInfo2` This patch fixes several bugs about `RenderPassCreateInfo2`. 1. Set missing `VkAttachmentReference2.aspectMask` for `inputAttachmentRefs` (VUID-VkRenderPassCreateInfo2-attachment-02525) 2. Fix incorrect assignment on `subpassDependencies`. `dependency` should be a pointer instead of a reference to point to different items in `passInfo.subpassDependencies`. With this patch below test failure on current Windows Intel UHD770 bots will pass when Vulkan validation layer is enabled: DawnLoadResolveTextureTest.DrawThenLoadNonZeroIndexedAttachment Bug: 463893793 Change-Id: I0d5b90032a3f4e524e6c04b5e1c3cdf0141dbd98 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/285715 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Shao, Jiawei <jiawei.shao@intel.com> Reviewed-by: Loko Kung <lokokung@google.com>
diff --git a/src/dawn/native/vulkan/RenderPassCache.cpp b/src/dawn/native/vulkan/RenderPassCache.cpp index 6a948ef..e2d83a5 100644 --- a/src/dawn/native/vulkan/RenderPassCache.cpp +++ b/src/dawn/native/vulkan/RenderPassCache.cpp
@@ -27,6 +27,7 @@ #include "dawn/native/vulkan/RenderPassCache.h" +#include <concepts> #include <vector> #include "absl/container/inlined_vector.h" @@ -210,6 +211,9 @@ passInfo.inputAttachmentRefs[i].attachment = resolveAttachmentRef.attachment; passInfo.inputAttachmentRefs[i].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + if constexpr (std::same_as<InfoType, RenderPassCreateInfo2>) { + passInfo.inputAttachmentRefs[i].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + } highestInputAttachmentIndex = i; } else { @@ -240,26 +244,26 @@ subpassCount++; // Dependency for resolve texture's read -> resolve texture's write. - auto& dependency = passInfo.subpassDependencies[dependencyCount]; - dependency.srcSubpass = 0; - dependency.dstSubpass = 1; - dependency.srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.srcAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; - dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + auto* dependency = &passInfo.subpassDependencies[dependencyCount]; + dependency->srcSubpass = 0; + dependency->dstSubpass = 1; + dependency->srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + dependency->dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency->srcAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; + dependency->dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency->dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; dependencyCount++; // Dependency for color write in subpass 0 -> color write in subpass 1 - dependency = passInfo.subpassDependencies[dependencyCount]; - dependency.srcSubpass = 0; - dependency.dstSubpass = 1; - dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - dependency.dstAccessMask = + dependency = &passInfo.subpassDependencies[dependencyCount]; + dependency->srcSubpass = 0; + dependency->dstSubpass = 1; + dependency->srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency->dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency->srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency->dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + dependency->dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; dependencyCount++; }