From c85a30e6695b1bb2ecc76ca76497ae5c990a2c8d Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Thu, 14 Nov 2024 17:38:44 +0100 Subject: [PATCH] working on rtt --- example/main.c | 15 +++++++++++++++ .../Includes/Renderer/RenderPasses/FinalPass.h | 2 +- runtime/Includes/Renderer/RenderPasses/Passes.h | 3 ++- runtime/Includes/Renderer/ScenesRenderer.h | 4 ++-- runtime/Sources/Core/Graphics.cpp | 5 ++--- .../Sources/Renderer/RenderPasses/FinalPass.cpp | 7 +++++-- .../Sources/Renderer/RenderPasses/Passes.cpp | 12 +++++++++--- runtime/Sources/Renderer/Renderer.cpp | 17 ++++++++++++----- runtime/Sources/Renderer/SceneRenderer.cpp | 4 ++-- 9 files changed, 50 insertions(+), 19 deletions(-) diff --git a/example/main.c b/example/main.c index bb56a06..819bb89 100644 --- a/example/main.c +++ b/example/main.c @@ -9,6 +9,8 @@ typedef struct void* logo_jpg; void* logo_bmp; void* img; + void* render_target; + void* render_target_win; } mlx_t; int update(void* param) @@ -50,6 +52,12 @@ int update(void* param) mlx_pixel_put(mlx->mlx, mlx->win, 220 + j, 160 + k, 0xFFFF0000); } + mlx_string_put(mlx->mlx, mlx->render_target_win, 20, 20, 0xFFAF2BFF, "cacaboudin"); + mlx_transform_put_image_to_window(mlx->mlx, mlx->render_target_win, mlx->logo_bmp, 100, 40, 0.5f, 75.0f); + mlx_put_image_to_window(mlx->mlx, mlx->render_target_win, mlx->img, 40, 60); + + mlx_put_image_to_window(mlx->mlx, mlx->win, mlx->render_target_win, 40, 60); + i++; return 0; } @@ -133,6 +141,9 @@ int main(void) mlx.mlx = mlx_init(); mlx.win = mlx_new_window(mlx.mlx, 400, 400, "My window"); + mlx.render_target = mlx_new_image(mlx.mlx, 200, 200); + mlx.render_target_win = mlx_new_window(mlx.mlx, 200, 200, (char*)mlx.render_target); + mlx_set_fps_goal(mlx.mlx, 60); mlx_on_event(mlx.mlx, mlx.win, MLX_KEYDOWN, key_hook, &mlx); @@ -161,6 +172,10 @@ int main(void) mlx_destroy_image(mlx.mlx, mlx.logo_bmp); mlx_destroy_image(mlx.mlx, mlx.img); mlx_destroy_window(mlx.mlx, mlx.win); + + mlx_destroy_window(mlx.mlx, mlx.render_target_win); + mlx_destroy_image(mlx.mlx, mlx.render_target); + mlx_destroy_display(mlx.mlx); return 0; diff --git a/runtime/Includes/Renderer/RenderPasses/FinalPass.h b/runtime/Includes/Renderer/RenderPasses/FinalPass.h index ead2c3a..1de1d0e 100644 --- a/runtime/Includes/Renderer/RenderPasses/FinalPass.h +++ b/runtime/Includes/Renderer/RenderPasses/FinalPass.h @@ -12,7 +12,7 @@ namespace mlx public: FinalPass() = default; void Init(); - void Pass(class Scene& scene, class Renderer& renderer, class Texture& render_target); + void Pass(class Scene& scene, class Renderer& renderer, class Texture& render_target, NonOwningPtr final_target); void Destroy(); ~FinalPass() = default; diff --git a/runtime/Includes/Renderer/RenderPasses/Passes.h b/runtime/Includes/Renderer/RenderPasses/Passes.h index a24bcc2..48dfc84 100644 --- a/runtime/Includes/Renderer/RenderPasses/Passes.h +++ b/runtime/Includes/Renderer/RenderPasses/Passes.h @@ -12,7 +12,7 @@ namespace mlx public: RenderPasses() = default; - void Init(); + void Init(NonOwningPtr render_target); void Pass(class Scene& scene, class Renderer& renderer, const Vec4f& clear_color); void Destroy(); @@ -22,6 +22,7 @@ namespace mlx Render2DPass m_2Dpass; FinalPass m_final; Texture m_main_render_texture; + NonOwningPtr p_render_target; }; } diff --git a/runtime/Includes/Renderer/ScenesRenderer.h b/runtime/Includes/Renderer/ScenesRenderer.h index 03c391e..2919d5f 100644 --- a/runtime/Includes/Renderer/ScenesRenderer.h +++ b/runtime/Includes/Renderer/ScenesRenderer.h @@ -9,8 +9,8 @@ namespace mlx { public: SceneRenderer() = default; - void Init(); - void Render(class Scene& scene, class Renderer& renderer); // TODO : add RTT support + void Init(NonOwningPtr render_target); + void Render(class Scene& scene, class Renderer& renderer); void Destroy(); ~SceneRenderer() = default; diff --git a/runtime/Sources/Core/Graphics.cpp b/runtime/Sources/Core/Graphics.cpp index 66a70ed..db79fa5 100644 --- a/runtime/Sources/Core/Graphics.cpp +++ b/runtime/Sources/Core/Graphics.cpp @@ -10,9 +10,8 @@ namespace mlx m_has_window(false) { MLX_PROFILE_FUNCTION(); - // TODO : re-enable render targets m_renderer.Init(nullptr); - m_scene_renderer.Init(); + m_scene_renderer.Init(render_target); p_scene = std::make_unique(); } @@ -24,7 +23,7 @@ namespace mlx { MLX_PROFILE_FUNCTION(); m_renderer.Init(p_window.get()); - m_scene_renderer.Init(); + m_scene_renderer.Init(nullptr); p_scene = std::make_unique(); } diff --git a/runtime/Sources/Renderer/RenderPasses/FinalPass.cpp b/runtime/Sources/Renderer/RenderPasses/FinalPass.cpp index ed368f5..c8dec0f 100644 --- a/runtime/Sources/Renderer/RenderPasses/FinalPass.cpp +++ b/runtime/Sources/Renderer/RenderPasses/FinalPass.cpp @@ -41,7 +41,7 @@ namespace mlx p_set = RenderCore::Get().GetDescriptorPoolManager().GetAvailablePool().RequestDescriptorSet(p_fragment_shader->GetShaderLayout().set_layouts[0].second, ShaderType::Fragment); } - void FinalPass::Pass([[maybe_unused]] Scene& scene, Renderer& renderer, Texture& render_target) + void FinalPass::Pass([[maybe_unused]] Scene& scene, Renderer& renderer, Texture& render_target, NonOwningPtr final_target) { MLX_PROFILE_FUNCTION(); if(m_pipeline.GetPipeline() == VK_NULL_HANDLE) @@ -49,7 +49,10 @@ namespace mlx GraphicPipelineDescriptor pipeline_descriptor; pipeline_descriptor.vertex_shader = p_vertex_shader; pipeline_descriptor.fragment_shader = p_fragment_shader; - pipeline_descriptor.renderer = &renderer; + if(final_target) + pipeline_descriptor.color_attachments = { final_target }; + else + pipeline_descriptor.renderer = &renderer; pipeline_descriptor.no_vertex_inputs = true; #ifdef DEBUG m_pipeline.Init(pipeline_descriptor, "mlx_final_pass"); diff --git a/runtime/Sources/Renderer/RenderPasses/Passes.cpp b/runtime/Sources/Renderer/RenderPasses/Passes.cpp index f1ea588..29bebbb 100644 --- a/runtime/Sources/Renderer/RenderPasses/Passes.cpp +++ b/runtime/Sources/Renderer/RenderPasses/Passes.cpp @@ -5,8 +5,10 @@ namespace mlx { - void RenderPasses::Init() + void RenderPasses::Init(NonOwningPtr render_target) { + p_render_target = render_target; + m_2Dpass.Init(); m_final.Init(); func::function functor = [this](const EventBase& event) @@ -21,7 +23,11 @@ namespace mlx { if(!m_main_render_texture.IsInit()) { - auto extent = kvfGetSwapchainImagesSize(renderer.GetSwapchain().Get()); + VkExtent2D extent; + if(p_render_target) + extent = VkExtent2D{ .width = p_render_target->GetWidth(), .height = p_render_target->GetHeight() }; + else + extent = kvfGetSwapchainImagesSize(renderer.GetSwapchain().Get()); #ifdef DEBUG m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, "mlx_renderpasses_target"); #else @@ -32,7 +38,7 @@ namespace mlx 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); + m_final.Pass(scene, renderer, m_main_render_texture, p_render_target); } void RenderPasses::Destroy() diff --git a/runtime/Sources/Renderer/Renderer.cpp b/runtime/Sources/Renderer/Renderer.cpp index 7014e20..9b9ea4e 100644 --- a/runtime/Sources/Renderer/Renderer.cpp +++ b/runtime/Sources/Renderer/Renderer.cpp @@ -19,7 +19,8 @@ namespace mlx { MLX_PROFILE_FUNCTION(); p_window = window; - m_swapchain.Init(p_window); + if(p_window) + m_swapchain.Init(p_window); for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { m_image_available_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice()); @@ -37,7 +38,8 @@ namespace mlx { MLX_PROFILE_FUNCTION(); kvfWaitForFence(RenderCore::Get().GetDevice(), m_cmd_fences[m_current_frame_index]); - m_swapchain.AquireFrame(m_image_available_semaphores[m_current_frame_index]); + if(p_window) + m_swapchain.AquireFrame(m_image_available_semaphores[m_current_frame_index]); RenderCore::Get().vkResetCommandBuffer(m_cmd_buffers[m_current_frame_index], 0); kvfBeginCommandBuffer(m_cmd_buffers[m_current_frame_index], 0); m_drawcalls = 0; @@ -50,8 +52,12 @@ namespace mlx MLX_PROFILE_FUNCTION(); VkPipelineStageFlags wait_stages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; kvfEndCommandBuffer(m_cmd_buffers[m_current_frame_index]); - kvfSubmitCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[m_current_frame_index], KVF_GRAPHICS_QUEUE, m_render_finished_semaphores[m_current_frame_index], m_image_available_semaphores[m_current_frame_index], m_cmd_fences[m_current_frame_index], wait_stages); - m_swapchain.Present(m_render_finished_semaphores[m_current_frame_index]); + if(p_window) + kvfSubmitCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[m_current_frame_index], KVF_GRAPHICS_QUEUE, m_render_finished_semaphores[m_current_frame_index], m_image_available_semaphores[m_current_frame_index], m_cmd_fences[m_current_frame_index], wait_stages); + else + kvfSubmitCommandBuffer(RenderCore::Get().GetDevice(), m_cmd_buffers[m_current_frame_index], KVF_GRAPHICS_QUEUE, VK_NULL_HANDLE, VK_NULL_HANDLE, m_cmd_fences[m_current_frame_index], wait_stages); + if(p_window) + m_swapchain.Present(m_render_finished_semaphores[m_current_frame_index]); m_current_frame_index = (m_current_frame_index + 1) % MAX_FRAMES_IN_FLIGHT; } @@ -68,6 +74,7 @@ namespace mlx kvfDestroyFence(RenderCore::Get().GetDevice(), m_cmd_fences[i]); DebugLog("Vulkan: fence destroyed"); } - m_swapchain.Destroy(); + if(p_window) + m_swapchain.Destroy(); } } diff --git a/runtime/Sources/Renderer/SceneRenderer.cpp b/runtime/Sources/Renderer/SceneRenderer.cpp index 98fa750..4daf819 100644 --- a/runtime/Sources/Renderer/SceneRenderer.cpp +++ b/runtime/Sources/Renderer/SceneRenderer.cpp @@ -6,10 +6,10 @@ namespace mlx { - void SceneRenderer::Init() + void SceneRenderer::Init(NonOwningPtr render_target) { MLX_PROFILE_FUNCTION(); - m_passes.Init(); + m_passes.Init(render_target); } void SceneRenderer::Render(Scene& scene, Renderer& renderer)