Skip to content

Commit

Permalink
Switch to single pass rendering (#90)
Browse files Browse the repository at this point in the history
  • Loading branch information
PolyMeilex authored Sep 28, 2023
1 parent f721878 commit d677188
Show file tree
Hide file tree
Showing 10 changed files with 148 additions and 178 deletions.
20 changes: 9 additions & 11 deletions neothesia-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ impl Recorder {
.update(&self.gpu.queue, time_without_lead_in(&self.playback));

self.keyboard.update(&self.gpu.queue, &mut self.text);

self.text.update((self.width, self.height), &self.gpu);
}

fn render(
Expand All @@ -123,10 +125,11 @@ impl Recorder {
texture_desc: &wgpu::TextureDescriptor<'_>,
output_buffer: &wgpu::Buffer,
) {
self.gpu.clear(view, self.config.background_color.into());
let bg_color = self.config.background_color;
let bg_color = wgpu_jumpstart::Color::from(bg_color).into_linear_wgpu_color();

{
let mut render_pass = self
let mut rpass = self
.gpu
.encoder
.begin_render_pass(&wgpu::RenderPassDescriptor {
Expand All @@ -135,23 +138,18 @@ impl Recorder {
view,
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Load,
load: wgpu::LoadOp::Clear(bg_color),
store: true,
},
})],
depth_stencil_attachment: None,
});

self.waterfall
.render(&self.transform_uniform, &mut render_pass);

self.keyboard
.render(&self.transform_uniform, &mut render_pass);
self.waterfall.render(&self.transform_uniform, &mut rpass);
self.keyboard.render(&self.transform_uniform, &mut rpass);
self.text.render(&mut rpass);
}

self.text
.render((self.width, self.height), &mut self.gpu, view);

{
let u32_size = std::mem::size_of::<u32>() as u32;

Expand Down
4 changes: 2 additions & 2 deletions neothesia-core/src/render/background_animation/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ pub struct BgPipeline {
time_uniform: Uniform<TimeUniform>,
}

impl<'a> BgPipeline {
impl BgPipeline {
pub fn new(gpu: &Gpu) -> Self {
let shader = gpu
.device
Expand Down Expand Up @@ -56,7 +56,7 @@ impl<'a> BgPipeline {
}
}

pub fn render(&'a self, render_pass: &mut wgpu::RenderPass<'a>) {
pub fn render<'a>(&'a self, render_pass: &mut wgpu::RenderPass<'a>) {
render_pass.set_pipeline(&self.render_pipeline);
render_pass.set_bind_group(0, &self.time_uniform.bind_group, &[]);

Expand Down
22 changes: 5 additions & 17 deletions neothesia-core/src/render/text/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ impl TextRenderer {
});
}

pub fn render(&mut self, logical_size: (u32, u32), gpu: &mut Gpu, view: &wgpu::TextureView) {
pub fn update(&mut self, logical_size: (u32, u32), gpu: &Gpu) {
let elements = self.queue.iter().map(|area| glyphon::TextArea {
buffer: &area.buffer,
left: area.left,
Expand All @@ -142,22 +142,10 @@ impl TextRenderer {
)
.unwrap();

// TODO: Use single pass, now that this is posible thanks to glyphon
let mut pass = gpu.encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("glyphon text"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view,
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Load,
store: true,
},
})],
depth_stencil_attachment: None,
});

self.text_renderer.render(&self.atlas, &mut pass).unwrap();

self.queue.clear();
}

pub fn render<'rpass>(&'rpass mut self, render_pass: &mut wgpu::RenderPass<'rpass>) {
self.text_renderer.render(&self.atlas, render_pass).unwrap();
}
}
103 changes: 71 additions & 32 deletions neothesia/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ mod scene;
mod target;
mod utils;

use std::time::Duration;

use iced_core::Renderer;
use scene::{menu_scene, playing_scene, Scene};
use target::Target;
use utils::window::WindowState;
Expand Down Expand Up @@ -38,10 +41,10 @@ pub enum NeothesiaEvent {
struct Neothesia {
target: Target,
surface: Surface,

last_time: std::time::Instant,
fps_timer: fps_ticker::Fps,
game_scene: Box<dyn Scene>,

#[cfg(debug_assertions)]
fps_ticker: fps_ticker::Fps,
}

impl Neothesia {
Expand All @@ -55,9 +58,10 @@ impl Neothesia {
Self {
target,
surface,
last_time: std::time::Instant::now(),
fps_timer: Default::default(),
game_scene: Box::new(game_scene),

#[cfg(debug_assertions)]
fps_ticker: fps_ticker::Fps::default(),
}
}

Expand Down Expand Up @@ -114,6 +118,8 @@ impl Neothesia {
fn neothesia_event(&mut self, event: NeothesiaEvent, control_flow: &mut ControlFlow) {
match event {
NeothesiaEvent::Play(midi_file) => {
self.target.iced_manager.renderer.clear();

let to = playing_scene::PlayingScene::new(&self.target, midi_file);
self.game_scene = Box::new(to);
}
Expand All @@ -131,16 +137,18 @@ impl Neothesia {
}
}

fn update(&mut self) {
self.fps_timer.tick();

let delta = self.last_time.elapsed();
self.last_time = std::time::Instant::now();
fn update(&mut self, delta: Duration) {
#[cfg(debug_assertions)]
{
self.fps_ticker.tick();
self.target.text_renderer.queue_fps(self.fps_ticker.avg());
}

self.game_scene.update(&mut self.target, delta);

#[cfg(debug_assertions)]
self.target.text_renderer.queue_fps(self.fps_timer.avg());
self.target.text_renderer.update(
self.target.window_state.physical_size.into(),
&self.target.gpu,
);
}

fn render(&mut self) {
Expand All @@ -156,20 +164,48 @@ impl Neothesia {
.texture
.create_view(&wgpu::TextureViewDescriptor::default());

{
let bg_color = self.target.config.background_color;
let bg_color = wgpu_jumpstart::Color::from(bg_color).into_linear_wgpu_color();
let mut rpass =
self.target
.gpu
.encoder
.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("Main Neothesia Pass"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view,
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Clear(bg_color),
store: true,
},
})],

depth_stencil_attachment: None,
});

self.game_scene.render(&self.target.transform, &mut rpass);
self.target.text_renderer.render(&mut rpass);
}

self.target
.gpu
.clear(view, self.target.config.background_color.into());

self.game_scene.render(&mut self.target, view);

self.target.text_renderer.render(
(
self.target.window_state.physical_size.width,
self.target.window_state.physical_size.height,
),
&mut self.target.gpu,
view,
);
.iced_manager
.renderer
.with_primitives(|backend, primitive| {
if !primitive.is_empty() {
backend.present(
&self.target.gpu.device,
&self.target.gpu.queue,
&mut self.target.gpu.encoder,
None,
view,
primitive,
&self.target.iced_manager.viewport,
&self.target.iced_manager.debug.overlay(),
);
}
});

self.target.gpu.submit();
frame.present();
Expand All @@ -188,6 +224,8 @@ fn main() {

let mut app = Neothesia::new(target, surface);

let mut last_time = std::time::Instant::now();

// Investigate:
// https://github.com/gfx-rs/wgpu-rs/pull/306

Expand All @@ -197,18 +235,19 @@ fn main() {
Event::UserEvent(event) => {
app.neothesia_event(event, control_flow);
}
Event::MainEventsCleared => {
app.game_scene.main_events_cleared(&mut app.target);

app.update();
app.target.window.request_redraw();
}
Event::WindowEvent { event, .. } => {
app.window_event(&event, control_flow);
}
Event::RedrawRequested(_) => {
let delta = last_time.elapsed();
last_time = std::time::Instant::now();

app.update(delta);
app.render();
}
Event::RedrawEventsCleared => {
app.target.window.request_redraw();
}
_ => {}
}
});
Expand Down
Loading

0 comments on commit d677188

Please sign in to comment.