diff options
Diffstat (limited to 'client/src/renderer.rs')
-rw-r--r-- | client/src/renderer.rs | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/client/src/renderer.rs b/client/src/renderer.rs index b4c2c05..2777526 100644 --- a/client/src/renderer.rs +++ b/client/src/renderer.rs @@ -15,14 +15,15 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ use crate::{ - camera::Camera, download::Downloader, scene_prepare::ScenePreparer, - scene_render::ScenePipeline, state::InputState, ui::UiRenderer, + camera::Camera, download::Downloader, interfaces::profiler::TimingProfiler, + scene_prepare::ScenePreparer, scene_render::ScenePipeline, state::InputState, ui::UiRenderer, }; use anyhow::{Result, anyhow}; use log::{info, warn}; use pollster::FutureExt; use std::{ - sync::Arc, + mem::swap, + sync::{Arc, Mutex}, thread::{sleep, spawn}, time::Duration, }; @@ -45,6 +46,8 @@ pub struct Renderer<'a> { pub scene_prepare: Arc<ScenePreparer>, surface_needs_reconfigure: bool, depth: TextureView, + pub timing: TimingProfiler, + pub timing_submit: Arc<Mutex<TimingProfiler>>, } impl<'a> Renderer<'a> { pub fn new(window: &'a Window, downloader: Arc<Downloader>) -> Result<Self> { @@ -138,6 +141,8 @@ impl<'a> Renderer<'a> { surface_configuration, ui_renderer, surface_needs_reconfigure: false, + timing: Default::default(), + timing_submit: Default::default(), }) } @@ -172,6 +177,7 @@ impl<'a> Renderer<'a> { camera: &Camera, input_state: &mut InputState, ) -> Result<()> { + self.timing.begin("prepare"); if self.surface_needs_reconfigure { self.surface .configure(&self.device, &self.surface_configuration); @@ -192,6 +198,7 @@ impl<'a> Renderer<'a> { let projection = camera.to_matrix(); + self.timing.checkpoint("draw scene"); self.scene_pipeline.draw( &mut commands, &target_view, @@ -201,6 +208,7 @@ impl<'a> Renderer<'a> { projection, ); + self.timing.checkpoint("draw ui"); self.ui_renderer.draw( &mut commands, &target_view, @@ -210,11 +218,18 @@ impl<'a> Renderer<'a> { &self.surface_configuration, ); + self.timing.checkpoint("submit"); let i = self.queue.submit(Some(commands.finish())); + self.timing.checkpoint("poll"); self.device.poll(MaintainBase::WaitForSubmissionIndex(i)); + self.timing.checkpoint("present"); target.present(); + self.timing.checkpoint(""); + + let mut ts = self.timing_submit.lock().unwrap(); + swap(&mut *ts, &mut self.timing); Ok(()) } } |