From 12610f5c7f4f412ea574f93873e8364aca53ba15 Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Sat, 11 Jul 2026 19:06:48 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20re?= =?UTF-8?q?size=20=D0=B2=20UniformBuffer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RenderEngine/UniformBuffer.hpp | 79 ++++++++++++++++--- .../RenderEngine/UwURenderEngine.cpp | 4 +- .../RenderEngine/UwURenderEngine.hpp | 4 +- 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/UwURenderEngine/RenderEngine/UniformBuffer.hpp b/UwURenderEngine/RenderEngine/UniformBuffer.hpp index a65d0a9..ff235a3 100644 --- a/UwURenderEngine/RenderEngine/UniformBuffer.hpp +++ b/UwURenderEngine/RenderEngine/UniformBuffer.hpp @@ -1,10 +1,13 @@ #pragma once +#include +#include #include #include #include #include "GPU_GarbageCollector.h" +#include "Delegate/Delegate.h" #include "DeviceFunctions/DeviceFunctions.hpp" #include "VkObjects/Device.hpp" #include "VkObjects/PhysicalDevice.hpp" @@ -21,26 +24,47 @@ class UniformBuffer VkBuffer buffer_ = nullptr; VkDeviceMemory device_memory_ = nullptr; void* map_ = nullptr; + + VkBuffer create_buffer(VkDeviceSize size) const + { + return DeviceFunctions::create_buffer( + device_.get_native(), + size, + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + physical_device_.get_unique_family_indices() + ); + } + VkDeviceMemory allocate_device_memory(VkBuffer buffer) const + { + return DeviceFunctions::allocate_device_memory( + physical_device_.get_native(), + device_.get_native(), + buffer, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT + ); + } public: + struct BufferDataDelegate + { + VkBuffer buffer; + VkDeviceMemory device_memory; + VkDeviceSize size; + }; + // Параметр - дескрипторы нового буфера + Delegate OnResize; + explicit UniformBuffer( const VkObjects::Device& device, const VkObjects::PhysicalDevice& physical_device, const std::shared_ptr& gc, - size_t count): + size_t count = 1): device_(device), physical_device_(physical_device), count_(count), gc_(gc) { + if (count == 0) + throw std::runtime_error("Count of 0 is not allowed to be 0"); + const VkDeviceSize size = sizeof(T) * count; - buffer_ = DeviceFunctions::create_buffer( - device.get_native(), - size, - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - physical_device.get_unique_family_indices() - ); - device_memory_ = DeviceFunctions::allocate_device_memory( - physical_device.get_native(), - device.get_native(), - buffer_, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT - ); + buffer_ = create_buffer(size); + device_memory_ = allocate_device_memory(buffer_); vkBindBufferMemory(device.get_native(), buffer_, device_memory_, 0); vkMapMemory(device.get_native(), device_memory_, 0, size, 0, &map_); @@ -78,4 +102,33 @@ public: return map_[index]; throw std::runtime_error("Index out of range!"); } + + void resize(size_t new_count) + { + if (new_count == count_) + return; + + if (new_count == 0) + throw std::runtime_error("Count of 0 is not allowed to be 0"); + + const VkDeviceSize new_size = sizeof(T) * new_count; + void* new_map = nullptr; + + VkBuffer new_buffer = create_buffer(new_size); + VkDeviceMemory new_memory = allocate_device_memory(new_buffer); + vkBindBufferMemory(device_.get_native(), new_buffer, new_memory, 0); + vkMapMemory(device_.get_native(), new_memory, 0, new_size, 0, &new_map); + + memcpy_s(new_map, new_size, map_, sizeof(T) * count_); + + vkUnmapMemory(device_.get_native(), device_memory_); + gc_->AddGarbage({ buffer_, device_memory_ }); + BufferDataDelegate data{ new_buffer, new_memory, new_size }; + OnResize.call(data); + + buffer_ = new_buffer; + device_memory_ = new_memory; + map_ = new_map; + count_ = new_count; + } }; diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp index bd69516..c79e650 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp @@ -41,7 +41,7 @@ void UwURenderEngine::create_descriptor_pool() VK_CHECK(vkCreateDescriptorPool(device_.get_native(), &descriptor_pool_info, nullptr, &descriptor_pool_)) } -void UwURenderEngine::create_descriptor_sets() +void UwURenderEngine::update_descriptor_sets() { std::vector layouts(swapchain_.get_images().size(), layout_binding_.get_native()); VkDescriptorSetAllocateInfo descriptor_set_allocate_info{}; @@ -338,7 +338,7 @@ pipeline_(device_, swapchain_, render_pass_, layout_binding_) create_uniform_buffers(); create_descriptor_pool(); - create_descriptor_sets(); + update_descriptor_sets(); create_framebuffers(); create_command_pool(); allocate_vertex_buffer(); diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp index a3670d3..778df82 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.hpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.hpp @@ -52,7 +52,7 @@ class UwURenderEngine final : public RenderEngineBase 4, 5, 1, 1, 0, 4 }; - const std::vector UwURenderEngine::deviceExtensions = { + const std::vector deviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; @@ -90,7 +90,7 @@ class UwURenderEngine final : public RenderEngineBase void create_uniform_buffers(); void create_descriptor_pool(); - void create_descriptor_sets(); + void update_descriptor_sets(); void create_framebuffers(); void create_command_pool(); void allocate_command_buffers();