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
log.log
*.out.spv
*.recompiled.spv
*.spv-dis
shaders_out
Generated
+35 -26
View File
@@ -39,9 +39,9 @@ dependencies = [
[[package]]
name = "aligned"
version = "0.4.2"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923"
checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685"
dependencies = [
"as-slice",
]
@@ -260,9 +260,9 @@ checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64"
[[package]]
name = "bumpalo"
version = "3.19.0"
version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]]
name = "bytemuck"
@@ -349,9 +349,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.49"
version = "1.2.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215"
checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c"
dependencies = [
"find-msvc-tools",
"jobserver",
@@ -388,9 +388,9 @@ dependencies = [
[[package]]
name = "cmake"
version = "0.1.56"
version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b042e5d8a74ae91bb0961acd039822472ec99f8ab0948cbf6d1369588f8be586"
checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d"
dependencies = [
"cc",
]
@@ -1044,7 +1044,7 @@ dependencies = [
"rgb",
"tiff",
"zune-core 0.5.0",
"zune-jpeg 0.5.6",
"zune-jpeg 0.5.7",
]
[[package]]
@@ -1215,13 +1215,13 @@ dependencies = [
[[package]]
name = "libredox"
version = "0.1.10"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb"
checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50"
dependencies = [
"bitflags 2.10.0",
"libc",
"redox_syscall 0.5.18",
"redox_syscall 0.6.0",
]
[[package]]
@@ -1321,9 +1321,9 @@ dependencies = [
[[package]]
name = "moxcms"
version = "0.7.10"
version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608"
checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97"
dependencies = [
"num-traits",
"pxfm",
@@ -2185,6 +2185,15 @@ dependencies = [
"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]]
name = "rgb"
version = "0.8.52"
@@ -2683,18 +2692,18 @@ dependencies = [
[[package]]
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"
checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533"
checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
dependencies = [
"serde_core",
]
[[package]]
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"
checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832"
checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"
dependencies = [
"indexmap",
"toml_datetime",
@@ -2704,18 +2713,18 @@ dependencies = [
[[package]]
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"
checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e"
checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
dependencies = [
"winnow",
]
[[package]]
name = "tracing"
version = "0.1.43"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647"
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
"log",
"pin-project-lite",
@@ -2724,9 +2733,9 @@ dependencies = [
[[package]]
name = "tracing-core"
version = "0.1.35"
version = "0.1.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c"
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
[[package]]
name = "ttf-parser"
@@ -3649,9 +3658,9 @@ dependencies = [
[[package]]
name = "zune-jpeg"
version = "0.5.6"
version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f520eebad972262a1dde0ec455bce4f8b298b1e5154513de58c114c4c54303e8"
checksum = "51d915729b0e7d5fe35c2f294c5dc10b30207cc637920e5b59077bfa3da63f28"
dependencies = [
"zune-core 0.5.0",
]
+1 -1
View File
@@ -1,7 +1,7 @@
[package]
name = "tape-drive"
version = "0.3.0"
edition = "2021"
edition = "2024"
# 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
`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();
println!("cargo:rerun-if-changed=build.rs");
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();
for path in paths {
@@ -22,8 +22,8 @@ fn main() {
}
}
Command::new("bash")
.arg("assemble_trace.sh")
Command::new("python")
.arg("assemble_trace.py")
.status()
.expect("Failed to assemble header shaders");
}
+19 -22
View File
@@ -228,7 +228,7 @@ struct App {
thread_work_creation: mpmc::Sender<WorkItem>,
thread_work_completion: mpsc::Receiver<WorkComplete>,
rcx: Arc<Mutex<Option<RenderContext>>>,
_watcher: RecommendedWatcher,
_watcher: Option<RecommendedWatcher>,
glsl_changed: Arc<AtomicBool>,
}
@@ -521,7 +521,7 @@ impl App {
.wait(None)
.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)
.unwrap()
.into_owned();
@@ -529,7 +529,7 @@ impl App {
rspirv::binary::parse_words(trace_spv_code_u32, &mut loader).unwrap();
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)
.unwrap()
.into_owned();
@@ -552,11 +552,10 @@ impl App {
let glsl_changed = Arc::new(AtomicBool::new(false));
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 {
Ok(event) => {
//info!("event: {:?}", event);
#[cfg(target_os = "linux")]
match event.kind {
notify::EventKind::Modify(notify::event::ModifyKind::Data(_)) => {
info!("event: {:?}", event);
@@ -568,23 +567,21 @@ impl App {
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 {
if let Ok(path) = path {
if path
.path()
.extension()
.map(|ext| ext == "glsl")
.unwrap_or(false)
if let Ok(path) = path
&& path.path().extension().is_some_and(|ext| ext == "glsl")
&& let Some(watcher) = &mut watcher
{
_watcher
let _ = watcher
.watch(&path.path(), notify::RecursiveMode::NonRecursive)
.unwrap();
}
.inspect_err(|f| {
error!("Failed to watch {}: {}", path.path().display(), f)
});
}
}
}
@@ -615,7 +612,7 @@ impl App {
thread_work_creation: thread_work_creation_sender,
thread_work_completion: thread_work_completion_receiver,
rcx: Arc::new(Mutex::new(None)),
_watcher,
_watcher: watcher,
glsl_changed,
}
}
@@ -1547,7 +1544,7 @@ impl App {
}
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() {
error!("Could not read trace frag file");
return;
@@ -1561,7 +1558,7 @@ impl App {
}
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() {
error!("Could not read normals frag file");
return;
@@ -1742,8 +1739,8 @@ impl App {
if self.glsl_changed.load(std::sync::atomic::Ordering::SeqCst) {
self.glsl_changed
.store(false, std::sync::atomic::Ordering::SeqCst);
if std::process::Command::new("bash")
.arg("assemble_trace.sh")
if std::process::Command::new("python")
.arg("assemble_trace.py")
.status()
.is_err()
{
+1 -1
View File
@@ -82,7 +82,7 @@ pub(crate) fn load_obj(
for v in &p.0 {
//trace!("{:?}", v);
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);
indices.push(exist);
} else {
+6
View File
@@ -185,12 +185,14 @@ unsafe fn build_acceleration_structure_common(
)
.unwrap();
unsafe {
builder
.build_acceleration_structure(
as_build_geometry_info,
iter::once(as_build_range_info).collect(),
)
.unwrap();
}
builder
.build()
@@ -223,6 +225,7 @@ unsafe fn build_acceleration_structure_triangles(
let geometries = AccelerationStructureGeometries::Triangles(vec![as_geometry_triangles_data]);
unsafe {
build_acceleration_structure_common(
geometries,
primitive_count,
@@ -232,6 +235,7 @@ unsafe fn build_acceleration_structure_triangles(
device,
queue,
)
}
}
unsafe fn build_top_level_acceleration_structure(
@@ -265,6 +269,7 @@ unsafe fn build_top_level_acceleration_structure(
let geometries = AccelerationStructureGeometries::Instances(as_geometry_instances_data);
unsafe {
build_acceleration_structure_common(
geometries,
primitive_count,
@@ -274,4 +279,5 @@ unsafe fn build_top_level_acceleration_structure(
device,
queue,
)
}
}