mirror of
https://github.com/seekrs/MacroLibX.git
synced 2026-01-11 14:43:34 +00:00
working on rtt
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,6 +49,9 @@ 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;
|
||||||
|
if(final_target)
|
||||||
|
pipeline_descriptor.color_attachments = { final_target };
|
||||||
|
else
|
||||||
pipeline_descriptor.renderer = &renderer;
|
pipeline_descriptor.renderer = &renderer;
|
||||||
pipeline_descriptor.no_vertex_inputs = true;
|
pipeline_descriptor.no_vertex_inputs = true;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ namespace mlx
|
|||||||
{
|
{
|
||||||
MLX_PROFILE_FUNCTION();
|
MLX_PROFILE_FUNCTION();
|
||||||
p_window = window;
|
p_window = window;
|
||||||
|
if(p_window)
|
||||||
m_swapchain.Init(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++)
|
||||||
{
|
{
|
||||||
@@ -37,6 +38,7 @@ 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]);
|
||||||
|
if(p_window)
|
||||||
m_swapchain.AquireFrame(m_image_available_semaphores[m_current_frame_index]);
|
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);
|
||||||
@@ -50,7 +52,11 @@ 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]);
|
||||||
|
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);
|
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_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");
|
||||||
}
|
}
|
||||||
|
if(p_window)
|
||||||
m_swapchain.Destroy();
|
m_swapchain.Destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user