From b8b620a7235ea35d2803edc2bc94c9d7a6728fc9 Mon Sep 17 00:00:00 2001 From: Anish Bhobe Date: Wed, 9 Apr 2025 20:33:38 +0200 Subject: [PATCH] Triangle is ready. --- aster/include/aster/systems/buffer_manager.h | 1 + aster/src/aster/systems/buffer_manager.cpp | 10 +++++ samples/01_triangle/triangle.cpp | 46 +++----------------- samples/CMakeLists.txt | 2 +- 4 files changed, 17 insertions(+), 42 deletions(-) diff --git a/aster/include/aster/systems/buffer_manager.h b/aster/include/aster/systems/buffer_manager.h index f30c444..f214a3a 100644 --- a/aster/include/aster/systems/buffer_manager.h +++ b/aster/include/aster/systems/buffer_manager.h @@ -30,5 +30,6 @@ class BufferManager final [[nodiscard]] Ref CreateStorageBuffer(usize size, cstr name = nullptr) const; [[nodiscard]] Ref CreateUniformBuffer(usize size, cstr name = nullptr) const; [[nodiscard]] Ref CreateStagingBuffer(usize size, cstr name = nullptr) const; + [[nodiscard]] Ref CreateVertexBuffer(usize size, cstr name = nullptr) const; }; } // namespace systems \ No newline at end of file diff --git a/aster/src/aster/systems/buffer_manager.cpp b/aster/src/aster/systems/buffer_manager.cpp index 8747676..c67d8a0 100644 --- a/aster/src/aster/systems/buffer_manager.cpp +++ b/aster/src/aster/systems/buffer_manager.cpp @@ -43,6 +43,16 @@ BufferManager::CreateStagingBuffer(const usize size, const cstr name) const return std::make_shared(Buffer{m_Device, size, usage, createFlags, memoryUsage, name}); } +Ref +BufferManager::CreateVertexBuffer(const usize size, const cstr name) const +{ + constexpr vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eVertexBuffer; + constexpr VmaAllocationCreateFlags createFlags = + VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT; + constexpr VmaMemoryUsage memoryUsage = VMA_MEMORY_USAGE_AUTO; + return std::make_shared(Buffer{m_Device, size, usage, createFlags, memoryUsage, name}); +} + // // void // UniformBuffer::Init(const Device *device, const usize size, const cstr name) diff --git a/samples/01_triangle/triangle.cpp b/samples/01_triangle/triangle.cpp index 3ae5999..1e5f871 100644 --- a/samples/01_triangle/triangle.cpp +++ b/samples/01_triangle/triangle.cpp @@ -15,6 +15,7 @@ #include "aster/core/window.h" #include "helpers.h" +#include "aster/systems/resource_manager.h" #include @@ -92,6 +93,7 @@ main(int, char **) vk::Queue commandQueue = device.GetQueue(queueAllocation.m_Family, 0); Swapchain swapchain = {&surface, &device, window.GetSize(), "Primary Chain"}; Pipeline pipeline = CreatePipeline(&device, &swapchain); + systems::ResourceManager resourceManager{&device}; vk::CommandPool copyPool; vk::CommandBuffer copyBuffer; @@ -117,45 +119,8 @@ main(int, char **) Vertex{.m_Position = {0.5f, -0.5f, 0.0f}, .m_Color = {0.0f, 1.0f, 0.0f}}, Vertex{.m_Position = {0.0f, 0.5f, 0.0f}, .m_Color = {0.0f, 0.0f, 1.0f}}, }; - VertexBuffer vbo; - vbo.Init(&device, vertices.size() * sizeof vertices[0], "VBO"); - { - StagingBuffer staging; - staging.Init(&device, vertices.size() * sizeof vertices[0], "Staging"); - staging.Write(0, vertices.size() * sizeof vertices[0], vertices.data()); - - vk::Fence fence; - vk::FenceCreateInfo fenceCreateInfo = {}; - auto result = device.m_Device.createFence(&fenceCreateInfo, nullptr, &fence); - ERROR_IF(Failed(result), "Fence creation failed. Cause: {}", result) THEN_ABORT(result); - - vk::CommandBufferBeginInfo beginInfo = {.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit}; - result = copyBuffer.begin(&beginInfo); - ERROR_IF(Failed(result), "Copy begin failed. Cause: {}", result) THEN_ABORT(result); - - vk::BufferCopy bufferCopy = {.srcOffset = 0, .dstOffset = 0, .size = staging.m_Size}; - copyBuffer.copyBuffer(staging.m_Buffer, vbo.m_Buffer, 1, &bufferCopy); - - result = copyBuffer.end(); - ERROR_IF(Failed(result), "Copy end failed. Cause: {}", result) THEN_ABORT(result); - - vk::SubmitInfo submitInfo = { - .commandBufferCount = 1, - .pCommandBuffers = ©Buffer, - }; - - result = commandQueue.submit(1, &submitInfo, fence); - ERROR_IF(Failed(result), "Submit failed. Cause: {}", result) THEN_ABORT(result) ELSE_INFO("Submit copy"); - - result = device.m_Device.waitForFences(1, &fence, true, MaxValue); - ERROR_IF(Failed(result), "Fence wait failed. Cause: {}", result) THEN_ABORT(result) ELSE_INFO("Fence wait"); - - result = device.m_Device.resetCommandPool(copyPool, {}); - ERROR_IF(Failed(result), "Couldn't reset command pool. Cause: {}", result) THEN_ABORT(result); - - device.m_Device.destroy(fence, nullptr); - staging.Destroy(); - } + auto vbo = resourceManager.Buffers().CreateVertexBuffer(vertices.size() * sizeof vertices[0], "VBO"); + vbo->Write(0, vertices.size() * sizeof vertices[0], vertices.data()); // Persistent variables vk::Viewport viewport = { @@ -294,7 +259,7 @@ main(int, char **) cmd.setScissor(0, 1, &scissor); cmd.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline.m_Pipeline); usize offsets = 0; - cmd.bindVertexBuffers(0, 1, &vbo.m_Buffer, &offsets); + cmd.bindVertexBuffers(0, 1, &vbo->m_Buffer, &offsets); cmd.draw(3, 1, 0, 0); cmd.endRendering(); @@ -352,7 +317,6 @@ main(int, char **) device.WaitIdle(); device.m_Device.destroy(copyPool, nullptr); - vbo.Destroy(); return 0; } diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index bd09519..a20107f 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.13) add_subdirectory("00_util") -# add_subdirectory("01_triangle") +add_subdirectory("01_triangle") add_subdirectory("02_box") add_subdirectory("03_model_render") # add_subdirectory("04_scenes")