diff --git a/Cargo.lock b/Cargo.lock index 915f0ae..5604648 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1222,19 +1222,13 @@ dependencies = [ name = "gb-emu" version = "0.4.0" dependencies = [ - "ash", - "ash-window", - "bytemuck", "clap", "cpal", "ctrlc", "futures", "gb-emu-lib", "gilrs", - "librashader", - "naga 0.13.0", "nokhwa", - "pixels", "raw-window-handle", "send_wrapper", "winit", @@ -1243,15 +1237,20 @@ dependencies = [ [[package]] name = "gb-emu-lib" -version = "0.3.3" +version = "0.4.0" dependencies = [ + "ash", + "ash-window", "async-ringbuf", "bytemuck", "futures", "itertools", + "librashader", + "naga 0.13.0", "num-traits", - "once_cell", + "pixels", "rand", + "raw-window-handle", "serde", "serde_with", ] diff --git a/gb-emu/Cargo.toml b/gb-emu/Cargo.toml index 4630877..81bc60b 100644 --- a/gb-emu/Cargo.toml +++ b/gb-emu/Cargo.toml @@ -5,19 +5,12 @@ edition = "2021" [features] default = ["vulkan"] -pixels = ["dep:pixels"] -vulkan = [ - "dep:ash", - "dep:ash-window", - "dep:raw-window-handle", - "dep:naga", - # "dep:librashader-common", - "dep:librashader", -] +pixels = ["gb-emu-lib/pixels-renderer"] +vulkan = ["dep:raw-window-handle", "gb-emu-lib/vulkan-renderer"] camera = ["dep:nokhwa", "dep:send_wrapper"] [dependencies] -gb-emu-lib = { path = "../lib" } +gb-emu-lib = { path = "../lib", default-features = false } clap = { version = "4.1.8", features = ["derive"] } gilrs = "0.10" cpal = "0.15" @@ -29,17 +22,4 @@ nokhwa = { version = "0.10.3", features = [ send_wrapper = { version = "0.6.0", optional = true } winit = "0.28" winit_input_helper = "0.14" -bytemuck = "1.13" -pixels = { version = "0.12", optional = true } -ash = { version = "0.37", features = ["linked"], optional = true } -ash-window = { version = "0.12", optional = true } raw-window-handle = { version = "0.5", optional = true } -# librashader-common = { version = "0.1", optional = true, default-features = false, features = [ -# "vulkan", -# ] } -librashader = { version = "0.1", optional = true, default-features = false, features = [ - "runtime-vk", -] } - -[build-dependencies] -naga = { version = "0.13", optional = true, features = ["wgsl-in", "spv-out"] } diff --git a/gb-emu/src/window.rs b/gb-emu/src/window.rs index 9d6e499..b5bc175 100644 --- a/gb-emu/src/window.rs +++ b/gb-emu/src/window.rs @@ -4,7 +4,10 @@ use std::{ sync::{mpsc::Sender, Arc, Mutex, RwLock}, }; -use gb_emu_lib::connect::{EmulatorMessage, JoypadState, Renderer}; +use gb_emu_lib::{ + connect::{EmulatorMessage, JoypadState, Renderer, ResolutionData}, + renderer::{RendererBackend, RendererBackendManager, WindowOptions}, +}; use gilrs::{ ff::{BaseEffect, BaseEffectType, EffectBuilder, Replay, Ticks}, Button, Gilrs, @@ -20,22 +23,6 @@ use winit::{ }; use winit_input_helper::WinitInputHelper; -#[cfg_attr(feature = "pixels", path = "renderer/pixels.rs")] -#[cfg_attr(feature = "vulkan", path = "renderer/vulkan/vulkan.rs")] -mod renderer; - -use renderer::RendererBackend; - -use self::renderer::{RendererBackendManager, WindowOptions}; - -#[derive(Clone, Copy, Debug)] -pub struct ResolutionData { - real_width: u32, - real_height: u32, - scaled_width: u32, - scaled_height: u32, -} - pub struct WindowInfo { id: WindowId, data: Arc, diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 84d49d1..15a94c7 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -1,19 +1,36 @@ [package] name = "gb-emu-lib" -version = "0.3.3" +version = "0.4.0" edition = "2021" [features] default = [] clocked-serial = [] +vulkan-renderer = [ + "dep:ash", + "dep:ash-window", + "dep:raw-window-handle", + "dep:naga", + "dep:librashader", +] +pixels-renderer = ["dep:pixels"] [dependencies] rand = "0.8.5" async-ringbuf = "0.1.2" futures = "0.3" -once_cell = "1.17.1" itertools = "0.10.5" serde = { version = "1.0", features = ["derive"] } serde_with = "3.0" bytemuck = "1.13" num-traits = "0.2" +pixels = { version = "0.12", optional = true } +ash = { version = "0.37", features = ["linked"], optional = true } +ash-window = { version = "0.12", optional = true } +raw-window-handle = { version = "0.5", optional = true } +librashader = { version = "0.1", optional = true, default-features = false, features = [ + "runtime-vk", +] } + +[build-dependencies] +naga = { version = "0.13", optional = true, features = ["wgsl-in", "spv-out"] } diff --git a/gb-emu/build.rs b/lib/build.rs similarity index 97% rename from gb-emu/build.rs rename to lib/build.rs index 85b807e..8745ff0 100644 --- a/gb-emu/build.rs +++ b/lib/build.rs @@ -1,5 +1,5 @@ fn main() -> Result<(), Box> { - #[cfg(feature = "vulkan")] + #[cfg(feature = "vulkan-renderer")] { const SHADER_SRC_DIR: &str = "src/renderer/vulkan/shaders"; const SHADER_OUT_DIR: &str = "shaders"; diff --git a/lib/shaders/shader.spv b/lib/shaders/shader.spv new file mode 100644 index 0000000..a855a92 Binary files /dev/null and b/lib/shaders/shader.spv differ diff --git a/lib/src/connect/mod.rs b/lib/src/connect/mod.rs index c8eb4c8..bc5cce6 100644 --- a/lib/src/connect/mod.rs +++ b/lib/src/connect/mod.rs @@ -38,6 +38,15 @@ pub trait Renderer> { fn set_rumble(&mut self, _rumbling: bool) {} } +#[cfg(any(feature = "vulkan-renderer", feature = "pixels-renderer"))] +#[derive(Clone, Copy, Debug)] +pub struct ResolutionData { + pub real_width: u32, + pub real_height: u32, + pub scaled_width: u32, + pub scaled_height: u32, +} + pub struct AudioOutput { pub sample_rate: f32, pub send_rb: AsyncHeapProducer<[f32; 2]>, diff --git a/lib/src/lib.rs b/lib/src/lib.rs index e469b24..5768fea 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -26,6 +26,12 @@ use std::{ sync::{mpsc::Receiver, Arc, Mutex}, }; +#[allow(unused_attributes)] +#[cfg(any(feature = "vulkan-renderer", feature = "pixels-renderer"))] +#[cfg_attr(feature = "pixels-renderer", path = "renderer/pixels.rs")] +#[cfg_attr(feature = "vulkan-renderer", path = "renderer/vulkan/vulkan.rs")] +pub mod renderer; + pub mod connect; mod constants; mod processor; diff --git a/gb-emu/src/renderer/pixels.rs b/lib/src/renderer/pixels.rs similarity index 96% rename from gb-emu/src/renderer/pixels.rs rename to lib/src/renderer/pixels.rs index 73cac56..f441b5b 100644 --- a/gb-emu/src/renderer/pixels.rs +++ b/lib/src/renderer/pixels.rs @@ -5,12 +5,12 @@ use pixels::{ Pixels, SurfaceTexture, }; -use super::ResolutionData; +use crate::connect::ResolutionData; pub struct RendererBackendManager {} impl RendererBackendManager { - pub(super) fn new() -> Self { + pub fn new() -> Self { Self {} } } diff --git a/gb-emu/src/renderer/vulkan/shaders/shader.wgsl b/lib/src/renderer/vulkan/shaders/shader.wgsl similarity index 100% rename from gb-emu/src/renderer/vulkan/shaders/shader.wgsl rename to lib/src/renderer/vulkan/shaders/shader.wgsl diff --git a/gb-emu/src/renderer/vulkan/types.rs b/lib/src/renderer/vulkan/types.rs similarity index 99% rename from gb-emu/src/renderer/vulkan/types.rs rename to lib/src/renderer/vulkan/types.rs index 08a8164..b4c54ac 100644 --- a/gb-emu/src/renderer/vulkan/types.rs +++ b/lib/src/renderer/vulkan/types.rs @@ -4,7 +4,7 @@ use ash::{ }; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; -use crate::window::ResolutionData; +use crate::connect::ResolutionData; use super::{ utils::{find_memorytype_index, record_submit_commandbuffer}, diff --git a/gb-emu/src/renderer/vulkan/utils.rs b/lib/src/renderer/vulkan/utils.rs similarity index 100% rename from gb-emu/src/renderer/vulkan/utils.rs rename to lib/src/renderer/vulkan/utils.rs diff --git a/gb-emu/src/renderer/vulkan/vulkan.rs b/lib/src/renderer/vulkan/vulkan.rs similarity index 99% rename from gb-emu/src/renderer/vulkan/vulkan.rs rename to lib/src/renderer/vulkan/vulkan.rs index 4ad3eff..0cbe260 100644 --- a/gb-emu/src/renderer/vulkan/vulkan.rs +++ b/lib/src/renderer/vulkan/vulkan.rs @@ -5,6 +5,8 @@ use ash_window::enumerate_required_extensions; use librashader::runtime::vk::{FilterChain, FilterChainOptions, FrameOptions, VulkanObjects}; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle}; +use crate::connect::ResolutionData; + use self::{ types::{FramebufferData, SurfaceData, SwapchainData, Vertex, VulkanData, SHADER_INPUT_FORMAT}, utils::{ @@ -13,8 +15,6 @@ use self::{ }, }; -use super::ResolutionData; - mod types; mod utils;