From c6a024d911b49e4cac891afdc425020f8801dbb6 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Mon, 8 Jan 2024 22:18:45 +0100 Subject: [PATCH] fixing issue with fonts vulkan descriptor destroyed --- example/main.c | 6 +++--- src/core/application.cpp | 20 +++----------------- src/core/application.inl | 15 +++++++++++++++ src/renderer/images/texture_atlas.h | 7 +++++-- src/renderer/text_pipeline.cpp | 18 ++++++++++++++---- 5 files changed, 40 insertions(+), 26 deletions(-) diff --git a/example/main.c b/example/main.c index ffdacf9..70e3733 100644 --- a/example/main.c +++ b/example/main.c @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:55:21 by maldavid #+# #+# */ -/* Updated: 2024/01/07 01:24:29 by maldavid ### ########.fr */ +/* Updated: 2024/01/08 22:17:57 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,8 +32,8 @@ int update(void *param) mlx = (t_mlx *)param; mlx_put_image_to_window(mlx->mlx, mlx->win, mlx->logo, 100, 100); mlx_put_image_to_window(mlx->mlx, mlx->win, mlx->img, 150, 60); - if (i == 0) - mlx_set_font_scale(mlx->mlx, mlx->win, "font.ttf", 16.f); + //if (i == 0) + // mlx_set_font_scale(mlx->mlx, mlx->win, "font.ttf", 16.f); mlx_string_put(mlx->mlx, mlx->win, 20, 50, 0xFFFFFFFF, "that's a text"); j = 0; k = 0; diff --git a/src/core/application.cpp b/src/core/application.cpp index 1697a28..21bc253 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: 2024/01/07 01:31:44 by maldavid ### ########.fr */ +/* Updated: 2023/12/27 21:30:10 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,19 +38,12 @@ namespace mlx::core { _in->update(); - Render_Core::get().getSingleTimeCmdManager().updateSingleTimesCmdBuffersSubmitState(); - if(_loop_hook) _loop_hook(_param); for(auto& gs : _graphics) gs->render(); } - for(auto& gs : _graphics) - { - for(int i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) - gs->getRenderer().getCmdBuffer(i).waitForExecution(); - } } void* Application::newTexture(int w, int h) @@ -71,16 +64,9 @@ namespace mlx::core void Application::destroyTexture(void* ptr) { - if(ptr == nullptr) - { - core::error::report(e_kind::error, "wrong texture (NULL)"); - return; - } + vkDeviceWaitIdle(Render_Core::get().getDevice().get()); // TODO : synchronize with another method than stopping all the GPU process Texture* texture = static_cast(ptr); - if(!texture->isInit()) - core::error::report(e_kind::error, "trying to destroy a texture that has already been destroyed"); - else - texture->destroy(); + texture->destroy(); } Application::~Application() diff --git a/src/core/application.inl b/src/core/application.inl index 3ecf15c..83ecb16 100644 --- a/src/core/application.inl +++ b/src/core/application.inl @@ -64,6 +64,11 @@ namespace mlx::core _graphics.emplace_back(std::make_unique(w, h, reinterpret_cast(const_cast(title)), _graphics.size())); else { + if(title == NULL) + { + core::error::report(e_kind::fatal_error, "invalid window title (NULL)"); + return nullptr; + } _graphics.emplace_back(std::make_unique(w, h, title, _graphics.size())); _in->addWindow(_graphics.back()->getWindow()); } @@ -91,6 +96,16 @@ namespace mlx::core void Application::stringPut(void* win, int x, int y, int color, char* str) { CHECK_WINDOW_PTR(win); + if(str == nullptr) + { + core::error::report(e_kind::error, "wrong text (NULL)"); + return; + } + if(std::strlen(str) == 0) + { + core::error::report(e_kind::error, "trying to put an empty text"); + return; + } _graphics[*static_cast(win)]->stringPut(x, y, color, str); } diff --git a/src/renderer/images/texture_atlas.h b/src/renderer/images/texture_atlas.h index 6191ca9..5fd4da9 100644 --- a/src/renderer/images/texture_atlas.h +++ b/src/renderer/images/texture_atlas.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/07 16:36:33 by maldavid #+# #+# */ -/* Updated: 2023/12/23 18:49:25 by kbz_8 ### ########.fr */ +/* Updated: 2024/01/08 21:42:31 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,12 +31,15 @@ namespace mlx inline void setDescriptor(DescriptorSet&& set) noexcept { _set = set; } inline VkDescriptorSet getSet() noexcept { return _set.isInit() ? _set.get() : VK_NULL_HANDLE; } - inline void updateSet(int binding) const noexcept { _set.writeDescriptor(binding, *this); } + inline void updateSet(int binding) noexcept { _set.writeDescriptor(binding, *this); _has_been_updated = true; } + inline bool hasBeenUpdated() const noexcept { return _has_been_updated; } + inline constexpr void resetUpdate() noexcept { _has_been_updated = false; } ~TextureAtlas() = default; private: DescriptorSet _set; + bool _has_been_updated = false; }; } diff --git a/src/renderer/text_pipeline.cpp b/src/renderer/text_pipeline.cpp index 173e6f9..4353168 100644 --- a/src/renderer/text_pipeline.cpp +++ b/src/renderer/text_pipeline.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/04/06 16:41:13 by maldavid #+# #+# */ -/* Updated: 2023/12/14 17:49:37 by maldavid ### ########.fr */ +/* Updated: 2024/01/08 21:42:15 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,7 +46,7 @@ namespace mlx for(char c : text) { - if(c < 32) + if(c < 32 && c != '\n') continue; stbtt_aligned_quad q; @@ -110,13 +110,23 @@ namespace mlx for(auto& draw : _drawlist) { std::shared_ptr draw_data = _library.getTextData(draw.id); - const TextureAtlas& atlas = draw_data->getFontInUse().getAtlas(); + TextureAtlas& atlas = const_cast(draw_data->getFontInUse().getAtlas()); draw_data->bind(*_renderer); - atlas.updateSet(0); + if(atlas.getSet() == VK_NULL_HANDLE) + atlas.setDescriptor(_renderer->getFragDescriptorSet().duplicate()); + if(!atlas.hasBeenUpdated()) + atlas.updateSet(0); sets[1] = const_cast(atlas).getSet(); vkCmdBindDescriptorSets(_renderer->getActiveCmdBuffer().get(), VK_PIPELINE_BIND_POINT_GRAPHICS, _renderer->getPipeline().getPipelineLayout(), 0, sets.size(), sets.data(), 0, nullptr); atlas.render(*_renderer, draw.x, draw.y, draw_data->getIBOsize()); } + + for(auto& draw : _drawlist) + { + std::shared_ptr draw_data = _library.getTextData(draw.id); + TextureAtlas& atlas = const_cast(draw_data->getFontInUse().getAtlas()); + atlas.resetUpdate(); + } } void TextPutPipeline::destroy() noexcept