Сделал минимальный GC для видеопамяти

This commit is contained in:
Jiga228
2026-05-23 23:23:43 +07:00
parent 9db3d9b0e2
commit 582b23d0f8
4 changed files with 64 additions and 7 deletions
@@ -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();
}
@@ -0,0 +1,27 @@
#pragma once
#include <list>
#include <mutex>
#include <vulkan/vulkan.h>
class GPU_GarbageCollector
{
public:
struct Garbage
{
VkBuffer buffer;
VkDeviceMemory device_memory;
};
private:
VkDevice device_ = VK_NULL_HANDLE;
std::list<Garbage> heap_;
std::mutex m_heap_;
public:
GPU_GarbageCollector() = default;
explicit GPU_GarbageCollector(VkDevice device);
void AddGarbage(Garbage garbage);
void FreeHeap();
};
@@ -6,6 +6,7 @@
#include <fstream> #include <fstream>
#include <chrono> #include <chrono>
#include "GPU_GarbageCollector.h"
#include "Core/CoreInstance.hpp" #include "Core/CoreInstance.hpp"
#include "Log/Log.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); vkWaitForFences(device_, 1, &in_flight_fences_[current_frame_], VK_TRUE, UINT64_MAX);
vkResetFences(device_, 1, &in_flight_fences_[current_frame_]); vkResetFences(device_, 1, &in_flight_fences_[current_frame_]);
garbage_collector_->FreeHeap();
uint32_t image_index; uint32_t image_index;
vkAcquireNextImageKHR(device_, swapchain_, UINT64_MAX, image_available_semaphores_[current_frame_], VK_NULL_HANDLE, &image_index); vkAcquireNextImageKHR(device_, swapchain_, UINT64_MAX, image_available_semaphores_[current_frame_], VK_NULL_HANDLE, &image_index);
vkResetCommandBuffer(command_buffers_[current_frame_], 0); vkResetCommandBuffer(command_buffers_[current_frame_], 0);
record_command_buffer(command_buffers_[current_frame_], image_index);
update_uniform_buffer(current_frame_); update_uniform_buffer(current_frame_);
record_command_buffer(command_buffers_[current_frame_], image_index);
VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
VkSubmitInfo submit_info{}; VkSubmitInfo submit_info{};
@@ -937,6 +940,7 @@ core_(core)
allocate_index_buffer(); allocate_index_buffer();
create_sync_objects(); create_sync_objects();
garbage_collector_.reset(new GPU_GarbageCollector(device_));
model_manager_.reset(new ModelManager(physical_device_, device_)); model_manager_.reset(new ModelManager(physical_device_, device_));
} }
@@ -945,7 +949,7 @@ UwURenderEngine::~UwURenderEngine()
vkDeviceWaitIdle(device_); vkDeviceWaitIdle(device_);
if (index_buffer_memory_ != VK_NULL_HANDLE) 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) if (index_buffer_ != VK_NULL_HANDLE)
vkDestroyBuffer(device_, index_buffer_, nullptr); vkDestroyBuffer(device_, index_buffer_, nullptr);
@@ -12,6 +12,8 @@
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/matrix_transform.hpp>
class GPU_GarbageCollector;
class UwURenderEngine : public RenderEngineBase class UwURenderEngine : public RenderEngineBase
{ {
struct QueueFamilyIndices struct QueueFamilyIndices
@@ -52,11 +54,13 @@ class UwURenderEngine : public RenderEngineBase
}; };
static const std::vector<const char*> deviceExtensions; static const std::vector<const char*> deviceExtensions;
int current_frame_ = 0; int current_frame_ = 0;
CoreInstance& core_; CoreInstance& core_;
std::unique_ptr<ModelManager> model_manager_; std::shared_ptr<ModelManager> model_manager_;
std::shared_ptr<GPU_GarbageCollector> garbage_collector_;
VkInstance instance_ = VK_NULL_HANDLE; VkInstance instance_ = VK_NULL_HANDLE;
VkSurfaceKHR surface_ = VK_NULL_HANDLE; VkSurfaceKHR surface_ = VK_NULL_HANDLE;
@@ -130,11 +134,11 @@ class UwURenderEngine : public RenderEngineBase
void draw_frame(); void draw_frame();
public: public:
// Can throw the exception // Can throw the exception
UwURenderEngine(CoreInstance& core); explicit UwURenderEngine(CoreInstance& core);
~UwURenderEngine() override; ~UwURenderEngine() override;
void start() override; void start() override;
void stop_render() const override; void stop_render() const override;
ModelManager* GetModelManager() const { return model_manager_.get(); } std::shared_ptr<ModelManager> GetModelManager() const { return model_manager_; }
}; };