refactor
This commit is contained in:
parent
14046462d8
commit
a39b31dc33
6 changed files with 53 additions and 28 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1103,6 +1103,7 @@ dependencies = [
|
|||
name = "gb-emu"
|
||||
version = "0.3.3"
|
||||
dependencies = [
|
||||
"ash",
|
||||
"bytemuck",
|
||||
"clap",
|
||||
"cpal",
|
||||
|
|
|
@ -4,7 +4,10 @@ version = "0.3.3"
|
|||
edition = "2021"
|
||||
|
||||
[features]
|
||||
default = []
|
||||
# default = ["vulkan"]
|
||||
default = ["pixels"]
|
||||
pixels = ["dep:pixels"]
|
||||
vulkan = ["dep:ash"]
|
||||
camera = ["dep:nokhwa", "dep:send_wrapper"]
|
||||
|
||||
[dependencies]
|
||||
|
@ -20,5 +23,6 @@ nokhwa = { version = "0.10.3", features = [
|
|||
send_wrapper = { version = "0.6.0", optional = true }
|
||||
winit = "0.28"
|
||||
winit_input_helper = "0.14"
|
||||
pixels = "0.12"
|
||||
bytemuck = "1.13"
|
||||
pixels = { version = "0.12", optional = true }
|
||||
ash = { version = "0.37", optional = true }
|
||||
|
|
|
@ -24,6 +24,11 @@ mod camera;
|
|||
mod debug;
|
||||
mod window;
|
||||
|
||||
#[cfg(all(feature = "vulkan", feature = "pixels"))]
|
||||
compile_error!("select only one rendering backend!");
|
||||
#[cfg(all(not(feature = "vulkan"), not(feature = "pixels")))]
|
||||
compile_error!("select one rendering backend!");
|
||||
|
||||
/// Gameboy (DMG/CGB) emulator
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
|
|
33
gb-emu/src/renderer/pixels.rs
Normal file
33
gb-emu/src/renderer/pixels.rs
Normal file
|
@ -0,0 +1,33 @@
|
|||
use pixels::{Pixels, SurfaceTexture};
|
||||
use winit::window::Window;
|
||||
pub struct WindowData {
|
||||
pub pixels: Pixels,
|
||||
}
|
||||
|
||||
impl WindowData {
|
||||
pub fn new(factor: u32, window: &Window) -> Self {
|
||||
let pixels = {
|
||||
let window_size = window.inner_size();
|
||||
let width = window_size.width / factor;
|
||||
let height = window_size.height / factor;
|
||||
new_pixels(width, height, factor, window)
|
||||
};
|
||||
Self { pixels }
|
||||
}
|
||||
|
||||
pub fn resize(&mut self, width: u32, height: u32, factor: u32, window: &Window) {
|
||||
self.pixels = new_pixels(width, height, factor, window);
|
||||
}
|
||||
}
|
||||
|
||||
fn new_pixels(width: u32, height: u32, scaling: u32, window: &Window) -> Pixels {
|
||||
let surface_texture: SurfaceTexture<'_, Window> =
|
||||
SurfaceTexture::new(width * scaling, height * scaling, window);
|
||||
pixels::PixelsBuilder::new(width, height, surface_texture)
|
||||
.request_adapter_options(pixels::wgpu::RequestAdapterOptionsBase {
|
||||
power_preference: pixels::wgpu::PowerPreference::HighPerformance,
|
||||
..pixels::wgpu::RequestAdapterOptionsBase::default()
|
||||
})
|
||||
.build()
|
||||
.unwrap()
|
||||
}
|
0
gb-emu/src/renderer/vulkan.rs
Normal file
0
gb-emu/src/renderer/vulkan.rs
Normal file
|
@ -8,7 +8,6 @@ use gilrs::{
|
|||
ff::{BaseEffect, BaseEffectType, EffectBuilder, Replay, Ticks},
|
||||
Button, Gilrs,
|
||||
};
|
||||
use pixels::{Pixels, SurfaceTexture};
|
||||
use winit::{
|
||||
dpi::PhysicalSize,
|
||||
event::{Event, VirtualKeyCode, WindowEvent},
|
||||
|
@ -18,15 +17,17 @@ use winit::{
|
|||
};
|
||||
use winit_input_helper::WinitInputHelper;
|
||||
|
||||
#[cfg_attr(feature = "pixels", path = "renderer/pixels.rs")]
|
||||
#[cfg_attr(feature = "vulkan", path = "renderer/vulkan.rs")]
|
||||
mod renderer;
|
||||
|
||||
use renderer::WindowData;
|
||||
|
||||
pub struct WindowInfo {
|
||||
id: WindowId,
|
||||
data: Arc<Mutex<WindowData>>,
|
||||
}
|
||||
|
||||
pub struct WindowData {
|
||||
pixels: Pixels,
|
||||
}
|
||||
|
||||
pub struct WindowManager {
|
||||
event_loop: EventLoop<()>,
|
||||
windows: HashMap<WindowId, Arc<Mutex<WindowData>>>,
|
||||
|
@ -113,14 +114,7 @@ impl WindowRenderer {
|
|||
|
||||
let real_factor = (window.scale_factor() * factor as f64) as usize;
|
||||
|
||||
let pixels = {
|
||||
let window_size = window.inner_size();
|
||||
let width = window_size.width / (real_factor as u32);
|
||||
let height = window_size.height / (real_factor as u32);
|
||||
new_pixels(width, height, real_factor as u32, &window)
|
||||
};
|
||||
|
||||
let data = Arc::new(Mutex::new(WindowData { pixels }));
|
||||
let data = Arc::new(Mutex::new(WindowData::new(real_factor as u32, &window)));
|
||||
let info = WindowInfo {
|
||||
id: window.id(),
|
||||
data: data.clone(),
|
||||
|
@ -156,7 +150,7 @@ impl Renderer<[u8; 4]> for WindowRenderer {
|
|||
self.window.set_inner_size(PhysicalSize::new(w, h));
|
||||
|
||||
if let Ok(mut data) = self.data.lock() {
|
||||
data.pixels = new_pixels(
|
||||
data.resize(
|
||||
width as u32,
|
||||
height as u32,
|
||||
self.real_factor as u32,
|
||||
|
@ -258,15 +252,3 @@ impl Renderer<[u8; 4]> for WindowRenderer {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn new_pixels(width: u32, height: u32, scaling: u32, window: &Window) -> Pixels {
|
||||
let surface_texture: SurfaceTexture<'_, Window> =
|
||||
SurfaceTexture::new(width * scaling, height * scaling, window);
|
||||
pixels::PixelsBuilder::new(width, height, surface_texture)
|
||||
.request_adapter_options(pixels::wgpu::RequestAdapterOptionsBase {
|
||||
power_preference: pixels::wgpu::PowerPreference::HighPerformance,
|
||||
..pixels::wgpu::RequestAdapterOptionsBase::default()
|
||||
})
|
||||
.build()
|
||||
.unwrap()
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue