CSC8503_Advanced_Game_Technologies / Plugins / VulkanRendering / VulkanRenderPassBuilder.cpp
VulkanRenderPassBuilder.cpp
Raw
#include "VulkanRenderPassBuilder.h"

using namespace NCL;
using namespace Rendering;

VulkanRenderPassBuilder::VulkanRenderPassBuilder() {
	subPass.setPDepthStencilAttachment(nullptr);
}

VulkanRenderPassBuilder::~VulkanRenderPassBuilder() {

}

VulkanRenderPassBuilder& VulkanRenderPassBuilder::WithColourAttachment(VulkanTexture* texture, bool clear, vk::ImageLayout startLayout, vk::ImageLayout useLayout,  vk::ImageLayout endLayout) {
	allDescriptions.emplace_back(
		vk::AttachmentDescription()
		.setInitialLayout(startLayout)
		.setFinalLayout(endLayout)
		.setFormat(texture->GetFormat())
		.setLoadOp(clear ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad)
	);
	allReferences.emplace_back(vk::AttachmentReference((uint32_t)allReferences.size(), useLayout));

	return *this;
}

VulkanRenderPassBuilder& VulkanRenderPassBuilder::WithDepthAttachment(VulkanTexture* texture, bool clear, vk::ImageLayout startLayout, vk::ImageLayout useLayout, vk::ImageLayout endLayout) {
	allDescriptions.emplace_back(
		vk::AttachmentDescription()
		.setInitialLayout(startLayout)
		.setFinalLayout(endLayout)
		.setFormat(texture->GetFormat())
		.setLoadOp(clear ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad)
	);
	depthReference			= vk::AttachmentReference((uint32_t)allReferences.size(), useLayout);
	subPass.setPDepthStencilAttachment(&depthReference);
	return *this;
}

VulkanRenderPassBuilder& VulkanRenderPassBuilder::WithDepthStencilAttachment(VulkanTexture* texture, bool clear, vk::ImageLayout startLayout, vk::ImageLayout useLayout, vk::ImageLayout endLayout) {
	return WithDepthAttachment(texture, clear, startLayout, useLayout, endLayout); //we just get different default parameters!
}

VulkanRenderPassBuilder& VulkanRenderPassBuilder::WithDebugName(const string& name) {
	debugName = name;
	return *this;
}

vk::RenderPass	VulkanRenderPassBuilder::Build(VulkanRenderer& renderer) {
	vk::RenderPass pass;

	subPass.setColorAttachmentCount((uint32_t)allReferences.size())
		.setPColorAttachments(allReferences.data())
		.setPipelineBindPoint(vk::PipelineBindPoint::eGraphics);

	vk::RenderPassCreateInfo renderPassInfo = vk::RenderPassCreateInfo()
		.setAttachmentCount((uint32_t)allDescriptions.size())
		.setPAttachments(allDescriptions.data())
		.setSubpassCount(1)
		.setPSubpasses(&subPass);

	pass = renderer.GetDevice().createRenderPass(renderPassInfo);

	if (!debugName.empty()) {
		renderer.SetDebugName(vk::ObjectType::eRenderPass, (uint64_t)(VkRenderPass)pass, debugName);
	}

	return pass;
}