From 0c587e1f2fc99c4560831451e3d9afa43fef6320 Mon Sep 17 00:00:00 2001 From: Krzysztof Jakubowski Date: Sat, 19 Oct 2024 11:12:49 +0200 Subject: [PATCH] Saving PerfAnalyzer show/hide state; Creating renderers on demand --- libfwk | 2 +- src/lucid_app.cpp | 38 +++++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/libfwk b/libfwk index 859dc8c..22acd02 160000 --- a/libfwk +++ b/libfwk @@ -1 +1 @@ -Subproject commit 859dc8cb16cb8a3b26ef2d8ffd1ff220ccbae8b3 +Subproject commit 22acd026b51c33cad79ded04dc69566c8a1b5e00 diff --git a/src/lucid_app.cpp b/src/lucid_app.cpp index e488ed0..7d126a3 100644 --- a/src/lucid_app.cpp +++ b/src/lucid_app.cpp @@ -35,6 +35,8 @@ #include #include +// TODO: device lost crash when resizing window with path tracer + FilePath mainPath() { return platform == Platform::msvc ? FilePath::current().get() : executablePath().parent(); } @@ -114,9 +116,15 @@ void LucidApp::setConfig(const AnyConfig &config) { m_select_stats_tab = config.get("selected_stats_tab", -1); if(auto *scene_name = config.get("scene")) selectSetup(*scene_name); - if(m_perf_analyzer) + if(config.get("show_perf_analyzer", true)) { + if(!m_perf_analyzer) + m_perf_analyzer.emplace(); if(auto *sub = config.subConfig("perf_analyzer")) m_perf_analyzer->setConfig(*sub); + } else { + m_perf_analyzer.reset(); + } + if(auto *sub = config.subConfig("gui")) m_gui.setConfig(*sub); if(auto *lighting = config.subConfig("lighting")) @@ -150,7 +158,7 @@ void LucidApp::saveConfig() const { out.set("window_maximized", is_maximized); out.set("show_stats", m_show_stats); out.set("selected_stats_tab", m_selected_stats_tab); - + out.set("show_perf_analyzer", !!m_perf_analyzer); if(m_setup_idx != -1) out.set("scene", m_setups[m_setup_idx]->name); if(m_perf_analyzer) @@ -214,8 +222,7 @@ bool LucidApp::updateViewport() { Ex LucidApp::updateRenderer() { PERF_SCOPE(); - bool do_update = !m_pbr_renderer || !m_simple_renderer || !m_lucid_renderer || - m_lucid_renderer->opts() != m_lucid_opts; + bool do_update = m_lucid_renderer && m_lucid_renderer->opts() != m_lucid_opts; if(updateViewport()) do_update = true; @@ -235,20 +242,11 @@ Ex LucidApp::updateRenderer() { } if(do_update) { - auto swap_chain = m_device->swapChain(); m_lucid_renderer.reset(); m_simple_renderer.reset(); m_pbr_renderer.reset(); m_path_tracer.reset(); m_device->waitForIdle(); - - m_pbr_renderer = EX_PASS( - construct(m_device, *m_shader_compiler, m_viewport, swap_chain->format())); - m_simple_renderer = EX_PASS(construct(m_device, *m_shader_compiler, - m_viewport, swap_chain->format())); - m_lucid_renderer = EX_PASS(construct( - *m_device, *m_shader_compiler, swap_chain->format(), m_lucid_opts, m_viewport.size())); - m_last_shader_update_time = m_last_time; m_scene_frame_id = 0; } @@ -258,6 +256,20 @@ Ex LucidApp::updateRenderer() { m_rendering_mode = RenderingMode::simple; } + auto swap_chain = m_device->swapChain(); + + if(m_rendering_mode == RenderingMode::pbr && !m_pbr_renderer) + m_pbr_renderer = EX_PASS( + construct(m_device, *m_shader_compiler, m_viewport, swap_chain->format())); + + if(isOneOf(m_rendering_mode, RenderingMode::simple, RenderingMode::mixed) && !m_simple_renderer) + m_simple_renderer = EX_PASS(construct(m_device, *m_shader_compiler, + m_viewport, swap_chain->format())); + + if(isOneOf(m_rendering_mode, RenderingMode::lucid, RenderingMode::mixed) && !m_lucid_renderer) + m_lucid_renderer = EX_PASS(construct( + *m_device, *m_shader_compiler, swap_chain->format(), m_lucid_opts, m_viewport.size())); + if(m_rendering_mode == RenderingMode::path_trace && !m_path_tracer) { auto format = m_device->swapChain()->format(); m_path_tracer = EX_PASS(construct(*m_device, *m_shader_compiler, format,