Compare commits

..

21 Commits

Author SHA1 Message Date
Simon Gellis f7cf960b62 Support hypothetical big-endian users 2025-02-15 18:33:18 -05:00
Simon Gellis b888d1140a Make properties editable 2025-02-15 18:33:18 -05:00
Simon Gellis 7356287030 Finish object view 2025-02-15 18:33:18 -05:00
Simon Gellis b5e1711a56 Support signed numbers in number picker 2025-02-15 18:33:18 -05:00
Simon Gellis 92ccc482ae Fix keyboard navigation for numberedit 2025-02-15 18:33:18 -05:00
Simon Gellis c4f17bfc13 Start drawing objects 2025-02-15 18:33:18 -05:00
Simon Gellis dfcfd17bfc Optimize image updates 2025-02-15 18:33:18 -05:00
Simon Gellis d16c5363da Move about into a button 2025-02-15 18:33:18 -05:00
Simon Gellis a5676c20d1 Add a number editor widget 2025-02-15 18:33:18 -05:00
Simon Gellis ba15dc77ae When the UI consumes an input, don't send it to the game 2025-02-15 18:33:18 -05:00
Simon Gellis ebe444870f Sync memory between emulator thread and UI 2025-02-15 18:33:18 -05:00
Simon Gellis a461faf89d Render images on background thread to keep UI responsive 2025-02-15 18:33:18 -05:00
Simon Gellis a82389224f Avoid unnecessary computation/cloning in renderer 2025-02-15 18:33:18 -05:00
Simon Gellis 600148c781 Rerender VRAM graphics every frame (slow in debug) 2025-02-15 18:33:18 -05:00
Simon Gellis 4601f1b52f Flesh out bgmap viewer 2025-02-15 18:33:18 -05:00
Simon Gellis 57eebb5874 New implementation for reading/showing vram 2025-02-15 18:33:17 -05:00
Simon Gellis 75779f2b24 Dummy second window 2025-02-15 18:29:35 -05:00
Simon Gellis 6c9265cb78 First pass of character data viewer 2025-02-15 18:29:33 -05:00
Simon Gellis 5f17469dc2 Fix warning on windows 2025-02-15 18:22:21 -05:00
Simon Gellis db36332307 chore: Release lemur version 0.3.2 2025-02-15 16:56:20 -05:00
Simon Gellis 8df05d923d Share one wgpu instance across all windows 2025-02-15 16:55:21 -05:00
3 changed files with 66 additions and 14 deletions

2
Cargo.lock generated
View File

@ -1763,7 +1763,7 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "lemur"
version = "0.3.1"
version = "0.3.2"
dependencies = [
"anyhow",
"atoi",

View File

@ -4,7 +4,7 @@ description = "An emulator for the Virtual Boy."
repository = "https://git.virtual-boy.com/PVB/lemur"
publish = false
license = "MIT"
version = "0.3.1"
version = "0.3.2"
edition = "2021"
[dependencies]

View File

@ -40,6 +40,7 @@ fn load_icon() -> anyhow::Result<IconData> {
pub struct Application {
icon: Option<Arc<IconData>>,
wgpu: WgpuState,
client: EmulatorClient,
proxy: EventLoopProxy<UserEvent>,
mappings: MappingProvider,
@ -58,6 +59,7 @@ impl Application {
proxy: EventLoopProxy<UserEvent>,
debug_port: Option<u16>,
) -> Self {
let wgpu = WgpuState::new();
let icon = load_icon().ok().map(Arc::new);
let persistence = Persistence::new();
let mappings = MappingProvider::new(persistence.clone());
@ -71,6 +73,7 @@ impl Application {
}
Self {
icon,
wgpu,
client,
proxy,
mappings,
@ -91,7 +94,7 @@ impl Application {
}
self.viewports.insert(
viewport_id,
Viewport::new(event_loop, self.icon.clone(), window),
Viewport::new(event_loop, &self.wgpu, self.icon.clone(), window),
);
}
}
@ -266,6 +269,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 {
#[allow(unused_variables)]
let egui_wgpu::WgpuConfiguration {
wgpu_setup:
egui_wgpu::WgpuSetup::CreateNew {
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 {
painter: egui_wgpu::winit::Painter,
ctx: Context,
@ -279,6 +334,7 @@ struct Viewport {
impl Viewport {
pub fn new(
event_loop: &ActiveEventLoop,
wgpu: &WgpuState,
icon: Option<Arc<IconData>>,
mut app: Box<dyn AppWindow>,
) -> Self {
@ -302,20 +358,16 @@ impl Viewport {
});
egui_extras::install_image_loaders(&ctx);
#[allow(unused_mut)]
let mut wgpu_config = egui_wgpu::WgpuConfiguration {
let wgpu_config = egui_wgpu::WgpuConfiguration {
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()
};
#[cfg(windows)]
{
if let egui_wgpu::WgpuSetup::CreateNew {
supported_backends, ..
} = &mut wgpu_config.wgpu_setup
{
*supported_backends -= wgpu::Backends::VULKAN;
}
}
let mut painter =
egui_wgpu::winit::Painter::new(ctx.clone(), wgpu_config, 1, None, false, true);