mirror of
https://github.com/exoticorn/microw8.git
synced 2026-01-20 11:16:42 +01:00
only draw area covered by framebuffer
This commit is contained in:
@@ -14,10 +14,11 @@ fn vs_main(
|
|||||||
@builtin(vertex_index) in_vertex_index: u32,
|
@builtin(vertex_index) in_vertex_index: u32,
|
||||||
) -> VertexOutput {
|
) -> VertexOutput {
|
||||||
var out: VertexOutput;
|
var out: VertexOutput;
|
||||||
let x = (1.0 - f32(in_vertex_index)) * 3.0;
|
let i = in_vertex_index / 3u + in_vertex_index % 3u;
|
||||||
let y = f32(in_vertex_index & 1u) * 3.0 - 1.0;
|
let x = -1.0 + f32(i % 2u) * 322.0;
|
||||||
out.clip_position = vec4<f32>(x, y, 0.0, 1.0);
|
let y = -1.0 + f32(i / 2u) * 242.0;
|
||||||
out.tex_coords = vec2<f32>(x, y) * uniforms.texture_scale.xy + vec2<f32>(160.0, 120.0);
|
out.clip_position = vec4<f32>((vec2<f32>(x, y) - vec2<f32>(160.0, 120.0)) / uniforms.texture_scale.xy, 0.0, 1.0);
|
||||||
|
out.tex_coords = vec2<f32>(x, y);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,10 +40,6 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
|
|||||||
let o = vec2<f32>(0.5) - (in.tex_coords - pixel);
|
let o = vec2<f32>(0.5) - (in.tex_coords - pixel);
|
||||||
let pixel = vec2<i32>(pixel);
|
let pixel = vec2<i32>(pixel);
|
||||||
|
|
||||||
if(pixel.x < -1 || pixel.y < -1 || pixel.x > 320 || pixel.y > 240) {
|
|
||||||
return vec4<f32>(0.0, 0.0, 0.0, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
let offset_x = o.xxxx + vec4<f32>(-0.125, 0.375, 0.125, -0.375) * uniforms.texture_scale.z;
|
let offset_x = o.xxxx + vec4<f32>(-0.125, 0.375, 0.125, -0.375) * uniforms.texture_scale.z;
|
||||||
let offset_y = o.yyyy + vec4<f32>(-0.375, -0.125, 0.375, 0.125) * uniforms.texture_scale.z;
|
let offset_y = o.yyyy + vec4<f32>(-0.375, -0.125, 0.375, 0.125) * uniforms.texture_scale.z;
|
||||||
|
|
||||||
|
|||||||
@@ -404,7 +404,12 @@ impl Window {
|
|||||||
view: &view,
|
view: &view,
|
||||||
resolve_target: None,
|
resolve_target: None,
|
||||||
ops: wgpu::Operations {
|
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,
|
store: true,
|
||||||
},
|
},
|
||||||
})],
|
})],
|
||||||
@@ -413,7 +418,7 @@ impl Window {
|
|||||||
|
|
||||||
render_pass.set_pipeline(&render_pipeline);
|
render_pass.set_pipeline(&render_pipeline);
|
||||||
render_pass.set_bind_group(0, &crt_bind_group, &[]);
|
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()));
|
queue.submit(std::iter::once(encoder.finish()));
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use std::time::{Duration, Instant};
|
use std::time::Instant;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
|
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);
|
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| {
|
uw8_window::run(true, move |gpu_framebuffer, _gamepads, _reset| {
|
||||||
|
for _ in 0..1 {
|
||||||
draw_frame(&mut framebuffer, start_time.elapsed().as_secs_f32());
|
draw_frame(&mut framebuffer, start_time.elapsed().as_secs_f32());
|
||||||
|
}
|
||||||
gpu_framebuffer.update(&framebuffer, bytemuck::cast_slice(&palette));
|
gpu_framebuffer.update(&framebuffer, bytemuck::cast_slice(&palette));
|
||||||
prev_frame += Duration::from_secs_f32(1.0 / 60.0);
|
fps_counter += 1;
|
||||||
prev_frame
|
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()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user