From 43b800ff808957a3f23a7abfc0709fbcedf17480 Mon Sep 17 00:00:00 2001 From: Alex Janka Date: Thu, 8 Feb 2024 15:27:48 +1100 Subject: [PATCH] backend genericisation (?) and rwh 0.6 --- Cargo.lock | 339 +++----------------- Cargo.toml | 16 +- frontend-common/Cargo.toml | 4 +- frontend-common/src/lib.rs | 6 - frontend-common/src/window/winit_manager.rs | 4 +- gb-vst/Cargo.toml | 10 +- gb-vst/src/plugin/ui.rs | 5 +- gui/Cargo.toml | 2 +- gui/src/macos/cacao_window_manager.rs | 28 +- gui/src/macos/mod.rs | 8 +- lib/Cargo.toml | 17 +- lib/src/lib.rs | 7 - lib/src/renderer/compat.rs | 35 ++ lib/src/renderer/mod.rs | 19 +- lib/src/renderer/pixels.rs | 22 +- lib/src/renderer/vulkan/mod.rs | 12 +- lib/src/renderer/vulkan/types.rs | 6 +- lib/src/renderer/wgpu.rs | 42 +++ 18 files changed, 219 insertions(+), 363 deletions(-) create mode 100644 lib/src/renderer/compat.rs diff --git a/Cargo.lock b/Cargo.lock index 849c568..03ab65a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -212,8 +212,7 @@ checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" [[package]] name = "ash" version = "0.37.3+1.3.251" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +source = "git+https://git.alexjanka.com/alex/ash?branch=raw-window-handle-0.6.0#55628b4023d692d604fb8cce67babb9eab0fa785" dependencies = [ "libloading 0.7.4", ] @@ -233,11 +232,10 @@ dependencies = [ [[package]] name = "ash-window" version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b912285a7c29f3a8f87ca6f55afc48768624e5e33ec17dbd2f2075903f5e35ab" +source = "git+https://git.alexjanka.com/alex/ash?branch=raw-window-handle-0.6.0#55628b4023d692d604fb8cce67babb9eab0fa785" dependencies = [ "ash", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "raw-window-metal", ] @@ -310,32 +308,14 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "baseview" version = "0.1.0" -source = "git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4#2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4" +source = "git+https://git.alexjanka.com/alex/baseview#b3bbdea6c0f46d71de812d4f64835b13a8f7ffab" dependencies = [ "cocoa 0.24.1", "core-foundation 0.9.4", "keyboard-types", "nix 0.22.3", "objc", - "raw-window-handle 0.5.2", - "uuid 0.8.2", - "winapi", - "x11", - "xcb", - "xcb-util", -] - -[[package]] -name = "baseview" -version = "0.1.0" -source = "git+https://git.alexjanka.com/alex/baseview#50a5602bca9b438fd125fb48cf0ade48fd794a36" -dependencies = [ - "cocoa 0.24.1", - "core-foundation 0.9.4", - "keyboard-types", - "nix 0.22.3", - "objc", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "uuid 0.8.2", "winapi", "x11", @@ -532,7 +512,7 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cacao" version = "0.4.0-beta2" -source = "git+https://git.alexjanka.com/alex/cacao#65b32e79c0a8d088d19799b13e86634f3a64c10b" +source = "git+https://git.alexjanka.com/alex/cacao#b19806af9731609e2875cb32acaeea17792a492a" dependencies = [ "bitmask-enum", "block2 0.2.0-alpha.6", @@ -804,12 +784,6 @@ dependencies = [ "com_macros", ] -[[package]] -name = "com-rs" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" - [[package]] name = "com_macros" version = "0.6.0" @@ -1156,17 +1130,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" -[[package]] -name = "d3d12" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da" -dependencies = [ - "bitflags 1.3.2", - "libloading 0.7.4", - "winapi", -] - [[package]] name = "d3d12" version = "0.19.0" @@ -1174,7 +1137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" dependencies = [ "bitflags 2.4.2", - "libloading 0.7.4", + "libloading 0.8.1", "winapi", ] @@ -1473,7 +1436,7 @@ dependencies = [ "gilrs", "image", "nokhwa", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "send_wrapper", "serde", "winit", @@ -1585,14 +1548,15 @@ dependencies = [ "librashader", "librashader-common", "librashader-presets", - "naga 0.19.0", + "naga", "num-traits", "pixels", "rand", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "ron", "serde", "serde_with", + "wgpu", ] [[package]] @@ -1685,18 +1649,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "glow" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "glow" version = "0.13.1" @@ -1729,16 +1681,6 @@ dependencies = [ "scroll", ] -[[package]] -name = "gpu-alloc" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62" -dependencies = [ - "bitflags 1.3.2", - "gpu-alloc-types 0.2.0", -] - [[package]] name = "gpu-alloc" version = "0.6.0" @@ -1746,16 +1688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ "bitflags 2.4.2", - "gpu-alloc-types 0.3.0", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5" -dependencies = [ - "bitflags 1.3.2", + "gpu-alloc-types", ] [[package]] @@ -1777,8 +1710,6 @@ dependencies = [ "backtrace", "log", "thiserror", - "winapi", - "windows 0.44.0", ] [[package]] @@ -1823,7 +1754,7 @@ dependencies = [ "frontend-common", "gb-emu-lib", "objc2 0.3.0-beta.3", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "serde", "twinc_emu_vst", "uuid 1.7.0", @@ -1864,21 +1795,6 @@ dependencies = [ "hashbrown 0.14.3", ] -[[package]] -name = "hassle-rs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" -dependencies = [ - "bitflags 1.3.2", - "com-rs", - "libc", - "libloading 0.7.4", - "thiserror", - "widestring", - "winapi", -] - [[package]] name = "hassle-rs" version = "0.11.0" @@ -1888,7 +1804,7 @@ dependencies = [ "bitflags 2.4.2", "com", "libc", - "libloading 0.7.4", + "libloading 0.8.1", "thiserror", "widestring", "winapi", @@ -2171,17 +2087,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "khronos-egl" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" -dependencies = [ - "libc", - "libloading 0.7.4", - "pkg-config", -] - [[package]] name = "khronos-egl" version = "6.0.0" @@ -2257,7 +2162,7 @@ dependencies = [ "librashader-runtime", "librashader-runtime-vk", "librashader-runtime-wgpu", - "wgpu 0.19.1", + "wgpu", ] [[package]] @@ -2283,7 +2188,7 @@ source = "git+https://git.alexjanka.com/alex/librashader#446b052657fee7cc364ae33 dependencies = [ "ash", "num-traits", - "wgpu-types 0.19.0", + "wgpu-types", ] [[package]] @@ -2323,12 +2228,12 @@ dependencies = [ "librashader-presets", "librashader-spirv-cross", "matches", - "naga 0.19.0", + "naga", "rspirv", "rustc-hash", "serde", "shaderc", - "spirv 0.3.0+sdk-1.3.268.0", + "spirv", "thiserror", ] @@ -2384,7 +2289,7 @@ dependencies = [ "rayon", "rustc-hash", "thiserror", - "wgpu 0.19.1", + "wgpu", ] [[package]] @@ -2544,20 +2449,6 @@ dependencies = [ "objc", ] -[[package]] -name = "metal" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-graphics-types 0.1.3", - "foreign-types 0.3.2", - "log", - "objc", -] - [[package]] name = "metal" version = "0.27.0" @@ -2635,26 +2526,6 @@ dependencies = [ "nasm-rs", ] -[[package]] -name = "naga" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbcc2e0513220fd2b598e6068608d4462db20322c0e77e47f6f488dfcfc279cb" -dependencies = [ - "bit-set", - "bitflags 1.3.2", - "codespan-reporting", - "hexf-parse", - "indexmap 1.9.3", - "log", - "num-traits", - "rustc-hash", - "spirv 0.2.0+1.5.4", - "termcolor", - "thiserror", - "unicode-xid", -] - [[package]] name = "naga" version = "0.19.0" @@ -2670,7 +2541,7 @@ dependencies = [ "num-traits", "petgraph", "rustc-hash", - "spirv 0.3.0+sdk-1.3.268.0", + "spirv", "termcolor", "thiserror", "unicode-xid", @@ -2762,14 +2633,14 @@ dependencies = [ [[package]] name = "nih_plug" version = "0.0.0" -source = "git+https://github.com/robbert-vdh/nih-plug#7a01b57735bb0cb18da048e4eb5b303b85b30c4d" +source = "git+https://git.alexjanka.com/alex/nih-plug#a54abb48e7571ce453a6b7a43d7a8d20f6b95a3e" dependencies = [ "anyhow", "anymap", "atomic_float", "atomic_refcell", "backtrace", - "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4)", + "baseview", "bitflags 1.3.2", "cfg-if 1.0.0", "clap", @@ -2787,7 +2658,7 @@ dependencies = [ "nih_plug_derive", "objc", "parking_lot", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "rtrb", "serde", "serde_json", @@ -2799,7 +2670,7 @@ dependencies = [ [[package]] name = "nih_plug_derive" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/nih-plug#7a01b57735bb0cb18da048e4eb5b303b85b30c4d" +source = "git+https://git.alexjanka.com/alex/nih-plug#a54abb48e7571ce453a6b7a43d7a8d20f6b95a3e" dependencies = [ "proc-macro2", "quote", @@ -2809,7 +2680,7 @@ dependencies = [ [[package]] name = "nih_plug_xtask" version = "0.1.0" -source = "git+https://github.com/robbert-vdh/nih-plug#7a01b57735bb0cb18da048e4eb5b303b85b30c4d" +source = "git+https://git.alexjanka.com/alex/nih-plug#a54abb48e7571ce453a6b7a43d7a8d20f6b95a3e" dependencies = [ "anyhow", "goblin", @@ -3225,15 +3096,14 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pixels" version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba8189b31db4f12fbf0d4a8eab2d7d7343a504a8d8a7ea4b14ffb2e6129136a" +source = "git+https://git.alexjanka.com/alex/pixels#b577b326a8e661645ca5643091dbaf4348a70bb8" dependencies = [ "bytemuck", "pollster", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "thiserror", "ultraviolet", - "wgpu 0.16.3", + "wgpu", ] [[package]] @@ -3442,14 +3312,14 @@ checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" [[package]] name = "raw-window-metal" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac4ea493258d54c24cb46aa9345d099e58e2ea3f30dd63667fc54fc892f18e76" +checksum = "76e8caa82e31bb98fee12fa8f051c94a6aa36b07cddb03f0d4fc558988360ff1" dependencies = [ "cocoa 0.25.0", "core-graphics 0.23.1 (registry+https://github.com/rust-lang/crates.io-index)", "objc", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", ] [[package]] @@ -3591,7 +3461,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cf3a93856b6e5946537278df0d3075596371b1950ccff012f02b0f7eafec8d" dependencies = [ "rustc-hash", - "spirv 0.3.0+sdk-1.3.268.0", + "spirv", ] [[package]] @@ -3892,16 +3762,6 @@ dependencies = [ "lock_api", ] -[[package]] -name = "spirv" -version = "0.2.0+1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" -dependencies = [ - "bitflags 1.3.2", - "num-traits", -] - [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -4144,13 +4004,14 @@ name = "twinc_emu_vst" version = "0.5.1" dependencies = [ "async-ringbuf", - "baseview 0.1.0 (git+https://git.alexjanka.com/alex/baseview)", + "baseview", "futures", "gb-emu-lib", "keyboard-types", "nih_plug", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "serde", + "thiserror", ] [[package]] @@ -4525,30 +4386,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" -[[package]] -name = "wgpu" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "480c965c9306872eb6255fa55e4b4953be55a8b64d57e61d7ff840d3dcc051cd" -dependencies = [ - "arrayvec", - "cfg-if 1.0.0", - "js-sys", - "log", - "naga 0.12.3", - "parking_lot", - "profiling", - "raw-window-handle 0.5.2", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core 0.16.1", - "wgpu-hal 0.16.2", - "wgpu-types 0.16.1", -] - [[package]] name = "wgpu" version = "0.19.1" @@ -4560,7 +4397,7 @@ dependencies = [ "cfg_aliases", "js-sys", "log", - "naga 0.19.0", + "naga", "parking_lot", "profiling", "raw-window-handle 0.6.0", @@ -4569,32 +4406,9 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core 0.19.0", - "wgpu-hal 0.19.1", - "wgpu-types 0.19.0", -] - -[[package]] -name = "wgpu-core" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f478237b4bf0d5b70a39898a66fa67ca3a007d79f2520485b8b0c3dfc46f8c2" -dependencies = [ - "arrayvec", - "bit-vec", - "bitflags 2.4.2", - "codespan-reporting", - "log", - "naga 0.12.3", - "parking_lot", - "profiling", - "raw-window-handle 0.5.2", - "rustc-hash", - "smallvec", - "thiserror", - "web-sys", - "wgpu-hal 0.16.2", - "wgpu-types 0.16.1", + "wgpu-core", + "wgpu-hal", + "wgpu-types", ] [[package]] @@ -4610,7 +4424,7 @@ dependencies = [ "codespan-reporting", "indexmap 2.1.0", "log", - "naga 0.19.0", + "naga", "once_cell", "parking_lot", "profiling", @@ -4619,50 +4433,8 @@ dependencies = [ "smallvec", "thiserror", "web-sys", - "wgpu-hal 0.19.1", - "wgpu-types 0.19.0", -] - -[[package]] -name = "wgpu-hal" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecb3258078e936deee14fd4e0febe1cfe9bbb5ffef165cb60218d2ee5eb4448" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bit-set", - "bitflags 2.4.2", - "block", - "core-graphics-types 0.1.3", - "d3d12 0.6.0", - "foreign-types 0.3.2", - "glow 0.12.3", - "gpu-alloc 0.5.4", - "gpu-allocator 0.22.0", - "gpu-descriptor", - "hassle-rs 0.10.0", - "js-sys", - "khronos-egl 4.1.0", - "libc", - "libloading 0.8.1", - "log", - "metal 0.24.0", - "naga 0.12.3", - "objc", - "parking_lot", - "profiling", - "range-alloc", - "raw-window-handle 0.5.2", - "renderdoc-sys", - "rustc-hash", - "smallvec", - "thiserror", - "wasm-bindgen", - "web-sys", - "wgpu-types 0.16.1", - "winapi", + "wgpu-hal", + "wgpu-types", ] [[package]] @@ -4679,20 +4451,20 @@ dependencies = [ "block", "cfg_aliases", "core-graphics-types 0.1.3", - "d3d12 0.19.0", - "glow 0.13.1", + "d3d12", + "glow", "glutin_wgl_sys", - "gpu-alloc 0.6.0", + "gpu-alloc", "gpu-allocator 0.25.0", "gpu-descriptor", - "hassle-rs 0.11.0", + "hassle-rs", "js-sys", - "khronos-egl 6.0.0", + "khronos-egl", "libc", - "libloading 0.7.4", + "libloading 0.8.1", "log", "metal 0.27.0", - "naga 0.19.0", + "naga", "objc", "once_cell", "parking_lot", @@ -4705,21 +4477,10 @@ dependencies = [ "thiserror", "wasm-bindgen", "web-sys", - "wgpu-types 0.19.0", + "wgpu-types", "winapi", ] -[[package]] -name = "wgpu-types" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c153280bb108c2979eb5c7391cb18c56642dd3c072e55f52065e13e2a1252a" -dependencies = [ - "bitflags 2.4.2", - "js-sys", - "web-sys", -] - [[package]] name = "wgpu-types" version = "0.19.0" diff --git a/Cargo.toml b/Cargo.toml index 7f91dbf..26e35c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,11 +4,13 @@ default-members = ["cli"] resolver = "2" [workspace.dependencies] +thiserror = "1.0" +raw-window-handle = "0.6" gb-emu-lib = { path = "./lib", features = ["config"] } frontend-common = { path = "./frontend-common" } -baseview = { git = "https://git.alexjanka.com/alex/baseview" } -nih_plug = { git = "https://github.com/robbert-vdh/nih-plug" } -nih_plug_xtask = { git = "https://github.com/robbert-vdh/nih-plug" } +baseview = { git = "https://git.alexjanka.com/alex/baseview", default-features = false } +nih_plug = { git = "https://git.alexjanka.com/alex/nih-plug" } +nih_plug_xtask = { git = "https://git.alexjanka.com/alex/nih-plug" } librashader = { git = "https://git.alexjanka.com/alex/librashader", default-features = false } librashader-common = { git = "https://git.alexjanka.com/alex/librashader" } librashader-presets = { git = "https://git.alexjanka.com/alex/librashader" } @@ -17,3 +19,11 @@ librashader-reflect = { git = "https://git.alexjanka.com/alex/librashader" } librashader-runtime = { git = "https://git.alexjanka.com/alex/librashader" } librashader-runtime-vk = { git = "https://git.alexjanka.com/alex/librashader" } librashader-cache = { git = "https://git.alexjanka.com/alex/librashader" } +ash = { git = "https://git.alexjanka.com/alex/ash", branch = "raw-window-handle-0.6.0" } +ash-window = { git = "https://git.alexjanka.com/alex/ash", branch = "raw-window-handle-0.6.0" } + +[patch."https://github.com/RustAudio/baseview.git"] +baseview = { git = "https://git.alexjanka.com/alex/baseview" } + +[patch.crates-io] +ash = { git = "https://git.alexjanka.com/alex/ash", branch = "raw-window-handle-0.6.0" } diff --git a/frontend-common/Cargo.toml b/frontend-common/Cargo.toml index b693382..90a6595 100644 --- a/frontend-common/Cargo.toml +++ b/frontend-common/Cargo.toml @@ -8,7 +8,7 @@ description = "Frontend common library for TWINC Game Boy (CGB/DMG) emulator" identifier = "com.alexjanka.TWINC" [features] -default = ["vulkan-static"] +default = ["wgpu", "pixels", "vulkan-static"] pixels = ["gb-emu-lib/pixels-renderer"] vulkan = ["gb-emu-lib/vulkan-renderer", "gb-emu-lib/vulkan-debug"] vulkan-static = ["vulkan", "gb-emu-lib/vulkan-static"] @@ -26,7 +26,7 @@ nokhwa = { version = "0.10", features = [ send_wrapper = { version = "0.6.0", optional = true } winit = { version = "0.29", features = ["rwh_05"] } winit_input_helper = "0.15" -raw-window-handle = { version = "0.5" } +raw-window-handle = { workspace = true } serde = { version = "1.0", features = ["derive"] } image = { version = "0.24", default-features = false, features = ["png"] } bytemuck = "1.14" diff --git a/frontend-common/src/lib.rs b/frontend-common/src/lib.rs index 770bb18..d967077 100644 --- a/frontend-common/src/lib.rs +++ b/frontend-common/src/lib.rs @@ -24,12 +24,6 @@ mod camera; pub mod debug; pub mod window; -#[cfg(any( - all(feature = "vulkan", feature = "pixels"), - all(feature = "vulkan", feature = "wgpu"), - all(feature = "wgpu", feature = "pixels") -))] -compile_error!("select only one rendering backend!"); #[cfg(all( not(feature = "vulkan"), not(feature = "pixels"), diff --git a/frontend-common/src/window/winit_manager.rs b/frontend-common/src/window/winit_manager.rs index d3cbb51..4bc9153 100644 --- a/frontend-common/src/window/winit_manager.rs +++ b/frontend-common/src/window/winit_manager.rs @@ -14,7 +14,7 @@ use gb_emu_lib::{ }; use gilrs::{Button, Gilrs}; use image::ImageBuffer; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use winit::{ dpi::PhysicalSize, event::{Event, WindowEvent}, @@ -64,7 +64,7 @@ where let event_loop = EventLoop::new().unwrap(); let window_data_manager = Arc::new(Backend::RendererBackendManager::new( - event_loop.raw_display_handle(), + event_loop.display_handle().unwrap(), )); Self { event_loop, diff --git a/gb-vst/Cargo.toml b/gb-vst/Cargo.toml index 57a8484..a795d64 100644 --- a/gb-vst/Cargo.toml +++ b/gb-vst/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [features] -default = ["plugin", "vulkan-static"] +default = ["plugin", "wgpu", "pixels", "vulkan-static"] pixels = ["gb-emu-lib/pixels-renderer"] vulkan = ["gb-emu-lib/vulkan-renderer"] vulkan-static = ["vulkan", "gb-emu-lib/vulkan-static"] @@ -22,10 +22,14 @@ plugin = [ [dependencies] gb-emu-lib = { workspace = true } -nih_plug = { workspace = true, features = ["standalone"], optional = true } +nih_plug = { workspace = true, features = [ + "standalone", + "vst3", +], optional = true } baseview = { workspace = true, optional = true } async-ringbuf = { version = "0.1", optional = true } futures = { version = "0.3", optional = true } keyboard-types = { version = "0.6.2", optional = true } -raw-window-handle = { version = "0.5" } +raw-window-handle = { workspace = true } serde = { version = "1.0", features = ["derive"] } +thiserror = { workspace = true } diff --git a/gb-vst/src/plugin/ui.rs b/gb-vst/src/plugin/ui.rs index 83fd4dc..1660536 100644 --- a/gb-vst/src/plugin/ui.rs +++ b/gb-vst/src/plugin/ui.rs @@ -9,7 +9,7 @@ use gb_emu_lib::{ }; use keyboard_types::{Code, KeyState}; use nih_plug::prelude::*; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use super::{access_config, EmuComms}; @@ -68,11 +68,12 @@ impl Editor for TwincEditor { title: String::from("gb-emu"), size, scale: baseview::WindowScalePolicy::SystemScaleFactor, + gl_config: Default::default(), }, move |window| { let manager = Arc::new( ::RendererBackendManager::new( - window.raw_display_handle(), + window.display_handle().unwrap(), ), ); TwincEditorWindow::new(window, rr_cloned, manager, size, shader_path) diff --git a/gui/Cargo.toml b/gui/Cargo.toml index 944afca..717bc17 100644 --- a/gui/Cargo.toml +++ b/gui/Cargo.toml @@ -20,6 +20,6 @@ twinc_emu_vst = { path = "../gb-vst", default-features = false } cacao = { git = "https://git.alexjanka.com/alex/cacao" } objc = { version = "=0.3.0-beta.3", package = "objc2" } uuid = { version = "1.6", features = ["v4", "fast-rng"] } -raw-window-handle = { version = "0.5" } +raw-window-handle = { workspace = true } cpal = "0.15" serde = { version = "1.0", features = ["derive"] } diff --git a/gui/src/macos/cacao_window_manager.rs b/gui/src/macos/cacao_window_manager.rs index 037d423..71772b2 100644 --- a/gui/src/macos/cacao_window_manager.rs +++ b/gui/src/macos/cacao_window_manager.rs @@ -13,7 +13,6 @@ use cacao::{ window::{Window, WindowConfig, WindowDelegate, WindowStyle}, Event, EventMask, EventMonitor, }, - core_foundation::base::TCFTypeRef, filesystem::ModalResponse, foundation::{NSInteger, NSString}, }; @@ -32,8 +31,8 @@ use objc::{ runtime::Object, }; use raw_window_handle::{ - AppKitDisplayHandle, AppKitWindowHandle, HasRawDisplayHandle, HasRawWindowHandle, - RawDisplayHandle, RawWindowHandle, + AppKitDisplayHandle, AppKitWindowHandle, DisplayHandle, HasDisplayHandle, HasWindowHandle, + RawDisplayHandle, RawWindowHandle, WindowHandle, }; use super::{dispatch, AppMessage, CoreMessage}; @@ -165,7 +164,7 @@ pub struct CacaoWindowManager { } impl CacaoWindowManager { - pub fn new(display_handle: RawDisplayHandle) -> Self { + pub fn new(display_handle: DisplayHandle) -> Self { let _button_handler = ButtonHandler::new(); Self { @@ -506,18 +505,23 @@ impl WindowDelegate for CacaoWindow { struct WindowHandleWrapper<'a, T>(&'a Window); -unsafe impl<'a, T> HasRawDisplayHandle for WindowHandleWrapper<'a, T> { - fn raw_display_handle(&self) -> RawDisplayHandle { - RawDisplayHandle::AppKit(AppKitDisplayHandle::empty()) +impl<'a, T> HasDisplayHandle for WindowHandleWrapper<'a, T> { + fn display_handle(&self) -> Result, raw_window_handle::HandleError> { + Ok(unsafe { + DisplayHandle::borrow_raw(RawDisplayHandle::AppKit(AppKitDisplayHandle::new())) + }) } } -unsafe impl<'a, T> HasRawWindowHandle for WindowHandleWrapper<'a, T> { - fn raw_window_handle(&self) -> RawWindowHandle { +impl<'a, T> HasWindowHandle for WindowHandleWrapper<'a, T> { + fn window_handle(&self) -> Result, raw_window_handle::HandleError> { let Self(w) = self; - let mut handle = AppKitWindowHandle::empty(); - handle.ns_window = objc::rc::Id::as_ptr(&w.objc).as_void_ptr().cast_mut(); - RawWindowHandle::AppKit(handle) + Ok(unsafe { + WindowHandle::borrow_raw(RawWindowHandle::AppKit(AppKitWindowHandle::new( + w.content_view_ptr() + .ok_or(raw_window_handle::HandleError::Unavailable)?, + ))) + }) } } diff --git a/gui/src/macos/mod.rs b/gui/src/macos/mod.rs index 2f5c328..e0b3a31 100644 --- a/gui/src/macos/mod.rs +++ b/gui/src/macos/mod.rs @@ -10,7 +10,7 @@ use cacao::notification_center::Dispatcher; use frontend_common::audio; use gb_emu_lib::config::{NamedConfig, CONFIG_MANAGER}; use gb_emu_lib::connect::{EmulatorCoreTrait, EmulatorMessage}; -use raw_window_handle::{AppKitDisplayHandle, RawDisplayHandle}; +use raw_window_handle::{AppKitDisplayHandle, DisplayHandle, RawDisplayHandle}; use serde::{Deserialize, Serialize}; use self::cacao_window_manager::{CacaoWindowManager, EmuWindowMessage}; @@ -92,9 +92,9 @@ impl Default for TwincUiApp { }, PreferencesUi::new(), )), - current_game: RwLock::new(CacaoWindowManager::new(RawDisplayHandle::AppKit( - AppKitDisplayHandle::empty(), - ))), + current_game: RwLock::new(CacaoWindowManager::new(unsafe { + DisplayHandle::borrow_raw(RawDisplayHandle::AppKit(AppKitDisplayHandle::new())) + })), gui_config: RwLock::new(CONFIG_MANAGER.load_or_create_config()), } } diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 0030e48..194717b 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -19,7 +19,12 @@ vulkan-renderer = [ vulkan-static = ["dep:ash-molten", "vulkan-renderer"] vulkan-debug = [] pixels-renderer = ["renderer", "dep:pixels"] -wgpu-renderer = ["renderer", "dep:librashader", "librashader/runtime-wgpu"] +wgpu-renderer = [ + "renderer", + "dep:librashader", + "librashader/runtime-wgpu", + "dep:wgpu", +] renderer = [] config = ["dep:directories", "dep:ron"] error-colour = [] @@ -33,16 +38,18 @@ serde = { version = "1.0", features = ["derive"] } serde_with = "3.0" bytemuck = "1.14" num-traits = "0.2" -pixels = { version = "0.13", optional = true } -ash = { version = "0.37", features = ["linked"], optional = true } -ash-window = { version = "0.12", optional = true } -raw-window-handle = { version = "0.5" } +pixels = { git = "https://git.alexjanka.com/alex/pixels", optional = true } +ash = { workspace = true, features = ["linked"], optional = true } +ash-window = { workspace = true, optional = true } + +raw-window-handle = { workspace = true } librashader = { workspace = true, optional = true } librashader-presets = { workspace = true, optional = true } librashader-common = { workspace = true, optional = true } directories = { version = "5.0", optional = true } ron = { version = "0.8", optional = true } lazy_static = "1.4" +wgpu = { version = "0.19", optional = true } [build-dependencies] naga = { version = "0.19", optional = true, features = ["wgsl-in", "spv-out"] } diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 9af961c..9a9c5a3 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -8,13 +8,6 @@ use processor::{ }; use std::sync::mpsc::Receiver; -#[cfg(any( - all(feature = "vulkan-renderer", feature = "pixels-renderer"), - all(feature = "vulkan-renderer", feature = "wgpu-renderer"), - all(feature = "wgpu-renderer", feature = "pixels-renderer") -))] -compile_error!("select only one rendering backend!"); - pub mod renderer; #[cfg(feature = "config")] diff --git a/lib/src/renderer/compat.rs b/lib/src/renderer/compat.rs new file mode 100644 index 0000000..d86b798 --- /dev/null +++ b/lib/src/renderer/compat.rs @@ -0,0 +1,35 @@ +use raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}; + +pub struct DummyHandle<'a> { + pub window: raw_window_handle::WindowHandle<'a>, + pub display: raw_window_handle::DisplayHandle<'a>, +} + +impl<'a> DummyHandle<'a> { + pub fn new(value: &'a T) -> Option + where + T: HasWindowHandle + HasDisplayHandle + 'a, + { + Some(Self { + window: value.window_handle().ok()?, + display: value.display_handle().ok()?, + }) + } +} + +unsafe impl<'a> Sync for DummyHandle<'a> {} +unsafe impl<'a> Send for DummyHandle<'a> {} + +impl<'a> HasWindowHandle for DummyHandle<'a> { + fn window_handle( + &self, + ) -> Result, raw_window_handle::HandleError> { + Ok(self.window) + } +} + +impl<'a> HasDisplayHandle for DummyHandle<'a> { + fn display_handle(&self) -> Result, raw_window_handle::HandleError> { + Ok(self.display) + } +} diff --git a/lib/src/renderer/mod.rs b/lib/src/renderer/mod.rs index 5eed318..2769429 100644 --- a/lib/src/renderer/mod.rs +++ b/lib/src/renderer/mod.rs @@ -1,14 +1,17 @@ use std::{path::PathBuf, sync::Arc}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle}; +use raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}; use crate::connect::ResolutionData; -#[cfg(feature = "vulkan-renderer")] -pub type ActiveBackend = vulkan::VulkanBackend; #[cfg(feature = "wgpu-renderer")] pub type ActiveBackend = wgpu::WgpuBackend; -#[cfg(feature = "pixels-renderer")] +#[cfg(all(feature = "vulkan-renderer", not(feature = "wgpu-renderer")))] +pub type ActiveBackend = vulkan::VulkanBackend; +#[cfg(all( + feature = "pixels-renderer", + not(any(feature = "wgpu-renderer", feature = "vulkan-renderer")) +))] pub type ActiveBackend = pixels::PixelsBackend; #[cfg(feature = "pixels-renderer")] @@ -18,16 +21,18 @@ pub mod vulkan; #[cfg(feature = "wgpu-renderer")] pub mod wgpu; +mod compat; + pub trait RendererBackend { type RendererBackendManager: RendererBackendManager; - fn new( + fn new( resolutions: ResolutionData, window: &W, shader_path: Option, manager: Arc, ) -> Self; - fn resize( + fn resize( &mut self, resolutions: ResolutionData, window: &W, @@ -37,5 +42,5 @@ pub trait RendererBackend { } pub trait RendererBackendManager { - fn new(display_handle: RawDisplayHandle) -> Self; + fn new(display_handle: DisplayHandle) -> Self; } diff --git a/lib/src/renderer/pixels.rs b/lib/src/renderer/pixels.rs index 67f6f4e..2e8ac0c 100644 --- a/lib/src/renderer/pixels.rs +++ b/lib/src/renderer/pixels.rs @@ -1,19 +1,16 @@ use std::{path::PathBuf, sync::Arc}; -use pixels::{ - raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}, - Pixels, SurfaceTexture, -}; -use raw_window_handle::RawDisplayHandle; +use pixels::{Pixels, SurfaceTexture}; +use raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}; use crate::connect::ResolutionData; -use super::{RendererBackend, RendererBackendManager}; +use super::{compat::DummyHandle, RendererBackend, RendererBackendManager}; pub struct PixelsBackendManager {} impl RendererBackendManager for PixelsBackendManager { - fn new(_: RawDisplayHandle) -> Self { + fn new(_: DisplayHandle) -> Self { Self {} } } @@ -25,7 +22,7 @@ pub struct PixelsBackend { impl RendererBackend for PixelsBackend { type RendererBackendManager = PixelsBackendManager; - fn new( + fn new( resolutions: ResolutionData, window: &W, _: Option, @@ -36,7 +33,7 @@ impl RendererBackend for PixelsBackend { } } - fn resize( + fn resize( &mut self, resolutions: ResolutionData, window: &W, @@ -57,12 +54,13 @@ impl RendererBackend for PixelsBackend { } } -fn new_pixels( +fn new_pixels( resolutions: ResolutionData, window: &W, ) -> Pixels { - let surface_texture: SurfaceTexture<'_, W> = - SurfaceTexture::new(resolutions.real_width, resolutions.real_height, window); + let dummy = DummyHandle::new(window).unwrap(); + let surface_texture: SurfaceTexture<'_, DummyHandle> = + SurfaceTexture::new(resolutions.real_width, resolutions.real_height, &dummy); pixels::PixelsBuilder::new( resolutions.scaled_width, resolutions.scaled_height, diff --git a/lib/src/renderer/vulkan/mod.rs b/lib/src/renderer/vulkan/mod.rs index 2b77512..3a03f18 100644 --- a/lib/src/renderer/vulkan/mod.rs +++ b/lib/src/renderer/vulkan/mod.rs @@ -1,7 +1,7 @@ use ash::{util::Align, vk, Entry, Instance}; use ash_window::enumerate_required_extensions; use librashader::runtime::vk::{FilterChain, FilterChainOptions, FrameOptions, VulkanObjects}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle}; +use raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}; use std::{mem::ManuallyDrop, path::PathBuf, sync::Arc}; use crate::connect::ResolutionData; @@ -36,7 +36,7 @@ pub struct VulkanBackendManager { } impl RendererBackendManager for VulkanBackendManager { - fn new(display_handle: RawDisplayHandle) -> Self { + fn new(display_handle: DisplayHandle) -> Self { #[cfg(all(any(target_os = "macos", target_os = "ios"), feature = "vulkan-static"))] let entry = ash_molten::load(); #[cfg(not(all(any(target_os = "macos", target_os = "ios"), feature = "vulkan-static")))] @@ -45,7 +45,7 @@ impl RendererBackendManager for VulkanBackendManager { let name = std::ffi::CString::new("gameboy").unwrap(); #[allow(unused_mut)] - let mut extension_names = enumerate_required_extensions(display_handle) + let mut extension_names = enumerate_required_extensions(display_handle.as_raw()) .unwrap() .to_vec(); @@ -120,7 +120,7 @@ pub struct VulkanWindowOptions { impl RendererBackend for VulkanBackend { type RendererBackendManager = VulkanBackendManager; - fn new( + fn new( resolutions: ResolutionData, window: &W, shader_path: Option, @@ -189,7 +189,7 @@ impl RendererBackend for VulkanBackend { } } - fn resize( + fn resize( &mut self, resolutions: ResolutionData, _window: &W, @@ -220,7 +220,7 @@ struct VulkanWindowInner { } impl VulkanWindowInner { - unsafe fn new( + unsafe fn new( resolutions: ResolutionData, window: &W, manager: &VulkanBackendManager, diff --git a/lib/src/renderer/vulkan/types.rs b/lib/src/renderer/vulkan/types.rs index 475dea6..0d1cce0 100644 --- a/lib/src/renderer/vulkan/types.rs +++ b/lib/src/renderer/vulkan/types.rs @@ -2,6 +2,7 @@ use ash::{ extensions::khr::{Surface, Swapchain}, vk, Device, }; +#[allow(deprecated)] use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; use crate::connect::ResolutionData; @@ -207,6 +208,7 @@ pub(super) struct SurfaceData { } impl SurfaceData { + #[allow(deprecated)] pub(super) unsafe fn new( window: &W, manager: &VulkanBackendManager, @@ -214,8 +216,8 @@ impl SurfaceData { let surface = ash_window::create_surface( &manager.entry, &manager.instance, - window.raw_display_handle(), - window.raw_window_handle(), + window.raw_display_handle().unwrap(), + window.raw_window_handle().unwrap(), None, ) .unwrap(); diff --git a/lib/src/renderer/wgpu.rs b/lib/src/renderer/wgpu.rs index 33f222f..e501678 100644 --- a/lib/src/renderer/wgpu.rs +++ b/lib/src/renderer/wgpu.rs @@ -1,3 +1,45 @@ +use raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}; + +use crate::{ + connect::ResolutionData, + renderer::{RendererBackend, RendererBackendManager}, +}; + pub struct WgpuBackend {} +impl RendererBackend for WgpuBackend { + type RendererBackendManager = WgpuBackendManager; + + fn new( + resolutions: ResolutionData, + window: &W, + shader_path: Option, + manager: std::sync::Arc, + ) -> Self { + todo!() + } + + fn resize( + &mut self, + resolutions: ResolutionData, + window: &W, + ) { + todo!() + } + + fn new_frame(&mut self, buffer: &[[u8; 4]]) { + todo!() + } + + fn render(&mut self, resolutions: ResolutionData, manager: &Self::RendererBackendManager) { + todo!() + } +} + pub struct WgpuBackendManager {} + +impl RendererBackendManager for WgpuBackendManager { + fn new(display_handle: DisplayHandle) -> Self { + todo!() + } +}