mirror of
https://github.com/Kbz-8/42_vox.git
synced 2026-01-13 15:43:34 +00:00
improving allocator
This commit is contained in:
@@ -26,7 +26,7 @@ namespace Scop
|
||||
[[nodiscard]] inline VkBuffer operator()() const noexcept { return m_buffer; }
|
||||
[[nodiscard]] inline VkBuffer Get() const noexcept { return m_buffer; }
|
||||
[[nodiscard]] inline VkDeviceMemory GetMemory() const noexcept { return m_memory.memory; }
|
||||
[[nodiscard]] inline VkDeviceSize GetSize() const noexcept { return m_memory.size; }
|
||||
[[nodiscard]] inline VkDeviceSize GetSize() const noexcept { return m_size; }
|
||||
[[nodiscard]] inline VkDeviceSize GetOffset() const noexcept { return 0; }
|
||||
|
||||
[[nodiscard]] inline static std::size_t GetBufferCount() noexcept { return s_buffer_count; }
|
||||
@@ -41,6 +41,7 @@ namespace Scop
|
||||
protected:
|
||||
VkBuffer m_buffer = VK_NULL_HANDLE;
|
||||
MemoryBlock m_memory = NULL_MEMORY_BLOCK;
|
||||
VkDeviceSize m_size = 0;
|
||||
|
||||
private:
|
||||
void CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, std::string_view name, bool dedicated_alloc);
|
||||
@@ -78,7 +79,7 @@ namespace Scop
|
||||
{
|
||||
m_vertex_offset = 0;
|
||||
m_index_offset = vertex_size;
|
||||
GPUBuffer::Init(BufferType::LowDynamic, vertex_size + index_size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | additional_flags, std::move(data), std::move(name), true);
|
||||
GPUBuffer::Init(BufferType::LowDynamic, vertex_size + index_size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | additional_flags, std::move(data), std::move(name), false);
|
||||
}
|
||||
void SetVertexData(CPUBuffer data);
|
||||
void SetIndexData(CPUBuffer data);
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace Scop
|
||||
#endif
|
||||
}
|
||||
|
||||
void Init(ImageType type, std::uint32_t width, std::uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, bool is_multisampled = false, std::string_view name = {});
|
||||
void Init(ImageType type, std::uint32_t width, std::uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, bool is_multisampled = false, std::string_view name = {}, bool dedicated_alloc = false);
|
||||
void CreateImageView(VkImageViewType type, VkImageAspectFlags aspectFlags, int layer_count = 1) noexcept;
|
||||
void CreateSampler() noexcept;
|
||||
void TransitionLayout(VkImageLayout new_layout, VkCommandBuffer cmd = VK_NULL_HANDLE);
|
||||
@@ -98,13 +98,13 @@ namespace Scop
|
||||
{
|
||||
public:
|
||||
Texture() = default;
|
||||
Texture(CPUBuffer pixels, std::uint32_t width, std::uint32_t height, VkFormat format = VK_FORMAT_R8G8B8A8_SRGB, bool is_multisampled = false, std::string_view name = {})
|
||||
Texture(CPUBuffer pixels, std::uint32_t width, std::uint32_t height, VkFormat format = VK_FORMAT_R8G8B8A8_SRGB, bool is_multisampled = false, std::string_view name = {}, bool dedicated_alloc = false)
|
||||
{
|
||||
Init(std::move(pixels), width, height, format, is_multisampled, std::move(name));
|
||||
Init(std::move(pixels), width, height, format, is_multisampled, std::move(name), dedicated_alloc);
|
||||
}
|
||||
inline void Init(CPUBuffer pixels, std::uint32_t width, std::uint32_t height, VkFormat format = VK_FORMAT_R8G8B8A8_SRGB, bool is_multisampled = false, std::string_view name = {})
|
||||
inline void Init(CPUBuffer pixels, std::uint32_t width, std::uint32_t height, VkFormat format = VK_FORMAT_R8G8B8A8_SRGB, bool is_multisampled = false, std::string_view name = {}, bool dedicated_alloc = false)
|
||||
{
|
||||
Image::Init(ImageType::Color, width, height, format, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, is_multisampled, std::move(name));
|
||||
Image::Init(ImageType::Color, width, height, format, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, is_multisampled, std::move(name), dedicated_alloc);
|
||||
Image::CreateImageView(VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
Image::CreateSampler();
|
||||
if(pixels)
|
||||
|
||||
@@ -11,12 +11,15 @@
|
||||
|
||||
namespace Scop
|
||||
{
|
||||
constexpr std::size_t SMALL_HEAP_MAX_SIZE = (1024ULL * 1024 * 1024);
|
||||
constexpr std::size_t DEFAULT_LARGE_HEAP_BLOCK_SIZE = (256ULL * 1024 * 1024);
|
||||
|
||||
class DeviceAllocator
|
||||
{
|
||||
public:
|
||||
DeviceAllocator() = default;
|
||||
|
||||
inline void AttachToDevice(VkDevice device, VkPhysicalDevice physical) noexcept { m_device = device; m_physical = physical; }
|
||||
void AttachToDevice(VkDevice device, VkPhysicalDevice physical) noexcept;
|
||||
inline void DetachFromDevice() noexcept { m_chunks.clear(); m_device = VK_NULL_HANDLE; m_physical = VK_NULL_HANDLE; }
|
||||
[[nodiscard]] inline std::size_t GetAllocationsCount() const noexcept { return m_allocations_count; }
|
||||
|
||||
@@ -25,8 +28,12 @@ namespace Scop
|
||||
|
||||
~DeviceAllocator() = default;
|
||||
|
||||
private:
|
||||
VkDeviceSize CalcPreferredChunkSize(std::uint32_t mem_type_index);
|
||||
|
||||
private:
|
||||
std::vector<std::unique_ptr<MemoryChunk>> m_chunks;
|
||||
VkPhysicalDeviceMemoryProperties m_mem_props;
|
||||
VkDevice m_device = VK_NULL_HANDLE;
|
||||
VkPhysicalDevice m_physical = VK_NULL_HANDLE;
|
||||
std::size_t m_allocations_count = 0;
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
namespace Scop
|
||||
{
|
||||
constexpr std::uint32_t SEMAPHORE_COUNT = 4;
|
||||
|
||||
class Renderer
|
||||
{
|
||||
public:
|
||||
@@ -41,12 +43,13 @@ namespace Scop
|
||||
|
||||
private:
|
||||
Swapchain m_swapchain;
|
||||
std::array<VkSemaphore, MAX_FRAMES_IN_FLIGHT> m_image_available_semaphores;
|
||||
std::array<VkSemaphore, MAX_FRAMES_IN_FLIGHT> m_render_finished_semaphores;
|
||||
std::array<VkSemaphore, SEMAPHORE_COUNT> m_image_available_semaphores;
|
||||
std::array<VkSemaphore, SEMAPHORE_COUNT> m_render_finished_semaphores;
|
||||
std::array<VkCommandBuffer, MAX_FRAMES_IN_FLIGHT> m_cmd_buffers;
|
||||
std::array<VkFence, MAX_FRAMES_IN_FLIGHT> m_cmd_fences;
|
||||
NonOwningPtr<Window> p_window;
|
||||
std::uint32_t m_current_frame_index = 0;
|
||||
std::uint32_t m_current_semaphore_index = 0;
|
||||
std::size_t m_polygons_drawn = 0;
|
||||
std::size_t m_drawcalls = 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user