diff --git a/.gitignore b/.gitignore index 9c8cb76..a55bcdc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ *.pdb *.gch *.pch +*.sym *.exe *vgcore.* *.gdb_history diff --git a/example/main.c b/example/main.c index 3639bc5..6db5745 100644 --- a/example/main.c +++ b/example/main.c @@ -18,23 +18,25 @@ typedef struct static mlx_color pixels_circle[CIRCLE_DIAMETER * CIRCLE_DIAMETER] = { 0 }; +#define THRESHOLD 200 + void update(void* param) { static int i = 0; mlx_t* mlx = (mlx_t*)param; - if(i > 200) + if(i > THRESHOLD) { mlx_clear_window(mlx->mlx, mlx->win, (mlx_color){ .rgba = 0x334D4DFF }); mlx_put_transformed_image_to_window(mlx->mlx, mlx->win, mlx->logo_bmp, 220, 40, 0.5f, 0.5f, i); } - if(i >= 250) + if(i >= THRESHOLD + THRESHOLD / 4) mlx_set_font_scale(mlx->mlx, "default", 16.f); else mlx_set_font_scale(mlx->mlx, "default", 6.f); - mlx_string_put(mlx->mlx, mlx->win, 160, 120, (mlx_color){ .rgba = 0xFF2066FF }, "this text should be hidden"); + mlx_string_put(mlx->mlx, mlx->win, 160, 120, (mlx_color){ .rgba = 0xFF2066FF }, "this text should be behind"); mlx_put_image_to_window(mlx->mlx, mlx->win, mlx->logo_png, 100, 100); mlx_put_image_to_window(mlx->mlx, mlx->win, mlx->img, 150, 60); @@ -50,7 +52,7 @@ void update(void* param) color += (color < 255); } - if(i < 200) + if(i < THRESHOLD) mlx_put_transformed_image_to_window(mlx->mlx, mlx->win, mlx->logo_jpg, 210, 150, 0.5f, 2.0f, 0.0f); else mlx_put_transformed_image_to_window(mlx->mlx, mlx->win, mlx->logo_jpg, 210, 150, fabs(sin(i / 100.0f)), fabs(cos(i / 100.0f) * 2.0f), 0.0f); @@ -59,7 +61,7 @@ void update(void* param) mlx_pixel_put_region(mlx->mlx, mlx->win, 200, 170, CIRCLE_DIAMETER, CIRCLE_DIAMETER, pixels_circle); - i++; + i++; // Will overflow and I don't care } mlx_image create_image(mlx_t* mlx) @@ -166,14 +168,9 @@ int main(void) mlx_on_event(mlx.mlx, mlx.win, MLX_KEYDOWN, key_hook, &mlx); mlx_on_event(mlx.mlx, mlx.win, MLX_WINDOW_EVENT, window_hook, &mlx); - mlx.logo_png = mlx_new_image_from_file(mlx.mlx, "42_logo.png", &dummy, &dummy); mlx.logo_bmp = mlx_new_image_from_file(mlx.mlx, "42_logo.bmp", &dummy, &dummy); - //mlx.logo_jpg = mlx_new_image_from_file(mlx.mlx, "42_logo.jpg", &dummy, &dummy); - mlx.logo_jpg = mlx_new_image(mlx.mlx, dummy, dummy); - - mlx_color* data = (mlx_color*)malloc(dummy * dummy * sizeof(mlx_color)); - mlx_get_image_region(mlx.mlx, mlx.logo_png, 0, 0, dummy, dummy, data); - mlx_set_image_region(mlx.mlx, mlx.logo_jpg, 0, 0, dummy, dummy, data); + mlx.logo_png = mlx_new_image_from_file(mlx.mlx, "42_logo.png", &dummy, &dummy); + mlx.logo_jpg = mlx_new_image_from_file(mlx.mlx, "42_logo.jpg", &dummy, &dummy); mlx_pixel_put(mlx.mlx, mlx.win, 200, 10, (mlx_color){ .rgba = 0xFF00FFFF }); mlx_put_image_to_window(mlx.mlx, mlx.win, mlx.logo_png, 0, 0); diff --git a/experimental/RenderToTexture/build.sh b/in_depth_features/build.sh similarity index 100% rename from experimental/RenderToTexture/build.sh rename to in_depth_features/build.sh diff --git a/experimental/RenderToTexture/main.c b/in_depth_features/main.c similarity index 100% rename from experimental/RenderToTexture/main.c rename to in_depth_features/main.c diff --git a/experimental/RenderToTexture/run.sh b/in_depth_features/run.sh similarity index 100% rename from experimental/RenderToTexture/run.sh rename to in_depth_features/run.sh diff --git a/includes/mlx.h b/includes/mlx.h index 0c4152a..4b373de 100644 --- a/includes/mlx.h +++ b/includes/mlx.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 16:56:35 by maldavid #+# #+# */ -/* Updated: 2024/12/20 00:42:01 by maldavid ### ########.fr */ +/* Updated: 2025/01/05 22:44:22 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,7 +79,7 @@ MLX_API mlx_context mlx_init(); * @brief Caps the FPS * * @param mlx Internal MLX application - * @param fps The FPS cap + * @param fps The FPS cap or 0 for vsync */ MLX_API void mlx_set_fps_goal(mlx_context mlx, int fps); diff --git a/includes/mlx_profile.h b/includes/mlx_profile.h index 5f53b0f..9c7e167 100644 --- a/includes/mlx_profile.h +++ b/includes/mlx_profile.h @@ -6,12 +6,12 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/11/10 08:49:17 by maldavid #+# #+# */ -/* Updated: 2024/12/17 00:35:35 by maldavid ### ########.fr */ +/* Updated: 2025/01/07 00:17:45 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef __MLX_PROFILE__ -#define __MLX_PROFILE__ +#ifndef MACROLIBX_PROFILE_H +#define MACROLIBX_PROFILE_H // Try to identify the compiler #if defined(__BORLANDC__) diff --git a/runtime/Includes/Core/Application.inl b/runtime/Includes/Core/Application.inl index 8cc58c3..c0d00b8 100644 --- a/runtime/Includes/Core/Application.inl +++ b/runtime/Includes/Core/Application.inl @@ -50,6 +50,13 @@ namespace mlx void Application::SetFPSCap(std::uint32_t fps) noexcept { + if(fps == 0) + { + SDL_DisplayMode mode; + if(!SDL_GetCurrentDisplayMode(1, &mode)) + return; + fps = mode.refresh_rate; + } m_fps.SetMaxFPS(fps); } diff --git a/runtime/Includes/Core/Graphics.h b/runtime/Includes/Core/Graphics.h index 06a221a..7d51d1c 100644 --- a/runtime/Includes/Core/Graphics.h +++ b/runtime/Includes/Core/Graphics.h @@ -22,13 +22,13 @@ namespace mlx void Render() noexcept; - inline void ResetRenderData(mlx_color color) noexcept; + void ResetRenderData(mlx_color color) noexcept; - inline void PixelPut(int x, int y, mlx_color color) noexcept; - inline void PixelPutArray(int x, int y, mlx_color* color, std::size_t pixels_size) noexcept; - inline void PixelPutRegion(int x, int y, int w, int h, mlx_color* color) noexcept; - inline void StringPut(int x, int y, mlx_color color, std::string str); - inline void TexturePut(NonOwningPtr texture, int x, int y, float scale_x, float scale_y, float angle); + void PixelPut(int x, int y, mlx_color color) noexcept; + void PixelPutArray(int x, int y, mlx_color* color, std::size_t pixels_size) noexcept; + void PixelPutRegion(int x, int y, int w, int h, mlx_color* color) noexcept; + void StringPut(int x, int y, mlx_color color, std::string str); + void TexturePut(NonOwningPtr texture, int x, int y, float scale_x, float scale_y, float angle); inline void TryEraseSpritesInScene(NonOwningPtr texture) noexcept; diff --git a/runtime/Includes/Core/Graphics.inl b/runtime/Includes/Core/Graphics.inl index 1416b9a..6cb2c34 100644 --- a/runtime/Includes/Core/Graphics.inl +++ b/runtime/Includes/Core/Graphics.inl @@ -3,107 +3,6 @@ namespace mlx { - void GraphicsSupport::ResetRenderData(mlx_color color) noexcept - { - MLX_PROFILE_FUNCTION(); - Vec4f vec_color = { - static_cast(color.r) / 255.0f, - static_cast(color.g) / 255.0f, - static_cast(color.b) / 255.0f, - static_cast(color.a) / 255.0f - }; - p_scene->ResetScene(std::move(vec_color)); - m_put_pixel_manager.ResetRenderData(); - m_draw_layer = 0; - m_pixelput_called = false; - } - - void GraphicsSupport::PixelPut(int x, int y, mlx_color color) noexcept - { - MLX_PROFILE_FUNCTION(); - NonOwningPtr texture = m_put_pixel_manager.DrawPixel(x, y, m_draw_layer, color); - if(texture) - { - m_pixelput_called = true; - Sprite& new_sprite = p_scene->CreateSprite(texture); - new_sprite.SetPosition(Vec2f{ 0.0f, 0.0f }); - } - } - - void GraphicsSupport::PixelPutArray(int x, int y, mlx_color* pixels, std::size_t pixels_size) noexcept - { - MLX_PROFILE_FUNCTION(); - NonOwningPtr texture = m_put_pixel_manager.DrawPixelsArray(x, y, m_draw_layer, pixels, pixels_size); - if(texture) - { - m_pixelput_called = true; - Sprite& new_sprite = p_scene->CreateSprite(texture); - new_sprite.SetPosition(Vec2f{ 0.0f, 0.0f }); - } - } - - void GraphicsSupport::PixelPutRegion(int x, int y, int w, int h, mlx_color* pixels) noexcept - { - MLX_PROFILE_FUNCTION(); - NonOwningPtr texture = m_put_pixel_manager.DrawPixelsRegion(x, y, w, h, m_draw_layer, pixels); - if(texture) - { - m_pixelput_called = true; - Sprite& new_sprite = p_scene->CreateSprite(texture); - new_sprite.SetPosition(Vec2f{ 0.0f, 0.0f }); - } - } - - void GraphicsSupport::StringPut(int x, int y, mlx_color color, std::string str) - { - MLX_PROFILE_FUNCTION(); - if(str.empty()) - return; - - Vec4f vec_color = { - static_cast(color.r) / 255.0f, - static_cast(color.g) / 255.0f, - static_cast(color.b) / 255.0f, - static_cast(color.a) / 255.0f, - }; - - NonOwningPtr text = p_scene->GetTextFromPositionAndColor(str, Vec2f{ static_cast(x), static_cast(y) }, vec_color); - if(!text) - { - if(m_pixelput_called) - { - m_draw_layer++; - m_pixelput_called = false; - } - Text& new_text = p_scene->CreateText(str); - new_text.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); - new_text.SetColor(std::move(vec_color)); - } - else if(!p_scene->IsTextAtGivenDrawLayer(str, m_draw_layer)) - p_scene->BringToDrawLayer(text.Get(), m_draw_layer); - } - - void GraphicsSupport::TexturePut(NonOwningPtr texture, int x, int y, float scale_x, float scale_y, float angle) - { - MLX_PROFILE_FUNCTION(); - NonOwningPtr sprite = p_scene->GetSpriteFromTexturePositionScaleRotation(texture, Vec2f{ static_cast(x), static_cast(y) }, scale_x, scale_y, angle); - if(!sprite) - { - if(m_pixelput_called) - { - m_draw_layer++; - m_pixelput_called = false; - } - Sprite& new_sprite = p_scene->CreateSprite(texture); - new_sprite.SetCenter(Vec2f{ texture->GetWidth() / 2.0f, texture->GetHeight() / 2.0f }); - new_sprite.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); - new_sprite.SetScale(Vec2f{ scale_x, scale_y }); - new_sprite.SetRotation(angle); - } - else if(!p_scene->IsTextureAtGivenDrawLayer(texture, m_draw_layer)) - p_scene->BringToDrawLayer(sprite.Get(), m_draw_layer); - } - void GraphicsSupport::TryEraseSpritesInScene(NonOwningPtr texture) noexcept { MLX_PROFILE_FUNCTION(); diff --git a/runtime/Includes/Graphics/Scene.h b/runtime/Includes/Graphics/Scene.h index 69d7fdc..cfa1ff7 100644 --- a/runtime/Includes/Graphics/Scene.h +++ b/runtime/Includes/Graphics/Scene.h @@ -29,17 +29,21 @@ namespace mlx void BringToDrawLayer(NonOwningPtr drawable, std::uint64_t draw_layer); - inline void ResetScene(Vec4f clear) { m_drawables.clear(); m_clear_color = std::move(clear); } + inline void ResetScene(Vec4f clear) { m_drawables.clear(); m_clear_color = std::move(clear); m_has_scene_changed = true; } inline const Vec4f& GetClearColor() const noexcept { return m_clear_color; } [[nodiscard]] MLX_FORCEINLINE const std::vector>& GetDrawables() const noexcept { return m_drawables; } + inline void ResetChangeChecker() noexcept { m_has_scene_changed = false; } + inline bool HasSceneChanged() const noexcept { return m_has_scene_changed; } + ~Scene() = default; private: std::vector> m_drawables; std::shared_ptr p_bound_font; Vec4f m_clear_color = { 0.0f, 0.0f, 0.0f, 1.0f }; + bool m_has_scene_changed = false; }; } diff --git a/runtime/Sources/Core/Application.cpp b/runtime/Sources/Core/Application.cpp index b3cf579..ef253b3 100644 --- a/runtime/Sources/Core/Application.cpp +++ b/runtime/Sources/Core/Application.cpp @@ -66,6 +66,7 @@ namespace mlx catch(...) { return nullptr; } m_image_registry.RegisterTexture(texture); image->texture = texture; + texture->Clear(VK_NULL_HANDLE, Vec4f{ 0.0f }); return image; } diff --git a/runtime/Sources/Core/Bridge.cpp b/runtime/Sources/Core/Bridge.cpp index 835dce2..ef83773 100644 --- a/runtime/Sources/Core/Bridge.cpp +++ b/runtime/Sources/Core/Bridge.cpp @@ -47,8 +47,6 @@ extern "C" MLX_CHECK_APPLICATION_POINTER(mlx); if(fps < 0) mlx::Error("You cannot set a negative FPS cap (nice try)"); - else if(fps == 0) - mlx::Error("You cannot set a FPS cap to 0 (nice try)"); else mlx->app->SetFPSCap(static_cast(fps)); } diff --git a/runtime/Sources/Core/Graphics.cpp b/runtime/Sources/Core/Graphics.cpp index 6560495..1e89686 100644 --- a/runtime/Sources/Core/Graphics.cpp +++ b/runtime/Sources/Core/Graphics.cpp @@ -51,6 +51,107 @@ namespace mlx #endif } + void GraphicsSupport::ResetRenderData(mlx_color color) noexcept + { + MLX_PROFILE_FUNCTION(); + Vec4f vec_color = { + static_cast(color.r) / 255.0f, + static_cast(color.g) / 255.0f, + static_cast(color.b) / 255.0f, + static_cast(color.a) / 255.0f + }; + p_scene->ResetScene(std::move(vec_color)); + m_put_pixel_manager.ResetRenderData(); + m_draw_layer = 0; + m_pixelput_called = false; + } + + void GraphicsSupport::PixelPut(int x, int y, mlx_color color) noexcept + { + MLX_PROFILE_FUNCTION(); + NonOwningPtr texture = m_put_pixel_manager.DrawPixel(x, y, m_draw_layer, color); + if(texture) + { + m_pixelput_called = true; + Sprite& new_sprite = p_scene->CreateSprite(texture); + new_sprite.SetPosition(Vec2f{ 0.0f, 0.0f }); + } + } + + void GraphicsSupport::PixelPutArray(int x, int y, mlx_color* pixels, std::size_t pixels_size) noexcept + { + MLX_PROFILE_FUNCTION(); + NonOwningPtr texture = m_put_pixel_manager.DrawPixelsArray(x, y, m_draw_layer, pixels, pixels_size); + if(texture) + { + m_pixelput_called = true; + Sprite& new_sprite = p_scene->CreateSprite(texture); + new_sprite.SetPosition(Vec2f{ 0.0f, 0.0f }); + } + } + + void GraphicsSupport::PixelPutRegion(int x, int y, int w, int h, mlx_color* pixels) noexcept + { + MLX_PROFILE_FUNCTION(); + NonOwningPtr texture = m_put_pixel_manager.DrawPixelsRegion(x, y, w, h, m_draw_layer, pixels); + if(texture) + { + m_pixelput_called = true; + Sprite& new_sprite = p_scene->CreateSprite(texture); + new_sprite.SetPosition(Vec2f{ 0.0f, 0.0f }); + } + } + + void GraphicsSupport::StringPut(int x, int y, mlx_color color, std::string str) + { + MLX_PROFILE_FUNCTION(); + if(str.empty()) + return; + + Vec4f vec_color = { + static_cast(color.r) / 255.0f, + static_cast(color.g) / 255.0f, + static_cast(color.b) / 255.0f, + static_cast(color.a) / 255.0f, + }; + + NonOwningPtr text = p_scene->GetTextFromPositionAndColor(str, Vec2f{ static_cast(x), static_cast(y) }, vec_color); + if(!text) + { + if(m_pixelput_called) + { + m_draw_layer++; + m_pixelput_called = false; + } + Text& new_text = p_scene->CreateText(str); + new_text.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); + new_text.SetColor(std::move(vec_color)); + } + else if(!p_scene->IsTextAtGivenDrawLayer(str, m_draw_layer)) + p_scene->BringToDrawLayer(text.Get(), m_draw_layer); + } + + void GraphicsSupport::TexturePut(NonOwningPtr texture, int x, int y, float scale_x, float scale_y, float angle) + { + MLX_PROFILE_FUNCTION(); + NonOwningPtr sprite = p_scene->GetSpriteFromTexturePositionScaleRotation(texture, Vec2f{ static_cast(x), static_cast(y) }, scale_x, scale_y, angle); + if(!sprite) + { + if(m_pixelput_called) + { + m_draw_layer++; + m_pixelput_called = false; + } + Sprite& new_sprite = p_scene->CreateSprite(texture); + new_sprite.SetCenter(Vec2f{ texture->GetWidth() / 2.0f, texture->GetHeight() / 2.0f }); + new_sprite.SetPosition(Vec2f{ static_cast(x), static_cast(y) }); + new_sprite.SetScale(Vec2f{ scale_x, scale_y }); + new_sprite.SetRotation(angle); + } + else if(!p_scene->IsTextureAtGivenDrawLayer(texture, m_draw_layer)) + p_scene->BringToDrawLayer(sprite.Get(), m_draw_layer); + } + GraphicsSupport::~GraphicsSupport() { MLX_PROFILE_FUNCTION(); diff --git a/runtime/Sources/Graphics/Scene.cpp b/runtime/Sources/Graphics/Scene.cpp index d36b135..34cef74 100644 --- a/runtime/Sources/Graphics/Scene.cpp +++ b/runtime/Sources/Graphics/Scene.cpp @@ -18,12 +18,14 @@ namespace mlx { std::shared_ptr new_sprite = std::make_shared(drawable->GetMesh(), texture); m_drawables.push_back(new_sprite); + m_has_scene_changed = true; return *new_sprite; } } std::shared_ptr sprite = std::make_shared(texture); m_drawables.push_back(sprite); + m_has_scene_changed = true; return *sprite; } @@ -83,12 +85,14 @@ namespace mlx { std::shared_ptr new_text = std::make_shared(text, p_bound_font, drawable->GetMesh()); m_drawables.push_back(new_text); + m_has_scene_changed = true; return *new_text; } } std::shared_ptr new_text = std::make_shared(text, p_bound_font); m_drawables.push_back(new_text); + m_has_scene_changed = true; return *new_text; } @@ -127,5 +131,6 @@ namespace mlx if(it == m_drawables.end()) return; std::swap(*it, *(m_drawables.begin() + draw_layer)); + m_has_scene_changed = true; } } diff --git a/runtime/Sources/Renderer/Descriptor.cpp b/runtime/Sources/Renderer/Descriptor.cpp index 8d7afca..ba29b37 100644 --- a/runtime/Sources/Renderer/Descriptor.cpp +++ b/runtime/Sources/Renderer/Descriptor.cpp @@ -227,9 +227,27 @@ namespace mlx { MLX_PROFILE_FUNCTION(); Verify(m_sets[i] != VK_NULL_HANDLE, "invalid descriptor"); - std::vector writes; - std::vector buffer_infos; - std::vector image_infos; + + std::size_t image_count = 0; + std::size_t buffer_count = 0; + + for(auto& descriptor : m_descriptors) + { + if(descriptor.image_ptr) + image_count++; + else if(descriptor.uniform_buffer_ptr || descriptor.storage_buffer_ptr) + buffer_count++; + else + FatalError("unknown descriptor data"); + } + + std::vector writes(m_descriptors.size()); + std::vector buffer_infos(buffer_count); + std::vector image_infos(image_count); + std::size_t buffer_index = 0; + std::size_t image_index = 0; + std::size_t write_index = 0; + for(auto& descriptor : m_descriptors) { if(descriptor.image_ptr) @@ -239,8 +257,9 @@ namespace mlx info.sampler = descriptor.image_ptr->GetSampler(); info.imageLayout = descriptor.image_ptr->GetLayout(); info.imageView = descriptor.image_ptr->GetImageView(); - image_infos.push_back(info); - writes.push_back(kvfWriteImageToDescriptorSet(RenderCore::Get().GetDevice(), m_sets[i], &image_infos.back(), descriptor.binding)); + image_infos[image_index] = std::move(info); + writes[write_index] = kvfWriteImageToDescriptorSet(RenderCore::Get().GetDevice(), m_sets[i], &image_infos[image_index], descriptor.binding); + image_index++; } else if(descriptor.uniform_buffer_ptr) { @@ -248,8 +267,9 @@ namespace mlx info.buffer = descriptor.uniform_buffer_ptr->Get(); info.offset = descriptor.uniform_buffer_ptr->GetOffset(); info.range = VK_WHOLE_SIZE; - buffer_infos.push_back(info); - writes.push_back(kvfWriteUniformBufferToDescriptorSet(RenderCore::Get().GetDevice(), m_sets[i], &buffer_infos.back(), descriptor.binding)); + buffer_infos[buffer_index] = std::move(info); + writes[write_index] = kvfWriteUniformBufferToDescriptorSet(RenderCore::Get().GetDevice(), m_sets[i], &buffer_infos[buffer_index], descriptor.binding); + buffer_index++; } else if(descriptor.storage_buffer_ptr) { @@ -257,9 +277,11 @@ namespace mlx info.buffer = descriptor.storage_buffer_ptr->Get(); info.offset = descriptor.storage_buffer_ptr->GetOffset(); info.range = VK_WHOLE_SIZE; - buffer_infos.push_back(info); - writes.push_back(kvfWriteStorageBufferToDescriptorSet(RenderCore::Get().GetDevice(), m_sets[i], &buffer_infos.back(), descriptor.binding)); + buffer_infos[buffer_index] = std::move(info); + writes[write_index] = kvfWriteStorageBufferToDescriptorSet(RenderCore::Get().GetDevice(), m_sets[i], &buffer_infos[buffer_index], descriptor.binding); + buffer_index++; } + write_index++; } RenderCore::Get().vkUpdateDescriptorSets(RenderCore::Get().GetDevice(), writes.size(), writes.data(), 0, nullptr); } diff --git a/runtime/Sources/Renderer/RenderPasses/2DPass.cpp b/runtime/Sources/Renderer/RenderPasses/2DPass.cpp index 84e4d5f..7a68c34 100644 --- a/runtime/Sources/Renderer/RenderPasses/2DPass.cpp +++ b/runtime/Sources/Renderer/RenderPasses/2DPass.cpp @@ -100,9 +100,9 @@ namespace mlx for(auto& drawable : drawables) { // Check every textures and update modified ones to GPU before starting the render pass + drawable->Update(cmd); if(!drawable->IsSetInit()) drawable->UpdateDescriptorSet(p_texture_set); - drawable->Update(cmd); } m_pipeline.BindPipeline(cmd, 0, {}); diff --git a/runtime/Sources/Renderer/RenderPasses/Passes.cpp b/runtime/Sources/Renderer/RenderPasses/Passes.cpp index 75c09a5..8f36483 100644 --- a/runtime/Sources/Renderer/RenderPasses/Passes.cpp +++ b/runtime/Sources/Renderer/RenderPasses/Passes.cpp @@ -21,6 +21,7 @@ namespace mlx void RenderPasses::Pass(Scene& scene, Renderer& renderer, const Vec4f& clear_color) { + bool force_render = false; if(!m_main_render_texture.IsInit()) { VkExtent2D extent; @@ -34,11 +35,15 @@ namespace mlx m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_UNORM, false, {}); #endif m_main_render_texture.TransitionLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + force_render = true; + } + if(scene.HasSceneChanged() || force_render) + { + m_main_render_texture.Clear(renderer.GetActiveCommandBuffer(), clear_color); + m_2Dpass.Pass(scene, renderer, m_main_render_texture); } - m_main_render_texture.Clear(renderer.GetActiveCommandBuffer(), clear_color); - - m_2Dpass.Pass(scene, renderer, m_main_render_texture); m_final.Pass(scene, renderer, m_main_render_texture, p_render_target); + scene.ResetChangeChecker(); } void RenderPasses::Destroy() diff --git a/runtime/Sources/Renderer/Renderer.cpp b/runtime/Sources/Renderer/Renderer.cpp index 8c18706..eeefe2b 100644 --- a/runtime/Sources/Renderer/Renderer.cpp +++ b/runtime/Sources/Renderer/Renderer.cpp @@ -87,6 +87,8 @@ namespace mlx DebugLog("Vulkan: image available semaphore destroyed"); kvfDestroySemaphore(RenderCore::Get().GetDevice(), m_render_finished_semaphores[i]); DebugLog("Vulkan: render finished semaphore destroyed"); + kvfDestroyCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[i]); + DebugLog("Vulkan: command buffer destroyed"); kvfDestroyFence(RenderCore::Get().GetDevice(), m_cmd_fences[i]); DebugLog("Vulkan: fence destroyed"); } diff --git a/third_party/kvf.h b/third_party/kvf.h index 3aa5486..b480456 100755 --- a/third_party/kvf.h +++ b/third_party/kvf.h @@ -549,7 +549,7 @@ void __kvfCompleteDevice(VkPhysicalDevice physical, VkDevice device) kvf_device = &__kvf_internal_devices[i]; } - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkCommandPool pool; VkCommandPoolCreateInfo pool_info = {}; @@ -583,7 +583,7 @@ void __kvfCompleteDeviceCustomPhysicalDeviceAndQueues(VkPhysicalDevice physical, kvf_device = &__kvf_internal_devices[i]; } - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkCommandPool pool; VkCommandPoolCreateInfo pool_info = {}; @@ -645,7 +645,7 @@ void kvfSetAllocationCallbacks(VkDevice device, const VkAllocationCallbacks* cal { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); kvf_device->callbacks = (VkAllocationCallbacks*)KVF_MALLOC(sizeof(VkAllocationCallbacks)); KVF_ASSERT(kvf_device->callbacks && "allocation failed :("); memcpy(kvf_device->callbacks, callbacks, sizeof(VkAllocationCallbacks)); @@ -703,7 +703,7 @@ void __kvfDestroyDevice(VkDevice device) KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); for(size_t i = 0; i < __kvf_internal_swapchains_size; i++) { @@ -758,7 +758,7 @@ void __kvfDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer) KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); for(size_t i = 0; i < __kvf_internal_framebuffers_size; i++) { @@ -796,7 +796,7 @@ VkDescriptorPool __kvfDeviceCreateDescriptorPool(VkDevice device) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); kvf_device->sets_pools_size++; kvf_device->sets_pools = (__KvfDescriptorPool*)KVF_REALLOC(kvf_device->sets_pools, kvf_device->sets_pools_size * sizeof(__KvfDescriptorPool)); memset(&kvf_device->sets_pools[kvf_device->sets_pools_size - 1], 0, sizeof(__KvfDescriptorPool)); @@ -831,7 +831,7 @@ void __kvfDestroyDescriptorPools(VkDevice device) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); for(size_t i = 0; i < kvf_device->sets_pools_size; i++) KVF_GET_DEVICE_FUNCTION(vkDestroyDescriptorPool)(device, kvf_device->sets_pools[i].pool, NULL); @@ -976,7 +976,7 @@ VkFormat kvfFindSupportFormatInCandidates(VkDevice device, VkFormat* candidates, { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); for(size_t i = 0; i < candidates_count; i++) { VkFormatProperties props; @@ -1529,7 +1529,7 @@ VkDevice kvfCreateDevice(VkPhysicalDevice physical, const char** extensions, uin __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkPhysicalDevice(physical); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); uint32_t queue_count = 0; queue_count += (kvf_device->queues.graphics != -1); @@ -1668,7 +1668,7 @@ VkDevice kvfCreateDeviceCustomPhysicalDeviceAndQueues(VkPhysicalDevice physical, KVF_ASSERT(device != VK_NULL_HANDLE); KVF_ASSERT(fns != NULL); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkPhysicalDevice(physical); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); kvf_device->fns = *fns; __kvfCompleteDevice(physical, device); } @@ -1685,7 +1685,7 @@ VkQueue kvfGetDeviceQueue(VkDevice device, KvfQueueType queue) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkQueue vk_queue = VK_NULL_HANDLE; if(queue == KVF_GRAPHICS_QUEUE) { @@ -1709,7 +1709,7 @@ uint32_t kvfGetDeviceQueueFamily(VkDevice device, KvfQueueType queue) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); if(queue == KVF_GRAPHICS_QUEUE) return kvf_device->queues.graphics; else if(queue == KVF_PRESENT_QUEUE) @@ -1726,7 +1726,7 @@ uint32_t kvfGetDeviceQueueFamily(VkDevice device, KvfQueueType queue) KVF_ASSERT(device != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkPresentInfoKHR present_info = {}; present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; @@ -1814,7 +1814,7 @@ VkFence kvfCreateFence(VkDevice device) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkFenceCreateInfo fence_info = {}; fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; fence_info.flags = VK_FENCE_CREATE_SIGNALED_BIT; @@ -1829,7 +1829,7 @@ void kvfWaitForFence(VkDevice device, VkFence fence) KVF_ASSERT(fence != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif KVF_GET_DEVICE_FUNCTION(vkWaitForFences)(device, 1, &fence, VK_TRUE, UINT64_MAX); } @@ -1840,7 +1840,7 @@ void kvfDestroyFence(VkDevice device, VkFence fence) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyFence)(device, fence, kvf_device->callbacks); } @@ -1848,7 +1848,7 @@ VkSemaphore kvfCreateSemaphore(VkDevice device) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkSemaphoreCreateInfo semaphore_info = {}; semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; VkSemaphore semaphore; @@ -1862,7 +1862,7 @@ void kvfDestroySemaphore(VkDevice device, VkSemaphore semaphore) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroySemaphore)(device, semaphore, kvf_device->callbacks); } @@ -1941,7 +1941,7 @@ void kvfDestroySemaphore(VkDevice device, VkSemaphore semaphore) image_count = support.capabilities.maxImageCount; __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); uint32_t queue_family_indices[] = { (uint32_t)kvf_device->queues.graphics, (uint32_t)kvf_device->queues.present }; @@ -2032,7 +2032,7 @@ VkImage kvfCreateImage(VkDevice device, uint32_t width, uint32_t height, VkForma { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkImageCreateInfo image_info = {}; image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; image_info.imageType = VK_IMAGE_TYPE_2D; @@ -2066,7 +2066,7 @@ void kvfCopyImageToBuffer(VkCommandBuffer cmd, VkBuffer dst, VkImage src, size_t KVF_ASSERT(src != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkCommandBuffer(cmd); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkOffset3D offset = { 0, 0, 0 }; VkBufferImageCopy region = {}; @@ -2088,7 +2088,7 @@ void kvfDestroyImage(VkDevice device, VkImage image) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyImage)(device, image, kvf_device->callbacks); } @@ -2096,7 +2096,7 @@ VkImageView kvfCreateImageView(VkDevice device, VkImage image, VkFormat format, { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkImageViewCreateInfo create_info = {}; create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; create_info.image = image; @@ -2121,7 +2121,7 @@ void kvfDestroyImageView(VkDevice device, VkImageView image_view) KVF_ASSERT(device != VK_NULL_HANDLE); KVF_ASSERT(image_view != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyImageView)(device, image_view, kvf_device->callbacks); } @@ -2135,7 +2135,7 @@ void kvfTransitionImageLayout(VkDevice device, VkImage image, KvfImageType type, #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif if(is_single_time_cmd_buffer) @@ -2189,7 +2189,7 @@ VkSampler kvfCreateSampler(VkDevice device, VkFilter filters, VkSamplerAddressMo { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkSamplerCreateInfo info = {}; info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; info.magFilter = filters; @@ -2213,7 +2213,7 @@ void kvfDestroySampler(VkDevice device, VkSampler sampler) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroySampler)(device, sampler, kvf_device->callbacks); } @@ -2221,7 +2221,7 @@ VkBuffer kvfCreateBuffer(VkDevice device, VkBufferUsageFlags usage, VkDeviceSize { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkBufferCreateInfo buffer_info = {}; buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; buffer_info.size = size; @@ -2239,7 +2239,7 @@ void kvfCopyBufferToBuffer(VkCommandBuffer cmd, VkBuffer dst, VkBuffer src, size KVF_ASSERT(src != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkCommandBuffer(cmd); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkBufferCopy copy_region = {}; copy_region.size = size; @@ -2253,7 +2253,7 @@ void kvfCopyBufferToImage(VkCommandBuffer cmd, VkImage dst, VkBuffer src, size_t KVF_ASSERT(src != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkCommandBuffer(cmd); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkOffset3D offset = { 0, 0, 0 }; VkBufferImageCopy region = {}; @@ -2275,7 +2275,7 @@ void kvfDestroyBuffer(VkDevice device, VkBuffer buffer) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyBuffer)(device, buffer, kvf_device->callbacks); } @@ -2284,7 +2284,7 @@ VkFramebuffer kvfCreateFramebuffer(VkDevice device, VkRenderPass render_pass, Vk KVF_ASSERT(device != VK_NULL_HANDLE); KVF_ASSERT(image_views != NULL); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkFramebufferCreateInfo framebuffer_info = {}; framebuffer_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebuffer_info.renderPass = render_pass; @@ -2324,7 +2324,7 @@ VkCommandBuffer kvfCreateCommandBufferLeveled(VkDevice device, VkCommandBufferLe { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkCommandPool pool = kvf_device->cmd_pool; VkCommandBuffer buffer; @@ -2335,7 +2335,7 @@ VkCommandBuffer kvfCreateCommandBufferLeveled(VkDevice device, VkCommandBufferLe alloc_info.commandBufferCount = 1; __kvfCheckVk(KVF_GET_DEVICE_FUNCTION(vkAllocateCommandBuffers)(device, &alloc_info, &buffer)); - if(kvf_device->cmd_buffers_size == kvf_device->cmd_buffers_capacity) + if(kvf_device->cmd_buffers_size >= kvf_device->cmd_buffers_capacity) { // Resize the dynamic array if necessary kvf_device->cmd_buffers_capacity += KVF_COMMAND_POOL_CAPACITY; @@ -2352,7 +2352,7 @@ void kvfBeginCommandBuffer(VkCommandBuffer buffer, VkCommandBufferUsageFlags usa KVF_ASSERT(buffer != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkCommandBuffer(buffer); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkCommandBufferBeginInfo begin_info = {}; begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; @@ -2365,7 +2365,7 @@ void kvfEndCommandBuffer(VkCommandBuffer buffer) KVF_ASSERT(buffer != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkCommandBuffer(buffer); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif __kvfCheckVk(KVF_GET_DEVICE_FUNCTION(vkEndCommandBuffer)(buffer)); } @@ -2376,7 +2376,7 @@ void kvfSubmitCommandBuffer(VkDevice device, VkCommandBuffer buffer, KvfQueueTyp #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkSemaphore signal_semaphores[1]; VkSemaphore wait_semaphores[1]; @@ -2403,7 +2403,7 @@ void kvfSubmitSingleTimeCommandBuffer(VkDevice device, VkCommandBuffer buffer, K KVF_ASSERT(device != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif if(fence != VK_NULL_HANDLE) @@ -2424,7 +2424,7 @@ void kvfDestroyCommandBuffer(VkDevice device, VkCommandBuffer buffer) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); for(size_t i = 0; i < kvf_device->cmd_buffers_size; i++) { @@ -2434,7 +2434,7 @@ void kvfDestroyCommandBuffer(VkDevice device, VkCommandBuffer buffer) // Shift the elements to fill the gap for(size_t j = i; j < kvf_device->cmd_buffers_size - 1; j++) kvf_device->cmd_buffers[j] = kvf_device->cmd_buffers[j + 1]; - kvf_device->cmd_buffers--; + kvf_device->cmd_buffers_size--; return; } } @@ -2553,7 +2553,7 @@ VkRenderPass kvfCreateRenderPassWithSubpassDependencies(VkDevice device, VkAttac } __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkSubpassDescription subpass = {}; subpass.pipelineBindPoint = bind_point; @@ -2583,7 +2583,7 @@ void kvfDestroyRenderPass(VkDevice device, VkRenderPass renderPass) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyRenderPass)(device, renderPass, kvf_device->callbacks); } @@ -2593,7 +2593,7 @@ void kvfBeginRenderPass(VkRenderPass pass, VkCommandBuffer cmd, VkFramebuffer fr KVF_ASSERT(framebuffer != VK_NULL_HANDLE); #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkCommandBuffer(cmd); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkOffset2D offset = { 0, 0 }; @@ -2612,7 +2612,7 @@ VkShaderModule kvfCreateShaderModule(VkDevice device, uint32_t* code, size_t siz { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkShaderModuleCreateInfo createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; createInfo.codeSize = size * sizeof(uint32_t); @@ -2628,7 +2628,7 @@ void kvfDestroyShaderModule(VkDevice device, VkShaderModule shader) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyShaderModule)(device, shader, kvf_device->callbacks); } @@ -2636,7 +2636,7 @@ VkDescriptorSetLayout kvfCreateDescriptorSetLayout(VkDevice device, VkDescriptor { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkDescriptorSetLayoutCreateInfo layout_info = {}; layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; layout_info.bindingCount = bindings_count; @@ -2653,7 +2653,7 @@ void kvfDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout layout return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyDescriptorSetLayout)(device, layout, kvf_device->callbacks); } @@ -2661,7 +2661,7 @@ VkDescriptorSet kvfAllocateDescriptorSet(VkDevice device, VkDescriptorSetLayout { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkDescriptorPool pool = VK_NULL_HANDLE; for(uint32_t i = 0; i < kvf_device->sets_pools_size; i++) { @@ -2687,7 +2687,7 @@ void kvfUpdateStorageBufferToDescriptorSet(VkDevice device, VkDescriptorSet set, { #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkWriteDescriptorSet write = kvfWriteStorageBufferToDescriptorSet(device, set, info, binding); KVF_GET_DEVICE_FUNCTION(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL); @@ -2697,7 +2697,7 @@ void kvfUpdateUniformBufferToDescriptorSet(VkDevice device, VkDescriptorSet set, { #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkWriteDescriptorSet write = kvfWriteUniformBufferToDescriptorSet(device, set, info, binding); KVF_GET_DEVICE_FUNCTION(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL); @@ -2707,7 +2707,7 @@ void kvfUpdateImageToDescriptorSet(VkDevice device, VkDescriptorSet set, const V { #ifdef KVF_IMPL_VK_NO_PROTOTYPES __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); #endif VkWriteDescriptorSet write = kvfWriteImageToDescriptorSet(device, set, info, binding); KVF_GET_DEVICE_FUNCTION(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL); @@ -2725,6 +2725,7 @@ VkWriteDescriptorSet kvfWriteStorageBufferToDescriptorSet(VkDevice device, VkDes descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; descriptor_write.descriptorCount = 1; descriptor_write.pBufferInfo = info; + descriptor_write.pNext = NULL; return descriptor_write; } @@ -2740,6 +2741,7 @@ VkWriteDescriptorSet kvfWriteUniformBufferToDescriptorSet(VkDevice device, VkDes descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; descriptor_write.descriptorCount = 1; descriptor_write.pBufferInfo = info; + descriptor_write.pNext = NULL; return descriptor_write; } @@ -2755,6 +2757,7 @@ VkWriteDescriptorSet kvfWriteImageToDescriptorSet(VkDevice device, VkDescriptorS descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; descriptor_write.descriptorCount = 1; descriptor_write.pImageInfo = info; + descriptor_write.pNext = NULL; return descriptor_write; } @@ -2762,7 +2765,7 @@ VkPipelineLayout kvfCreatePipelineLayout(VkDevice device, VkDescriptorSetLayout* { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkPipelineLayoutCreateInfo pipeline_layout_info = {}; pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pipeline_layout_info.setLayoutCount = set_layouts_count; @@ -2781,7 +2784,7 @@ void kvfDestroyPipelineLayout(VkDevice device, VkPipelineLayout layout) return; KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyPipelineLayout)(device, layout, kvf_device->callbacks); } @@ -2789,7 +2792,7 @@ void kvfResetDeviceDescriptorPools(VkDevice device) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); for(uint32_t i = 0; i < kvf_device->sets_pools_size; i++) { KVF_GET_DEVICE_FUNCTION(vkResetDescriptorPool)(device, kvf_device->sets_pools[i].pool, 0); @@ -3018,7 +3021,7 @@ VkPipeline kvfCreateGraphicsPipeline(VkDevice device, VkPipelineCache cache, VkP pipeline_info.pDepthStencilState = &builder->depth_stencil_state; __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); VkPipeline pipeline; __kvfCheckVk(KVF_GET_DEVICE_FUNCTION(vkCreateGraphicsPipelines)(device, cache, 1, &pipeline_info, kvf_device->callbacks, &pipeline)); return pipeline; @@ -3028,7 +3031,7 @@ void kvfDestroyPipeline(VkDevice device, VkPipeline pipeline) { KVF_ASSERT(device != VK_NULL_HANDLE); __KvfDevice* kvf_device = __kvfGetKvfDeviceFromVkDevice(device); - KVF_ASSERT(kvf_device != NULL); + KVF_ASSERT(kvf_device != NULL && "could not find VkDevice in registered devices"); KVF_GET_DEVICE_FUNCTION(vkDestroyPipeline)(device, pipeline, kvf_device->callbacks); } diff --git a/xmake.lua b/xmake.lua index 1ffbc7e..074e4ce 100644 --- a/xmake.lua +++ b/xmake.lua @@ -2,7 +2,7 @@ add_requires("libsdl", { configs = { sdlmain = false } }) -add_rules("mode.debug", "mode.release") +add_rules("mode.debug", "mode.release", "mode.releasedbg") set_languages("cxx20", "c11") set_objectdir("objs/xmake/$(os)_$(arch)") @@ -85,7 +85,6 @@ target("mlx") end) target_end() ---[[ target("Test") set_default(false) set_kind("binary") @@ -101,4 +100,3 @@ target("Test") add_packages("libsdl") target_end() -]]--