Вынес управление VkRenderPass в отдельный класс

This commit is contained in:
Jiga228
2026-06-24 12:10:47 +07:00
parent 93eb08fe9f
commit 2a57a30e29
9 changed files with 85 additions and 57 deletions
@@ -31,47 +31,6 @@ VkShaderModule UwURenderEngine::create_shader_module(const std::string& code) co
} }
void UwURenderEngine::create_render_pass()
{
VkAttachmentDescription attachment_description{};
attachment_description.format = swapchain_.get_image_format();
attachment_description.samples = VK_SAMPLE_COUNT_1_BIT;
attachment_description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
attachment_description.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachment_description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
attachment_description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
attachment_description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
attachment_description.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
VkAttachmentReference attachment_reference;
attachment_reference.attachment = 0;
attachment_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkSubpassDescription subpass_description{};
subpass_description.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass_description.colorAttachmentCount = 1;
subpass_description.pColorAttachments = &attachment_reference;
VkSubpassDependency dependency{};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.srcAccessMask = 0;
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
VkRenderPassCreateInfo render_pass_info{};
render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
render_pass_info.attachmentCount = 1;
render_pass_info.pAttachments = &attachment_description;
render_pass_info.subpassCount = 1;
render_pass_info.pSubpasses = &subpass_description;
render_pass_info.dependencyCount = 1;
render_pass_info.pDependencies = &dependency;
VK_CHECK(vkCreateRenderPass(device_.get_native(), &render_pass_info, nullptr, &render_pass_))
}
void UwURenderEngine::create_description_set_layout() void UwURenderEngine::create_description_set_layout()
{ {
VkDescriptorSetLayoutBinding ubo_layout_binding; VkDescriptorSetLayoutBinding ubo_layout_binding;
@@ -287,7 +246,7 @@ void UwURenderEngine::create_graphics_pipeline()
graphics_pipeline_info.pViewportState = &viewport_info; graphics_pipeline_info.pViewportState = &viewport_info;
graphics_pipeline_info.pVertexInputState = &vertex_input_info; graphics_pipeline_info.pVertexInputState = &vertex_input_info;
graphics_pipeline_info.pDepthStencilState = nullptr; graphics_pipeline_info.pDepthStencilState = nullptr;
graphics_pipeline_info.renderPass = render_pass_; graphics_pipeline_info.renderPass = render_pass_.get_native();
graphics_pipeline_info.subpass = 0; graphics_pipeline_info.subpass = 0;
graphics_pipeline_info.basePipelineHandle = nullptr; graphics_pipeline_info.basePipelineHandle = nullptr;
graphics_pipeline_info.basePipelineIndex = -1; graphics_pipeline_info.basePipelineIndex = -1;
@@ -304,7 +263,7 @@ void UwURenderEngine::create_framebuffers()
VkFramebufferCreateInfo framebuffer_info{}; VkFramebufferCreateInfo framebuffer_info{};
framebuffer_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebuffer_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebuffer_info.renderPass = render_pass_; framebuffer_info.renderPass = render_pass_.get_native();
framebuffer_info.attachmentCount = 1; framebuffer_info.attachmentCount = 1;
framebuffer_info.width = swapchain_.get_extent().width; framebuffer_info.width = swapchain_.get_extent().width;
framebuffer_info.height = swapchain_.get_extent().height; framebuffer_info.height = swapchain_.get_extent().height;
@@ -433,7 +392,7 @@ void UwURenderEngine::record_command_buffer(VkCommandBuffer command_buffer, uint
constexpr VkClearValue clear_color = {{{0.0f, 0.0f, 0.0f, 1.0f}}}; constexpr VkClearValue clear_color = {{{0.0f, 0.0f, 0.0f, 1.0f}}};
VkRenderPassBeginInfo render_pass_begin_info{}; VkRenderPassBeginInfo render_pass_begin_info{};
render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
render_pass_begin_info.renderPass = render_pass_; render_pass_begin_info.renderPass = render_pass_.get_native();
render_pass_begin_info.framebuffer = framebuffers_[image_index]; render_pass_begin_info.framebuffer = framebuffers_[image_index];
render_pass_begin_info.renderArea.offset = {0, 0}; render_pass_begin_info.renderArea.offset = {0, 0};
render_pass_begin_info.renderArea.extent = swapchain_.get_extent(); render_pass_begin_info.renderArea.extent = swapchain_.get_extent();
@@ -551,9 +510,9 @@ instance_(core),
surface_(instance_, get_window()), surface_(instance_, get_window()),
physical_device_(instance_, surface_, deviceExtensions), physical_device_(instance_, surface_, deviceExtensions),
device_(physical_device_, deviceExtensions), device_(physical_device_, deviceExtensions),
swapchain_(surface_, physical_device_, device_, get_window()) swapchain_(surface_, physical_device_, device_, get_window()),
render_pass_(device_, swapchain_)
{ {
create_render_pass();
create_description_set_layout(); create_description_set_layout();
create_uniform_buffers(); create_uniform_buffers();
create_descriptor_pool(); create_descriptor_pool();
@@ -624,9 +583,6 @@ UwURenderEngine::~UwURenderEngine()
if (ubo_layout_binding_ != VK_NULL_HANDLE) if (ubo_layout_binding_ != VK_NULL_HANDLE)
vkDestroyDescriptorSetLayout(device_.get_native(), ubo_layout_binding_, nullptr); vkDestroyDescriptorSetLayout(device_.get_native(), ubo_layout_binding_, nullptr);
if (render_pass_ != VK_NULL_HANDLE)
vkDestroyRenderPass(device_.get_native(), render_pass_, nullptr);
} }
void UwURenderEngine::start() void UwURenderEngine::start()
@@ -14,6 +14,7 @@
#include "VkObjects/Device.hpp" #include "VkObjects/Device.hpp"
#include "VkObjects/Instance.hpp" #include "VkObjects/Instance.hpp"
#include "VkObjects/PhysicalDevice.hpp" #include "VkObjects/PhysicalDevice.hpp"
#include "VkObjects/RenderPass.hpp"
#include "VkObjects/Surface.hpp" #include "VkObjects/Surface.hpp"
#include "VkObjects/Swapchain.hpp" #include "VkObjects/Swapchain.hpp"
@@ -22,7 +23,7 @@ class GPU_GarbageCollector;
#define GET_RENDER_ENGINE static_cast<UwURenderEngine*>(GetWorld()->GetGameInstance().GetCore().GetRenderEngine()) #define GET_RENDER_ENGINE static_cast<UwURenderEngine*>(GetWorld()->GetGameInstance().GetCore().GetRenderEngine())
class UwURenderEngine : public RenderEngineBase class UwURenderEngine final : public RenderEngineBase
{ {
struct UniformBufferObject { struct UniformBufferObject {
glm::mat4 model; glm::mat4 model;
@@ -67,7 +68,7 @@ class UwURenderEngine : public RenderEngineBase
VkObjects::PhysicalDevice physical_device_; VkObjects::PhysicalDevice physical_device_;
VkObjects::Device device_; VkObjects::Device device_;
VkObjects::Swapchain swapchain_; VkObjects::Swapchain swapchain_;
VkRenderPass render_pass_ = VK_NULL_HANDLE; VkObjects::RenderPass render_pass_;
VkDescriptorSetLayout ubo_layout_binding_ = VK_NULL_HANDLE; VkDescriptorSetLayout ubo_layout_binding_ = VK_NULL_HANDLE;
VkDescriptorPool descriptor_pool_ = VK_NULL_HANDLE; VkDescriptorPool descriptor_pool_ = VK_NULL_HANDLE;
std::vector<VkDescriptorSet> descriptor_sets_; std::vector<VkDescriptorSet> descriptor_sets_;
@@ -91,7 +92,6 @@ class UwURenderEngine : public RenderEngineBase
VkShaderModule create_shader_module(const std::string& code) const; VkShaderModule create_shader_module(const std::string& code) const;
void create_render_pass();
void create_description_set_layout(); void create_description_set_layout();
void create_uniform_buffers(); void create_uniform_buffers();
void create_descriptor_pool(); void create_descriptor_pool();
@@ -7,7 +7,7 @@ namespace VkObjects
{ {
class PhysicalDevice; class PhysicalDevice;
class Device class Device final
{ {
VkDevice device_ = nullptr; VkDevice device_ = nullptr;
VkQueue graphics_queue_ = nullptr; VkQueue graphics_queue_ = nullptr;
@@ -7,7 +7,7 @@ class CoreInstance;
namespace VkObjects namespace VkObjects
{ {
class Instance class Instance final
{ {
VkInstance instance_ = nullptr; VkInstance instance_ = nullptr;
@@ -9,7 +9,7 @@ namespace VkObjects
class Surface; class Surface;
class Instance; class Instance;
class PhysicalDevice class PhysicalDevice final
{ {
public: public:
struct QueueFamilyIndices struct QueueFamilyIndices
@@ -0,0 +1,52 @@
#include "RenderPass.hpp"
#include "DeviceFunctions/DeviceFunctions.hpp"
#include "Swapchain.hpp"
#include "Device.hpp"
VkObjects::RenderPass::RenderPass(const Device& device, const Swapchain& swapchain):device_(device)
{
VkAttachmentDescription attachment_description{};
attachment_description.format = swapchain.get_image_format();
attachment_description.samples = VK_SAMPLE_COUNT_1_BIT;
attachment_description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
attachment_description.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachment_description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
attachment_description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
attachment_description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
attachment_description.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
VkAttachmentReference attachment_reference;
attachment_reference.attachment = 0;
attachment_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkSubpassDescription subpass_description{};
subpass_description.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass_description.colorAttachmentCount = 1;
subpass_description.pColorAttachments = &attachment_reference;
VkSubpassDependency dependency{};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.srcAccessMask = 0;
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
VkRenderPassCreateInfo render_pass_info{};
render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
render_pass_info.attachmentCount = 1;
render_pass_info.pAttachments = &attachment_description;
render_pass_info.subpassCount = 1;
render_pass_info.pSubpasses = &subpass_description;
render_pass_info.dependencyCount = 1;
render_pass_info.pDependencies = &dependency;
VK_CHECK(vkCreateRenderPass(device_.get_native(), &render_pass_info, nullptr, &render_pass_))
}
VkObjects::RenderPass::~RenderPass()
{
if (render_pass_ != VK_NULL_HANDLE)
vkDestroyRenderPass(device_.get_native(), render_pass_, nullptr);
}
@@ -0,0 +1,20 @@
#pragma once
#include <vulkan/vulkan.h>
namespace VkObjects
{
class Swapchain;
class Device;
class RenderPass final
{
const Device& device_;
VkRenderPass render_pass_;
public:
explicit RenderPass(const Device& device, const Swapchain& swapchain);
~RenderPass();
inline VkRenderPass get_native() const { return render_pass_; }
};
}
@@ -8,7 +8,7 @@ namespace VkObjects
{ {
class Instance; class Instance;
class Surface class Surface final
{ {
VkSurfaceKHR surface_ = nullptr; VkSurfaceKHR surface_ = nullptr;
const Instance& instance_; const Instance& instance_;
@@ -11,7 +11,7 @@ namespace VkObjects
class PhysicalDevice; class PhysicalDevice;
class Surface; class Surface;
class Swapchain class Swapchain final
{ {
struct SwapchainSupportDetails struct SwapchainSupportDetails
{ {