From 18b01050eba5d164385ce8a79724be42c48c8a61 Mon Sep 17 00:00:00 2001 From: PancakeTAS Date: Sun, 30 Nov 2025 12:53:40 +0100 Subject: [PATCH] refactor(cleanup): expand vulkan abstraction --- .../include/lsfg-vk-common/vulkan/buffer.hpp | 10 +++++++--- .../include/lsfg-vk-common/vulkan/descriptor_set.hpp | 4 ++++ lsfg-vk-common/include/lsfg-vk-common/vulkan/fence.hpp | 4 ++++ lsfg-vk-common/include/lsfg-vk-common/vulkan/image.hpp | 6 ++++++ .../include/lsfg-vk-common/vulkan/shader.hpp | 9 ++++++++- .../include/lsfg-vk-common/vulkan/vulkan.hpp | 6 ++++++ lsfg-vk-common/src/vulkan/buffer.cpp | 9 +++++---- lsfg-vk-common/src/vulkan/descriptor_set.cpp | 1 + lsfg-vk-common/src/vulkan/image.cpp | 5 +++-- lsfg-vk-common/src/vulkan/shader.cpp | 2 +- 10 files changed, 45 insertions(+), 11 deletions(-) diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/buffer.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/buffer.hpp index 69f13dc..9005b0d 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/buffer.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/buffer.hpp @@ -14,17 +14,21 @@ namespace vk { /// create a buffer /// @param vk the vulkan instance /// @param data initial data uploaded to the buffer + /// @param usage usage flags for the buffer /// @throws ls::vulkan_error on failure template - Buffer(const vk::Vulkan& vk, const T& data) - : Buffer(vk, reinterpret_cast(&data), sizeof(T)) {} + Buffer(const vk::Vulkan& vk, const T& data, + VkBufferUsageFlags usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) + : Buffer(vk, reinterpret_cast(&data), sizeof(T), usage) {} /// create a buffer /// @param vk the vulkan instance /// @param data initial data uploaded to the buffer /// @param size size of the buffer in bytes + /// @param usage usage flags for the buffer /// @throws ls::vulkan_error on failure - Buffer(const vk::Vulkan& vk, const void* data, size_t size); + Buffer(const vk::Vulkan& vk, const void* data, size_t size, + VkBufferUsageFlags usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT); /// get the buffer handle /// @return the buffer handle diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp index 170b650..a2654b6 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/descriptor_set.hpp @@ -29,6 +29,10 @@ namespace vk { const std::vector>& storageImages, const std::vector>& samplers, const std::vector>& buffers); + + /// get the underlying descriptor set handle + /// @return the handle + [[nodiscard]] const auto& handle() const { return *this->descriptorSet; } private: ls::owned_ptr descriptorSet; }; diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/fence.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/fence.hpp index e2d8819..0a5a956 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/fence.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/fence.hpp @@ -27,6 +27,10 @@ namespace vk { /// @returns true if the fence signaled, false if it timed out /// @throws ls::vulkan_error on failure [[nodiscard]] bool wait(const vk::Vulkan& vk, uint64_t timeout = UINT64_MAX) const; + + /// get the fence handle + /// @return the fence handle + [[nodiscard]] VkFence handle() const { return *this->fence; } private: ls::owned_ptr fence; }; diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/image.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/image.hpp index b67b6e9..bda907a 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/image.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/image.hpp @@ -32,9 +32,15 @@ namespace vk { /// get the image view handle /// @return the image view handle [[nodiscard]] const auto& imageview() const { return this->view.get(); } + + /// get the extent of the image + /// @return the extent of the image + [[nodiscard]] VkExtent2D getExtent() const { return this->extent; } private: ls::owned_ptr image; ls::owned_ptr memory; ls::owned_ptr view; + + VkExtent2D extent{}; }; } diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/shader.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/shader.hpp index d0ffcd0..844b931 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/shader.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/shader.hpp @@ -27,11 +27,18 @@ namespace vk { /// get the descriptor set layout /// @returns the descriptor set layout [[nodiscard]] const auto& descriptorlayout() const { return *this->descriptorLayout; } + + /// get the pipeline layout + /// @returns the pipeline layout + [[nodiscard]] const auto& pipelinelayout() const { return *this->pipelineLayout; } + /// get the pipeline + /// @returns the pipeline + [[nodiscard]] const auto& pipeline() const { return *this->pipeline_; } private: ls::owned_ptr shaderModule; ls::owned_ptr descriptorLayout; ls::owned_ptr pipelineLayout; - ls::owned_ptr pipeline; + ls::owned_ptr pipeline_; }; } diff --git a/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp b/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp index 7be3f88..6ead6ec 100644 --- a/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp +++ b/lsfg-vk-common/include/lsfg-vk-common/vulkan/vulkan.hpp @@ -54,6 +54,9 @@ namespace vk { [[nodiscard]] std::optional findMemoryTypeIndex( std::bitset<32> validTypes, bool hostVisibility) const; + /// get the vulkan instance + /// @return the instance handle + [[nodiscard]] const auto& inst() const { return this->instance.get(); } /// get the vulkan device /// @return the device handle [[nodiscard]] const auto& dev() const { return this->device.get(); } @@ -63,6 +66,9 @@ namespace vk { /// get the descriptor pool /// @return the descriptor pool handle [[nodiscard]] const auto& descpool() const { return this->descPool.get(); } + /// get the compute queue + /// @return the compute queue handle + [[nodiscard]] const auto& queue() const { return this->computeQueue; } /// check if fp16 is supported /// @return true if fp16 is supported diff --git a/lsfg-vk-common/src/vulkan/buffer.cpp b/lsfg-vk-common/src/vulkan/buffer.cpp index b6d100a..e2c1a05 100644 --- a/lsfg-vk-common/src/vulkan/buffer.cpp +++ b/lsfg-vk-common/src/vulkan/buffer.cpp @@ -15,13 +15,14 @@ using namespace vk; namespace { /// create a buffer - ls::owned_ptr createBuffer(const vk::Vulkan& vk, size_t size) { + ls::owned_ptr createBuffer(const vk::Vulkan& vk, size_t size, + VkBufferUsageFlags usage) { VkBuffer handle{}; const VkBufferCreateInfo bufferInfo{ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .size = size, - .usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + .usage = usage, .sharingMode = VK_SHARING_MODE_EXCLUSIVE }; auto res = vkCreateBuffer(vk.dev(), &bufferInfo, nullptr, &handle); @@ -88,8 +89,8 @@ namespace { } } -Buffer::Buffer(const vk::Vulkan& vk, const void* data, size_t size) : - buffer(createBuffer(vk, size)), +Buffer::Buffer(const vk::Vulkan& vk, const void* data, size_t size, VkBufferUsageFlags usage) : + buffer(createBuffer(vk, size, usage)), memory(allocateMemory(vk, *this->buffer)), size(size) { copyDataToBuffer(vk, *this->memory, data, size); diff --git a/lsfg-vk-common/src/vulkan/descriptor_set.cpp b/lsfg-vk-common/src/vulkan/descriptor_set.cpp index d1555d2..5988267 100644 --- a/lsfg-vk-common/src/vulkan/descriptor_set.cpp +++ b/lsfg-vk-common/src/vulkan/descriptor_set.cpp @@ -10,6 +10,7 @@ #include #include #include + #include using namespace vk; diff --git a/lsfg-vk-common/src/vulkan/image.cpp b/lsfg-vk-common/src/vulkan/image.cpp index b69ff35..f04acbe 100644 --- a/lsfg-vk-common/src/vulkan/image.cpp +++ b/lsfg-vk-common/src/vulkan/image.cpp @@ -58,7 +58,7 @@ namespace { auto mti = vk.findMemoryTypeIndex( reqs.memoryTypeBits, - true + false ); if (!mti.has_value()) throw ls::vulkan_error("no suitable memory type found for image"); @@ -168,5 +168,6 @@ Image::Image(const vk::Vulkan& vk, view(createImageView(vk, *this->image, format - )) { + )), + extent(extent) { } diff --git a/lsfg-vk-common/src/vulkan/shader.cpp b/lsfg-vk-common/src/vulkan/shader.cpp index 8aeedf8..e30444e 100644 --- a/lsfg-vk-common/src/vulkan/shader.cpp +++ b/lsfg-vk-common/src/vulkan/shader.cpp @@ -158,7 +158,7 @@ Shader::Shader(const vk::Vulkan& vk, const std::vector& code, pipelineLayout(createPipelineLayout(vk, *this->descriptorLayout )), - pipeline(createComputePipeline(vk, + pipeline_(createComputePipeline(vk, *this->shaderModule, *this->pipelineLayout )) {