summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-07-24 18:35:54 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-08-02 19:21:35 +0000
commit4b44eea6ac2311d5e9d4373053c6aa382a1e3e0a (patch)
treeefe1a422d9145282c067a3711b241c8a099b7b27 /Graphics/GraphicsEngineVulkan
parentImplemented RenderPassAttachmentDesc struct; added render pass creation test;... (diff)
downloadDiligentCore-4b44eea6ac2311d5e9d4373053c6aa382a1e3e0a.tar.gz
DiligentCore-4b44eea6ac2311d5e9d4373053c6aa382a1e3e0a.zip
Defined SubpassDesc struct
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp79
1 files changed, 75 insertions, 4 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp
index 4483fcdc..23483370 100644
--- a/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp
@@ -26,7 +26,7 @@
*/
#include "pch.h"
-#include <array>
+#include <vector>
#include "RenderPassVkImpl.hpp"
#include "VulkanTypeConversions.hpp"
@@ -45,14 +45,14 @@ RenderPassVkImpl::RenderPassVkImpl(IReferenceCounters* pRefCounters,
RenderPassCI.pNext = nullptr;
RenderPassCI.flags = 0;
- std::array<VkAttachmentDescription, MAX_RENDER_TARGETS + 1> vkAttachments = {};
+ std::vector<VkAttachmentDescription> vkAttachments(m_Desc.AttachmentCount);
for (Uint32 i = 0; i < m_Desc.AttachmentCount; ++i)
{
const auto& Attachment = m_Desc.pAttachments[i];
auto& vkAttachment = vkAttachments[i];
vkAttachment.flags = 0;
vkAttachment.format = TexFormatToVkFormat(Attachment.Format);
- vkAttachment.samples = static_cast<VkSampleCountFlagBits>(0x01 << Attachment.SampleCount);
+ vkAttachment.samples = static_cast<VkSampleCountFlagBits>(0x01 << (Attachment.SampleCount - 1));
vkAttachment.loadOp = AttachmentLoadOpToVkAttachmentLoadOp(Attachment.LoadOp);
vkAttachment.storeOp = AttachmentStoreOpToVkAttachmentStoreOp(Attachment.StoreOp);
vkAttachment.stencilLoadOp = AttachmentLoadOpToVkAttachmentLoadOp(Attachment.StencilLoadOp);
@@ -64,11 +64,82 @@ RenderPassVkImpl::RenderPassVkImpl(IReferenceCounters* pRefCounters,
RenderPassCI.pAttachments = vkAttachments.data();
+ Uint32 TotalAttachmentReferencesCount = 0;
+ Uint32 TotalPreserveAttachmentsCount = 0;
+ CountSubpassAttachmentReferences(Desc, TotalAttachmentReferencesCount, TotalPreserveAttachmentsCount);
+ std::vector<VkAttachmentReference> vkAttachmentReferences(TotalAttachmentReferencesCount);
+ std::vector<Uint32> vkPreserveAttachments(TotalPreserveAttachmentsCount);
+
+ Uint32 CurrAttachmentReferenceInd = 0;
+ Uint32 CurrPreserveAttachmentInd = 0;
+
+ std::vector<VkSubpassDescription> vkSubpasses(Desc.SubpassCount);
+ for (Uint32 i = 0; i < m_Desc.SubpassCount; ++i)
+ {
+ const auto& SubpassDesc = m_Desc.pSubpasses[i];
+ auto& vkSubpass = vkSubpasses[i];
+ vkSubpass.flags = 0;
+ vkSubpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
+ vkSubpass.inputAttachmentCount = SubpassDesc.InputAttachmentCount;
+
+ auto ConvertAttachmentReferences = [&](Uint32 NumAttachments, const AttachmentReference* pSrcAttachments) //
+ {
+ auto* pCurrVkAttachmentReference = &vkAttachmentReferences[CurrAttachmentReferenceInd];
+ for (Uint32 attachment = 0; attachment < NumAttachments; ++attachment, ++CurrAttachmentReferenceInd)
+ {
+ vkAttachmentReferences[CurrAttachmentReferenceInd].attachment = pSrcAttachments[attachment].AttachmentIndex;
+ vkAttachmentReferences[CurrAttachmentReferenceInd].layout = ResourceStateToVkImageLayout(pSrcAttachments[attachment].State);
+ }
+
+ return pCurrVkAttachmentReference;
+ };
+
+ if (SubpassDesc.InputAttachmentCount != 0)
+ {
+ vkSubpass.pInputAttachments = ConvertAttachmentReferences(SubpassDesc.InputAttachmentCount, SubpassDesc.pInputAttachments);
+ }
+
+ vkSubpass.colorAttachmentCount = SubpassDesc.RenderTargetAttachmentCount;
+ if (SubpassDesc.RenderTargetAttachmentCount != 0)
+ {
+ vkSubpass.pColorAttachments = ConvertAttachmentReferences(SubpassDesc.RenderTargetAttachmentCount, SubpassDesc.pRenderTargetAttachments);
+ if (SubpassDesc.pResolveAttachments != nullptr)
+ {
+ vkSubpass.pResolveAttachments = ConvertAttachmentReferences(SubpassDesc.RenderTargetAttachmentCount, SubpassDesc.pResolveAttachments);
+ }
+ }
+
+ if (SubpassDesc.pDepthStencilAttachment != nullptr)
+ {
+ vkSubpass.pDepthStencilAttachment = ConvertAttachmentReferences(1, SubpassDesc.pDepthStencilAttachment);
+ }
+
+ vkSubpass.preserveAttachmentCount = SubpassDesc.PreserveAttachmentCount;
+ if (SubpassDesc.PreserveAttachmentCount != 0)
+ {
+ vkSubpass.pPreserveAttachments = &vkPreserveAttachments[CurrPreserveAttachmentInd];
+ for (Uint32 prsv_attachment = 0; prsv_attachment < SubpassDesc.PreserveAttachmentCount; ++prsv_attachment, ++CurrPreserveAttachmentInd)
+ {
+ vkPreserveAttachments[CurrPreserveAttachmentInd] = SubpassDesc.pPreserveAttachments[prsv_attachment];
+ }
+ }
+ }
+ VERIFY_EXPR(CurrAttachmentReferenceInd == vkAttachmentReferences.size());
+ VERIFY_EXPR(CurrPreserveAttachmentInd == vkPreserveAttachments.size());
RenderPassCI.subpassCount = Desc.SubpassCount;
- RenderPassCI.pSubpasses;
+ RenderPassCI.pSubpasses = vkSubpasses.data();
+
RenderPassCI.dependencyCount = Desc.DependencyCount;
RenderPassCI.pDependencies;
+
+ const auto& LogicalDevice = pDevice->GetLogicalDevice();
+
+ m_VkRenderPass = LogicalDevice.CreateRenderPass(RenderPassCI, Desc.Name);
+ if (!m_VkRenderPass)
+ {
+ LOG_ERROR_AND_THROW("Failed to create Vulkan render pass");
+ }
}
RenderPassVkImpl::~RenderPassVkImpl()