@@ -24,6 +24,8 @@ pub fn init() {
2424 SCREEN_INFO . call_once ( || SCREEN . with_locked ( |screen| * screen. info ( ) ) ) ;
2525}
2626
27+ #[ must_use]
28+ #[ inline]
2729/// Returns the screen info.
2830///
2931/// # Panics
@@ -33,29 +35,33 @@ fn screen_info() -> &'static Info {
3335 SCREEN_INFO . get ( ) . unwrap ( )
3436}
3537
38+ #[ inline]
3639fn with_screen < R , F : FnOnce ( & mut FrameBuffer ) -> R > ( f : F ) -> R {
3740 SCREEN . with_locked ( f)
3841}
3942
4043/// Draw the Doom framebuffer to the screen
4144pub fn draw ( ) {
42- let fb_start = unsafe { doom_get_framebuffer ( CHANNELS . try_into ( ) . unwrap ( ) ) } ;
43- let fb_raw = core:: ptr:: slice_from_raw_parts ( fb_start, SCREENWIDTH * SCREENHEIGHT * CHANNELS ) ;
45+ let fb_start = unsafe { doom_get_framebuffer ( CHANNELS as i32 ) } ;
4446
45- let Some ( fb) = ( unsafe { fb_raw. as_ref ( ) } ) else {
46- beskar_lib:: println!( "Warning: Doom framebuffer is not initialized" ) ;
47- return ;
48- } ;
47+ let info = screen_info ( ) ;
48+ let stride_bytes = usize:: from ( info. stride ( ) ) * usize:: from ( info. bytes_per_pixel ( ) ) ;
49+ let row_size = SCREENWIDTH * CHANNELS ;
4950
50- let stride = usize:: from ( screen_info ( ) . stride ( ) ) ;
51- let bpp = usize:: from ( screen_info ( ) . bytes_per_pixel ( ) ) ;
52- let stride_bytes = stride * bpp;
5351 with_screen ( |screen| {
54- let mut buffer_mut = screen. buffer_mut ( ) ;
55- for row in fb. chunks_exact ( SCREENWIDTH * CHANNELS ) {
56- buffer_mut[ ..SCREENWIDTH * CHANNELS ] . copy_from_slice ( row) ;
57- buffer_mut = & mut buffer_mut[ stride_bytes..] ;
52+ let dst = screen. buffer_mut ( ) . as_mut_ptr ( ) ;
53+ let src = fb_start;
54+
55+ for y in 0 ..SCREENHEIGHT {
56+ unsafe {
57+ core:: ptr:: copy_nonoverlapping (
58+ src. add ( y * row_size) ,
59+ dst. add ( y * stride_bytes) ,
60+ row_size,
61+ ) ;
62+ }
5863 }
59- let _ = screen. flush_rows ( 0 ..u16:: try_from ( SCREENHEIGHT ) . unwrap ( ) ) ;
64+
65+ let _ = screen. flush_rows ( 0 ..SCREENHEIGHT as u16 ) ;
6066 } ) ;
6167}
0 commit comments