From 80a209d00c94d773242d4b3c8c8b9af3ec1f5c7b Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Mon, 16 Jun 2025 03:48:57 +1000 Subject: [PATCH] rust: Support Windows (and Linux hopefully) --- Cargo.toml | 9 ++++++++- build.rs | 39 +++++++++++++++++++++++++++++---------- src/rust/nehe/context.rs | 4 ++-- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b4f203e..31516e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,14 @@ name = "NeHe-SDL_GPU" edition = "2024" [dependencies] -sdl3-sys = { version = "0.5.1", features = [ "link-framework" ] } +sdl3-sys = "0.5.2" + +[target.'cfg(target_os = "macos")'.dependencies] +sdl3-sys = { version = "0.5.2", features = [ "link-framework" ] } + +[target.'cfg(windows)'.dependencies] +sdl3-sys = { version = "0.5.2", features = [ "build-from-source" ] } +sdl3-src = { version = "3.1.10-prerelease-0" } [lib] name = "nehe" diff --git a/build.rs b/build.rs index e704694..d5fecf0 100644 --- a/build.rs +++ b/build.rs @@ -18,7 +18,7 @@ pub fn get_target_dir() -> PathBuf Path::new(&manifest_dir).join("target").join(build_type) } -pub fn copy_resources(src_dir: &PathBuf, dst_dir: &PathBuf, resources: &[&str; N]) +pub fn copy_resources>(src_dir: &PathBuf, dst_dir: &PathBuf, resources: Vec) { if !dst_dir.is_dir() { @@ -26,20 +26,39 @@ pub fn copy_resources(src_dir: &PathBuf, dst_dir: &PathBuf, reso } for resource in resources { - std::fs::copy(&src_dir.join(resource), &dst_dir.join(resource)).unwrap(); + std::fs::copy(&src_dir.join(resource.as_ref()), &dst_dir.join(resource.as_ref())).unwrap(); } } +pub fn copy_shaders(src_dir: &PathBuf, dst_dir: &PathBuf, shaders: &[&str; N]) +{ + let resources = shaders.into_iter().flat_map(|name| + { + if cfg!(target_os="macos") + { + vec![format!("{name}.metallib")] + } + else + { + vec![format!("{name}.vtx.spv"), format!("{name}.frg.spv")] + } + }).collect(); + copy_resources(src_dir, dst_dir, resources); +} + pub fn main() { #[cfg(target_os="macos")] println!("cargo:rustc-link-arg=-Wl,-rpath,/Library/Frameworks"); + #[cfg(target_os="linux")] + println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN"); + let src_dir = std::env::current_dir().unwrap().join("data"); let dst_dir = get_target_dir().join("Data"); copy_resources(&src_dir, &dst_dir, - &[ + vec![ "NeHe.bmp", "Crate.bmp", "Glass.bmp", @@ -47,13 +66,13 @@ pub fn main() "Mud.bmp", "World.txt", ]); - copy_resources(&src_dir.join("shaders"), &dst_dir.join("Shaders"), + copy_shaders(&src_dir.join("shaders"), &dst_dir.join("Shaders"), &[ - "lesson2.metallib", - "lesson3.metallib", - "lesson6.metallib", - "lesson7.metallib", - "lesson8.metallib", - "lesson9.metallib", + "lesson2", + "lesson3", + "lesson6", + "lesson7", + "lesson8", + "lesson9", ]); } diff --git a/src/rust/nehe/context.rs b/src/rust/nehe/context.rs index d0bf341..8edbebb 100644 --- a/src/rust/nehe/context.rs +++ b/src/rust/nehe/context.rs @@ -178,8 +178,8 @@ impl NeHeContext { info.format = SDL_GPU_SHADERFORMAT_SPIRV; Ok(( - self.load_shader(path.appending_ext("vtx.spv"), &info, SDL_GPU_SHADERSTAGE_VERTEX, "main")?, - self.load_shader(path.appending_ext("frg.spv"), &info, SDL_GPU_SHADERSTAGE_FRAGMENT, "main")? + self.load_shader(path.appending_ext("vtx.spv"), &info, SDL_GPU_SHADERSTAGE_VERTEX, "VertexMain")?, + self.load_shader(path.appending_ext("frg.spv"), &info, SDL_GPU_SHADERSTAGE_FRAGMENT, "FragmentMain")? )) } else if available_formats & SDL_GPU_SHADERFORMAT_DXIL == SDL_GPU_SHADERFORMAT_DXIL