From 5aac68ed764b8dc776643886ddaefce13b8d375e Mon Sep 17 00:00:00 2001 From: ReversedCausality Date: Sat, 28 Sep 2024 22:25:55 +0100 Subject: [PATCH] Remove fancy profiling stuff. --- Cargo.lock | 316 --------------------------------------------- Cargo.toml | 4 +- src/lib.rs | 43 ++---- world/default.tiff | Bin 18875863 -> 18875863 bytes 4 files changed, 10 insertions(+), 353 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d6f439e..e8f9828 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -129,29 +129,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.6.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.77", - "which", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -281,15 +258,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -302,17 +270,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "3.2.25" @@ -464,13 +421,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "cuda_device_sys" -version = "0.1.0" -dependencies = [ - "bindgen", -] - [[package]] name = "cursor-icon" version = "1.1.0" @@ -569,31 +519,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" -[[package]] -name = "ffmpeg-next" -version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a340e3d664ad5f530147cd6d4a86ece739a829fe2d81c369389ef903bd96f6" -dependencies = [ - "bitflags 2.6.0", - "ffmpeg-sys-next", - "libc", -] - -[[package]] -name = "ffmpeg-sys-next" -version = "7.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ac996bad6d164a08069a1e9b3370045860dba3d315acda09420f1febef9e" -dependencies = [ - "bindgen", - "cc", - "libc", - "num_cpus", - "pkg-config", - "vcpkg", -] - [[package]] name = "fixedbitset" version = "0.4.2" @@ -637,15 +562,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - [[package]] name = "generational-arena" version = "0.2.9" @@ -692,12 +608,6 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - [[package]] name = "half" version = "2.4.1" @@ -738,27 +648,12 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "humantime" version = "2.1.0" @@ -785,16 +680,6 @@ dependencies = [ "syn 2.0.77", ] -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "indexmap" version = "1.9.3" @@ -826,15 +711,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.11" @@ -899,12 +775,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.158" @@ -1074,16 +944,6 @@ dependencies = [ "syn 2.0.77", ] -[[package]] -name = "matrixmultiply" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" -dependencies = [ - "autocfg", - "rawpointer", -] - [[package]] name = "memchr" version = "2.7.4" @@ -1099,12 +959,6 @@ dependencies = [ "libc", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -1114,21 +968,6 @@ dependencies = [ "adler2", ] -[[package]] -name = "ndarray" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "portable-atomic", - "portable-atomic-util", - "rawpointer", -] - [[package]] name = "ndk" version = "0.8.0" @@ -1159,34 +998,6 @@ dependencies = [ "jni-sys", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -1197,16 +1008,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.9", - "libc", -] - [[package]] name = "num_enum" version = "0.7.3" @@ -1346,21 +1147,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "portable-atomic" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d30538d42559de6b034bc76fd6dd4c38961b1ee5c6c56e3808c50128fdbc22ce" - -[[package]] -name = "portable-atomic-util" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdd8420072e66d54a407b3316991fe946ce3ab1083a7f575b2463866624704d" -dependencies = [ - "portable-atomic", -] - [[package]] name = "pretty-type-name" version = "1.0.1" @@ -1443,12 +1229,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - [[package]] name = "rayon" version = "1.10.0" @@ -1525,12 +1305,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustix" version = "0.38.37" @@ -1588,7 +1362,6 @@ dependencies = [ name = "sefirot" version = "0.1.0" dependencies = [ - "cuda_device_sys", "dashmap", "dyn-clone", "generational-arena", @@ -1602,7 +1375,6 @@ dependencies = [ "smallvec", "static_assertions", "take_mut", - "tracing", ] [[package]] @@ -1619,9 +1391,7 @@ dependencies = [ name = "sefirot_testbed" version = "0.1.0" dependencies = [ - "ndarray", "sefirot", - "video-rs", "winit", ] @@ -1863,21 +1633,6 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "toml" version = "0.5.11" @@ -1911,29 +1666,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", - "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", -] - [[package]] name = "tracing-core" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] [[package]] name = "ttf-parser" @@ -1947,68 +1687,24 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "video-rs" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b5222502bd6cd50ab8b14cd305bcd6315eefaa5d8f28c86ffd1f2fbdc747da1" -dependencies = [ - "ffmpeg-next", - "ndarray", - "tracing", - "url", -] - [[package]] name = "walkdir" version = "2.5.0" @@ -2227,18 +1923,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 79ea5bf..e5f0340 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,6 @@ default-run = "thelema_render" [dependencies] glam = "0.27.0" -sefirot = { path = "../sefirot/sefirot", features = ["debug", "trace", "glam"] } -sefirot_testbed = { path = "../sefirot/testbed", features = ["video"] } +sefirot = { path = "../sefirot/sefirot", features = ["glam"] } +sefirot_testbed = { path = "../sefirot/testbed" } tiff = "0.9.1" diff --git a/src/lib.rs b/src/lib.rs index 6fb5335..2c9e2f1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -359,7 +359,7 @@ pub fn main() { let mut t = 0; - let mut total_runtime = vec![0.0]; + let mut total_runtime = 0.0; let draw_kernel = DEVICE.create_kernel::, f32, Vec3, Vec3, Vec3)>( &track!(|pos, radius, emiss, diff, opacity| { @@ -413,10 +413,6 @@ pub fn main() { } } - if rt.pressed_key(KeyCode::KeyX) { - println!("Recording"); - rt.begin_recording(None, false); - } if rt.just_pressed_key(KeyCode::Enter) { merge_variant = (merge_variant + 1) % radiance_cascades.merge_kernel_count(); } @@ -426,7 +422,6 @@ pub fn main() { } if rt.just_pressed_key(KeyCode::KeyB) { num_bounces = (num_bounces + 1) % 4; - total_runtime = vec![0.0; num_bounces + 1]; println!("Num bounces: {}", num_bounces); } if rt.just_pressed_key(KeyCode::KeyF) { @@ -466,7 +461,9 @@ pub fn main() { println!("Loaded"); } - let timings = ( + let before_time = std::time::Instant::now(); + + ( world .emissive .view(0) @@ -502,35 +499,11 @@ pub fn main() { .debug("Display"), ) .chain() - .execute_timed(); - if rt.just_pressed_key(KeyCode::Space) { - println!("{:?}", timings); - } - { - let mut index = 0; - let mut last_merge = false; - for (name, value) in timings.iter() { - if name.starts_with("merge") { - total_runtime[index] += *value; - last_merge = true; - } else { - if last_merge { - index += 1; - } - last_merge = false; - } - } - } + .execute(); + total_runtime += before_time.elapsed().as_secs_f32() * 1000.0; if t % 100 == 0 { - println!("Runtime:"); - if num_bounces > 0 { - for (i, time) in total_runtime.iter().enumerate().take(num_bounces) { - println!(" Bounce {}: {}ms", i, time / 100.0); - } - } - println!(" Display: {}ms", total_runtime[num_bounces] / 100.0); - println!(" Total: {}ms", total_runtime.iter().sum::() / 100.0); - total_runtime.fill(0.0); + println!("Frame time: {:?}ms", total_runtime / 100.0); + total_runtime = 0.0; } }); } diff --git a/world/default.tiff b/world/default.tiff index 1b541c5e70c488c6df78e551d4a31b5d8cecbb3c..6229ea7998e3f8319b5a03e94859659304b48d92 100644 GIT binary patch delta 5105 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 YE|=yCX)2_-QkqKN_qq;M`EI-Y-=M;kVE_OC