Optimise SDL2 rendering code
Former-commit-id: 4a0e4f57a97c98bc8a930901bd1ba2125d96138b
This commit is contained in:
parent
3c7a734270
commit
cb630ffb8e
|
@ -1,11 +1,10 @@
|
||||||
use sdl2::pixels::{Color, PixelFormatEnum};
|
use sdl2::pixels::{Color, PixelFormatEnum};
|
||||||
use sdl2::rect::{Point, Rect};
|
use sdl2::rect::Rect;
|
||||||
use sdl2::render::{TextureCreator, WindowCanvas};
|
use sdl2::render::{TextureCreator, WindowCanvas};
|
||||||
use sdl2::video::WindowContext;
|
use sdl2::video::WindowContext;
|
||||||
use sdl2::Sdl;
|
use sdl2::Sdl;
|
||||||
|
|
||||||
use rustboyadvance_ng::core::gpu::{DISPLAY_HEIGHT, DISPLAY_WIDTH};
|
use rustboyadvance_ng::core::gpu::{DISPLAY_HEIGHT, DISPLAY_WIDTH};
|
||||||
use rustboyadvance_ng::util::FpsCounter;
|
|
||||||
use rustboyadvance_ng::VideoInterface;
|
use rustboyadvance_ng::VideoInterface;
|
||||||
|
|
||||||
const SCREEN_WIDTH: u32 = DISPLAY_WIDTH as u32;
|
const SCREEN_WIDTH: u32 = DISPLAY_WIDTH as u32;
|
||||||
|
@ -15,12 +14,11 @@ const SCALE: u32 = 3; // TODO control via CLI & support window resize
|
||||||
pub struct Sdl2Video {
|
pub struct Sdl2Video {
|
||||||
tc: TextureCreator<WindowContext>,
|
tc: TextureCreator<WindowContext>,
|
||||||
canvas: WindowCanvas,
|
canvas: WindowCanvas,
|
||||||
fps_counter: FpsCounter,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Sdl2Video {
|
impl Sdl2Video {
|
||||||
pub fn set_window_title(&mut self, title: &str) {
|
pub fn set_window_title(&mut self, title: &str) {
|
||||||
self.canvas.window_mut().set_title(&title);
|
self.canvas.window_mut().set_title(&title).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,19 +26,14 @@ impl VideoInterface for Sdl2Video {
|
||||||
fn render(&mut self, buffer: &[u32]) {
|
fn render(&mut self, buffer: &[u32]) {
|
||||||
let mut texture = self
|
let mut texture = self
|
||||||
.tc
|
.tc
|
||||||
.create_texture_target(PixelFormatEnum::RGB24, SCREEN_WIDTH, SCREEN_HEIGHT)
|
.create_texture_streaming(PixelFormatEnum::BGRA32, SCREEN_WIDTH, SCREEN_HEIGHT)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.canvas
|
texture
|
||||||
.with_texture_canvas(&mut texture, |texture_canvas| {
|
.update(
|
||||||
for y in 0i32..(SCREEN_HEIGHT as i32) {
|
None,
|
||||||
for x in 0i32..(SCREEN_WIDTH as i32) {
|
unsafe { std::mem::transmute::<&[u32], &[u8]>(buffer) },
|
||||||
let c = buffer[index2d!(x, y, SCREEN_WIDTH as i32) as usize];
|
(SCREEN_WIDTH as usize) * 4,
|
||||||
let color = Color::RGB((c >> 16) as u8, (c >> 8) as u8, c as u8);
|
)
|
||||||
texture_canvas.set_draw_color(color);
|
|
||||||
let _ = texture_canvas.draw_point(Point::from((x, y)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
self.canvas
|
self.canvas
|
||||||
.copy(
|
.copy(
|
||||||
|
@ -72,6 +65,5 @@ pub fn create_video_interface(sdl: &Sdl) -> Sdl2Video {
|
||||||
Sdl2Video {
|
Sdl2Video {
|
||||||
tc: tc,
|
tc: tc,
|
||||||
canvas: canvas,
|
canvas: canvas,
|
||||||
fps_counter: Default::default(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue