diff --git a/include/vulkan/basalt_render_pass.h b/include/vulkan/basalt_render_pass.h new file mode 100644 index 0000000..24863b6 --- /dev/null +++ b/include/vulkan/basalt_render_pass.h @@ -0,0 +1,38 @@ +#pragma once +#include "vulkan/basalt_device.h" +// TODO: Support adding dependencies to the RenderPass +// TODO: Support all attachment types (input, resolve, depth stencil, preserve) + +namespace basalt +{ + class RenderPass + { + public: + RenderPass(basalt::Device& device, VkRenderPass pass); + ~RenderPass(); + + basalt::Device& device; + VkRenderPass render_pass; + }; + + + class RenderPassBuilder + { + public: + RenderPassBuilder(basalt::Device& device); + + RenderPassBuilder& add_subpass(VkPipelineBindPoint bind_point, const basalt::darray& attachments); + RenderPassBuilder& add_attachment(VkAttachmentDescription desc); + RenderPassBuilder& add_subpass_dependency(VkSubpassDependency dep); + + RenderPass build(void); + + VkRenderPassCreateInfo ci; + basalt::darray attachments; + basalt::darray> subpass_indicies; + basalt::darray subpasses; + basalt::darray dependencies; + + basalt::Device& device; + }; +} \ No newline at end of file diff --git a/src/vulkan/basalt_render_pass.cpp b/src/vulkan/basalt_render_pass.cpp new file mode 100644 index 0000000..0968539 --- /dev/null +++ b/src/vulkan/basalt_render_pass.cpp @@ -0,0 +1,69 @@ +#include "vulkan/basalt_render_pass.h" + +basalt::RenderPassBuilder::RenderPassBuilder(basalt::Device& device) : + device(device), + subpasses(MEMORY_TAG_CLASS_DYNARRAY | MEMORY_TAG_ZONE_ENGINE | MEMORY_TAG_ALIGN_ANY), + subpass_indicies(MEMORY_TAG_CLASS_DYNARRAY | MEMORY_TAG_ZONE_ENGINE | MEMORY_TAG_ALIGN_ANY), + attachments(MEMORY_TAG_CLASS_DYNARRAY | MEMORY_TAG_ZONE_ENGINE | MEMORY_TAG_ALIGN_ANY), + dependencies(MEMORY_TAG_CLASS_DYNARRAY | MEMORY_TAG_ZONE_ENGINE | MEMORY_TAG_ALIGN_ANY) +{ + ci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + ci.dependencyCount = 0; + ci.pDependencies = VK_NULL_HANDLE; + ci.attachmentCount = 0; + ci.pAttachments = VK_NULL_HANDLE; + ci.subpassCount = 0; + ci.pSubpasses = VK_NULL_HANDLE; + ci.flags = 0; + ci.pNext = VK_NULL_HANDLE; +} + +basalt::RenderPassBuilder& basalt::RenderPassBuilder::add_subpass(VkPipelineBindPoint bind_point, const basalt::darray& attachments) +{ + this->subpass_indicies.push_back(attachments); + VkSubpassDescription subpass = {}; + subpass.colorAttachmentCount = this->subpass_indicies.peek_back().m_nelements; + subpass.pColorAttachments = this->subpass_indicies.peek_back().m_pdata; + subpass.pipelineBindPoint = bind_point; + this->subpasses.push_back(subpass); + return *this; +} + +basalt::RenderPassBuilder& basalt::RenderPassBuilder::add_attachment(VkAttachmentDescription desc) +{ + this->attachments.push_back(desc); + return *this; +} + +basalt::RenderPassBuilder& basalt::RenderPassBuilder::add_subpass_dependency(VkSubpassDependency dep) +{ + this->dependencies.push_back(dep); + return *this; +} + +basalt::RenderPass basalt::RenderPassBuilder::build(void) +{ + ci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + ci.attachmentCount = this->attachments.m_nelements; + ci.pAttachments = this->attachments.m_pdata; + ci.subpassCount = this->subpasses.m_nelements; + ci.pSubpasses = this->subpasses.m_pdata; + ci.pNext = VK_NULL_HANDLE; + ci.flags = 0; + ci.dependencyCount = dependencies.m_nelements; + ci.pDependencies = dependencies.m_pdata; + + VkRenderPass pass = VK_NULL_HANDLE; + VkResult err = VK_SUCCESS; + VK_ASSERT(vkCreateRenderPass(device, &ci, device.ctx->vk_alloc, &pass), "Failed to create render pass\n\tAt %s:%d\n\tError %s\n"); + return basalt::RenderPass(device, pass); +} + +basalt::RenderPass::RenderPass(basalt::Device& device, VkRenderPass pass) : + device(device), render_pass(pass) +{} + +basalt::RenderPass::~RenderPass() +{ + vkDestroyRenderPass(device, render_pass, device.ctx->vk_alloc); +}