backend genericisation (?) and rwh 0.6

This commit is contained in:
Alex Janka 2024-02-08 15:27:48 +11:00
parent 63301c692e
commit 43b800ff80
18 changed files with 219 additions and 363 deletions

339
Cargo.lock generated
View file

@ -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"

View file

@ -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" }

View file

@ -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"

View file

@ -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"),

View file

@ -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,

View file

@ -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 }

View file

@ -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(
<ActiveBackend as RendererBackend>::RendererBackendManager::new(
window.raw_display_handle(),
window.display_handle().unwrap(),
),
);
TwincEditorWindow::new(window, rr_cloned, manager, size, shader_path)

View file

@ -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"] }

View file

@ -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<T>);
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<DisplayHandle<'_>, 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<WindowHandle<'_>, 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)?,
)))
})
}
}

View file

@ -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()),
}
}

View file

@ -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"] }

View file

@ -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")]

View file

@ -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<T>(value: &'a T) -> Option<Self>
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::WindowHandle<'_>, raw_window_handle::HandleError> {
Ok(self.window)
}
}
impl<'a> HasDisplayHandle for DummyHandle<'a> {
fn display_handle(&self) -> Result<DisplayHandle<'_>, raw_window_handle::HandleError> {
Ok(self.display)
}
}

View file

@ -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<W: HasRawDisplayHandle + HasRawWindowHandle>(
fn new<W: HasDisplayHandle + HasWindowHandle>(
resolutions: ResolutionData,
window: &W,
shader_path: Option<PathBuf>,
manager: Arc<Self::RendererBackendManager>,
) -> Self;
fn resize<W: HasRawDisplayHandle + HasRawWindowHandle>(
fn resize<W: HasDisplayHandle + HasWindowHandle>(
&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;
}

View file

@ -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<W: HasRawDisplayHandle + HasRawWindowHandle>(
fn new<W: HasDisplayHandle + HasWindowHandle>(
resolutions: ResolutionData,
window: &W,
_: Option<PathBuf>,
@ -36,7 +33,7 @@ impl RendererBackend for PixelsBackend {
}
}
fn resize<W: HasRawDisplayHandle + HasRawWindowHandle>(
fn resize<W: HasDisplayHandle + HasWindowHandle>(
&mut self,
resolutions: ResolutionData,
window: &W,
@ -57,12 +54,13 @@ impl RendererBackend for PixelsBackend {
}
}
fn new_pixels<W: HasRawDisplayHandle + HasRawWindowHandle>(
fn new_pixels<W: HasDisplayHandle + HasWindowHandle>(
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,

View file

@ -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<W: HasRawDisplayHandle + HasRawWindowHandle>(
fn new<W: HasDisplayHandle + HasWindowHandle>(
resolutions: ResolutionData,
window: &W,
shader_path: Option<PathBuf>,
@ -189,7 +189,7 @@ impl RendererBackend for VulkanBackend {
}
}
fn resize<W: HasRawDisplayHandle + HasRawWindowHandle>(
fn resize<W: HasDisplayHandle + HasWindowHandle>(
&mut self,
resolutions: ResolutionData,
_window: &W,
@ -220,7 +220,7 @@ struct VulkanWindowInner {
}
impl VulkanWindowInner {
unsafe fn new<W: HasRawDisplayHandle + HasRawWindowHandle>(
unsafe fn new<W: HasDisplayHandle + HasWindowHandle>(
resolutions: ResolutionData,
window: &W,
manager: &VulkanBackendManager,

View file

@ -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<W: HasRawDisplayHandle + HasRawWindowHandle>(
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();

View file

@ -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<W: HasDisplayHandle + HasWindowHandle>(
resolutions: ResolutionData,
window: &W,
shader_path: Option<std::path::PathBuf>,
manager: std::sync::Arc<Self::RendererBackendManager>,
) -> Self {
todo!()
}
fn resize<W: HasDisplayHandle + HasWindowHandle>(
&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!()
}
}