working on rtt

This commit is contained in:
2024-11-14 17:38:44 +01:00
parent ef50272a0c
commit 32b6053cfb
9 changed files with 50 additions and 19 deletions

View File

@@ -9,6 +9,8 @@ typedef struct
void* logo_jpg; void* logo_jpg;
void* logo_bmp; void* logo_bmp;
void* img; void* img;
void* render_target;
void* render_target_win;
} mlx_t; } mlx_t;
int update(void* param) 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_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++; i++;
return 0; return 0;
} }
@@ -133,6 +141,9 @@ int main(void)
mlx.mlx = mlx_init(); mlx.mlx = mlx_init();
mlx.win = mlx_new_window(mlx.mlx, 400, 400, "My window"); 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_set_fps_goal(mlx.mlx, 60);
mlx_on_event(mlx.mlx, mlx.win, MLX_KEYDOWN, key_hook, &mlx); 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.logo_bmp);
mlx_destroy_image(mlx.mlx, mlx.img); mlx_destroy_image(mlx.mlx, mlx.img);
mlx_destroy_window(mlx.mlx, mlx.win); 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); mlx_destroy_display(mlx.mlx);
return 0; return 0;

View File

@@ -12,7 +12,7 @@ namespace mlx
public: public:
FinalPass() = default; FinalPass() = default;
void Init(); 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<class Texture> final_target);
void Destroy(); void Destroy();
~FinalPass() = default; ~FinalPass() = default;

View File

@@ -12,7 +12,7 @@ namespace mlx
public: public:
RenderPasses() = default; RenderPasses() = default;
void Init(); void Init(NonOwningPtr<class Texture> render_target);
void Pass(class Scene& scene, class Renderer& renderer, const Vec4f& clear_color); void Pass(class Scene& scene, class Renderer& renderer, const Vec4f& clear_color);
void Destroy(); void Destroy();
@@ -22,6 +22,7 @@ namespace mlx
Render2DPass m_2Dpass; Render2DPass m_2Dpass;
FinalPass m_final; FinalPass m_final;
Texture m_main_render_texture; Texture m_main_render_texture;
NonOwningPtr<class Texture> p_render_target;
}; };
} }

View File

@@ -9,8 +9,8 @@ namespace mlx
{ {
public: public:
SceneRenderer() = default; SceneRenderer() = default;
void Init(); void Init(NonOwningPtr<class Texture> render_target);
void Render(class Scene& scene, class Renderer& renderer); // TODO : add RTT support void Render(class Scene& scene, class Renderer& renderer);
void Destroy(); void Destroy();
~SceneRenderer() = default; ~SceneRenderer() = default;

View File

@@ -10,9 +10,8 @@ namespace mlx
m_has_window(false) m_has_window(false)
{ {
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
// TODO : re-enable render targets
m_renderer.Init(nullptr); m_renderer.Init(nullptr);
m_scene_renderer.Init(); m_scene_renderer.Init(render_target);
p_scene = std::make_unique<Scene>(); p_scene = std::make_unique<Scene>();
} }
@@ -24,7 +23,7 @@ namespace mlx
{ {
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
m_renderer.Init(p_window.get()); m_renderer.Init(p_window.get());
m_scene_renderer.Init(); m_scene_renderer.Init(nullptr);
p_scene = std::make_unique<Scene>(); p_scene = std::make_unique<Scene>();
} }

View File

@@ -41,7 +41,7 @@ namespace mlx
p_set = RenderCore::Get().GetDescriptorPoolManager().GetAvailablePool().RequestDescriptorSet(p_fragment_shader->GetShaderLayout().set_layouts[0].second, ShaderType::Fragment); 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<class Texture> final_target)
{ {
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
if(m_pipeline.GetPipeline() == VK_NULL_HANDLE) if(m_pipeline.GetPipeline() == VK_NULL_HANDLE)
@@ -49,7 +49,10 @@ namespace mlx
GraphicPipelineDescriptor pipeline_descriptor; GraphicPipelineDescriptor pipeline_descriptor;
pipeline_descriptor.vertex_shader = p_vertex_shader; pipeline_descriptor.vertex_shader = p_vertex_shader;
pipeline_descriptor.fragment_shader = p_fragment_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; pipeline_descriptor.no_vertex_inputs = true;
#ifdef DEBUG #ifdef DEBUG
m_pipeline.Init(pipeline_descriptor, "mlx_final_pass"); m_pipeline.Init(pipeline_descriptor, "mlx_final_pass");

View File

@@ -5,8 +5,10 @@
namespace mlx namespace mlx
{ {
void RenderPasses::Init() void RenderPasses::Init(NonOwningPtr<class Texture> render_target)
{ {
p_render_target = render_target;
m_2Dpass.Init(); m_2Dpass.Init();
m_final.Init(); m_final.Init();
func::function<void(const EventBase&)> functor = [this](const EventBase& event) func::function<void(const EventBase&)> functor = [this](const EventBase& event)
@@ -21,7 +23,11 @@ namespace mlx
{ {
if(!m_main_render_texture.IsInit()) 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 #ifdef DEBUG
m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, "mlx_renderpasses_target"); m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, "mlx_renderpasses_target");
#else #else
@@ -32,7 +38,7 @@ namespace mlx
m_main_render_texture.Clear(renderer.GetActiveCommandBuffer(), clear_color); m_main_render_texture.Clear(renderer.GetActiveCommandBuffer(), clear_color);
m_2Dpass.Pass(scene, renderer, m_main_render_texture); 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() void RenderPasses::Destroy()

View File

@@ -19,7 +19,8 @@ namespace mlx
{ {
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
p_window = window; 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++) for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
{ {
m_image_available_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice()); m_image_available_semaphores[i] = kvfCreateSemaphore(RenderCore::Get().GetDevice());
@@ -37,7 +38,8 @@ namespace mlx
{ {
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
kvfWaitForFence(RenderCore::Get().GetDevice(), m_cmd_fences[m_current_frame_index]); 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); RenderCore::Get().vkResetCommandBuffer(m_cmd_buffers[m_current_frame_index], 0);
kvfBeginCommandBuffer(m_cmd_buffers[m_current_frame_index], 0); kvfBeginCommandBuffer(m_cmd_buffers[m_current_frame_index], 0);
m_drawcalls = 0; m_drawcalls = 0;
@@ -50,8 +52,12 @@ namespace mlx
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
VkPipelineStageFlags wait_stages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; VkPipelineStageFlags wait_stages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
kvfEndCommandBuffer(m_cmd_buffers[m_current_frame_index]); 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); if(p_window)
m_swapchain.Present(m_render_finished_semaphores[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);
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; 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]); kvfDestroyFence(RenderCore::Get().GetDevice(), m_cmd_fences[i]);
DebugLog("Vulkan: fence destroyed"); DebugLog("Vulkan: fence destroyed");
} }
m_swapchain.Destroy(); if(p_window)
m_swapchain.Destroy();
} }
} }

View File

@@ -6,10 +6,10 @@
namespace mlx namespace mlx
{ {
void SceneRenderer::Init() void SceneRenderer::Init(NonOwningPtr<class Texture> render_target)
{ {
MLX_PROFILE_FUNCTION(); MLX_PROFILE_FUNCTION();
m_passes.Init(); m_passes.Init(render_target);
} }
void SceneRenderer::Render(Scene& scene, Renderer& renderer) void SceneRenderer::Render(Scene& scene, Renderer& renderer)