Files
Seele/src/Engine/Graphics/Vulkan/RenderPass.cpp
T

146 lines
5.9 KiB
C++
Raw Normal View History

2023-10-26 18:37:29 +02:00
#include "RenderPass.h"
#include "Initializer.h"
#include "Graphics.h"
#include "Framebuffer.h"
#include "Texture.h"
2020-04-12 15:47:19 +02:00
using namespace Seele;
using namespace Seele::Vulkan;
2023-11-01 23:12:30 +01:00
RenderPass::RenderPass(PGraphics graphics, Gfx::ORenderTargetLayout layout, Gfx::PViewport viewport)
: Gfx::RenderPass(std::move(layout))
2020-05-05 01:51:13 +02:00
, graphics(graphics)
2020-04-12 15:47:19 +02:00
{
2021-09-23 10:10:39 +02:00
renderArea.extent.width = viewport->getSizeX();
renderArea.extent.height = viewport->getSizeY();
renderArea.offset.x = viewport->getOffsetX();
renderArea.offset.y = viewport->getOffsetY();
2020-10-03 11:00:10 +02:00
subpassContents = VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS;
2020-04-12 15:47:19 +02:00
Array<VkAttachmentDescription> attachments;
Array<VkAttachmentReference> inputRefs;
Array<VkAttachmentReference> colorRefs;
VkAttachmentReference depthRef;
uint32 attachmentCounter = 0;
2023-11-01 23:12:30 +01:00
for (auto& inputAttachment : this->layout->inputAttachments)
2020-04-12 15:47:19 +02:00
{
PTexture2D image = inputAttachment->getTexture().cast<Texture2D>();
2020-08-11 21:23:20 +02:00
VkAttachmentDescription& desc = attachments.add();
2020-04-12 15:47:19 +02:00
desc.flags = 0;
desc.format = cast(image->getFormat());
desc.storeOp = cast(inputAttachment->getStoreOp());
desc.loadOp = cast(inputAttachment->getLoadOp());
desc.stencilStoreOp = cast(inputAttachment->getStencilStoreOp());
desc.stencilLoadOp = cast(inputAttachment->getStencilLoadOp());
desc.initialLayout = image->isDepthStencil() ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
desc.finalLayout = desc.initialLayout;
VkAttachmentReference &ref = inputRefs.add();
ref.layout = desc.initialLayout;
ref.attachment = attachmentCounter;
attachmentCounter++;
}
2023-11-01 23:12:30 +01:00
for (auto& colorAttachment : this->layout->colorAttachments)
2020-04-12 15:47:19 +02:00
{
2020-08-11 21:23:20 +02:00
VkAttachmentDescription& desc = attachments.add();
2020-04-12 15:47:19 +02:00
desc.flags = 0;
2020-08-11 21:23:20 +02:00
desc.samples = (VkSampleCountFlagBits)colorAttachment->getNumSamples();
desc.format = cast(colorAttachment->getFormat());
2020-04-12 15:47:19 +02:00
desc.storeOp = cast(colorAttachment->getStoreOp());
desc.loadOp = cast(colorAttachment->getLoadOp());
desc.stencilStoreOp = cast(colorAttachment->getStencilStoreOp());
desc.stencilLoadOp = cast(colorAttachment->getStencilLoadOp());
desc.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
2020-10-23 01:47:56 +02:00
VkClearValue& clearValue = clearValues.add();
if(desc.loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
{
clearValue = cast(colorAttachment->clear);
}
2020-04-12 15:47:19 +02:00
VkAttachmentReference &ref = colorRefs.add();
ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
ref.attachment = attachmentCounter;
attachmentCounter++;
}
if (layout->depthAttachment != nullptr)
{
PTexture2D image = layout->depthAttachment->getTexture().cast<Texture2D>();
2020-08-11 21:23:20 +02:00
VkAttachmentDescription& desc = attachments.add();
2020-04-12 15:47:19 +02:00
desc.flags = 0;
2020-08-11 21:23:20 +02:00
desc.samples = (VkSampleCountFlagBits)image->getNumSamples();
2020-04-12 15:47:19 +02:00
desc.format = cast(image->getFormat());
desc.storeOp = cast(layout->depthAttachment->getStoreOp());
desc.loadOp = cast(layout->depthAttachment->getLoadOp());
desc.stencilStoreOp = cast(layout->depthAttachment->getStencilStoreOp());
desc.stencilLoadOp = cast(layout->depthAttachment->getStencilLoadOp());
desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
2020-10-23 01:47:56 +02:00
VkClearValue& clearValue = clearValues.add();
if(desc.loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
{
clearValue = cast(layout->depthAttachment->clear);
}
2020-04-12 15:47:19 +02:00
VkAttachmentReference &ref = depthRef;
ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
ref.attachment = attachmentCounter;
attachmentCounter++;
}
VkSubpassDescription subPassDesc =
init::SubpassDescription(
VK_PIPELINE_BIND_POINT_GRAPHICS,
2021-03-31 12:18:16 +02:00
(uint32)colorRefs.size(),
2020-04-12 15:47:19 +02:00
colorRefs.data(),
&depthRef,
2021-03-31 12:18:16 +02:00
(uint32)inputRefs.size(),
2020-04-12 15:47:19 +02:00
inputRefs.data());
VkSubpassDependency dependency = {};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
VkRenderPassCreateInfo info =
init::RenderPassCreateInfo(
2021-03-31 12:18:16 +02:00
(uint32)attachments.size(),
2020-04-12 15:47:19 +02:00
attachments.data(),
1,
&subPassDesc,
1,
&dependency);
VK_CHECK(vkCreateRenderPass(graphics->getDevice(), &info, nullptr, &renderPass));
}
RenderPass::~RenderPass()
{
vkDestroyRenderPass(graphics->getDevice(), renderPass, nullptr);
}
uint32 RenderPass::getFramebufferHash()
{
FramebufferDescription description;
std::memset(&description, 0, sizeof(FramebufferDescription));
2023-11-01 23:12:30 +01:00
for (auto& inputAttachment : layout->inputAttachments)
2020-04-12 15:47:19 +02:00
{
PTexture2D tex = inputAttachment->getTexture().cast<Texture2D>();
description.inputAttachments[description.numInputAttachments++] = tex->getView();
}
2023-11-01 23:12:30 +01:00
for (auto& colorAttachment : layout->colorAttachments)
2020-04-12 15:47:19 +02:00
{
PTexture2D tex = colorAttachment->getTexture().cast<Texture2D>();
2020-05-05 01:51:13 +02:00
description.colorAttachments[description.numColorAttachments++] = tex->getView();
2020-04-12 15:47:19 +02:00
}
2020-05-05 01:51:13 +02:00
if (layout->depthAttachment != nullptr)
2020-04-12 15:47:19 +02:00
{
PTexture2D tex = layout->depthAttachment->getTexture().cast<Texture2D>();
description.depthAttachment = tex->getView();
}
2022-11-22 22:11:37 +01:00
return CRC::Calculate(&description, sizeof(FramebufferDescription), CRC::CRC_32());
2020-04-12 15:47:19 +02:00
}