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:
@@ -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<class Texture> final_target);
|
||||
void Destroy();
|
||||
~FinalPass() = default;
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace mlx
|
||||
public:
|
||||
RenderPasses() = default;
|
||||
|
||||
void Init();
|
||||
void Init(NonOwningPtr<class Texture> 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<class Texture> p_render_target;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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<class Texture> render_target);
|
||||
void Render(class Scene& scene, class Renderer& renderer);
|
||||
void Destroy();
|
||||
~SceneRenderer() = default;
|
||||
|
||||
|
||||
@@ -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<Scene>();
|
||||
}
|
||||
|
||||
@@ -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<Scene>();
|
||||
}
|
||||
|
||||
|
||||
@@ -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<class Texture> 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");
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
void RenderPasses::Init()
|
||||
void RenderPasses::Init(NonOwningPtr<class Texture> render_target)
|
||||
{
|
||||
p_render_target = render_target;
|
||||
|
||||
m_2Dpass.Init();
|
||||
m_final.Init();
|
||||
func::function<void(const EventBase&)> 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()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
|
||||
namespace mlx
|
||||
{
|
||||
void SceneRenderer::Init()
|
||||
void SceneRenderer::Init(NonOwningPtr<class Texture> render_target)
|
||||
{
|
||||
MLX_PROFILE_FUNCTION();
|
||||
m_passes.Init();
|
||||
m_passes.Init(render_target);
|
||||
}
|
||||
|
||||
void SceneRenderer::Render(Scene& scene, Renderer& renderer)
|
||||
|
||||
Reference in New Issue
Block a user