Default Windows startup to DirectX 12 (#16)
eframe's default wgpu instance enables PRIMARY | GL on Windows. Creating the OpenGL backend can crash inside AMD's atio6axx.dll before the window appears, so the app exits silently at launch. When WGPU_BACKEND is not set, the Windows instance now enables only DirectX 12; an explicit WGPU_BACKEND is still honoured. macOS, Linux and web are unchanged. Same fix as storytold/designcraft#168 and storytold/filmcraft#179. Claude-Session: https://claude.ai/code/session_01LyVbT6Vv4BwWZ4hY8973qD Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
parent
80e8a0fe53
commit
89d23ffa85
15
README.md
15
README.md
|
|
@ -170,6 +170,21 @@ scorecard.
|
||||||
|
|
||||||
Installers and executables are code-signed.
|
Installers and executables are code-signed.
|
||||||
|
|
||||||
|
**If the app doesn't open on Windows:** the desktop app initializes only DirectX 12 by default.
|
||||||
|
Letting wgpu also create an OpenGL instance can crash some graphics drivers (AMD's
|
||||||
|
`atio6axx.dll`) before the window appears, so the app would flash in Task Manager and quit.
|
||||||
|
`WGPU_BACKEND` overrides the default for troubleshooting (for example `dx12` or `vulkan`). In
|
||||||
|
PowerShell, from the folder containing the executable:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$env:WGPU_BACKEND = "vulkan"
|
||||||
|
& .\deckcraft.exe
|
||||||
|
Remove-Item Env:WGPU_BACKEND # restore the default for later launches
|
||||||
|
```
|
||||||
|
|
||||||
|
An explicit `gl` override can bring the driver crash back on affected systems. The macOS, Linux
|
||||||
|
and web backend defaults are unchanged.
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
| Build | File | Notes |
|
| Build | File | Notes |
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
//! Windows graphics instance configuration, applied before wgpu can initialize any driver.
|
||||||
|
|
||||||
|
use eframe::{NativeOptions, egui_wgpu::WgpuSetup, wgpu::Backends};
|
||||||
|
|
||||||
|
/// Restrict the wgpu instance to DirectX 12 unless `backend_override` (normally
|
||||||
|
/// `Backends::from_env()`, i.e. `WGPU_BACKEND`) names other backends.
|
||||||
|
pub fn configure(options: &mut NativeOptions, backend_override: Option<Backends>) {
|
||||||
|
if let WgpuSetup::CreateNew(create) = &mut options.wgpu_options.wgpu_setup {
|
||||||
|
// eframe's default includes GL. Creating that backend can crash inside AMD's
|
||||||
|
// atio6axx.dll before adapter selection or any Rust error handling runs, so the
|
||||||
|
// window never appears. Choosing an adapter afterwards is too late: only leaving GL
|
||||||
|
// out of the instance avoids it. This matches the verified WGPU_BACKEND=dx12
|
||||||
|
// workaround without mutating process environment variables.
|
||||||
|
create.instance_descriptor.backends = backend_override.unwrap_or(Backends::DX12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn configured_backends(backend_override: Option<Backends>) -> Backends {
|
||||||
|
let mut options = NativeOptions::default();
|
||||||
|
configure(&mut options, backend_override);
|
||||||
|
let WgpuSetup::CreateNew(create) = options.wgpu_options.wgpu_setup else {
|
||||||
|
panic!("default native options must create a wgpu instance");
|
||||||
|
};
|
||||||
|
create.instance_descriptor.backends
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn windows_default_initializes_only_dx12() {
|
||||||
|
// eframe's own default (PRIMARY | GL) would initialize OpenGL as well.
|
||||||
|
let WgpuSetup::CreateNew(eframe_default) = NativeOptions::default().wgpu_options.wgpu_setup else {
|
||||||
|
panic!("default native options must create a wgpu instance");
|
||||||
|
};
|
||||||
|
assert!(eframe_default.instance_descriptor.backends.contains(Backends::GL));
|
||||||
|
assert_eq!(configured_backends(None), Backends::DX12);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn explicit_backend_override_is_preserved() {
|
||||||
|
for backends in [Backends::VULKAN, Backends::GL, Backends::DX12, Backends::VULKAN | Backends::DX12, Backends::empty()] {
|
||||||
|
assert_eq!(configured_backends(Some(backends)), backends);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
mod audio;
|
mod audio;
|
||||||
mod control_server;
|
mod control_server;
|
||||||
|
#[cfg(any(target_os = "windows", test))]
|
||||||
|
mod graphics;
|
||||||
mod logging;
|
mod logging;
|
||||||
|
|
||||||
use deckcraft_engine::Session;
|
use deckcraft_engine::Session;
|
||||||
|
|
@ -188,6 +190,9 @@ fn main() -> eframe::Result {
|
||||||
b.with_x11();
|
b.with_x11();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
// Before eframe creates the wgpu instance: default Windows to DirectX 12 only (see graphics.rs).
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
graphics::configure(&mut options, eframe::wgpu::Backends::from_env());
|
||||||
eframe::run_native(
|
eframe::run_native(
|
||||||
"DeckCraft",
|
"DeckCraft",
|
||||||
options,
|
options,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue