From 2a57a30e2971ff8b691c06436efea9898bbc6f92 Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Wed, 24 Jun 2026 12:10:47 +0700 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20=D1=83=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20VkRenderPass?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RenderEngine/UwURenderEngine.cpp | 54 ++----------------- .../RenderEngine/UwURenderEngine.hpp | 6 +-- .../RenderEngine/VkObjects/Device.hpp | 2 +- .../RenderEngine/VkObjects/Instance.hpp | 2 +- .../RenderEngine/VkObjects/PhysicalDevice.hpp | 2 +- .../RenderEngine/VkObjects/RenderPass.cpp | 52 ++++++++++++++++++ .../RenderEngine/VkObjects/RenderPass.hpp | 20 +++++++ .../RenderEngine/VkObjects/Surface.hpp | 2 +- .../RenderEngine/VkObjects/Swapchain.hpp | 2 +- 9 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 UwURenderEngine/RenderEngine/VkObjects/RenderPass.cpp create mode 100644 UwURenderEngine/RenderEngine/VkObjects/RenderPass.hpp diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp index 4b1583b..bf0e98f 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp @@ -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() { VkDescriptorSetLayoutBinding ubo_layout_binding; @@ -287,7 +246,7 @@ void UwURenderEngine::create_graphics_pipeline() graphics_pipeline_info.pViewportState = &viewport_info; graphics_pipeline_info.pVertexInputState = &vertex_input_info; 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.basePipelineHandle = nullptr; graphics_pipeline_info.basePipelineIndex = -1; @@ -304,7 +263,7 @@ void UwURenderEngine::create_framebuffers() VkFramebufferCreateInfo framebuffer_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.width = swapchain_.get_extent().width; 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}}}; VkRenderPassBeginInfo 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.renderArea.offset = {0, 0}; render_pass_begin_info.renderArea.extent = swapchain_.get_extent(); @@ -551,9 +510,9 @@ instance_(core), surface_(instance_, get_window()), physical_device_(instance_, surface_, 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_uniform_buffers(); create_descriptor_pool(); @@ -624,9 +583,6 @@ UwURenderEngine::~UwURenderEngine() if (ubo_layout_binding_ != VK_NULL_HANDLE) vkDestroyDescriptorSetLayout(device_.get_native(), ubo_layout_binding_, nullptr); - - if (render_pass_ != VK_NULL_HANDLE) - vkDestroyRenderPass(device_.get_native(), render_pass_, nullptr); } void UwURenderEngine::start() diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp index ef598e8..5cb9401 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp @@ -14,6 +14,7 @@ #include "VkObjects/Device.hpp" #include "VkObjects/Instance.hpp" #include "VkObjects/PhysicalDevice.hpp" +#include "VkObjects/RenderPass.hpp" #include "VkObjects/Surface.hpp" #include "VkObjects/Swapchain.hpp" @@ -22,7 +23,7 @@ class GPU_GarbageCollector; #define GET_RENDER_ENGINE static_cast(GetWorld()->GetGameInstance().GetCore().GetRenderEngine()) -class UwURenderEngine : public RenderEngineBase +class UwURenderEngine final : public RenderEngineBase { struct UniformBufferObject { glm::mat4 model; @@ -67,7 +68,7 @@ class UwURenderEngine : public RenderEngineBase VkObjects::PhysicalDevice physical_device_; VkObjects::Device device_; VkObjects::Swapchain swapchain_; - VkRenderPass render_pass_ = VK_NULL_HANDLE; + VkObjects::RenderPass render_pass_; VkDescriptorSetLayout ubo_layout_binding_ = VK_NULL_HANDLE; VkDescriptorPool descriptor_pool_ = VK_NULL_HANDLE; std::vector descriptor_sets_; @@ -91,7 +92,6 @@ class UwURenderEngine : public RenderEngineBase VkShaderModule create_shader_module(const std::string& code) const; - void create_render_pass(); void create_description_set_layout(); void create_uniform_buffers(); void create_descriptor_pool(); diff --git a/UwURenderEngine/RenderEngine/VkObjects/Device.hpp b/UwURenderEngine/RenderEngine/VkObjects/Device.hpp index 7c2e1ea..6c85368 100644 --- a/UwURenderEngine/RenderEngine/VkObjects/Device.hpp +++ b/UwURenderEngine/RenderEngine/VkObjects/Device.hpp @@ -7,7 +7,7 @@ namespace VkObjects { class PhysicalDevice; - class Device + class Device final { VkDevice device_ = nullptr; VkQueue graphics_queue_ = nullptr; diff --git a/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp b/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp index 2172b67..0ff99cf 100644 --- a/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp +++ b/UwURenderEngine/RenderEngine/VkObjects/Instance.hpp @@ -7,7 +7,7 @@ class CoreInstance; namespace VkObjects { - class Instance + class Instance final { VkInstance instance_ = nullptr; diff --git a/UwURenderEngine/RenderEngine/VkObjects/PhysicalDevice.hpp b/UwURenderEngine/RenderEngine/VkObjects/PhysicalDevice.hpp index 5eda0e4..53e0408 100644 --- a/UwURenderEngine/RenderEngine/VkObjects/PhysicalDevice.hpp +++ b/UwURenderEngine/RenderEngine/VkObjects/PhysicalDevice.hpp @@ -9,7 +9,7 @@ namespace VkObjects class Surface; class Instance; - class PhysicalDevice + class PhysicalDevice final { public: struct QueueFamilyIndices diff --git a/UwURenderEngine/RenderEngine/VkObjects/RenderPass.cpp b/UwURenderEngine/RenderEngine/VkObjects/RenderPass.cpp new file mode 100644 index 0000000..e959005 --- /dev/null +++ b/UwURenderEngine/RenderEngine/VkObjects/RenderPass.cpp @@ -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); +} diff --git a/UwURenderEngine/RenderEngine/VkObjects/RenderPass.hpp b/UwURenderEngine/RenderEngine/VkObjects/RenderPass.hpp new file mode 100644 index 0000000..1bf051e --- /dev/null +++ b/UwURenderEngine/RenderEngine/VkObjects/RenderPass.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +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_; } + }; +} \ No newline at end of file diff --git a/UwURenderEngine/RenderEngine/VkObjects/Surface.hpp b/UwURenderEngine/RenderEngine/VkObjects/Surface.hpp index 347747f..95728c2 100644 --- a/UwURenderEngine/RenderEngine/VkObjects/Surface.hpp +++ b/UwURenderEngine/RenderEngine/VkObjects/Surface.hpp @@ -8,7 +8,7 @@ namespace VkObjects { class Instance; - class Surface + class Surface final { VkSurfaceKHR surface_ = nullptr; const Instance& instance_; diff --git a/UwURenderEngine/RenderEngine/VkObjects/Swapchain.hpp b/UwURenderEngine/RenderEngine/VkObjects/Swapchain.hpp index 7ab2dfa..29231c2 100644 --- a/UwURenderEngine/RenderEngine/VkObjects/Swapchain.hpp +++ b/UwURenderEngine/RenderEngine/VkObjects/Swapchain.hpp @@ -11,7 +11,7 @@ namespace VkObjects class PhysicalDevice; class Surface; - class Swapchain + class Swapchain final { struct SwapchainSupportDetails {