From a750cb8e16f3126f81d58d13f7e0defbf312869c Mon Sep 17 00:00:00 2001 From: Michel Heily Date: Thu, 15 Sep 2022 00:34:41 +0300 Subject: [PATCH] Cleanup sdl2 desktop app Former-commit-id: abc58c25406c6a16efa8acf771ebe2bc95343236 Former-commit-id: 90fbe62bbdd7758fe582280d499a4d23440c7fb5 --- platform/rustboyadvance-sdl2/Cargo.toml | 8 +-- platform/rustboyadvance-sdl2/src/main.rs | 87 ++--------------------- platform/rustboyadvance-sdl2/src/video.rs | 60 +++++++++++----- 3 files changed, 54 insertions(+), 101 deletions(-) diff --git a/platform/rustboyadvance-sdl2/Cargo.toml b/platform/rustboyadvance-sdl2/Cargo.toml index 5b46185..54d2f9c 100644 --- a/platform/rustboyadvance-sdl2/Cargo.toml +++ b/platform/rustboyadvance-sdl2/Cargo.toml @@ -19,7 +19,7 @@ spin_sleep = "0.3.7" [target.'cfg(windows)'.build-dependencies] winres = "0.1" -[features] -default = ["gdb"] -debugger = ["rustboyadvance-core/debugger"] -gdb = ["rustboyadvance-core/gdb"] \ No newline at end of file +# [features] +# default = ["gdb"] +# debugger = ["rustboyadvance-core/debugger"] +# gdb = ["rustboyadvance-core/gdb"] \ No newline at end of file diff --git a/platform/rustboyadvance-sdl2/src/main.rs b/platform/rustboyadvance-sdl2/src/main.rs index d082608..6bab3dc 100644 --- a/platform/rustboyadvance-sdl2/src/main.rs +++ b/platform/rustboyadvance-sdl2/src/main.rs @@ -1,15 +1,8 @@ use sdl2::controller::Button; -use sdl2::event::{Event, WindowEvent}; -use sdl2::image::{InitFlag, LoadSurface, LoadTexture}; +use sdl2::event::Event; use sdl2::keyboard::Scancode; -use sdl2::pixels::Color; -use sdl2::rect::Rect; -use sdl2::render::WindowCanvas; -use sdl2::surface::Surface; use sdl2::{self}; -use sdl2::EventPump; - use bytesize; use spin_sleep; use structopt::StructOpt; @@ -17,7 +10,6 @@ use structopt::StructOpt; use std::fs; use std::io::Cursor; use std::path::Path; -use std::process; use std::time; #[macro_use] @@ -30,8 +22,6 @@ mod input; mod options; mod video; -use video::{SCREEN_HEIGHT, SCREEN_WIDTH}; - use rustboyadvance_core::prelude::*; use rustboyadvance_utils::FpsCounter; @@ -39,53 +29,6 @@ use rustboyadvance_utils::FpsCounter; const LOG_DIR: &str = ".logs"; const DEFAULT_GDB_SERVER_ADDR: &'static str = "localhost:1337"; -const CANVAS_WIDTH: u32 = SCREEN_WIDTH; -const CANVAS_HEIGHT: u32 = SCREEN_HEIGHT; - - -/// Waits for the user to drag a rom file to window -fn wait_for_rom(canvas: &mut WindowCanvas, event_pump: &mut EventPump) -> Result { - let texture_creator = canvas.texture_creator(); - let icon_texture = texture_creator - .load_texture("assets/icon_cropped_small.png") - .expect("failed to load icon"); - let background = Color::RGB(0xDD, 0xDD, 0xDD); - - let mut redraw = || -> Result<(), String> { - canvas.set_draw_color(background); - canvas.clear(); - canvas.copy( - &icon_texture, - None, - Some(Rect::from_center( - ((CANVAS_WIDTH / 2) as i32, (CANVAS_HEIGHT / 2) as i32), - 160, - 100, - )), - )?; - canvas.present(); - Ok(()) - }; - - redraw()?; - - loop { - for event in event_pump.wait_iter() { - match event { - Event::DropFile { filename, .. } => { - return Ok(filename); - } - Event::Quit { .. } => process::exit(0), - Event::Window { win_event, .. } => match win_event { - WindowEvent::SizeChanged(..) | WindowEvent::Restored => redraw()?, - _ => {} - }, - _ => {} - } - } - } -} - fn ask_download_bios() { const OPEN_SOURCE_BIOS_URL: &'static str = "https://github.com/Nebuleon/ReGBA/raw/master/bios/gba_bios.bin"; @@ -119,23 +62,6 @@ fn main() -> Result<(), Box> { info!("Initializing SDL2 context"); let sdl_context = sdl2::init().expect("failed to initialize sdl2"); - let mut event_pump = sdl_context.event_pump()?; - - let video_subsystem = sdl_context.video()?; - let _image_context = sdl2::image::init(InitFlag::PNG | InitFlag::JPG)?; - let mut window = video_subsystem - .window("RustBoyAdvance", SCREEN_WIDTH * 3, SCREEN_HEIGHT * 3) - .opengl() - .position_centered() - .resizable() - .build()?; - - let window_icon = Surface::from_file("assets/icon.png")?; - window.set_icon(window_icon); - - let mut canvas = window.into_canvas().accelerated().build()?; - canvas.set_logical_size(CANVAS_WIDTH, CANVAS_HEIGHT)?; - let controller_subsystem = sdl_context.game_controller()?; let controller_mappings = include_str!("../../../external/SDL_GameControllerDB/gamecontrollerdb.txt"); @@ -157,17 +83,17 @@ fn main() -> Result<(), Box> { } }; - let mut renderer = video::Renderer::from_canvas(canvas); + let mut renderer = video::init(&sdl_context)?; let (audio_interface, mut _sdl_audio_device) = audio::create_audio_player(&sdl_context)?; let mut rom_name = opts.rom_name(); let bios_bin = load_bios(&opts.bios); - let mut gba = GameBoyAdvance::new( + let mut gba = Box::new(GameBoyAdvance::new( bios_bin.clone(), opts.cartridge_from_opts()?, audio_interface, - ); + )); if opts.skip_bios { gba.skip_bios(); @@ -179,7 +105,8 @@ fn main() -> Result<(), Box> { let mut vsync = true; let mut fps_counter = FpsCounter::default(); - let frame_time = time::Duration::new(0, 1_000_000_000u32 / 60); + const FRAME_TIME: time::Duration = time::Duration::new(0, 1_000_000_000u32 / 60); + let mut event_pump = sdl_context.event_pump()?; 'running: loop { let start_time = time::Instant::now(); @@ -279,7 +206,7 @@ fn main() -> Result<(), Box> { if vsync { let time_passed = start_time.elapsed(); - let delay = frame_time.checked_sub(time_passed); + let delay = FRAME_TIME.checked_sub(time_passed); match delay { None => {} Some(delay) => { diff --git a/platform/rustboyadvance-sdl2/src/video.rs b/platform/rustboyadvance-sdl2/src/video.rs index 45ca50f..90e7218 100644 --- a/platform/rustboyadvance-sdl2/src/video.rs +++ b/platform/rustboyadvance-sdl2/src/video.rs @@ -1,7 +1,10 @@ +use sdl2::image::{InitFlag, LoadSurface, Sdl2ImageContext}; use sdl2::pixels::{Color, PixelFormatEnum}; use sdl2::rect::Rect; use sdl2::render::{Texture, TextureCreator, WindowCanvas}; +use sdl2::surface::Surface; use sdl2::video::WindowContext; +use sdl2::{Sdl, VideoSubsystem}; use rustboyadvance_core::gpu::{DISPLAY_HEIGHT, DISPLAY_WIDTH}; @@ -9,27 +12,50 @@ pub const SCREEN_WIDTH: u32 = DISPLAY_WIDTH as u32; pub const SCREEN_HEIGHT: u32 = DISPLAY_HEIGHT as u32; pub struct Renderer<'a> { - _tc: TextureCreator, // only kept alive because of the texture - texture: Texture<'a>, // TODO - what happens if _tc is destroyed first ? + texture: Texture<'a>, // TODO - what happens if _tc is destroyed first ? canvas: WindowCanvas, + #[allow(unused)] + tc: TextureCreator, // only kept alive because of the texture + #[allow(unused)] + video_subsystem: VideoSubsystem, // holds a reference to the video subsystem + #[allow(unused)] + image_context: Sdl2ImageContext, +} + +pub fn init<'a>(sdl_context: &'a Sdl) -> Result, Box> { + let video_subsystem = sdl_context.video()?; + let image_context = sdl2::image::init(InitFlag::PNG | InitFlag::JPG)?; + let mut window = video_subsystem + .window("RustBoyAdvance", SCREEN_WIDTH * 3, SCREEN_HEIGHT * 3) + .opengl() + .position_centered() + .resizable() + .build()?; + + let window_icon = Surface::from_file("assets/icon.png")?; + window.set_icon(window_icon); + + let mut canvas = window.into_canvas().accelerated().build()?; + canvas.set_logical_size(SCREEN_WIDTH, SCREEN_HEIGHT)?; + + let mut tc = canvas.texture_creator(); + let texture = unsafe { + let tc_ptr = &mut tc as *mut TextureCreator; + (*tc_ptr) + .create_texture_streaming(PixelFormatEnum::BGRA32, SCREEN_WIDTH, SCREEN_HEIGHT) + .unwrap() + }; + + Ok(Renderer { + tc, + texture, + canvas, + video_subsystem, + image_context, + }) } impl<'a> Renderer<'a> { - pub fn from_canvas(canvas: WindowCanvas) -> Renderer<'a> { - let mut tc = canvas.texture_creator(); - let texture = unsafe { - let tc_ptr = &mut tc as *mut TextureCreator; - (*tc_ptr) - .create_texture_streaming(PixelFormatEnum::BGRA32, SCREEN_WIDTH, SCREEN_HEIGHT) - .unwrap() - }; - Renderer { - _tc: tc, - texture, - canvas, - } - } - pub fn set_window_title(&mut self, title: &str) { self.canvas.window_mut().set_title(&title).unwrap(); }