Make it compilable from windows

This commit is contained in:
2025-12-19 22:39:00 +00:00
parent 2a3c3fbab4
commit d34b6eef07
10 changed files with 175 additions and 109 deletions
-1
View File
@@ -2,6 +2,5 @@
pipeline_cache.bin pipeline_cache.bin
log.log log.log
*.out.spv *.out.spv
*.recompiled.spv
*.spv-dis *.spv-dis
shaders_out shaders_out
Generated
+35 -26
View File
@@ -39,9 +39,9 @@ dependencies = [
[[package]] [[package]]
name = "aligned" name = "aligned"
version = "0.4.2" version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685"
dependencies = [ dependencies = [
"as-slice", "as-slice",
] ]
@@ -260,9 +260,9 @@ checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64"
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.19.0" version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
@@ -349,9 +349,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.49" version = "1.2.50"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c"
dependencies = [ dependencies = [
"find-msvc-tools", "find-msvc-tools",
"jobserver", "jobserver",
@@ -388,9 +388,9 @@ dependencies = [
[[package]] [[package]]
name = "cmake" name = "cmake"
version = "0.1.56" version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b042e5d8a74ae91bb0961acd039822472ec99f8ab0948cbf6d1369588f8be586" checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d"
dependencies = [ dependencies = [
"cc", "cc",
] ]
@@ -1044,7 +1044,7 @@ dependencies = [
"rgb", "rgb",
"tiff", "tiff",
"zune-core 0.5.0", "zune-core 0.5.0",
"zune-jpeg 0.5.6", "zune-jpeg 0.5.7",
] ]
[[package]] [[package]]
@@ -1215,13 +1215,13 @@ dependencies = [
[[package]] [[package]]
name = "libredox" name = "libredox"
version = "0.1.10" version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"libc", "libc",
"redox_syscall 0.5.18", "redox_syscall 0.6.0",
] ]
[[package]] [[package]]
@@ -1321,9 +1321,9 @@ dependencies = [
[[package]] [[package]]
name = "moxcms" name = "moxcms"
version = "0.7.10" version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97"
dependencies = [ dependencies = [
"num-traits", "num-traits",
"pxfm", "pxfm",
@@ -2185,6 +2185,15 @@ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
] ]
[[package]]
name = "redox_syscall"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5"
dependencies = [
"bitflags 2.10.0",
]
[[package]] [[package]]
name = "rgb" name = "rgb"
version = "0.8.52" version = "0.8.52"
@@ -2683,18 +2692,18 @@ dependencies = [
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "0.7.3" version = "0.7.5+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
dependencies = [ dependencies = [
"serde_core", "serde_core",
] ]
[[package]] [[package]]
name = "toml_edit" name = "toml_edit"
version = "0.23.9" version = "0.23.10+spec-1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"
dependencies = [ dependencies = [
"indexmap", "indexmap",
"toml_datetime", "toml_datetime",
@@ -2704,18 +2713,18 @@ dependencies = [
[[package]] [[package]]
name = "toml_parser" name = "toml_parser"
version = "1.0.4" version = "1.0.6+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
dependencies = [ dependencies = [
"winnow", "winnow",
] ]
[[package]] [[package]]
name = "tracing" name = "tracing"
version = "0.1.43" version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [ dependencies = [
"log", "log",
"pin-project-lite", "pin-project-lite",
@@ -2724,9 +2733,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.35" version = "0.1.36"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
[[package]] [[package]]
name = "ttf-parser" name = "ttf-parser"
@@ -3649,9 +3658,9 @@ dependencies = [
[[package]] [[package]]
name = "zune-jpeg" name = "zune-jpeg"
version = "0.5.6" version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f520eebad972262a1dde0ec455bce4f8b298b1e5154513de58c114c4c54303e8" checksum = "51d915729b0e7d5fe35c2f294c5dc10b30207cc637920e5b59077bfa3da63f28"
dependencies = [ dependencies = [
"zune-core 0.5.0", "zune-core 0.5.0",
] ]
+1 -1
View File
@@ -1,7 +1,7 @@
[package] [package]
name = "tape-drive" name = "tape-drive"
version = "0.3.0" version = "0.3.0"
edition = "2021" edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+1 -1
View File
@@ -4,4 +4,4 @@ A realtime renderer for implicit surfaces that JIT compiles the bytecode represe
## Building ## Building
`assemble_trace.sh && cargo build --release` `python assemble_trace.py && cargo build --release`
+83
View File
@@ -0,0 +1,83 @@
#!/bin/python3
import shutil
import os
import sys
import subprocess
import re
SHADERS_DIR = "shaders_out"
TARGET_ENV = "vulkan1.3"
shutil.rmtree(SHADERS_DIR)
os.mkdir(SHADERS_DIR)
normal_shaders = [
("fullscreen.vert", "vert"),
("lighting.frag", "frag"),
("trace.vert", "vert"),
("rgen", "rgen"),
("rchit", "rchit"),
("rmiss", "rmiss"),
]
for shader, ty in normal_shaders:
result = subprocess.run(
[
"glslangValidator",
"--spirv-val",
"-gVS",
"-S",
ty,
"--target-env",
TARGET_ENV,
"-o",
f"{SHADERS_DIR}/{shader}.spv",
f"src/shaders/{shader}.glsl",
]
)
if result.returncode != 0:
sys.exit(result.returncode)
replacement_shaders = [("trace.frag", "frag"), ("normals.frag", "frag")]
for shader, ty in replacement_shaders:
print(f"src/shaders/{shader}.glsl")
result = subprocess.run(
[
"glslangValidator",
"--spirv-val",
"--spirv-dis",
"-g0",
"-S",
ty,
"--target-env",
TARGET_ENV,
"--quiet",
"src/shaders/trace.frag.glsl",
],
capture_output=True,
text=True,
)
if result.returncode != 0:
sys.exit(result.returncode)
asm = result.stdout
asm = re.sub(r"(?ms)%11 =.*OpFunctionEnd", "", asm)
asm = re.sub(r"%11 ", "%1000 ", asm)
with open(f"{SHADERS_DIR}/{shader}.spv-dis", "w") as f:
f.write(asm)
result = subprocess.run(
[
"spirv-as",
"--preserve-numeric-ids",
"--target-env",
"vulkan1.3",
"-o",
f"{SHADERS_DIR}/{shader}.spv",
],
input=asm,
encoding="ascii",
)
if result.returncode != 0:
sys.exit(result.returncode)
os.remove(f"{ty}.spv")
-28
View File
@@ -1,28 +0,0 @@
#!/bin/bash
rm -r shaders_out
mkdir -p shaders_out
glslangValidator --spirv-val -gVS -S vert --target-env vulkan1.3 -o shaders_out/fullscreen.vert.spv src/shaders/fullscreen.vert.glsl
glslangValidator --spirv-val -gVS -S frag --target-env vulkan1.3 -o shaders_out/lighting.frag.spv src/shaders/lighting.frag.glsl
glslangValidator --spirv-val -gVS -S vert --target-env vulkan1.3 -o shaders_out/trace.vert.spv src/shaders/trace.vert.glsl
glslangValidator --spirv-val -gVS -S rgen --target-env vulkan1.3 -o shaders_out/rgen.spv src/shaders/rgen.glsl
glslangValidator --spirv-val -gVS -S rchit --target-env vulkan1.3 -o shaders_out/rchit.spv src/shaders/rchit.glsl
glslangValidator --spirv-val -gVS -S rmiss --target-env vulkan1.3 -o shaders_out/rmiss.spv src/shaders/rmiss.glsl
echo src/shaders/trace.frag.glsl
glslangValidator --spirv-val --spirv-dis -g0 -S frag --target-env vulkan1.3 --quiet src/shaders/trace.frag.glsl > shaders_out/trace.spv-dis
sed -i '/%11 =/,/OpFunctionEnd/d' shaders_out/trace.spv-dis
sed -i 's/%11\b/%1000/g' shaders_out/trace.spv-dis
spirv-as --preserve-numeric-ids --target-env vulkan1.3 -o shaders_out/trace.recompiled.spv shaders_out/trace.spv-dis
rm frag.spv
# rm shaders_out/trace.spv-dis
echo src/shaders/normals.frag.glsl
glslangValidator --spirv-val --spirv-dis -g0 -S frag --target-env vulkan1.3 --quiet src/shaders/normals.frag.glsl > shaders_out/normals.spv-dis
sed -i '/%11 =/,/OpFunctionEnd/d' shaders_out/normals.spv-dis
sed -i 's/%11\b/%1000/g' shaders_out/normals.spv-dis
spirv-as --preserve-numeric-ids --target-env vulkan1.3 -o shaders_out/normals.recompiled.spv shaders_out/normals.spv-dis
rm frag.spv
# rm shaders_out/normals.spv-dis
+3 -3
View File
@@ -4,7 +4,7 @@ fn main() {
//let mut output = std::fs::File::create("output.txt").unwrap(); //let mut output = std::fs::File::create("output.txt").unwrap();
println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=Cargo.lock"); println!("cargo:rerun-if-changed=Cargo.lock");
println!("cargo:rerun-if-changed=assemble_trace.sh"); println!("cargo:rerun-if-changed=assemble_trace.py");
let paths = read_dir("src/shaders").unwrap(); let paths = read_dir("src/shaders").unwrap();
for path in paths { for path in paths {
@@ -22,8 +22,8 @@ fn main() {
} }
} }
Command::new("bash") Command::new("python")
.arg("assemble_trace.sh") .arg("assemble_trace.py")
.status() .status()
.expect("Failed to assemble header shaders"); .expect("Failed to assemble header shaders");
} }
+21 -24
View File
@@ -228,7 +228,7 @@ struct App {
thread_work_creation: mpmc::Sender<WorkItem>, thread_work_creation: mpmc::Sender<WorkItem>,
thread_work_completion: mpsc::Receiver<WorkComplete>, thread_work_completion: mpsc::Receiver<WorkComplete>,
rcx: Arc<Mutex<Option<RenderContext>>>, rcx: Arc<Mutex<Option<RenderContext>>>,
_watcher: RecommendedWatcher, _watcher: Option<RecommendedWatcher>,
glsl_changed: Arc<AtomicBool>, glsl_changed: Arc<AtomicBool>,
} }
@@ -521,7 +521,7 @@ impl App {
.wait(None) .wait(None)
.unwrap(); .unwrap();
let trace_spv_code = include_bytes!("../shaders_out/trace.recompiled.spv"); let trace_spv_code = include_bytes!("../shaders_out/trace.frag.spv");
let trace_spv_code_u32 = vulkano::shader::spirv::bytes_to_words(trace_spv_code) let trace_spv_code_u32 = vulkano::shader::spirv::bytes_to_words(trace_spv_code)
.unwrap() .unwrap()
.into_owned(); .into_owned();
@@ -529,7 +529,7 @@ impl App {
rspirv::binary::parse_words(trace_spv_code_u32, &mut loader).unwrap(); rspirv::binary::parse_words(trace_spv_code_u32, &mut loader).unwrap();
let trace_module = loader.module(); let trace_module = loader.module();
let normals_spv_code = include_bytes!("../shaders_out/normals.recompiled.spv"); let normals_spv_code = include_bytes!("../shaders_out/normals.frag.spv");
let normals_spv_code_u32 = vulkano::shader::spirv::bytes_to_words(normals_spv_code) let normals_spv_code_u32 = vulkano::shader::spirv::bytes_to_words(normals_spv_code)
.unwrap() .unwrap()
.into_owned(); .into_owned();
@@ -552,11 +552,10 @@ impl App {
let glsl_changed = Arc::new(AtomicBool::new(false)); let glsl_changed = Arc::new(AtomicBool::new(false));
let watcher_glsl_changed = glsl_changed.clone(); let watcher_glsl_changed = glsl_changed.clone();
let mut _watcher = notify::recommended_watcher( let mut watcher = notify::recommended_watcher(
move |res: Result<notify::Event, notify::Error>| match res { move |res: Result<notify::Event, notify::Error>| match res {
Ok(event) => { Ok(event) => {
//info!("event: {:?}", event); //info!("event: {:?}", event);
#[cfg(target_os = "linux")]
match event.kind { match event.kind {
notify::EventKind::Modify(notify::event::ModifyKind::Data(_)) => { notify::EventKind::Modify(notify::event::ModifyKind::Data(_)) => {
info!("event: {:?}", event); info!("event: {:?}", event);
@@ -568,23 +567,21 @@ impl App {
Err(e) => error!("watch error: {:?}", e), Err(e) => error!("watch error: {:?}", e),
}, },
) )
.unwrap(); .ok();
#[cfg(target_os = "linux")] if watcher.is_some()
&& let Ok(paths) = std::fs::read_dir("src/shaders")
{ {
let paths = std::fs::read_dir("src/shaders").unwrap();
for path in paths { for path in paths {
if let Ok(path) = path { if let Ok(path) = path
if path && path.path().extension().is_some_and(|ext| ext == "glsl")
.path() && let Some(watcher) = &mut watcher
.extension() {
.map(|ext| ext == "glsl") let _ = watcher
.unwrap_or(false) .watch(&path.path(), notify::RecursiveMode::NonRecursive)
{ .inspect_err(|f| {
_watcher error!("Failed to watch {}: {}", path.path().display(), f)
.watch(&path.path(), notify::RecursiveMode::NonRecursive) });
.unwrap();
}
} }
} }
} }
@@ -615,7 +612,7 @@ impl App {
thread_work_creation: thread_work_creation_sender, thread_work_creation: thread_work_creation_sender,
thread_work_completion: thread_work_completion_receiver, thread_work_completion: thread_work_completion_receiver,
rcx: Arc::new(Mutex::new(None)), rcx: Arc::new(Mutex::new(None)),
_watcher, _watcher: watcher,
glsl_changed, glsl_changed,
} }
} }
@@ -1547,7 +1544,7 @@ impl App {
} }
fn load_all_spv_from_file(&mut self, rcx: &mut RenderContext) { fn load_all_spv_from_file(&mut self, rcx: &mut RenderContext) {
let trace_frag = read_spirv_words_from_file("trace.recompiled.spv"); let trace_frag = read_spirv_words_from_file("trace.frag.spv");
if trace_frag.is_err() { if trace_frag.is_err() {
error!("Could not read trace frag file"); error!("Could not read trace frag file");
return; return;
@@ -1561,7 +1558,7 @@ impl App {
} }
let trace_vert = trace_vert.unwrap(); let trace_vert = trace_vert.unwrap();
let normals_frag = read_spirv_words_from_file("normals.recompiled.spv"); let normals_frag = read_spirv_words_from_file("normals.frag.spv");
if normals_frag.is_err() { if normals_frag.is_err() {
error!("Could not read normals frag file"); error!("Could not read normals frag file");
return; return;
@@ -1742,8 +1739,8 @@ impl App {
if self.glsl_changed.load(std::sync::atomic::Ordering::SeqCst) { if self.glsl_changed.load(std::sync::atomic::Ordering::SeqCst) {
self.glsl_changed self.glsl_changed
.store(false, std::sync::atomic::Ordering::SeqCst); .store(false, std::sync::atomic::Ordering::SeqCst);
if std::process::Command::new("bash") if std::process::Command::new("python")
.arg("assemble_trace.sh") .arg("assemble_trace.py")
.status() .status()
.is_err() .is_err()
{ {
+1 -1
View File
@@ -82,7 +82,7 @@ pub(crate) fn load_obj(
for v in &p.0 { for v in &p.0 {
//trace!("{:?}", v); //trace!("{:?}", v);
let mapping = ((v.0) as u32, (v.2.unwrap_or(0)) as u32); let mapping = ((v.0) as u32, (v.2.unwrap_or(0)) as u32);
if let Some(&exist) = &temp_hash_map.get(&mapping) { if let Some(&exist) = temp_hash_map.get(&mapping) {
//trace!("{:?}", exist); //trace!("{:?}", exist);
indices.push(exist); indices.push(exist);
} else { } else {
+30 -24
View File
@@ -185,12 +185,14 @@ unsafe fn build_acceleration_structure_common(
) )
.unwrap(); .unwrap();
builder unsafe {
.build_acceleration_structure( builder
as_build_geometry_info, .build_acceleration_structure(
iter::once(as_build_range_info).collect(), as_build_geometry_info,
) iter::once(as_build_range_info).collect(),
.unwrap(); )
.unwrap();
}
builder builder
.build() .build()
@@ -223,15 +225,17 @@ unsafe fn build_acceleration_structure_triangles(
let geometries = AccelerationStructureGeometries::Triangles(vec![as_geometry_triangles_data]); let geometries = AccelerationStructureGeometries::Triangles(vec![as_geometry_triangles_data]);
build_acceleration_structure_common( unsafe {
geometries, build_acceleration_structure_common(
primitive_count, geometries,
AccelerationStructureType::BottomLevel, primitive_count,
memory_allocator, AccelerationStructureType::BottomLevel,
command_buffer_allocator, memory_allocator,
device, command_buffer_allocator,
queue, device,
) queue,
)
}
} }
unsafe fn build_top_level_acceleration_structure( unsafe fn build_top_level_acceleration_structure(
@@ -265,13 +269,15 @@ unsafe fn build_top_level_acceleration_structure(
let geometries = AccelerationStructureGeometries::Instances(as_geometry_instances_data); let geometries = AccelerationStructureGeometries::Instances(as_geometry_instances_data);
build_acceleration_structure_common( unsafe {
geometries, build_acceleration_structure_common(
primitive_count, geometries,
AccelerationStructureType::TopLevel, primitive_count,
allocator, AccelerationStructureType::TopLevel,
command_buffer_allocator, allocator,
device, command_buffer_allocator,
queue, device,
) queue,
)
}
} }