From a6d66152314caa769c5e5010b7276a7b96b209db Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sun, 10 Jul 2022 12:18:53 +0200 Subject: [PATCH] only draw area covered by framebuffer --- uw8-window/src/crt.wgsl | 13 +++++-------- uw8-window/src/gpu.rs | 9 +++++++-- uw8-window/src/main.rs | 21 +++++++++++++++------ 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/uw8-window/src/crt.wgsl b/uw8-window/src/crt.wgsl index 569568b..22400a0 100644 --- a/uw8-window/src/crt.wgsl +++ b/uw8-window/src/crt.wgsl @@ -14,10 +14,11 @@ fn vs_main( @builtin(vertex_index) in_vertex_index: u32, ) -> VertexOutput { var out: VertexOutput; - let x = (1.0 - f32(in_vertex_index)) * 3.0; - let y = f32(in_vertex_index & 1u) * 3.0 - 1.0; - out.clip_position = vec4(x, y, 0.0, 1.0); - out.tex_coords = vec2(x, y) * uniforms.texture_scale.xy + vec2(160.0, 120.0); + let i = in_vertex_index / 3u + in_vertex_index % 3u; + let x = -1.0 + f32(i % 2u) * 322.0; + let y = -1.0 + f32(i / 2u) * 242.0; + out.clip_position = vec4((vec2(x, y) - vec2(160.0, 120.0)) / uniforms.texture_scale.xy, 0.0, 1.0); + out.tex_coords = vec2(x, y); return out; } @@ -39,10 +40,6 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4 { let o = vec2(0.5) - (in.tex_coords - pixel); let pixel = vec2(pixel); - if(pixel.x < -1 || pixel.y < -1 || pixel.x > 320 || pixel.y > 240) { - return vec4(0.0, 0.0, 0.0, 1.0); - } - let offset_x = o.xxxx + vec4(-0.125, 0.375, 0.125, -0.375) * uniforms.texture_scale.z; let offset_y = o.yyyy + vec4(-0.375, -0.125, 0.375, 0.125) * uniforms.texture_scale.z; diff --git a/uw8-window/src/gpu.rs b/uw8-window/src/gpu.rs index 718a217..986b371 100644 --- a/uw8-window/src/gpu.rs +++ b/uw8-window/src/gpu.rs @@ -404,7 +404,12 @@ impl Window { view: &view, resolve_target: None, ops: wgpu::Operations { - load: wgpu::LoadOp::Load, + load: wgpu::LoadOp::Clear(wgpu::Color { + r: 0.0, + g: 0.0, + b: 0.0, + a: 1.0, + }), store: true, }, })], @@ -413,7 +418,7 @@ impl Window { render_pass.set_pipeline(&render_pipeline); render_pass.set_bind_group(0, &crt_bind_group, &[]); - render_pass.draw(0..3, 0..1); + render_pass.draw(0..6, 0..1); } queue.submit(std::iter::once(encoder.finish())); diff --git a/uw8-window/src/main.rs b/uw8-window/src/main.rs index b58f4f1..1bcf986 100644 --- a/uw8-window/src/main.rs +++ b/uw8-window/src/main.rs @@ -1,4 +1,4 @@ -use std::time::{Duration, Instant}; +use std::time::Instant; fn main() { env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); @@ -15,13 +15,22 @@ fn main() { palette[i as usize] = r + (g << 8) + (b << 16); } - let mut prev_frame = Instant::now(); + let mut fps_start = Instant::now(); + let mut fps_counter = 0; - uw8_window::run(move |gpu_framebuffer, _gamepads, _reset| { - draw_frame(&mut framebuffer, start_time.elapsed().as_secs_f32()); + uw8_window::run(true, move |gpu_framebuffer, _gamepads, _reset| { + for _ in 0..1 { + draw_frame(&mut framebuffer, start_time.elapsed().as_secs_f32()); + } gpu_framebuffer.update(&framebuffer, bytemuck::cast_slice(&palette)); - prev_frame += Duration::from_secs_f32(1.0 / 60.0); - prev_frame + fps_counter += 1; + let elapsed = fps_start.elapsed().as_secs_f32(); + if elapsed >= 1.0 { + println!("{:.1} fps", fps_counter as f32 / elapsed); + fps_start = Instant::now(); + fps_counter = 0; + } + Instant::now() }); }