Created render_pass object
Some TODO's to handle regarding exposing access to vulkan functionallity
This commit is contained in:
38
include/vulkan/basalt_render_pass.h
Normal file
38
include/vulkan/basalt_render_pass.h
Normal 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;
|
||||||
|
};
|
||||||
|
}
|
||||||
69
src/vulkan/basalt_render_pass.cpp
Normal file
69
src/vulkan/basalt_render_pass.cpp
Normal 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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user