2

I'm trying to reuse the depth attachment from the first renderpass into the second renderpass. but, it's not loading the depth values in the second renderpass.

//code that creates attachments

void VulkanRenderTarget::addAttachment(AttachmentCreateInfo createinfo)
        {
            auto device = mRenderer->getDevice();

            Attachment attachment;

            attachment.format = createinfo.format;

            VkImageAspectFlags aspectMask = 0;

            // Select aspect mask and layout depending on usage

            // Color attachment
            if (createinfo.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
            {
                aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
            }

            // Depth (and/or stencil) attachment
            if (createinfo.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
            {
                if (attachment.hasDepth())
                {
                    aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
                }
                if (attachment.hasStencil())
                {
                    aspectMask = aspectMask | VK_IMAGE_ASPECT_STENCIL_BIT;
                }
            }

            assert(aspectMask > 0);

            VkImageCreateInfo image = VulkanInitializers::imageCreateInfo();
            image.imageType = VK_IMAGE_TYPE_2D;
            image.format = createinfo.format;
            image.extent.width = createinfo.width;
            image.extent.height = createinfo.height;
            image.extent.depth = 1;
            image.mipLevels = 1;
            image.arrayLayers = createinfo.layerCount;
            image.samples = createinfo.imageSampleCount;
            image.tiling = createinfo.tiling;
            image.usage = createinfo.usage;

            VkMemoryAllocateInfo memAlloc = VulkanInitializers::memoryAllocateInfo();
            VkMemoryRequirements memReqs;

            // Create image for this attachment
            VERIFY(vkCreateImage(device, &image, nullptr, &attachment.image));
            vkGetImageMemoryRequirements(device, attachment.image, &memReqs);
            memAlloc.allocationSize = memReqs.size;
            memAlloc.memoryTypeIndex = mRenderer->getMemoryType(memReqs.memoryTypeBits, createinfo.memoryFlag);
            VERIFY(vkAllocateMemory(device, &memAlloc, nullptr, &attachment.memory));
            VERIFY(vkBindImageMemory(device, attachment.image, attachment.memory, 0));

            attachment.subresourceRange = {};
            attachment.subresourceRange.aspectMask = aspectMask;
            attachment.subresourceRange.levelCount = 1;
            attachment.subresourceRange.layerCount = createinfo.layerCount;

            VkImageViewCreateInfo imageView = VulkanInitializers::imageViewCreateInfo();
            imageView.viewType = (createinfo.layerCount == 1) ? VK_IMAGE_VIEW_TYPE_2D : VK_IMAGE_VIEW_TYPE_2D_ARRAY;
            imageView.format = createinfo.format;
            imageView.subresourceRange = attachment.subresourceRange;
            //todo: workaround for depth+stencil attachments
            imageView.subresourceRange.aspectMask = (attachment.hasDepth()) ? VK_IMAGE_ASPECT_DEPTH_BIT : aspectMask;
            imageView.image = attachment.image;
            VERIFY(vkCreateImageView(device, &imageView, nullptr, &attachment.view));

            // Fill attachment description
            attachment.description = {};
            attachment.description.samples = createinfo.imageSampleCount;
            attachment.description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
            attachment.description.storeOp = (createinfo.usage & VK_IMAGE_USAGE_SAMPLED_BIT) ? VK_ATTACHMENT_STORE_OP_STORE : VK_ATTACHMENT_STORE_OP_DONT_CARE;
            attachment.description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
            attachment.description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
            attachment.description.format = createinfo.format;
            attachment.description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
            // Final layout
            // If not, final layout depends on attachment type
            if (attachment.hasDepth() || attachment.hasStencil())
            {
                attachment.description.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
                //attachment.description.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
            }
            else
            {
                attachment.description.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
            }

            mAttachments.push_back(attachment);
        }

///first renderpass creation

// Four attachments (3 color, 1 depth)
            AttachmentCreateInfo attachmentInfo = {};
            attachmentInfo.width = mWidth;
            attachmentInfo.height = mHeight;
            attachmentInfo.layerCount = 1;
            attachmentInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
            attachmentInfo.imageSampleCount = mRenderer->getMSAAsamples();

            // Color attachments
            // Attachment 0: (World space) Positions
            //attachmentInfo.format = VK_FORMAT_R16G16B16A16_SFLOAT;
            attachmentInfo.format = VK_FORMAT_R32G32B32A32_SFLOAT;
            addAttachment(attachmentInfo);

            // Attachment 1: (World space) Normals
            attachmentInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
            addAttachment(attachmentInfo);

            // Attachment 2: Albedo (color)
            attachmentInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
            addAttachment(attachmentInfo);

            //depth
            attachmentInfo.format = mRenderer->getDepthFormat();
            attachmentInfo.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
            addAttachment(attachmentInfo);

            {
                //create sampler
                VkSamplerCreateInfo samplerInfo = VulkanInitializers::samplerCreateInfo();
                samplerInfo.magFilter = VK_FILTER_NEAREST;
                samplerInfo.minFilter = VK_FILTER_NEAREST;
                samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
                samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
                samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
                samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
                samplerInfo.mipLodBias = 0.0f;
                samplerInfo.maxAnisotropy = 1.0f;
                samplerInfo.minLod = 0.0f;
                samplerInfo.maxLod = 1.0f;
                samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
                VERIFY(vkCreateSampler(device, &samplerInfo, nullptr, &sampler));

            }

            //create renderpass and frame buffer
            {
                std::vector<VkAttachmentDescription> attachmentDescriptions;
                for (auto& attachment : mAttachments)
                {
                    attachmentDescriptions.push_back(attachment.description);
                };

                // Collect attachment references
                std::vector<VkAttachmentReference> colorReferences;
                VkAttachmentReference depthReference = {};
                bool hasDepth = false;
                bool hasColor = false;

                uint32_t attachmentIndex = 0;

                for (auto& attachment : mAttachments)
                {
                    if (attachment.isDepthStencil())
                    {
                        // Only one depth attachment allowed
                        assert(!hasDepth);
                        depthReference.attachment = attachmentIndex;
                        depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
                        hasDepth = true;
                    }
                    else
                    {
                        colorReferences.push_back({ attachmentIndex, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL });
                        hasColor = true;
                    }
                    attachmentIndex++;
                };

                // Default render pass setup uses only one subpass
                VkSubpassDescription subpass = {};
                subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
                if (hasColor)
                {
                    subpass.pColorAttachments = colorReferences.data();
                    subpass.colorAttachmentCount = static_cast<uint32_t>(colorReferences.size());
                }
                if (hasDepth)
                {
                    subpass.pDepthStencilAttachment = &depthReference;
                }

                // Use subpass dependencies for attachment layout transitions
                std::array<VkSubpassDependency, 2> dependencies;

                dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
                dependencies[0].dstSubpass = 0;
                dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
                dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
                dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
                dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
                dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;

                dependencies[1].srcSubpass = 0;
                dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
                dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
                dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
                dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
                dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
                dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;


                // Create render pass
                VkRenderPassCreateInfo renderPassInfo = {};
                renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
                renderPassInfo.pAttachments = attachmentDescriptions.data();
                renderPassInfo.attachmentCount = static_cast<uint32_t>(attachmentDescriptions.size());
                renderPassInfo.subpassCount = 1;
                renderPassInfo.pSubpasses = &subpass;
                renderPassInfo.dependencyCount = static_cast<uint32_t>(dependencies.size());
                renderPassInfo.pDependencies = dependencies.data();
                VERIFY(vkCreateRenderPass(device, &renderPassInfo, nullptr, &mRenderPass));

                std::vector<VkImageView> attachmentViews;
                for (auto attachment : mAttachments)
                {
                    attachmentViews.push_back(attachment.view);
                }

                // Find. max number of layers across attachments
                uint32_t maxLayers = 0;
                for (auto attachment : mAttachments)
                {
                    if (attachment.subresourceRange.layerCount > maxLayers)
                    {
                        maxLayers = attachment.subresourceRange.layerCount;
                    }
                }

                VkFramebufferCreateInfo framebufferInfo = {};
                framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
                framebufferInfo.renderPass = mRenderPass;
                framebufferInfo.pAttachments = attachmentViews.data();
                framebufferInfo.attachmentCount = static_cast<uint32_t>(attachmentViews.size());
                framebufferInfo.width = mWidth;
                framebufferInfo.height = mHeight;
                framebufferInfo.layers = maxLayers;

                mFrameBuffers.clear();
                mFrameBuffers.resize(1);
                VERIFY(vkCreateFramebuffer(device, &framebufferInfo, nullptr, &mFrameBuffers[0]));
            }

///second renderpass

finalImageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;

                        std::array<VkAttachmentDescription, 3> attachments = {};

                        // Multisampled attachment that we render to
                        attachments[0].format = mRenderer->getSCImageFormat();// swapChain.colorFormat;
                        attachments[0].samples = mRenderer->getMSAAsamples();//  settings.sampleCount;
                        attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
                        attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
                        attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
                        attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
                        attachments[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
                        attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;

                        // This is the frame buffer attachment to where the multisampled image
                        // will be resolved to and which will be presented to the swapchain
                        attachments[1].format = mRenderer->getSCImageFormat();;
                        attachments[1].samples = VK_SAMPLE_COUNT_1_BIT;
                        attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
                        attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
                        attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
                        attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
                        attachments[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
                        attachments[1].finalLayout = finalImageLayout;

                        // Multisampled depth attachment we render to
                        attachments[2].format = mRenderer->getDepthFormat();// depthFormat;
                        attachments[2].samples = mRenderer->getMSAAsamples();// settings.sampleCount;
                        attachments[2].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;// VK_ATTACHMENT_LOAD_OP_LOAD; //VK_ATTACHMENT_LOAD_OP_CLEAR; use depth from deferred renderer
                        attachments[2].storeOp = VK_ATTACHMENT_STORE_OP_STORE;// VK_ATTACHMENT_STORE_OP_DONT_CARE;
                        attachments[2].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
                        attachments[2].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
                        attachments[2].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
                        attachments[2].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;

                        VkAttachmentReference colorReference = {};
                        colorReference.attachment = 0;
                        colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;

                        VkAttachmentReference depthReference = {};
                        depthReference.attachment = 2;
                        depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;

                        // Resolve attachment reference for the color attachment
                        VkAttachmentReference resolveReference = {};
                        resolveReference.attachment = 1;
                        resolveReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;

                        VkSubpassDescription subpass = {};
            

            subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
                            subpass.colorAttachmentCount = 1;
                            subpass.pColorAttachments = &colorReference;
                            // Pass our resolve attachments to the sub pass
                            subpass.pResolveAttachments = &resolveReference;
                            subpass.pDepthStencilAttachment = &depthReference;
    
                            std::vector<VkSubpassDependency> dependencies;
                            dependencies.resize(2);
    
                            dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
                            dependencies[0].dstSubpass = 0;
                            dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
                                VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; // Both stages might have access the depth-buffer, so need both in src/dstStageMask;;
                            dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
                            dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
                            dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
                                VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
                            dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
    
                        
                            dependencies[1].srcSubpass = 0;
                            dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
                            dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
                            dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
                            dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
                            dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
                            dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
    
                            VkRenderPassCreateInfo renderPassCI = {};
                            renderPassCI.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
                            renderPassCI.attachmentCount = static_cast<uint32_t>(attachments.size());
                            renderPassCI.pAttachments = attachments.data();
                            renderPassCI.subpassCount = 1;
                            renderPassCI.pSubpasses = &subpass;
                            renderPassCI.dependencyCount = static_cast<uint32_t>(dependencies.size());
                            renderPassCI.pDependencies = dependencies.data();
                            VERIFY(vkCreateRenderPass(device, &renderPassCI, nullptr, &mRenderPass));

        VkImageCreateInfo imageCI{};
                    imageCI.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
                    imageCI.imageType = VK_IMAGE_TYPE_2D;
                    imageCI.format = mRenderer->getSCImageFormat();// swapChain.colorFormat;
                    imageCI.extent.width = mWidth;// width;
                    imageCI.extent.height = mHeight;
                    imageCI.extent.depth = 1;
                    imageCI.mipLevels = 1;
                    imageCI.arrayLayers = 1;
                    imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
                    imageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
                    imageCI.samples = mRenderer->getMSAAsamples();//  settings.sampleCount;
                    imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
                    imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
                    VERIFY(vkCreateImage(device, &imageCI, nullptr, &multisampleTarget.color.image));

                    VkMemoryRequirements memReqs;
                    vkGetImageMemoryRequirements(device, multisampleTarget.color.image, &memReqs);
                    VkMemoryAllocateInfo memAllocInfo{};
                    memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
                    memAllocInfo.allocationSize = memReqs.size;
                    VkBool32 lazyMemTypePresent;
                    memAllocInfo.memoryTypeIndex = mRenderer->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT, &lazyMemTypePresent);
                    if (!lazyMemTypePresent) {
                        memAllocInfo.memoryTypeIndex = mRenderer->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
                    }
                    VERIFY(vkAllocateMemory(device, &memAllocInfo, nullptr, &multisampleTarget.color.memory));
                    vkBindImageMemory(device, multisampleTarget.color.image, multisampleTarget.color.memory, 0);

                    // Create image view for the MSAA target
                    VkImageViewCreateInfo imageViewCI{};
                    imageViewCI.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
                    imageViewCI.image = multisampleTarget.color.image;
                    imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
                    imageViewCI.format = mRenderer->getSCImageFormat();// swapChain.colorFormat;
                    imageViewCI.components.r = VK_COMPONENT_SWIZZLE_R;
                    imageViewCI.components.g = VK_COMPONENT_SWIZZLE_G;
                    imageViewCI.components.b = VK_COMPONENT_SWIZZLE_B;
                    imageViewCI.components.a = VK_COMPONENT_SWIZZLE_A;
                    imageViewCI.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
                    imageViewCI.subresourceRange.levelCount = 1;
                    imageViewCI.subresourceRange.layerCount = 1;
                    VERIFY(vkCreateImageView(device, &imageViewCI, nullptr, &multisampleTarget.color.view));

AttachmentCreateInfo attachmentInfo = {};
                    attachmentInfo.width = mWidth;
                    attachmentInfo.height = mHeight;
                    attachmentInfo.layerCount = 1;
                    attachmentInfo.imageSampleCount = mRenderer->getMSAAsamples();
                    attachmentInfo.format = mRenderer->getDepthFormat();
                    attachmentInfo.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
                    addAttachment(attachmentInfo);

                    auto& depthAttachment = mAttachments.back();

                    multisampleTarget.depth.image = depthAttachment.image;
                    multisampleTarget.depth.view = depthAttachment.view;
                    multisampleTarget.depth.memory = depthAttachment.memory;

std::vector<VkImageView> attachments;
attachments.emplace_back(multisampleTarget.color.view);
                    attachments.emplace_back(color.view);
                    attachments.emplace_back(multisampleTarget.depth.view);
VkFramebufferCreateInfo frameBufferCI{};
                frameBufferCI.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
                frameBufferCI.pNext = NULL;
                frameBufferCI.renderPass = mRenderPass;
                frameBufferCI.attachmentCount = static_cast<uint32_t>(attachments.size());
                frameBufferCI.pAttachments = attachments.data();
                frameBufferCI.width = mWidth;
                frameBufferCI.height = mHeight;
                frameBufferCI.layers = 1;
mFrameBuffers.resize(1);
                    VERIFY(vkCreateFramebuffer(device, &frameBufferCI, nullptr, &mFrameBuffers[0]));

In renderDoc I could see the second renderpass depth attachment as 'undefined img' enter image description here

I'm guessing that I'm using Load and StoreOps the right way and also created the subpass dependencies which takes care of transfering the depth values from first render pass to second. But!! it's not working. :( Apologies for my novice coding style. Most were from SaschaWillems examples.

1 Answer 1

3

In second pass, depth attachment description, it "loads" image in undefined state:

attachments[2].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;

Based on your attachment creating code, I assume it should be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL

Sign up to request clarification or add additional context in comments.

1 Comment

That saved me. I was trying to understand why it wasn't working.!! now I got it. Also, I used the same depth attachment buffer created in the deferred framebuffer. Now there is no need for creating 'multisampleTarget.depth.view'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.