Добавил resize в UniformBuffer
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user