Vsync instead of fps + print display modes
authorTomas Wenström <tomas.wenstrom@gmail.com>
Tue, 5 Jan 2021 14:56:48 +0000 (15:56 +0100)
committerTomas Wenström <tomas.wenstrom@gmail.com>
Tue, 5 Jan 2021 14:56:48 +0000 (15:56 +0100)
src/game/app.rs
src/main.rs

index b37e8fd..362af2e 100644 (file)
@@ -1,11 +1,11 @@
 use rand::Rng;
 use sdl2::event::Event;
-use sdl2::EventPump;
+use sdl2::{EventPump, VideoSubsystem};
 use sdl2::keyboard::Keycode;
 use sdl2::pixels::Color;
 use sdl2::render::BlendMode;
 use sdl2::render::Canvas;
-use sdl2::video::Window;
+use sdl2::video::{SwapInterval, Window};
 
 use ::{SCREEN_HEIGHT, SCREEN_WIDTH};
 use boll::*;
@@ -19,7 +19,6 @@ pub type Nanoseconds = u64;
 #[derive(Default)]
 pub struct AppBuilder {
     resolution: Rect<u16>,
-    fps: u8,
     state: Option<Box<dyn AppState>>,
     title: Option<String>,
 }
@@ -30,12 +29,6 @@ impl AppBuilder {
        self
     }
 
-    pub fn with_fps(mut self, fps: u8) -> Self {
-       unimplemented!()
-       // self.fps = fps;
-       // self
-    }
-
     pub fn with_state(mut self, state: Box<dyn AppState>) -> Self {
        self.state = Some(state);
        self
@@ -46,13 +39,18 @@ impl AppBuilder {
        self
     }
 
-    pub fn start(self) -> App {
+    pub fn build(self) -> Result<App, String> {
         let context = sdl2::init().unwrap();
-        sdl2::image::init(sdl2::image::InitFlag::PNG).unwrap();
-        let window = context
-           .video().unwrap()
+        sdl2::image::init(sdl2::image::InitFlag::PNG)?;
+       let video = context.video()?;
+
+       self.print_video_display_modes(&video);
+
+        let window = video
            .window(&self.title.unwrap(), self.resolution.width.into(), self.resolution.height.into())
             .position_centered()
+       // .fullscreen()
+       // .fullscreen_desktop()
             .opengl()
             .build().unwrap();
         context.mouse().show_cursor(false);
@@ -63,15 +61,33 @@ impl AppBuilder {
         canvas.clear();
         canvas.present();
 
-        let event_pump = context.event_pump().unwrap();
+       video.gl_set_swap_interval(SwapInterval::VSync)?;
+
+        let event_pump = context.event_pump()?;
         let sprites = SpriteManager::new(canvas.texture_creator());
 
-        App {
+        Ok(App {
             canvas,
             event_pump,
             sprites,
             state: self.state.unwrap_or(Box::new(ActiveState::new())),
-        }
+        })
+    }
+
+    fn print_video_display_modes(&self, video: &VideoSubsystem) {
+       println!("video subsystem: {:?}", video);
+       println!("current_video_driver: {:?}", video.current_video_driver());
+       for display in 0..video.num_video_displays().unwrap() {
+           println!("=== display {} - {} ===", display, video.display_name(display).unwrap());
+           println!(" display_bounds: {:?}", video.display_bounds(display).unwrap());
+           println!(" num_display_modes: {:?}", video.num_display_modes(display).unwrap());
+           println!(" desktop_display_mode: {:?}", video.desktop_display_mode(display).unwrap());
+           println!(" current_display_mode: {:?}", video.current_display_mode(display).unwrap());
+           for mode in 0..video.num_display_modes(display).unwrap() {
+               println!("  {:2}: {:?}", mode, video.display_mode(display, mode).unwrap());
+           }
+       }
+       println!("swap interval: {:?}", video.gl_get_swap_interval());
     }
 }
 
index 31f9d3b..217918c 100644 (file)
@@ -30,10 +30,10 @@ fn main() {
     println!("starting...");
     let mut app = App::new()
        .with_resolution(SCREEN_WIDTH as u16, SCREEN_HEIGHT as u16)
-       .with_fps(60)
        .with_state(Box::new(ActiveState::new()))
        .with_title("SDL test")
-       .start();
+       .build()
+       .unwrap();
     app.load_sprites(&[
         ("block", "res/block.bmp"),
         ("mario", "res/mario-trans.png"),