Created render_pass object

Some TODO's to handle regarding exposing access to vulkan functionallity
This commit is contained in:
2025-07-07 22:54:59 +10:00
parent 0598a89d0c
commit 4d797e1170
2 changed files with 107 additions and 0 deletions

View File

@@ -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<VkAttachmentReference>& attachments);
RenderPassBuilder& add_attachment(VkAttachmentDescription desc);
RenderPassBuilder& add_subpass_dependency(VkSubpassDependency dep);
RenderPass build(void);
VkRenderPassCreateInfo ci;
basalt::darray<VkAttachmentDescription> attachments;
basalt::darray<basalt::darray<VkAttachmentReference>> subpass_indicies;
basalt::darray<VkSubpassDescription> subpasses;
basalt::darray<VkSubpassDependency> dependencies;
basalt::Device& device;
};
}

View File

@@ -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<VkAttachmentReference>& 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);
}