From 582b23d0f8c1e5888623f5aac72f3c48bd59fe79 Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Sat, 23 May 2026 23:23:43 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?GC=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B8=D0=B4=D0=B5=D0=BE=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D1=8F=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RenderEngine/GPU_GarbageCollector.cpp | 22 +++++++++++++++ .../RenderEngine/GPU_GarbageCollector.h | 27 +++++++++++++++++++ .../RenderEngine/UwURenderEngine.cpp | 10 ++++--- .../RenderEngine/UwURenderEngine.hpp | 12 ++++++--- 4 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 UwURenderEngine/RenderEngine/GPU_GarbageCollector.cpp create mode 100644 UwURenderEngine/RenderEngine/GPU_GarbageCollector.h diff --git a/UwURenderEngine/RenderEngine/GPU_GarbageCollector.cpp b/UwURenderEngine/RenderEngine/GPU_GarbageCollector.cpp new file mode 100644 index 0000000..df1fc39 --- /dev/null +++ b/UwURenderEngine/RenderEngine/GPU_GarbageCollector.cpp @@ -0,0 +1,22 @@ +#include "GPU_GarbageCollector.h" + + +GPU_GarbageCollector::GPU_GarbageCollector(VkDevice device) : device_(device) +{} + +void GPU_GarbageCollector::AddGarbage(Garbage garbage) +{ + std::scoped_lock lock(m_heap_); + heap_.push_back(garbage); +} + +void GPU_GarbageCollector::FreeHeap() +{ + std::scoped_lock lock(m_heap_); + for (auto& i : heap_) + { + vkFreeMemory(device_, i.device_memory, nullptr); + vkDestroyBuffer(device_, i.buffer, nullptr); + } + heap_.clear(); +} diff --git a/UwURenderEngine/RenderEngine/GPU_GarbageCollector.h b/UwURenderEngine/RenderEngine/GPU_GarbageCollector.h new file mode 100644 index 0000000..48bd786 --- /dev/null +++ b/UwURenderEngine/RenderEngine/GPU_GarbageCollector.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include + +class GPU_GarbageCollector +{ +public: + struct Garbage + { + VkBuffer buffer; + VkDeviceMemory device_memory; + }; +private: + VkDevice device_ = VK_NULL_HANDLE; + + std::list heap_; + std::mutex m_heap_; +public: + GPU_GarbageCollector() = default; + + explicit GPU_GarbageCollector(VkDevice device); + + void AddGarbage(Garbage garbage); + void FreeHeap(); +}; diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp index abe3c0a..a294ced 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp @@ -6,6 +6,7 @@ #include #include +#include "GPU_GarbageCollector.h" #include "Core/CoreInstance.hpp" #include "Log/Log.hpp" @@ -872,13 +873,15 @@ void UwURenderEngine::draw_frame() vkWaitForFences(device_, 1, &in_flight_fences_[current_frame_], VK_TRUE, UINT64_MAX); vkResetFences(device_, 1, &in_flight_fences_[current_frame_]); + garbage_collector_->FreeHeap(); + uint32_t image_index; vkAcquireNextImageKHR(device_, swapchain_, UINT64_MAX, image_available_semaphores_[current_frame_], VK_NULL_HANDLE, &image_index); vkResetCommandBuffer(command_buffers_[current_frame_], 0); - record_command_buffer(command_buffers_[current_frame_], image_index); - + update_uniform_buffer(current_frame_); + record_command_buffer(command_buffers_[current_frame_], image_index); VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkSubmitInfo submit_info{}; @@ -937,6 +940,7 @@ core_(core) allocate_index_buffer(); create_sync_objects(); + garbage_collector_.reset(new GPU_GarbageCollector(device_)); model_manager_.reset(new ModelManager(physical_device_, device_)); } @@ -945,7 +949,7 @@ UwURenderEngine::~UwURenderEngine() vkDeviceWaitIdle(device_); if (index_buffer_memory_ != VK_NULL_HANDLE) - vkFreeMemory(device_, index_buffer_memory_, nullptr); + vkFreeMemory(device_, index_buffer_memory_, nullptr); if (index_buffer_ != VK_NULL_HANDLE) vkDestroyBuffer(device_, index_buffer_, nullptr); diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp index 8f108ad..56fc015 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp @@ -12,6 +12,8 @@ #include #include +class GPU_GarbageCollector; + class UwURenderEngine : public RenderEngineBase { struct QueueFamilyIndices @@ -52,11 +54,13 @@ class UwURenderEngine : public RenderEngineBase }; static const std::vector deviceExtensions; - + int current_frame_ = 0; + CoreInstance& core_; - std::unique_ptr model_manager_; + std::shared_ptr model_manager_; + std::shared_ptr garbage_collector_; VkInstance instance_ = VK_NULL_HANDLE; VkSurfaceKHR surface_ = VK_NULL_HANDLE; @@ -130,11 +134,11 @@ class UwURenderEngine : public RenderEngineBase void draw_frame(); public: // Can throw the exception - UwURenderEngine(CoreInstance& core); + explicit UwURenderEngine(CoreInstance& core); ~UwURenderEngine() override; void start() override; void stop_render() const override; - ModelManager* GetModelManager() const { return model_manager_.get(); } + std::shared_ptr GetModelManager() const { return model_manager_; } };