From 1386fe64cb982ccdca8d6ef953945824cbc83d09 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Sat, 16 Dec 2023 02:11:54 +0100 Subject: [PATCH] updating readme --- README.md | 13 ++++-- src/renderer/buffers/vk_buffer.cpp | 20 ++++----- src/renderer/command/vk_cmd_buffer.cpp | 12 ++---- src/renderer/images/vk_image.cpp | 54 +++++++++++-------------- src/renderer/images/vk_image.h | 6 +-- src/renderer/swapchain/vk_swapchain.cpp | 5 +-- 6 files changed, 44 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 55b495f..edb7306 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ ###### MacroLibX, a rewrite of 42 School's MiniLibX using SDL2 and Vulkan. The goal of this version is to provide a light, fast, and modern graphical tool while keeping the same API. -## 💫 Features +## 🌟 Features -### 🏁 Performances +### 🚀 Performances Built on top of Vulkan, the MacroLibX takes advantage of its very low-level nature to achieve high performance with great control over available resources. ### 💻 Cross-Platform @@ -27,6 +27,12 @@ One of the guidelines of this lib was to get as close as possible to the old min ### 📖 It's all FOSS Everything in this repo is entirely free and open source, all available under the MIT license (even the third-party libraries used). +### 🔍 Valgrind suppressions file +Experimental for now, a [suppressions file for valgrind](./valgrind.supp) is given to remove potential leaks comming from Xorg, Nvidia drivers, SDL2, or any other tool which the user has no control. It is far from perfect at the moment and may allow some leaks but it will block the majority. + +### ⛔ Error system +Strong error handling informing the user of problems with their code and even capable of informing them of graphics memory leaks that tools like Valgrind cannot detect. + ## 🖥️ Installation ### Dependencies @@ -101,5 +107,4 @@ You can force the mlx to use your integrated GPU by using `make FORCE_INTEGRATED The mlx can dump it's graphics memory use to json files every two seconds by enabling this option `make GRAPHICS_MEMORY_DUMP=true`. ## License - -This project and all its files, except the [`third_party`](./third_party) directory or unless otherwise mentionned, are licenced under the [MIT license](./LICENSE). +This project and all its files, even the [`third_party`](./third_party) directory or unless otherwise mentionned, are licenced under the [MIT license](./LICENSE). diff --git a/src/renderer/buffers/vk_buffer.cpp b/src/renderer/buffers/vk_buffer.cpp index a98bb74..56ad61a 100644 --- a/src/renderer/buffers/vk_buffer.cpp +++ b/src/renderer/buffers/vk_buffer.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/08 18:55:57 by maldavid #+# #+# */ -/* Updated: 2023/12/12 22:11:47 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/15 21:48:02 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -97,22 +97,16 @@ namespace mlx } // TODO, use global cmd buffer pool to manage resources - CmdPool cmdpool; - cmdpool.init(); - CmdBuffer cmdBuffer; - cmdBuffer.init(&cmdpool); - - cmdBuffer.beginRecord(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + CmdBuffer& cmd = Render_Core::get().getSingleTimeCmdBuffer(); + cmd.reset(); + cmd.beginRecord(); VkBufferCopy copyRegion{}; copyRegion.size = _size; - vkCmdCopyBuffer(cmdBuffer.get(), buffer._buffer, _buffer, 1, ©Region); + vkCmdCopyBuffer(cmd.get(), buffer._buffer, _buffer, 1, ©Region); - cmdBuffer.endRecord(); - cmdBuffer.submitIdle(); - - cmdBuffer.destroy(); - cmdpool.destroy(); + cmd.endRecord(); + cmd.submitIdle(); return true; } diff --git a/src/renderer/command/vk_cmd_buffer.cpp b/src/renderer/command/vk_cmd_buffer.cpp index 143b9b2..9897070 100644 --- a/src/renderer/command/vk_cmd_buffer.cpp +++ b/src/renderer/command/vk_cmd_buffer.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:26:06 by maldavid #+# #+# */ -/* Updated: 2023/11/08 20:17:49 by maldavid ### ########.fr */ +/* Updated: 2023/12/15 21:54:11 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -67,8 +67,6 @@ namespace mlx void CmdBuffer::submitIdle() noexcept { - auto device = Render_Core::get().getDevice().get(); - VkSubmitInfo submitInfo = {}; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.commandBufferCount = 1; @@ -77,12 +75,8 @@ namespace mlx VkFenceCreateInfo fenceCreateInfo = {}; fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - VkFence fence; - vkCreateFence(device, &fenceCreateInfo, nullptr, &fence); - vkResetFences(device, 1, &fence); - vkQueueSubmit(Render_Core::get().getQueue().getGraphic(), 1, &submitInfo, fence); - vkWaitForFences(device, 1, &fence, VK_TRUE, UINT64_MAX); - vkDestroyFence(device, fence, nullptr); + vkQueueSubmit(Render_Core::get().getQueue().getGraphic(), 1, &submitInfo, _fence.get()); + waitForExecution(); } void CmdBuffer::submit(Semaphore& semaphores) noexcept diff --git a/src/renderer/images/vk_image.cpp b/src/renderer/images/vk_image.cpp index ddd6315..6c908d7 100644 --- a/src/renderer/images/vk_image.cpp +++ b/src/renderer/images/vk_image.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/25 11:59:07 by maldavid #+# #+# */ -/* Updated: 2023/11/18 17:21:14 by maldavid ### ########.fr */ +/* Updated: 2023/12/15 21:46:33 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -167,8 +167,6 @@ namespace mlx } _allocation = Render_Core::get().getAllocator().createImage(&imageInfo, &alloc_info, _image, name); - - _pool.init(); } void Image::createImageView(VkImageViewType type, VkImageAspectFlags aspectFlags) noexcept @@ -209,11 +207,9 @@ namespace mlx void Image::copyFromBuffer(Buffer& buffer) { - if(!_transfer_cmd.isInit()) - _transfer_cmd.init(&_pool); - - _transfer_cmd.reset(); - _transfer_cmd.beginRecord(); + CmdBuffer& cmd = Render_Core::get().getSingleTimeCmdBuffer(); + cmd.reset(); + cmd.beginRecord(); VkImageMemoryBarrier copy_barrier{}; copy_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -226,7 +222,7 @@ namespace mlx copy_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copy_barrier.subresourceRange.levelCount = 1; copy_barrier.subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(_transfer_cmd.get(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, ©_barrier); + vkCmdPipelineBarrier(cmd.get(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, ©_barrier); VkBufferImageCopy region{}; region.bufferOffset = 0; @@ -239,7 +235,7 @@ namespace mlx region.imageOffset = { 0, 0, 0 }; region.imageExtent = { _width, _height, 1 }; - vkCmdCopyBufferToImage(_transfer_cmd.get(), buffer.get(), _image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + vkCmdCopyBufferToImage(cmd.get(), buffer.get(), _image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); VkImageMemoryBarrier use_barrier{}; use_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -253,19 +249,17 @@ namespace mlx use_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; use_barrier.subresourceRange.levelCount = 1; use_barrier.subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(_transfer_cmd.get(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &use_barrier); + vkCmdPipelineBarrier(cmd.get(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &use_barrier); - _transfer_cmd.endRecord(); - _transfer_cmd.submitIdle(); + cmd.endRecord(); + cmd.submitIdle(); } void Image::copyToBuffer(Buffer& buffer) { - if(!_transfer_cmd.isInit()) - _transfer_cmd.init(&_pool); - - _transfer_cmd.reset(); - _transfer_cmd.beginRecord(); + CmdBuffer& cmd = Render_Core::get().getSingleTimeCmdBuffer(); + cmd.reset(); + cmd.beginRecord(); VkImageMemoryBarrier copy_barrier{}; copy_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -278,7 +272,7 @@ namespace mlx copy_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copy_barrier.subresourceRange.levelCount = 1; copy_barrier.subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(_transfer_cmd.get(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, ©_barrier); + vkCmdPipelineBarrier(cmd.get(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, ©_barrier); VkBufferImageCopy region{}; region.bufferOffset = 0; @@ -291,7 +285,7 @@ namespace mlx region.imageOffset = { 0, 0, 0 }; region.imageExtent = { _width, _height, 1 }; - vkCmdCopyImageToBuffer(_transfer_cmd.get(), _image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer.get(), 1, ®ion); + vkCmdCopyImageToBuffer(cmd.get(), _image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer.get(), 1, ®ion); VkImageMemoryBarrier use_barrier{}; use_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -305,10 +299,10 @@ namespace mlx use_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; use_barrier.subresourceRange.levelCount = 1; use_barrier.subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(_transfer_cmd.get(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &use_barrier); + vkCmdPipelineBarrier(cmd.get(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &use_barrier); - _transfer_cmd.endRecord(); - _transfer_cmd.submitIdle(); + cmd.endRecord(); + cmd.submitIdle(); } void Image::transitionLayout(VkImageLayout new_layout) @@ -316,10 +310,9 @@ namespace mlx if(new_layout == _layout) return; - if(!_transfer_cmd.isInit()) - _transfer_cmd.init(&_pool); - _transfer_cmd.reset(); - _transfer_cmd.beginRecord(); + CmdBuffer& cmd = Render_Core::get().getSingleTimeCmdBuffer(); + cmd.reset(); + cmd.beginRecord(); VkImageMemoryBarrier barrier{}; barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -354,10 +347,10 @@ namespace mlx else destinationStage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - vkCmdPipelineBarrier(_transfer_cmd.get(), sourceStage, destinationStage, 0, 0, nullptr, 0, nullptr, 1, &barrier); + vkCmdPipelineBarrier(cmd.get(), sourceStage, destinationStage, 0, 0, nullptr, 0, nullptr, 1, &barrier); - _transfer_cmd.endRecord(); - _transfer_cmd.submitIdle(); + cmd.endRecord(); + cmd.submitIdle(); _layout = new_layout; } @@ -379,7 +372,6 @@ namespace mlx { destroySampler(); destroyImageView(); - destroyCmdPool(); if(_image != VK_NULL_HANDLE) Render_Core::get().getAllocator().destroyImage(_allocation, _image); diff --git a/src/renderer/images/vk_image.h b/src/renderer/images/vk_image.h index f1cc20d..a5600e6 100644 --- a/src/renderer/images/vk_image.h +++ b/src/renderer/images/vk_image.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/01/25 11:54:21 by maldavid #+# #+# */ -/* Updated: 2023/12/15 21:07:34 by maldavid ### ########.fr */ +/* Updated: 2023/12/15 21:44:30 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,7 +39,6 @@ namespace mlx _width = width; _height = height; _layout = layout; - _pool.init(); } void create(uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, const char* name, bool decated_memory = false); void createImageView(VkImageViewType type, VkImageAspectFlags aspectFlags) noexcept; @@ -64,11 +63,8 @@ namespace mlx private: void destroySampler() noexcept; void destroyImageView() noexcept; - inline void destroyCmdPool() noexcept { _transfer_cmd.destroy(); _pool.destroy(); } private: - CmdBuffer _transfer_cmd; - CmdPool _pool; VmaAllocation _allocation; VkImage _image = VK_NULL_HANDLE; VkImageView _image_view = VK_NULL_HANDLE; diff --git a/src/renderer/swapchain/vk_swapchain.cpp b/src/renderer/swapchain/vk_swapchain.cpp index 826830c..cada9ba 100644 --- a/src/renderer/swapchain/vk_swapchain.cpp +++ b/src/renderer/swapchain/vk_swapchain.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:22:28 by maldavid #+# #+# */ -/* Updated: 2023/12/10 22:32:54 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/15 21:49:19 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -146,9 +146,6 @@ namespace mlx vkDestroySwapchainKHR(Render_Core::get().getDevice().get(), _swapChain, nullptr); _swapChain = VK_NULL_HANDLE; for(Image& img : _images) - { img.destroyImageView(); - img.destroyCmdPool(); - } } }