Добавил resize в UniformBuffer

This commit is contained in:
Jiga228
2026-07-11 19:06:48 +07:00
parent 506776b6d6
commit 12610f5c7f
3 changed files with 70 additions and 17 deletions
+66 -13
View File
@@ -1,10 +1,13 @@
#pragma once #pragma once
#include <algorithm>
#include <cstring>
#include <memory> #include <memory>
#include <stdexcept> #include <stdexcept>
#include <vulkan/vulkan_core.h> #include <vulkan/vulkan_core.h>
#include "GPU_GarbageCollector.h" #include "GPU_GarbageCollector.h"
#include "Delegate/Delegate.h"
#include "DeviceFunctions/DeviceFunctions.hpp" #include "DeviceFunctions/DeviceFunctions.hpp"
#include "VkObjects/Device.hpp" #include "VkObjects/Device.hpp"
#include "VkObjects/PhysicalDevice.hpp" #include "VkObjects/PhysicalDevice.hpp"
@@ -21,26 +24,47 @@ class UniformBuffer
VkBuffer buffer_ = nullptr; VkBuffer buffer_ = nullptr;
VkDeviceMemory device_memory_ = nullptr; VkDeviceMemory device_memory_ = nullptr;
void* map_ = 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: public:
struct BufferDataDelegate
{
VkBuffer buffer;
VkDeviceMemory device_memory;
VkDeviceSize size;
};
// Параметр - дескрипторы нового буфера
Delegate<const BufferDataDelegate&> OnResize;
explicit UniformBuffer( const VkObjects::Device& device, explicit UniformBuffer( const VkObjects::Device& device,
const VkObjects::PhysicalDevice& physical_device, const VkObjects::PhysicalDevice& physical_device,
const std::shared_ptr<GPU_GarbageCollector>& gc, const std::shared_ptr<GPU_GarbageCollector>& gc,
size_t count): size_t count = 1):
device_(device), physical_device_(physical_device), count_(count), gc_(gc) 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; const VkDeviceSize size = sizeof(T) * count;
buffer_ = DeviceFunctions::create_buffer( buffer_ = create_buffer(size);
device.get_native(), device_memory_ = allocate_device_memory(buffer_);
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
);
vkBindBufferMemory(device.get_native(), buffer_, device_memory_, 0); vkBindBufferMemory(device.get_native(), buffer_, device_memory_, 0);
vkMapMemory(device.get_native(), device_memory_, 0, size, 0, &map_); vkMapMemory(device.get_native(), device_memory_, 0, size, 0, &map_);
@@ -78,4 +102,33 @@ public:
return map_[index]; return map_[index];
throw std::runtime_error("Index out of range!"); 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;
}
}; };
@@ -41,7 +41,7 @@ void UwURenderEngine::create_descriptor_pool()
VK_CHECK(vkCreateDescriptorPool(device_.get_native(), &descriptor_pool_info, nullptr, &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<VkDescriptorSetLayout> layouts(swapchain_.get_images().size(), layout_binding_.get_native()); std::vector<VkDescriptorSetLayout> layouts(swapchain_.get_images().size(), layout_binding_.get_native());
VkDescriptorSetAllocateInfo descriptor_set_allocate_info{}; VkDescriptorSetAllocateInfo descriptor_set_allocate_info{};
@@ -338,7 +338,7 @@ pipeline_(device_, swapchain_, render_pass_, layout_binding_)
create_uniform_buffers(); create_uniform_buffers();
create_descriptor_pool(); create_descriptor_pool();
create_descriptor_sets(); update_descriptor_sets();
create_framebuffers(); create_framebuffers();
create_command_pool(); create_command_pool();
allocate_vertex_buffer(); allocate_vertex_buffer();
@@ -52,7 +52,7 @@ class UwURenderEngine final : public RenderEngineBase
4, 5, 1, 1, 0, 4 4, 5, 1, 1, 0, 4
}; };
const std::vector<const char*> UwURenderEngine::deviceExtensions = { const std::vector<const char*> deviceExtensions = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME VK_KHR_SWAPCHAIN_EXTENSION_NAME
}; };
@@ -90,7 +90,7 @@ class UwURenderEngine final : public RenderEngineBase
void create_uniform_buffers(); void create_uniform_buffers();
void create_descriptor_pool(); void create_descriptor_pool();
void create_descriptor_sets(); void update_descriptor_sets();
void create_framebuffers(); void create_framebuffers();
void create_command_pool(); void create_command_pool();
void allocate_command_buffers(); void allocate_command_buffers();