From 2d89f4163921b6b9b0e8be4ba3e2b7a2093e9d8c Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Fri, 15 Dec 2023 21:08:46 +0100 Subject: [PATCH] fixing issue when destroying an image in the loop hook, begenning single time command buffers manager --- src/core/application.cpp | 4 +- src/core/application.inl | 10 +++- src/core/graphics.cpp | 4 +- .../command/single_time_cmd_manager.cpp | 47 +++++++++++++++++++ .../command/single_time_cmd_manager.h | 44 +++++++++++++++++ src/renderer/command/vk_cmd_buffer.h | 3 +- src/renderer/core/render_core.cpp | 4 +- src/renderer/core/render_core.h | 5 +- src/renderer/core/vk_fence.cpp | 8 +++- src/renderer/core/vk_fence.h | 4 +- src/renderer/images/vk_image.h | 4 +- test/main.c | 2 +- 12 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 src/renderer/command/single_time_cmd_manager.cpp create mode 100644 src/renderer/command/single_time_cmd_manager.h diff --git a/src/core/application.cpp b/src/core/application.cpp index 5072560..0a30f7b 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 22:10:52 by maldavid #+# #+# */ -/* Updated: 2023/12/11 19:46:13 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/15 20:51:41 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -61,7 +61,7 @@ namespace mlx::core void Application::destroyTexture(void* ptr) { - vkDeviceWaitIdle(Render_Core::get().getDevice().get()); + vkDeviceWaitIdle(Render_Core::get().getDevice().get()); // TODO : synchronize with another method than stopping all the GPU porcess Texture* texture = static_cast(ptr); texture->destroy(); } diff --git a/src/core/application.inl b/src/core/application.inl index 85fbd8f..3fd33c0 100644 --- a/src/core/application.inl +++ b/src/core/application.inl @@ -74,8 +74,16 @@ namespace mlx::core void Application::texturePut(void* win, void* img, int x, int y) { + if(img == nullptr) + { + core::error::report(e_kind::error, "wrong texture (NULL)"); + return; + } Texture* texture = static_cast(img); - _graphics[*static_cast(win)]->texturePut(texture, x, y); + if(!texture->isInit()) + core::error::report(e_kind::error, "trying to put a texture that has been destroyed"); + else + _graphics[*static_cast(win)]->texturePut(texture, x, y); } int Application::getTexturePixel(void* img, int x, int y) diff --git a/src/core/graphics.cpp b/src/core/graphics.cpp index ec36a73..bc4fd81 100644 --- a/src/core/graphics.cpp +++ b/src/core/graphics.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/02 15:13:55 by maldavid #+# #+# */ -/* Updated: 2023/12/14 17:14:30 by maldavid ### ########.fr */ +/* Updated: 2023/12/15 21:04:50 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,6 +37,8 @@ namespace mlx for(auto& data : _textures_to_render) { + if(!data.texture->isInit()) + continue; if(data.texture->getSet() == VK_NULL_HANDLE) data.texture->setDescriptor(_renderer->getFragDescriptorSet().duplicate()); if(!data.texture->hasBeenUpdated()) diff --git a/src/renderer/command/single_time_cmd_manager.cpp b/src/renderer/command/single_time_cmd_manager.cpp new file mode 100644 index 0000000..c64f445 --- /dev/null +++ b/src/renderer/command/single_time_cmd_manager.cpp @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* single_time_cmd_manager.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maldavid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/12/15 19:57:49 by maldavid #+# #+# */ +/* Updated: 2023/12/15 20:21:54 by maldavid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include + +namespace mlx +{ + SingleTimeCmdManager::SingleTimeCmdManager() : _buffers(MIN_POOL_SIZE) {} + + void SingleTimeCmdManager::init() noexcept + { + _pool.init(); + for(int i = 0; i < MIN_POOL_SIZE; i++) + _buffers.emplace_back().init(&_pool); + } + + void SingleTimeCmdManager::destroy() noexcept + { + std::for_each(_buffers.begin(), _buffers.end(), [](CmdBuffer& buf) + { + buf.destroy(); + }); + _pool.destroy(); + } + + CmdBuffer& SingleTimeCmdManager::getCmdBuffer() noexcept + { + for(CmdBuffer& buf : _buffers) + { + if(buf.isReadyToBeUsed()) + return buf; + } + _buffers.emplace_back().init(&_pool); + return _buffers.back(); + } +} diff --git a/src/renderer/command/single_time_cmd_manager.h b/src/renderer/command/single_time_cmd_manager.h new file mode 100644 index 0000000..a05dca3 --- /dev/null +++ b/src/renderer/command/single_time_cmd_manager.h @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* single_time_cmd_manager.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: maldavid +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/12/15 18:25:57 by maldavid #+# #+# */ +/* Updated: 2023/12/15 19:59:40 by maldavid ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef __MLX_SINGLE_TIME_CMD_MANAGER__ +#define __MLX_SINGLE_TIME_CMD_MANAGER__ + +#include + +#include +#include + +namespace mlx +{ + class SingleTimeCmdManager + { + public: + SingleTimeCmdManager(); + + void init() noexcept; + void destroy() noexcept; + + inline CmdPool& getCmdPool() noexcept { return _pool; } + CmdBuffer& getCmdBuffer() noexcept; + + ~SingleTimeCmdManager() = default; + + inline static constexpr const uint8_t MIN_POOL_SIZE = 8; + + private: + std::vector _buffers; + CmdPool _pool; + }; +} + +#endif diff --git a/src/renderer/command/vk_cmd_buffer.h b/src/renderer/command/vk_cmd_buffer.h index eca0520..bc8e653 100644 --- a/src/renderer/command/vk_cmd_buffer.h +++ b/src/renderer/command/vk_cmd_buffer.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/06 18:25:42 by maldavid #+# #+# */ -/* Updated: 2023/12/08 19:07:11 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/15 20:19:42 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,6 +31,7 @@ namespace mlx void submitIdle() noexcept; inline void waitForExecution() noexcept { _fence.waitAndReset(); } inline void reset() noexcept { vkResetCommandBuffer(_cmd_buffer, 0); } + inline bool isReadyToBeUsed() const noexcept { return _fence.isReady(); } void endRecord(); inline bool isRecording() const noexcept { return _is_recording; } diff --git a/src/renderer/core/render_core.cpp b/src/renderer/core/render_core.cpp index 3849a8a..fa615ff 100644 --- a/src/renderer/core/render_core.cpp +++ b/src/renderer/core/render_core.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/17 23:33:34 by maldavid #+# #+# */ -/* Updated: 2023/12/15 15:21:26 by maldavid ### ########.fr */ +/* Updated: 2023/12/15 20:32:01 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -97,6 +97,7 @@ namespace mlx volkLoadDevice(_device.get()); _queues.init(); _allocator.init(); + _cmd_manager.init(); _is_init = true; } @@ -107,6 +108,7 @@ namespace mlx vkDeviceWaitIdle(_device()); + _cmd_manager.destroy(); _allocator.destroy(); _device.destroy(); _layers.destroy(); diff --git a/src/renderer/core/render_core.h b/src/renderer/core/render_core.h index fe4efbc..a318ff4 100644 --- a/src/renderer/core/render_core.h +++ b/src/renderer/core/render_core.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/08 19:16:32 by maldavid #+# #+# */ -/* Updated: 2023/12/12 15:45:39 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/15 20:31:08 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ #include #include +#include #include "vk_queues.h" #include "vk_device.h" #include "vk_instance.h" @@ -57,11 +58,13 @@ namespace mlx inline Queues& getQueue() noexcept { return _queues; } inline GPUallocator& getAllocator() noexcept { return _allocator; } inline ValidationLayers& getLayers() noexcept { return _layers; } + inline CmdBuffer& getSingleTimeCmdBuffer() noexcept { return _cmd_manager.getCmdBuffer(); } ~Render_Core() = default; private: ValidationLayers _layers; + SingleTimeCmdManager _cmd_manager; Queues _queues; Device _device; Instance _instance; diff --git a/src/renderer/core/vk_fence.cpp b/src/renderer/core/vk_fence.cpp index 8061a6c..7b58f58 100644 --- a/src/renderer/core/vk_fence.cpp +++ b/src/renderer/core/vk_fence.cpp @@ -6,11 +6,12 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/02 17:53:06 by maldavid #+# #+# */ -/* Updated: 2023/12/12 15:50:48 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/15 20:31:29 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ #include +#include namespace mlx { @@ -38,6 +39,11 @@ namespace mlx vkResetFences(Render_Core::get().getDevice().get(), 1, &_fence); } + bool Fence::isReady() const noexcept + { + return vkGetFenceStatus(Render_Core::get().getDevice().get(), _fence) == VK_SUCCESS; + } + void Fence::destroy() noexcept { if(_fence != VK_NULL_HANDLE) diff --git a/src/renderer/core/vk_fence.h b/src/renderer/core/vk_fence.h index f50e223..ec5c8a1 100644 --- a/src/renderer/core/vk_fence.h +++ b/src/renderer/core/vk_fence.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/02 17:52:09 by maldavid #+# #+# */ -/* Updated: 2023/12/08 19:08:01 by kbz_8 ### ########.fr */ +/* Updated: 2023/12/15 20:31:25 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,6 @@ #include #include -#include namespace mlx { @@ -29,6 +28,7 @@ namespace mlx inline VkFence& get() noexcept { return _fence; } void wait() noexcept; void reset() noexcept; + bool isReady() const noexcept; inline void waitAndReset() noexcept { wait(); reset(); } void destroy() noexcept; diff --git a/src/renderer/images/vk_image.h b/src/renderer/images/vk_image.h index a55a2a4..f1cc20d 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/14 16:44:40 by maldavid ### ########.fr */ +/* Updated: 2023/12/15 21:07:34 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -56,6 +57,7 @@ namespace mlx inline VkSampler getSampler() const noexcept { return _sampler; } inline uint32_t getWidth() const noexcept { return _width; } inline uint32_t getHeight() const noexcept { return _height; } + inline bool isInit() const noexcept { return _image != VK_NULL_HANDLE; } virtual ~Image() = default; diff --git a/test/main.c b/test/main.c index 3da1085..8be11b1 100644 --- a/test/main.c +++ b/test/main.c @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:55:21 by maldavid #+# #+# */ -/* Updated: 2023/12/14 18:49:01 by maldavid ### ########.fr */ +/* Updated: 2023/12/15 21:08:07 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */