Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
db36332307 | ||
|
|
8df05d923d | ||
|
|
0086b9c9ce | ||
|
|
a87fce102d | ||
|
|
1cae0c8e54 | ||
|
|
707dd3a200 | ||
|
|
b79f35ac61 | ||
|
|
89128b8207 | ||
|
|
b0404a5da2 | ||
|
|
16cf54e5cf |
Generated
+1
-1
@@ -1763,7 +1763,7 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lemur"
|
name = "lemur"
|
||||||
version = "0.2.7"
|
version = "0.3.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"atoi",
|
"atoi",
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ description = "An emulator for the Virtual Boy."
|
|||||||
repository = "https://git.virtual-boy.com/PVB/lemur"
|
repository = "https://git.virtual-boy.com/PVB/lemur"
|
||||||
publish = false
|
publish = false
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
version = "0.2.7"
|
version = "0.3.2"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
+1
-1
Submodule shrooms-vb-core updated: 57dcd8370a...155a3aa678
+64
-12
@@ -35,6 +35,7 @@ fn load_icon() -> anyhow::Result<IconData> {
|
|||||||
|
|
||||||
pub struct Application {
|
pub struct Application {
|
||||||
icon: Option<Arc<IconData>>,
|
icon: Option<Arc<IconData>>,
|
||||||
|
wgpu: WgpuState,
|
||||||
client: EmulatorClient,
|
client: EmulatorClient,
|
||||||
proxy: EventLoopProxy<UserEvent>,
|
proxy: EventLoopProxy<UserEvent>,
|
||||||
mappings: MappingProvider,
|
mappings: MappingProvider,
|
||||||
@@ -51,6 +52,7 @@ impl Application {
|
|||||||
proxy: EventLoopProxy<UserEvent>,
|
proxy: EventLoopProxy<UserEvent>,
|
||||||
debug_port: Option<u16>,
|
debug_port: Option<u16>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
|
let wgpu = WgpuState::new();
|
||||||
let icon = load_icon().ok().map(Arc::new);
|
let icon = load_icon().ok().map(Arc::new);
|
||||||
let persistence = Persistence::new();
|
let persistence = Persistence::new();
|
||||||
let mappings = MappingProvider::new(persistence.clone());
|
let mappings = MappingProvider::new(persistence.clone());
|
||||||
@@ -62,6 +64,7 @@ impl Application {
|
|||||||
}
|
}
|
||||||
Self {
|
Self {
|
||||||
icon,
|
icon,
|
||||||
|
wgpu,
|
||||||
client,
|
client,
|
||||||
proxy,
|
proxy,
|
||||||
mappings,
|
mappings,
|
||||||
@@ -80,7 +83,7 @@ impl Application {
|
|||||||
}
|
}
|
||||||
self.viewports.insert(
|
self.viewports.insert(
|
||||||
viewport_id,
|
viewport_id,
|
||||||
Viewport::new(event_loop, self.icon.clone(), window),
|
Viewport::new(event_loop, &self.wgpu, self.icon.clone(), window),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -238,6 +241,58 @@ impl ApplicationHandler<UserEvent> for Application {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct WgpuState {
|
||||||
|
instance: Arc<wgpu::Instance>,
|
||||||
|
adapter: Arc<wgpu::Adapter>,
|
||||||
|
device: Arc<wgpu::Device>,
|
||||||
|
queue: Arc<wgpu::Queue>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WgpuState {
|
||||||
|
fn new() -> Self {
|
||||||
|
let egui_wgpu::WgpuConfiguration {
|
||||||
|
wgpu_setup:
|
||||||
|
egui_wgpu::WgpuSetup::CreateNew {
|
||||||
|
#[allow(unused)]
|
||||||
|
supported_backends,
|
||||||
|
device_descriptor,
|
||||||
|
..
|
||||||
|
},
|
||||||
|
..
|
||||||
|
} = egui_wgpu::WgpuConfiguration::default()
|
||||||
|
else {
|
||||||
|
panic!("required fields not found")
|
||||||
|
};
|
||||||
|
#[cfg(windows)]
|
||||||
|
let supported_backends = wgpu::util::backend_bits_from_env()
|
||||||
|
.unwrap_or((wgpu::Backends::PRIMARY | wgpu::Backends::GL) - wgpu::Backends::VULKAN);
|
||||||
|
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
|
||||||
|
backends: supported_backends,
|
||||||
|
..wgpu::InstanceDescriptor::default()
|
||||||
|
});
|
||||||
|
|
||||||
|
let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
|
||||||
|
power_preference: wgpu::PowerPreference::HighPerformance,
|
||||||
|
compatible_surface: None,
|
||||||
|
force_fallback_adapter: false,
|
||||||
|
}))
|
||||||
|
.expect("could not create adapter");
|
||||||
|
|
||||||
|
let trace_path = std::env::var("WGPU_TRACE");
|
||||||
|
let (device, queue) = pollster::block_on(adapter.request_device(
|
||||||
|
&(*device_descriptor)(&adapter),
|
||||||
|
trace_path.ok().as_ref().map(std::path::Path::new),
|
||||||
|
))
|
||||||
|
.expect("could not request device");
|
||||||
|
Self {
|
||||||
|
instance: Arc::new(instance),
|
||||||
|
adapter: Arc::new(adapter),
|
||||||
|
device: Arc::new(device),
|
||||||
|
queue: Arc::new(queue),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct Viewport {
|
struct Viewport {
|
||||||
painter: egui_wgpu::winit::Painter,
|
painter: egui_wgpu::winit::Painter,
|
||||||
ctx: Context,
|
ctx: Context,
|
||||||
@@ -251,6 +306,7 @@ struct Viewport {
|
|||||||
impl Viewport {
|
impl Viewport {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
event_loop: &ActiveEventLoop,
|
event_loop: &ActiveEventLoop,
|
||||||
|
wgpu: &WgpuState,
|
||||||
icon: Option<Arc<IconData>>,
|
icon: Option<Arc<IconData>>,
|
||||||
mut app: Box<dyn AppWindow>,
|
mut app: Box<dyn AppWindow>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
@@ -274,20 +330,16 @@ impl Viewport {
|
|||||||
});
|
});
|
||||||
egui_extras::install_image_loaders(&ctx);
|
egui_extras::install_image_loaders(&ctx);
|
||||||
|
|
||||||
#[allow(unused_mut)]
|
let wgpu_config = egui_wgpu::WgpuConfiguration {
|
||||||
let mut wgpu_config = egui_wgpu::WgpuConfiguration {
|
|
||||||
present_mode: wgpu::PresentMode::AutoNoVsync,
|
present_mode: wgpu::PresentMode::AutoNoVsync,
|
||||||
|
wgpu_setup: egui_wgpu::WgpuSetup::Existing {
|
||||||
|
instance: wgpu.instance.clone(),
|
||||||
|
adapter: wgpu.adapter.clone(),
|
||||||
|
device: wgpu.device.clone(),
|
||||||
|
queue: wgpu.queue.clone(),
|
||||||
|
},
|
||||||
..egui_wgpu::WgpuConfiguration::default()
|
..egui_wgpu::WgpuConfiguration::default()
|
||||||
};
|
};
|
||||||
#[cfg(windows)]
|
|
||||||
{
|
|
||||||
if let egui_wgpu::WgpuSetup::CreateNew {
|
|
||||||
supported_backends, ..
|
|
||||||
} = &mut wgpu_config.wgpu_setup
|
|
||||||
{
|
|
||||||
*supported_backends -= wgpu::Backends::VULKAN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut painter =
|
let mut painter =
|
||||||
egui_wgpu::winit::Painter::new(ctx.clone(), wgpu_config, 1, None, false, true);
|
egui_wgpu::winit::Painter::new(ctx.clone(), wgpu_config, 1, None, false, true);
|
||||||
|
|||||||
+3
-7
@@ -142,8 +142,7 @@ impl GameWindow {
|
|||||||
fn show_options_menu(&mut self, ctx: &Context, ui: &mut Ui) {
|
fn show_options_menu(&mut self, ctx: &Context, ui: &mut Ui) {
|
||||||
ui.menu_button("Video", |ui| {
|
ui.menu_button("Video", |ui| {
|
||||||
ui.menu_button("Screen Size", |ui| {
|
ui.menu_button("Screen Size", |ui| {
|
||||||
let current_dims = ctx.input(|i| i.viewport().inner_rect.unwrap());
|
let current_dims = self.config.dimensions;
|
||||||
let current_dims = current_dims.max - current_dims.min;
|
|
||||||
|
|
||||||
for scale in 1..=4 {
|
for scale in 1..=4 {
|
||||||
let label = format!("x{scale}");
|
let label = format!("x{scale}");
|
||||||
@@ -183,10 +182,7 @@ impl GameWindow {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let current_dims = {
|
let current_dims = self.config.dimensions;
|
||||||
let viewport = ctx.input(|i| i.viewport().inner_rect.unwrap());
|
|
||||||
viewport.max - viewport.min
|
|
||||||
};
|
|
||||||
let new_proportions = display_mode.proportions();
|
let new_proportions = display_mode.proportions();
|
||||||
let scale = new_proportions / old_proportions;
|
let scale = new_proportions / old_proportions;
|
||||||
if scale != Vec2::new(1.0, 1.0) {
|
if scale != Vec2::new(1.0, 1.0) {
|
||||||
@@ -330,7 +326,7 @@ impl AppWindow for GameWindow {
|
|||||||
|
|
||||||
fn show(&mut self, ctx: &Context) {
|
fn show(&mut self, ctx: &Context) {
|
||||||
let dimensions = {
|
let dimensions = {
|
||||||
let bounds = ctx.input(|i| i.viewport().inner_rect.unwrap());
|
let bounds = ctx.available_rect();
|
||||||
bounds.max - bounds.min
|
bounds.max - bounds.min
|
||||||
};
|
};
|
||||||
self.update_config(|c| c.dimensions = dimensions);
|
self.update_config(|c| c.dimensions = dimensions);
|
||||||
|
|||||||
Reference in New Issue
Block a user