Refactor platform

This commit is contained in:
Maximilian Ammann 2021-12-28 15:30:22 +01:00
parent 584f5956f9
commit dd591f42ce
10 changed files with 60 additions and 39 deletions

View File

@ -8,7 +8,6 @@ pub struct FPSMeter {
start: Instant, start: Instant,
next_report: Instant, next_report: Instant,
frame_count: u32, frame_count: u32,
pub time_secs: f64,
} }
impl FPSMeter { impl FPSMeter {
@ -18,14 +17,12 @@ impl FPSMeter {
start, start,
next_report: start + Duration::from_secs(1), next_report: start + Duration::from_secs(1),
frame_count: 0, frame_count: 0,
time_secs: 0.0,
} }
} }
pub fn update_and_print(&mut self) { pub fn update_and_print(&mut self) {
self.frame_count += 1; self.frame_count += 1;
let now = Instant::now(); let now = Instant::now();
self.time_secs = (now - self.start).as_secs_f64();
if now >= self.next_report { if now >= self.next_report {
info!("{} FPS", self.frame_count); info!("{} FPS", self.frame_count);
self.frame_count = 0; self.frame_count = 0;

View File

@ -1,5 +1,9 @@
pub use std::time::Instant;
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8Unorm;
#[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))] #[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))]
fn main() { pub fn main() {
use winit::event_loop::EventLoop; use winit::event_loop::EventLoop;
use winit::window::WindowBuilder; use winit::window::WindowBuilder;

View File

@ -1,8 +1,13 @@
use winit::event_loop::EventLoop; use winit::event_loop::EventLoop;
use winit::window::WindowBuilder; use winit::window::WindowBuilder;
pub use std::time::Instant;
// macOS and iOS (Metal)
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;
#[no_mangle] #[no_mangle]
fn mapr_apple_main() { pub fn mapr_apple_main() {
env_logger::init_from_env(env_logger::Env::default().default_filter_or("info")); env_logger::init_from_env(env_logger::Env::default().default_filter_or("info"));
let event_loop = EventLoop::new(); let event_loop = EventLoop::new();

5
src/platform/generic.rs Normal file
View File

@ -0,0 +1,5 @@
pub use std::time::Instant;
// Vulkan/OpenGL
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;

View File

@ -1,15 +1,37 @@
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
pub mod web; mod web;
#[cfg(target_arch = "aarch64")] #[cfg(target_arch = "aarch64")]
pub mod apple; mod apple;
#[cfg(target_os = "android")] #[cfg(target_os = "android")]
pub mod android; mod android;
#[cfg(not(any(
target_os = "android",
target_arch = "aarch64",
target_arch = "wasm32"
)))]
mod generic;
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
pub use instant::Instant; pub use web::*;
#[cfg(not(target_arch = "wasm32"))] #[cfg(target_arch = "aarch64")]
pub use std::time::Instant; pub use apple::*;
#[cfg(target_os = "android")]
pub use android::*;
#[cfg(not(any(
target_os = "android",
target_arch = "aarch64",
target_arch = "wasm32"
)))]
pub use generic::*;
// FIXME: This limit is enforced by WebGL. Actually this makes sense!
// FIXME: This can also be achieved by _pad attributes in shader_ffi.rs
pub const MIN_BUFFER_SIZE: u64 = 32;

View File

@ -17,6 +17,16 @@ use winit::window::{Window, WindowBuilder};
mod io; mod io;
mod wasm_experiment; mod wasm_experiment;
pub use instant::Instant;
// WebGPU
#[cfg(not(feature = "web-webgl"))]
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8Unorm;
// WebGL
#[cfg(feature = "web-webgl")]
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8UnormSrgb;
#[wasm_bindgen(start)] #[wasm_bindgen(start)]
pub fn start() { pub fn start() {
if let Err(_) = console_log::init_with_level(Level::Info) { if let Err(_) = console_log::init_with_level(Level::Info) {

View File

@ -2,7 +2,6 @@ mod piplines;
mod shader_ffi; mod shader_ffi;
mod tesselation; mod tesselation;
mod texture; mod texture;
mod platform_constants;
mod camera; mod camera;
pub mod state; pub mod state;

View File

@ -1,20 +0,0 @@
// WebGPU
#[cfg(all(target_arch = "wasm32", not(feature = "web-webgl")))]
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8Unorm;
// WebGL
#[cfg(all(target_arch = "wasm32", feature = "web-webgl"))]
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8UnormSrgb;
// Vulkan/OpenGL
#[cfg(target_os = "linux")]
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;
// macOS and iOS (Metal)
#[cfg(all(target_arch = "aarch64", not(target_os = "android")))]
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Bgra8UnormSrgb;
#[cfg(target_os = "android")]
pub const COLOR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8Unorm;
// FIXME: This limit is enforced by WebGL. Actually this makes sense!
// FIXME: This can also be achieved by _pad attributes in shader_ffi.rs
pub const MIN_BUFFER_SIZE: u64 = 32;

View File

@ -63,7 +63,7 @@ impl VertexShaderState {
} }
pub mod tile { pub mod tile {
use crate::render::platform_constants::COLOR_TEXTURE_FORMAT; use crate::platform::COLOR_TEXTURE_FORMAT;
use crate::render::shader_ffi::GpuVertexUniform; use crate::render::shader_ffi::GpuVertexUniform;
use super::{VertexShaderState, ColorTargetState, FragmentShaderState}; use super::{VertexShaderState, ColorTargetState, FragmentShaderState};
@ -103,7 +103,7 @@ pub mod tile {
pub mod tile_mask { pub mod tile_mask {
use crate::render::platform_constants::COLOR_TEXTURE_FORMAT; use crate::platform::COLOR_TEXTURE_FORMAT;
use crate::render::shader_ffi::GpuVertexUniform; use crate::render::shader_ffi::GpuVertexUniform;
use super::{VertexShaderState, ColorTargetState, FragmentShaderState}; use super::{VertexShaderState, ColorTargetState, FragmentShaderState};

View File

@ -19,7 +19,7 @@ use crate::render::camera::CameraController;
use crate::render::tesselation::TileMask; use crate::render::tesselation::TileMask;
use super::piplines::*; use super::piplines::*;
use super::platform_constants::{COLOR_TEXTURE_FORMAT, MIN_BUFFER_SIZE}; use crate::platform::{COLOR_TEXTURE_FORMAT, MIN_BUFFER_SIZE};
use super::shader_ffi::*; use super::shader_ffi::*;
use super::tesselation::Tesselated; use super::tesselation::Tesselated;
use super::texture::Texture; use super::texture::Texture;
@ -512,7 +512,6 @@ impl State {
if let Some(start) = self.scene.last_touch { if let Some(start) = self.scene.last_touch {
let delta_x = start.0 - touch.location.x; let delta_x = start.0 - touch.location.x;
let delta_y = start.1 - touch.location.y; let delta_y = start.1 - touch.location.y;
warn!("touch {} {} {}", delta_x, delta_y, window.scale_factor());
self.camera_controller.process_touch(delta_x / window.scale_factor(), delta_y / window.scale_factor()); self.camera_controller.process_touch(delta_x / window.scale_factor(), delta_y / window.scale_factor());
} }
@ -655,7 +654,6 @@ impl State {
pub fn update(&mut self, dt: std::time::Duration) { pub fn update(&mut self, dt: std::time::Duration) {
let scene = &mut self.scene; let scene = &mut self.scene;
let time_secs = self.fps_meter.time_secs as f32;
self.camera_controller.update_camera(&mut self.camera, dt); self.camera_controller.update_camera(&mut self.camera, dt);
@ -665,12 +663,13 @@ impl State {
// Animate the strokes of primitive // Animate the strokes of primitive
scene.cpu_primitives[STROKE_PRIM_ID as usize].width = scene.stroke_width; scene.cpu_primitives[STROKE_PRIM_ID as usize].width = scene.stroke_width;
/* scene.cpu_primitives[STROKE_PRIM_ID as usize].color = [ /*
scene.cpu_primitives[STROKE_PRIM_ID as usize].color = [
(time_secs * 0.8 - 1.6).sin() * 0.1 + 0.1, (time_secs * 0.8 - 1.6).sin() * 0.1 + 0.1,
(time_secs * 0.5 - 1.6).sin() * 0.1 + 0.1, (time_secs * 0.5 - 1.6).sin() * 0.1 + 0.1,
(time_secs - 1.6).sin() * 0.1 + 0.1, (time_secs - 1.6).sin() * 0.1 + 0.1,
1.0, 1.0,
]; ];
*/ */
self.fps_meter.update_and_print() self.fps_meter.update_and_print()
} }