From b86f6fd9a6fb2cbb6e20b0b2cfa403b864c19f7d Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 19:58:59 +0800 Subject: [PATCH 1/9] Add CI and make tests more cross platform --- .github/workflows/ci.yml | 24 ++ .github/workflows/release.yml | 14 +- coverage/README.md | 6 +- coverage/coverage.rs | 117 ++++++++ coverage/lcov.info | 484 +++++++++++++++++----------------- coverage/run.ps1 | 62 +---- coverage/run.sh | 17 ++ 7 files changed, 415 insertions(+), 309 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 coverage/coverage.rs create mode 100644 coverage/run.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..347b05c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: + push: + branches: ["master"] + pull_request: + branches: ["master"] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Build + run: cargo build --verbose + - name: Format + run: cargo fmt -- --check + - name: Lint + run: cargo clippy --all-targets --all-features -- -D warnings + - name: Test + run: ./coverage/coverage.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a7474a6..2c97fbf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Release on: push: - tags: ['v*'] + tags: ["v*"] env: CARGO_TERM_COLOR: always @@ -14,9 +14,9 @@ jobs: permissions: id-token: write steps: - - uses: actions/checkout@v5 - - uses: rust-lang/crates-io-auth-action@v1 - id: auth - - run: cargo publish - env: - CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} \ No newline at end of file + - uses: actions/checkout@v5 + - uses: rust-lang/crates-io-auth-action@v1 + id: auth + - run: cargo publish + env: + CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} diff --git a/coverage/README.md b/coverage/README.md index a75560e..d1333c6 100644 --- a/coverage/README.md +++ b/coverage/README.md @@ -2,8 +2,6 @@ This directory contains code coverage reports. -The coverage reports are generated using the [run.ps1](./run.ps1) script. To run the script, you need to install [cargo-llvm-cov](https://crates.io/crates/cargo-llvm-cov) and [cargo-nextest](https://crates.io/crates/cargo-nextest). +The coverage reports are generated using the [run.ps1](./run.ps1) (for Windows) and [run.sh](./run.sh) (for Linux/\*nix) scripts. -> [!NOTE] -> -> Because the crate requires GPU support, the coverage report is not run in CI. \ No newline at end of file +To run the script, you need to install [cargo-llvm-cov](https://crates.io/crates/cargo-llvm-cov) and [cargo-nextest](https://crates.io/crates/cargo-nextest). diff --git a/coverage/coverage.rs b/coverage/coverage.rs new file mode 100644 index 0000000..8812102 --- /dev/null +++ b/coverage/coverage.rs @@ -0,0 +1,117 @@ +macro_rules! cargo { + ($arg:literal $(, $fmt_args:expr),* $(,)?) => {{ + let cmd_arg = format!($arg, $($fmt_args),*); + let args = cmd_arg.split_whitespace(); + + println!("cargo {}", cmd_arg); + + let status = std::process::Command::new("cargo") + .args(args) + .status() + .expect("failed to execute process"); + + assert!(status.success(), "command 'cargo {}' failed", cmd_arg); + }}; +} + +fn main() { + let exe_path = std::env::current_exe().expect("current exe"); + + let mut manifest_path = exe_path.parent().expect("exe parent").to_path_buf(); + while std::fs::read_dir(&manifest_path) + .expect("read dir") + .find(|entry| entry.as_ref().expect("entry").file_name() == "Cargo.toml") + .is_none() + { + manifest_path = manifest_path.parent().expect("parent").to_path_buf(); + } + + let coverage_path = manifest_path.join("coverage"); + let lcov_path = coverage_path.join("lcov.info"); + let lcov_path_str = lcov_path.to_str().expect("lcov path"); + let badge_path = coverage_path.join("badge.json"); + let model_path = coverage_path.join("model.ply"); + let model_path_str = model_path.to_str().expect("model path"); + + println!("Running coverage..."); + + cargo!("llvm-cov clean --workspace"); + + println!("Running 'simple' example"); + cargo!("llvm-cov run --example simple --all-features -- -m {model_path_str}"); + + println!("Running 'multi-model' example"); + cargo!( + "llvm-cov run --example multi-model --all-features -- -m {model_path_str} -m {model_path_str}" + ); + + println!("Running 'selection' example"); + cargo!("llvm-cov run --example selection --all-features -- -m {model_path_str}"); + + println!("Running doctests"); + // `--doctests` flag is currently unstable + // cargo!("llvm-cov --no-report --doctests --all-features"); + cargo!("test --doc"); + + println!("Running tests"); + cargo!("llvm-cov --no-report nextest --all-features"); + + println!("Generating coverage report"); + cargo!("llvm-cov report --lcov --output-path {lcov_path_str}"); + + println!("Generating badge"); + + let lcov = std::fs::read_to_string(&lcov_path).expect("read lcov.info"); + let mut total: u64 = 0; + let mut covered: u64 = 0; + + for line in lcov.lines() { + if !line.starts_with("DA:") { + continue; + } + + let mut parts = line[3..].split(','); + let _line_number = parts.next(); + let hits_str = parts.next(); + + let Some(hits_str) = hits_str else { + continue; + }; + let Ok(hits) = hits_str.parse::() else { + continue; + }; + + total += 1; + if hits != 0 { + covered += 1; + } + } + + let badge_percentage: u64 = if total == 0 { + 100 + } else { + ((covered as f32 / total as f32) * 100.0).round() as u64 + }; + + let badge_color = if badge_percentage >= 80 { + "brightgreen" + } else if badge_percentage >= 50 { + "yellow" + } else { + "red" + }; + + let badge_json = format!( + r#" +{{ + "schemaVersion": 1, + "label": "coverage", + "message": "{badge_percentage}%", + "color": "{badge_color}" +}} + "# + ); + std::fs::write(&badge_path, badge_json.trim().to_owned() + "\n").expect("write badge.json"); + + println!("Done"); +} diff --git a/coverage/lcov.info b/coverage/lcov.info index 50fc8b8..e885b4b 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -23,10 +23,10 @@ FN:26,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffe FN:72,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs49roiI3Bpf9_6simple FNDA:3,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs8HrPP4l0PAj_3mod FNDA:27,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs8HrPP4l0PAj_3mod -FNDA:50,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB2_12CameraBuffer15update_with_pod +FNDA:271,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB2_12CameraBuffer15update_with_pod FNDA:23,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB2_12CameraBuffer3new FNDA:3,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB5_12CameraBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from -FNDA:96,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB4_12CameraBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer +FNDA:98,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB4_12CameraBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:1,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferINtNtCs6joXTnudZij_4core7convert4FromNtB5_12CameraBufferE4from FNDA:3,_RNCNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB7_12CameraBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from0Bb_ FNDA:0,_RINvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updatepEB7_ @@ -39,8 +39,8 @@ FNDA:0,_RNvXs1_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer6buffer6cameraNtB5_12CameraBu FNDA:0,_RNvXs_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer6buffer6cameraNtB4_12CameraBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:0,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs5eqtLxP0hPX_11multi_model FNDA:0,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs5eqtLxP0hPX_11multi_model -FNDA:27,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs8i3LEZ4i8f6_9selection -FNDA:27,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs8i3LEZ4i8f6_9selection +FNDA:248,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs8i3LEZ4i8f6_9selection +FNDA:248,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs8i3LEZ4i8f6_9selection FNDA:0,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs49roiI3Bpf9_6simple FNDA:0,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs49roiI3Bpf9_6simple FNF:8 @@ -54,29 +54,29 @@ DA:19,23 DA:20,23 DA:22,23 DA:23,23 -DA:26,30 -DA:27,30 -DA:28,30 -DA:31,50 -DA:32,50 -DA:33,50 -DA:37,96 -DA:38,96 -DA:39,96 +DA:26,251 +DA:27,251 +DA:28,251 +DA:31,271 +DA:32,271 +DA:33,271 +DA:37,98 +DA:38,98 +DA:39,98 DA:43,1 DA:44,1 DA:45,1 DA:51,3 DA:52,3 DA:53,3 -DA:72,54 -DA:73,54 -DA:74,54 -DA:75,54 -DA:76,54 -DA:77,54 -DA:78,54 -DA:79,54 +DA:72,275 +DA:73,275 +DA:74,275 +DA:75,275 +DA:76,275 +DA:77,275 +DA:78,275 +DA:79,275 BRF:0 BRH:0 LF:33 @@ -154,10 +154,10 @@ FNDA:32,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB2_18In FNDA:32,_RNvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBuffer3new FNDA:37,_RNvMs8_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_21IndirectIndicesBuffer3new FNDA:1,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_18IndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from -FNDA:88,_RNvXs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer +FNDA:309,_RNvXs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:1,_RNvXs6_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from FNDA:98,_RNvXs9_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_21IndirectIndicesBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer -FNDA:88,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB4_18IndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer +FNDA:309,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB4_18IndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:1,_RNvXsb_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_21IndirectIndicesBufferINtNtCs6joXTnudZij_4core7convert4FromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE4from FNDA:1,_RNCNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB7_18IndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from0Bb_ FNDA:1,_RNCNvXs6_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB7_27RadixSortIndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from0Bb_ @@ -191,9 +191,9 @@ DA:22,32 DA:23,32 DA:25,32 DA:26,32 -DA:34,88 -DA:35,88 -DA:36,88 +DA:34,309 +DA:35,309 +DA:36,309 DA:40,1 DA:41,1 DA:42,1 @@ -208,9 +208,9 @@ DA:67,32 DA:68,32 DA:70,32 DA:71,32 -DA:79,88 -DA:80,88 -DA:81,88 +DA:79,309 +DA:80,309 +DA:81,309 DA:85,1 DA:86,1 DA:87,1 @@ -259,15 +259,15 @@ FN:61,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera8pitch_by FN:80,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera9get_right FN:90,_RNvXs_NtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait10projection FN:86,_RNvXs_NtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait4view -FNDA:110,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera11get_forward +FNDA:773,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera11get_forward FNDA:25,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera3new -FNDA:28,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera6yaw_by -FNDA:27,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_by -FNDA:27,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_up -FNDA:28,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera8pitch_by -FNDA:27,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera9get_right -FNDA:56,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait10projection -FNDA:56,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait4view +FNDA:249,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera6yaw_by +FNDA:248,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_by +FNDA:248,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_up +FNDA:249,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera8pitch_by +FNDA:248,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera9get_right +FNDA:277,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait10projection +FNDA:277,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait4view FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera11get_forward FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera3new FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera6yaw_by @@ -288,33 +288,33 @@ DA:45,25 DA:46,25 DA:47,25 DA:48,25 -DA:51,27 -DA:52,27 -DA:53,27 -DA:56,27 -DA:57,27 -DA:58,27 -DA:61,28 -DA:62,28 -DA:63,28 -DA:66,28 -DA:67,28 -DA:68,28 -DA:71,110 -DA:72,110 -DA:73,110 -DA:74,110 -DA:75,110 -DA:77,110 -DA:80,27 -DA:81,27 -DA:82,27 -DA:86,56 -DA:87,56 -DA:88,56 -DA:90,56 -DA:91,56 -DA:92,56 +DA:51,248 +DA:52,248 +DA:53,248 +DA:56,248 +DA:57,248 +DA:58,248 +DA:61,249 +DA:62,249 +DA:63,249 +DA:66,249 +DA:67,249 +DA:68,249 +DA:71,773 +DA:72,773 +DA:73,773 +DA:74,773 +DA:75,773 +DA:77,773 +DA:80,248 +DA:81,248 +DA:82,248 +DA:86,277 +DA:87,277 +DA:88,277 +DA:90,277 +DA:91,277 +DA:92,277 BRF:0 BRH:0 LF:36 @@ -371,10 +371,10 @@ FNDA:0,_RNvMCsegerxfp6ECu_16wgpu_3dgs_viewerINtB2_6ViewerpE31update_model_transf FNDA:0,_RNvMCsegerxfp6ECu_16wgpu_3dgs_viewerINtB2_6ViewerpE34update_gaussian_transform_with_podB2_ FNDA:0,_RNvMCsegerxfp6ECu_16wgpu_3dgs_viewerINtB2_6ViewerpE6renderB2_ FNDA:0,_RNvXs_Csegerxfp6ECu_16wgpu_3dgs_viewerNtB4_19ViewerCreateOptionsNtNtCs6joXTnudZij_4core7default7Default7default -FNDA:27,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer13update_cameraNtNtB3_6camera6CameraECs8i3LEZ4i8f6_9selection +FNDA:248,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer13update_cameraNtNtB3_6camera6CameraECs8i3LEZ4i8f6_9selection FNDA:1,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer16new_with_optionsNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core8gaussian9GaussiansECs8i3LEZ4i8f6_9selection FNDA:1,_RNvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB2_6Viewer22update_model_transformCs8i3LEZ4i8f6_9selection -FNDA:27,_RNvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB2_6Viewer6renderCs8i3LEZ4i8f6_9selection +FNDA:248,_RNvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB2_6Viewer6renderCs8i3LEZ4i8f6_9selection FNDA:0,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer13update_cameraNtNtB3_6camera6CameraECs49roiI3Bpf9_6simple FNDA:0,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer16new_with_optionsNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core8gaussian9GaussiansECs49roiI3Bpf9_6simple FNDA:0,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer3newNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core8gaussian9GaussiansECs49roiI3Bpf9_6simple @@ -472,14 +472,14 @@ DA:196,14 DA:197,14 DA:198,14 DA:199,14 -DA:202,28 -DA:203,28 -DA:204,28 -DA:205,28 -DA:206,28 -DA:207,28 -DA:208,28 -DA:209,28 +DA:202,249 +DA:203,249 +DA:204,249 +DA:205,249 +DA:206,249 +DA:207,249 +DA:208,249 +DA:209,249 DA:212,12 DA:213,12 DA:214,12 @@ -523,14 +523,14 @@ DA:260,1 DA:261,1 DA:262,1 DA:263,1 -DA:266,40 -DA:267,40 -DA:268,40 -DA:270,40 -DA:271,40 -DA:273,40 -DA:274,40 -DA:275,40 +DA:266,261 +DA:267,261 +DA:268,261 +DA:270,261 +DA:271,261 +DA:273,261 +DA:274,261 +DA:275,261 DA:287,22 DA:288,22 DA:289,22 @@ -1087,7 +1087,7 @@ FNDA:0,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12Preprocess FNDA:8,_RNCNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB7_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_group0Cs8i3LEZ4i8f6_9selection FNDA:1,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB2_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE17create_bind_groupCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB5_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_groupCs8i3LEZ4i8f6_9selection -FNDA:27,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE10preprocessCs8i3LEZ4i8f6_9selection +FNDA:248,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE10preprocessCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE24create_bind_group_staticCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE3newCs8i3LEZ4i8f6_9selection FNDA:0,_RNCNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB7_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_group0Cs49roiI3Bpf9_6simple @@ -1177,12 +1177,12 @@ DA:257,14 DA:258,14 DA:259,14 DA:260,14 -DA:263,40 -DA:264,40 -DA:266,40 -DA:267,40 -DA:269,40 -DA:270,40 +DA:263,261 +DA:264,261 +DA:266,261 +DA:267,261 +DA:269,261 +DA:270,261 DA:274,30 DA:275,30 DA:276,30 @@ -1385,16 +1385,16 @@ FN:812,_RNvYpNtNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort16Sor FNDA:22,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterINtB5_11RadixSorteruE23new_without_bind_groups FNDA:15,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterINtB5_11RadixSorteruE4sort FNDA:14,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterNtB4_11RadixSorter3new -FNDA:40,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterNtB4_11RadixSorter4sort +FNDA:261,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterNtB4_11RadixSorter4sort FNDA:30,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterINtB2_11RadixSorteruE18create_bind_groupsB4_ FNDA:52,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter17bind_group_layout FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter17general_info_data -FNDA:55,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter23record_prefix_histogram +FNDA:276,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter23record_prefix_histogram FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter26create_internal_mem_buffer FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter28create_internal_sort_buffers -FNDA:55,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter28record_scatter_keys_indirect +FNDA:276,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter28record_scatter_keys_indirect FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter30create_internal_keyval_buffers -FNDA:55,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter35record_calculate_histogram_indirect +FNDA:276,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter35record_calculate_histogram_indirect FNDA:22,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter3new FNDA:91,_RNvNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort15histo_blocks_ru FNDA:91,_RNvNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort16keys_buffer_size @@ -1403,10 +1403,10 @@ FNDA:31,_RNvNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort22keys_b FNDA:0,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_11SortBuffersNtB5_16SortBuffersTrait10bind_group FNDA:0,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_11SortBuffersNtB5_16SortBuffersTrait12state_buffer FNDA:0,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_11SortBuffersNtB5_16SortBuffersTrait3len -FNDA:55,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait10bind_group +FNDA:276,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait10bind_group FNDA:0,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait12state_buffer FNDA:0,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait3len -FNDA:55,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter13sort_indirectNtB3_19InternalSortBuffersEB7_ +FNDA:276,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter13sort_indirectNtB3_19InternalSortBuffersEB7_ FNDA:0,_RINvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter13sort_indirectpEB7_ FNDA:0,_RINvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter4sortpEB7_ FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorterINtB2_11RadixSorterpE18create_bind_groupsB4_ @@ -1468,16 +1468,16 @@ DA:50,14 DA:51,14 DA:52,14 DA:53,14 -DA:56,40 -DA:57,40 -DA:58,40 -DA:59,40 -DA:60,40 -DA:61,40 -DA:62,40 -DA:63,40 -DA:64,40 -DA:66,40 +DA:56,261 +DA:57,261 +DA:58,261 +DA:59,261 +DA:60,261 +DA:61,261 +DA:62,261 +DA:63,261 +DA:64,261 +DA:66,261 DA:71,22 DA:72,22 DA:73,22 @@ -1759,46 +1759,46 @@ DA:521,0 DA:522,0 DA:523,0 DA:524,0 -DA:526,55 -DA:527,55 -DA:528,55 -DA:529,55 -DA:530,55 -DA:531,55 -DA:532,55 -DA:533,55 -DA:534,55 -DA:535,55 -DA:536,55 -DA:537,55 -DA:538,55 -DA:539,55 -DA:540,55 -DA:541,55 -DA:543,55 -DA:544,55 -DA:545,55 -DA:546,55 -DA:547,55 -DA:548,55 -DA:549,55 -DA:550,55 -DA:551,55 -DA:552,55 -DA:553,55 -DA:556,55 -DA:557,55 -DA:558,55 -DA:559,55 -DA:560,55 -DA:561,55 -DA:562,55 -DA:563,55 -DA:564,55 -DA:566,55 -DA:567,55 -DA:568,55 -DA:569,55 +DA:526,276 +DA:527,276 +DA:528,276 +DA:529,276 +DA:530,276 +DA:531,276 +DA:532,276 +DA:533,276 +DA:534,276 +DA:535,276 +DA:536,276 +DA:537,276 +DA:538,276 +DA:539,276 +DA:540,276 +DA:541,276 +DA:543,276 +DA:544,276 +DA:545,276 +DA:546,276 +DA:547,276 +DA:548,276 +DA:549,276 +DA:550,276 +DA:551,276 +DA:552,276 +DA:553,276 +DA:556,276 +DA:557,276 +DA:558,276 +DA:559,276 +DA:560,276 +DA:561,276 +DA:562,276 +DA:563,276 +DA:564,276 +DA:566,276 +DA:567,276 +DA:568,276 +DA:569,276 DA:571,0 DA:572,0 DA:573,0 @@ -1820,26 +1820,26 @@ DA:592,0 DA:594,0 DA:595,0 DA:596,0 -DA:598,55 -DA:599,55 -DA:600,55 -DA:601,55 -DA:602,55 -DA:603,55 -DA:604,55 -DA:605,55 -DA:606,55 -DA:607,55 -DA:609,55 -DA:610,55 -DA:611,55 -DA:613,55 -DA:614,55 -DA:616,55 -DA:617,55 -DA:619,55 -DA:620,55 -DA:621,55 +DA:598,276 +DA:599,276 +DA:600,276 +DA:601,276 +DA:602,276 +DA:603,276 +DA:604,276 +DA:605,276 +DA:606,276 +DA:607,276 +DA:609,276 +DA:610,276 +DA:611,276 +DA:613,276 +DA:614,276 +DA:616,276 +DA:617,276 +DA:619,276 +DA:620,276 +DA:621,276 DA:628,0 DA:629,0 DA:630,0 @@ -1854,17 +1854,17 @@ DA:641,0 DA:642,0 DA:643,0 DA:644,0 -DA:658,55 -DA:659,55 -DA:660,55 -DA:661,55 -DA:662,55 -DA:663,55 -DA:664,55 -DA:666,55 -DA:667,55 -DA:668,55 -DA:669,55 +DA:658,276 +DA:659,276 +DA:660,276 +DA:661,276 +DA:662,276 +DA:663,276 +DA:664,276 +DA:666,276 +DA:667,276 +DA:668,276 +DA:669,276 DA:672,0 DA:673,0 DA:674,0 @@ -1996,9 +1996,9 @@ DA:878,0 DA:909,0 DA:910,0 DA:911,0 -DA:913,55 -DA:914,55 -DA:915,55 +DA:913,276 +DA:914,276 +DA:915,276 DA:917,0 DA:918,0 DA:919,0 @@ -2072,10 +2072,10 @@ FNDA:0,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB5_8RendererNtNtNtC FNDA:0,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE24create_bind_group_staticCs5eqtLxP0hPX_11multi_model FNDA:1,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB2_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE17create_bind_groupCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB5_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_groupCs8i3LEZ4i8f6_9selection -FNDA:27,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE16render_with_passCs8i3LEZ4i8f6_9selection +FNDA:248,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE16render_with_passCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE24create_bind_group_staticCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE3newCs8i3LEZ4i8f6_9selection -FNDA:27,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE6renderCs8i3LEZ4i8f6_9selection +FNDA:248,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE6renderCs8i3LEZ4i8f6_9selection FNDA:0,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB2_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE17create_bind_groupCs49roiI3Bpf9_6simple FNDA:0,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB5_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_groupCs49roiI3Bpf9_6simple FNDA:0,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE16render_with_passCs49roiI3Bpf9_6simple @@ -2134,36 +2134,36 @@ DA:143,14 DA:144,14 DA:145,14 DA:146,14 -DA:149,40 -DA:150,40 -DA:151,40 -DA:152,40 -DA:153,40 -DA:154,40 -DA:155,40 -DA:156,40 -DA:157,40 -DA:158,40 -DA:159,40 -DA:160,40 -DA:161,40 -DA:162,40 -DA:163,40 -DA:164,40 -DA:165,40 -DA:166,40 -DA:167,40 -DA:169,40 -DA:170,40 -DA:173,40 -DA:174,40 -DA:175,40 -DA:176,40 -DA:177,40 -DA:178,40 -DA:179,40 -DA:180,40 -DA:181,40 +DA:149,261 +DA:150,261 +DA:151,261 +DA:152,261 +DA:153,261 +DA:154,261 +DA:155,261 +DA:156,261 +DA:157,261 +DA:158,261 +DA:159,261 +DA:160,261 +DA:161,261 +DA:162,261 +DA:163,261 +DA:164,261 +DA:165,261 +DA:166,261 +DA:167,261 +DA:169,261 +DA:170,261 +DA:173,261 +DA:174,261 +DA:175,261 +DA:176,261 +DA:177,261 +DA:178,261 +DA:179,261 +DA:180,261 +DA:181,261 DA:185,30 DA:186,30 DA:187,30 @@ -2349,8 +2349,8 @@ FN:138,_RNvXs7_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_24Viewp FN:175,_RNvXsa_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_33PreprocessorInvertSelectionBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FN:181,_RNvXsb_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferINtNtCs6joXTnudZij_4core7convert4FromNtB5_33PreprocessorInvertSelectionBufferE4from FN:189,_RNvXsc_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_33PreprocessorInvertSelectionBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from -FNDA:16,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture3new -FNDA:31,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture4view +FNDA:18,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture3new +FNDA:35,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture4view FNDA:23,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture7texture FNDA:8,_RNvMs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB5_24ViewportTextureF32Buffer3new FNDA:9,_RNvMs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB5_24ViewportTextureF32Buffer6update @@ -2393,30 +2393,30 @@ FNDA:0,_RNvXsb_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtNtNtCslVmK FNDA:0,_RNvXsc_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_33PreprocessorInvertSelectionBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from FNF:21 FNH:21 -DA:16,16 -DA:17,16 -DA:18,16 -DA:19,16 -DA:20,16 -DA:21,16 -DA:22,16 -DA:23,16 -DA:24,16 -DA:25,16 -DA:26,16 -DA:27,16 -DA:28,16 -DA:29,16 -DA:30,16 -DA:32,16 -DA:34,16 -DA:35,16 +DA:16,18 +DA:17,18 +DA:18,18 +DA:19,18 +DA:20,18 +DA:21,18 +DA:22,18 +DA:23,18 +DA:24,18 +DA:25,18 +DA:26,18 +DA:27,18 +DA:28,18 +DA:29,18 +DA:30,18 +DA:32,18 +DA:34,18 +DA:35,18 DA:38,23 DA:39,23 DA:40,23 -DA:43,31 -DA:44,31 -DA:45,31 +DA:43,35 +DA:44,35 +DA:45,35 DA:57,15 DA:58,15 DA:59,15 @@ -2544,9 +2544,9 @@ FNDA:7,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB FNDA:1,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector5clear FNDA:6,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector5start FNDA:6,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6render -FNDA:8,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6resize +FNDA:10,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6resize FNDA:6,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6update -FNDA:24,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector7texture +FNDA:28,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector7texture FNDA:0,_RNvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector16set_brush_radius FNDA:0,_RNvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector3new FNDA:0,_RNvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector5clear @@ -2642,16 +2642,16 @@ DA:295,3 DA:296,3 DA:298,3 DA:301,6 -DA:304,24 -DA:305,24 -DA:306,24 +DA:304,28 +DA:305,28 +DA:306,28 DA:309,1 DA:310,1 DA:311,1 DA:312,1 -DA:317,8 -DA:318,8 -DA:319,8 +DA:317,10 +DA:318,10 +DA:319,10 BRF:0 BRH:0 LF:95 diff --git a/coverage/run.ps1 b/coverage/run.ps1 index a9655ad..9c3d3c4 100644 --- a/coverage/run.ps1 +++ b/coverage/run.ps1 @@ -1,59 +1,9 @@ -$BASE_DIR = $PSScriptRoot -$LCOV_PATH = "$BASE_DIR/lcov.info" +$TARGET_DIR = "$PSScriptRoot\..\target\coverage" -echo "Running coverage..." - -cargo llvm-cov clean --workspace - -echo "Running 'simple' example" -cargo llvm-cov run --example simple --all-features -- -m "$BASE_DIR/model.ply" - -echo "Running 'multi-model' example" -cargo llvm-cov run --example multi-model --all-features -- -m "$BASE_DIR/model.ply" -m "$BASE_DIR/model.ply" - -echo "Running 'selection' example" -cargo llvm-cov run --example selection --all-features -- -m "$BASE_DIR/model.ply" - -# `--doctests` flag is currently unstable -# echo "Running doctests" -# cargo llvm-cov --no-report --doctests --all-features -cargo test --doc # Run doctests without tracking coverage - -echo "Running tests" -cargo llvm-cov --no-report nextest --all-features - -echo "Generating coverage report" -cargo llvm-cov report --lcov --output-path "$LCOV_PATH" - -echo "Generating badge" -$total = 0 -$covered = 0 -Select-String -Path "$LCOV_PATH" -Pattern "DA:" | ForEach-Object { - if ($_ -match "DA:\d+,(\d+)") { - $total++ - if ($matches[1] -ne "0") { - $covered++ - } - } -} - -$badge_percentage = if ($total -eq 0) { 100 } else { [math]::Round(($covered / $total) * 100) } -$badge_color = if ($badge_percentage -ge 80) { - "brightgreen" -} elseif ($badge_percentage -ge 50) { - "yellow" -} else { - "red" +if (!(Test-Path -Path $TARGET_DIR)) { + New-Item -ItemType Directory -Path $TARGET_DIR | Out-Null } -"{ - `"schemaVersion`": 1, - `"label`": `"coverage`", - `"message`": `"$badge_percentage%`", - `"color`": `"$badge_color`" -}" | Out-File -FilePath "$BASE_DIR/badge.json" -Encoding ascii - -# echo "Cleaning up" -# rm "$BASE_DIR/output.ply" - -echo "Done" +rustc "$PSScriptRoot\coverage.rs" -o "$TARGET_DIR\coverage.exe" +& "$TARGET_DIR\coverage.exe" +Remove-Item "$TARGET_DIR\coverage.exe" \ No newline at end of file diff --git a/coverage/run.sh b/coverage/run.sh new file mode 100644 index 0000000..4806ef0 --- /dev/null +++ b/coverage/run.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env sh +set -eu + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +TARGET_DIR="$SCRIPT_DIR/../target/coverage" + +mkdir -p "$TARGET_DIR" + +OUT_BIN="$TARGET_DIR/coverage" + +cleanup() { + rm -f "$OUT_BIN" +} +trap cleanup 0 + +rustc "$SCRIPT_DIR/coverage.rs" -o "$OUT_BIN" +"$OUT_BIN" From eb740b72f0ce2b327ce1debe679a5c251b2da326 Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 20:04:55 +0800 Subject: [PATCH 2/9] Test CI test step --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 347b05c..542817c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,9 +16,9 @@ jobs: - uses: actions/checkout@v4 - name: Build run: cargo build --verbose - - name: Format - run: cargo fmt -- --check - - name: Lint - run: cargo clippy --all-targets --all-features -- -D warnings + # - name: Format + # run: cargo fmt -- --check + # - name: Lint + # run: cargo clippy --all-targets --all-features -- -D warnings - name: Test - run: ./coverage/coverage.sh + run: ./coverage/run.sh From 5c5fbbd1e32a1c2161dcc668d93a25593dc3b5a3 Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 20:09:41 +0800 Subject: [PATCH 3/9] Try fix CI test step --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 542817c..86def7b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,4 +21,4 @@ jobs: # - name: Lint # run: cargo clippy --all-targets --all-features -- -D warnings - name: Test - run: ./coverage/run.sh + run: sh ./coverage/run.sh From 0e8fb25d847a4d023b6584099de59eb8154004e7 Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 20:48:20 +0800 Subject: [PATCH 4/9] Add install dependencies step in CI --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 86def7b..e46e7d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,5 +20,9 @@ jobs: # run: cargo fmt -- --check # - name: Lint # run: cargo clippy --all-targets --all-features -- -D warnings + - name: Install Dependencies + run: | + cargo install cargo-nextest + cargo install cargo-llvm-cov - name: Test run: sh ./coverage/run.sh From 8cc41491c53fe0a3cba6a19b307f5811131ce944 Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 21:10:29 +0800 Subject: [PATCH 5/9] Modify CI jobs --- .github/workflows/ci.yml | 55 +++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e46e7d0..ffb0a32 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,15 +14,56 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: Swatinem/rust-cache@v2 - name: Build - run: cargo build --verbose - # - name: Format - # run: cargo fmt -- --check - # - name: Lint - # run: cargo clippy --all-targets --all-features -- -D warnings + run: cargo build --verbose --all-features + + checks: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v4 + - uses: Swatinem/rust-cache@v2 + - name: Install rustfmt/clippy + run: rustup component add rustfmt clippy + - name: Format + run: cargo fmt --all-features -- --check --verbose + - name: Lint + run: cargo clippy --all-targets --all-features -- -D warnings + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v4 + - uses: Swatinem/rust-cache@v2 + - name: Cache apt packages (xvfb) + uses: actions/cache@v4 + with: + path: /var/cache/apt/archives + key: ${{ runner.os }}-apt-${{ runner.arch }}-xvfb + - name: Install Xvfb + run: sudo apt-get update && sudo apt-get install -y xvfb + - name: Cache cargo install binaries + uses: actions/cache@v4 + with: + path: ~/.cargo/bin + key: ${{ runner.os }}-cargo-bin-${{ hashFiles('.github/workflows/ci.yml') }} + restore-keys: | + ${{ runner.os }}-cargo-bin- - name: Install Dependencies run: | - cargo install cargo-nextest - cargo install cargo-llvm-cov + if ! command -v cargo-nextest >/dev/null 2>&1; then + cargo install cargo-nextest --locked + fi + if ! command -v cargo-llvm-cov >/dev/null 2>&1; then + cargo install cargo-llvm-cov --locked + fi + - name: Setup Xvfb for screen 0 + run: Xvfb :1 -screen 0 1600x1200x24 & - name: Test run: sh ./coverage/run.sh + env: + DISPLAY: :1 + - name: Tear down Xvfb + run: killall Xvfb From 3bd360e664bd3fa125b284eddf22858ba4addf80 Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 21:19:31 +0800 Subject: [PATCH 6/9] Improve CI jobs --- .github/workflows/ci.yml | 45 +++++++++++++--------------------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ffb0a32..7e74119 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,7 @@ name: CI on: + workflow_dispatch: push: branches: ["master"] pull_request: @@ -12,58 +13,40 @@ env: jobs: build: runs-on: ubuntu-latest + timeout-minutes: 30 steps: - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Build run: cargo build --verbose --all-features checks: runs-on: ubuntu-latest + timeout-minutes: 30 needs: build steps: - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy - uses: Swatinem/rust-cache@v2 - - name: Install rustfmt/clippy - run: rustup component add rustfmt clippy - name: Format - run: cargo fmt --all-features -- --check --verbose + run: cargo fmt -- --check --verbose - name: Lint run: cargo clippy --all-targets --all-features -- -D warnings test: runs-on: ubuntu-latest + timeout-minutes: 30 needs: build steps: - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - - name: Cache apt packages (xvfb) - uses: actions/cache@v4 - with: - path: /var/cache/apt/archives - key: ${{ runner.os }}-apt-${{ runner.arch }}-xvfb - name: Install Xvfb - run: sudo apt-get update && sudo apt-get install -y xvfb - - name: Cache cargo install binaries - uses: actions/cache@v4 - with: - path: ~/.cargo/bin - key: ${{ runner.os }}-cargo-bin-${{ hashFiles('.github/workflows/ci.yml') }} - restore-keys: | - ${{ runner.os }}-cargo-bin- - - name: Install Dependencies - run: | - if ! command -v cargo-nextest >/dev/null 2>&1; then - cargo install cargo-nextest --locked - fi - if ! command -v cargo-llvm-cov >/dev/null 2>&1; then - cargo install cargo-llvm-cov --locked - fi - - name: Setup Xvfb for screen 0 - run: Xvfb :1 -screen 0 1600x1200x24 & + run: sudo apt-get update && sudo apt-get install -y --no-install-recommends xvfb + - uses: taiki-e/install-action@cargo-nextest + - uses: taiki-e/install-action@cargo-llvm-cov - name: Test - run: sh ./coverage/run.sh - env: - DISPLAY: :1 - - name: Tear down Xvfb - run: killall Xvfb + run: xvfb-run -a -s "-screen 0 1600x1200x24" sh ./coverage/run.sh From 2a399affebc7826cdf73b411aa4b5351d88b0123 Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 21:28:27 +0800 Subject: [PATCH 7/9] Try fix missing libxkbcommon-x11 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e74119..0d01eca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,7 +45,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Install Xvfb - run: sudo apt-get update && sudo apt-get install -y --no-install-recommends xvfb + run: sudo apt-get update && sudo apt-get install -y --no-install-recommends xvfb libxkbcommon-x11-0 - uses: taiki-e/install-action@cargo-nextest - uses: taiki-e/install-action@cargo-llvm-cov - name: Test From 7b663d1bd28f2d654e10ab4820ca7c60cec01292 Mon Sep 17 00:00:00 2001 From: LioQing Date: Thu, 8 Jan 2026 22:08:11 +0800 Subject: [PATCH 8/9] Add conditional compilation for coverage examples without surface --- coverage/lcov.info | 484 ++++++++++++++++++++-------------------- examples/multi_model.rs | 116 ++++------ examples/selection.rs | 166 ++++++-------- examples/simple.rs | 118 ++++------ examples/utils/core.rs | 98 ++++++++ 5 files changed, 492 insertions(+), 490 deletions(-) diff --git a/coverage/lcov.info b/coverage/lcov.info index e885b4b..5e3ee75 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -23,10 +23,10 @@ FN:26,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffe FN:72,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs49roiI3Bpf9_6simple FNDA:3,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs8HrPP4l0PAj_3mod FNDA:27,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs8HrPP4l0PAj_3mod -FNDA:271,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB2_12CameraBuffer15update_with_pod +FNDA:679,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB2_12CameraBuffer15update_with_pod FNDA:23,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB2_12CameraBuffer3new FNDA:3,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB5_12CameraBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from -FNDA:98,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB4_12CameraBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer +FNDA:91,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB4_12CameraBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:1,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferINtNtCs6joXTnudZij_4core7convert4FromNtB5_12CameraBufferE4from FNDA:3,_RNCNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB7_12CameraBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from0Bb_ FNDA:0,_RINvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updatepEB7_ @@ -39,8 +39,8 @@ FNDA:0,_RNvXs1_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer6buffer6cameraNtB5_12CameraBu FNDA:0,_RNvXs_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer6buffer6cameraNtB4_12CameraBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:0,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs5eqtLxP0hPX_11multi_model FNDA:0,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs5eqtLxP0hPX_11multi_model -FNDA:248,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs8i3LEZ4i8f6_9selection -FNDA:248,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs8i3LEZ4i8f6_9selection +FNDA:656,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs8i3LEZ4i8f6_9selection +FNDA:656,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs8i3LEZ4i8f6_9selection FNDA:0,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB3_12CameraBuffer6updateNtNtB7_6camera6CameraECs49roiI3Bpf9_6simple FNDA:0,_RINvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer6cameraNtB6_9CameraPod3newNtNtBa_6camera6CameraECs49roiI3Bpf9_6simple FNF:8 @@ -54,29 +54,29 @@ DA:19,23 DA:20,23 DA:22,23 DA:23,23 -DA:26,251 -DA:27,251 -DA:28,251 -DA:31,271 -DA:32,271 -DA:33,271 -DA:37,98 -DA:38,98 -DA:39,98 +DA:26,659 +DA:27,659 +DA:28,659 +DA:31,679 +DA:32,679 +DA:33,679 +DA:37,91 +DA:38,91 +DA:39,91 DA:43,1 DA:44,1 DA:45,1 DA:51,3 DA:52,3 DA:53,3 -DA:72,275 -DA:73,275 -DA:74,275 -DA:75,275 -DA:76,275 -DA:77,275 -DA:78,275 -DA:79,275 +DA:72,683 +DA:73,683 +DA:74,683 +DA:75,683 +DA:76,683 +DA:77,683 +DA:78,683 +DA:79,683 BRF:0 BRH:0 LF:33 @@ -154,10 +154,10 @@ FNDA:32,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB2_18In FNDA:32,_RNvMs3_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBuffer3new FNDA:37,_RNvMs8_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_21IndirectIndicesBuffer3new FNDA:1,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_18IndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from -FNDA:309,_RNvXs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer +FNDA:717,_RNvXs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:1,_RNvXs6_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_27RadixSortIndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from FNDA:98,_RNvXs9_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_21IndirectIndicesBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer -FNDA:309,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB4_18IndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer +FNDA:717,_RNvXs_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB4_18IndirectArgsBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FNDA:1,_RNvXsb_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB5_21IndirectIndicesBufferINtNtCs6joXTnudZij_4core7convert4FromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE4from FNDA:1,_RNCNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB7_18IndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from0Bb_ FNDA:1,_RNCNvXs6_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6buffer13indirect_argsNtB7_27RadixSortIndirectArgsBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from0Bb_ @@ -191,9 +191,9 @@ DA:22,32 DA:23,32 DA:25,32 DA:26,32 -DA:34,309 -DA:35,309 -DA:36,309 +DA:34,717 +DA:35,717 +DA:36,717 DA:40,1 DA:41,1 DA:42,1 @@ -208,9 +208,9 @@ DA:67,32 DA:68,32 DA:70,32 DA:71,32 -DA:79,309 -DA:80,309 -DA:81,309 +DA:79,717 +DA:80,717 +DA:81,717 DA:85,1 DA:86,1 DA:87,1 @@ -259,15 +259,15 @@ FN:61,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera8pitch_by FN:80,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera9get_right FN:90,_RNvXs_NtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait10projection FN:86,_RNvXs_NtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait4view -FNDA:773,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera11get_forward +FNDA:1997,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera11get_forward FNDA:25,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera3new -FNDA:249,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera6yaw_by -FNDA:248,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_by -FNDA:248,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_up -FNDA:249,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera8pitch_by -FNDA:248,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera9get_right -FNDA:277,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait10projection -FNDA:277,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait4view +FNDA:657,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera6yaw_by +FNDA:656,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_by +FNDA:656,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera7move_up +FNDA:657,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera8pitch_by +FNDA:656,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB2_6Camera9get_right +FNDA:685,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait10projection +FNDA:685,_RNvXs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer6cameraNtB4_6CameraNtB4_11CameraTrait4view FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera11get_forward FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera3new FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer6cameraNtB2_6Camera6yaw_by @@ -288,33 +288,33 @@ DA:45,25 DA:46,25 DA:47,25 DA:48,25 -DA:51,248 -DA:52,248 -DA:53,248 -DA:56,248 -DA:57,248 -DA:58,248 -DA:61,249 -DA:62,249 -DA:63,249 -DA:66,249 -DA:67,249 -DA:68,249 -DA:71,773 -DA:72,773 -DA:73,773 -DA:74,773 -DA:75,773 -DA:77,773 -DA:80,248 -DA:81,248 -DA:82,248 -DA:86,277 -DA:87,277 -DA:88,277 -DA:90,277 -DA:91,277 -DA:92,277 +DA:51,656 +DA:52,656 +DA:53,656 +DA:56,656 +DA:57,656 +DA:58,656 +DA:61,657 +DA:62,657 +DA:63,657 +DA:66,657 +DA:67,657 +DA:68,657 +DA:71,1997 +DA:72,1997 +DA:73,1997 +DA:74,1997 +DA:75,1997 +DA:77,1997 +DA:80,656 +DA:81,656 +DA:82,656 +DA:86,685 +DA:87,685 +DA:88,685 +DA:90,685 +DA:91,685 +DA:92,685 BRF:0 BRH:0 LF:36 @@ -371,10 +371,10 @@ FNDA:0,_RNvMCsegerxfp6ECu_16wgpu_3dgs_viewerINtB2_6ViewerpE31update_model_transf FNDA:0,_RNvMCsegerxfp6ECu_16wgpu_3dgs_viewerINtB2_6ViewerpE34update_gaussian_transform_with_podB2_ FNDA:0,_RNvMCsegerxfp6ECu_16wgpu_3dgs_viewerINtB2_6ViewerpE6renderB2_ FNDA:0,_RNvXs_Csegerxfp6ECu_16wgpu_3dgs_viewerNtB4_19ViewerCreateOptionsNtNtCs6joXTnudZij_4core7default7Default7default -FNDA:248,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer13update_cameraNtNtB3_6camera6CameraECs8i3LEZ4i8f6_9selection +FNDA:656,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer13update_cameraNtNtB3_6camera6CameraECs8i3LEZ4i8f6_9selection FNDA:1,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer16new_with_optionsNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core8gaussian9GaussiansECs8i3LEZ4i8f6_9selection FNDA:1,_RNvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB2_6Viewer22update_model_transformCs8i3LEZ4i8f6_9selection -FNDA:248,_RNvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB2_6Viewer6renderCs8i3LEZ4i8f6_9selection +FNDA:656,_RNvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB2_6Viewer6renderCs8i3LEZ4i8f6_9selection FNDA:0,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer13update_cameraNtNtB3_6camera6CameraECs49roiI3Bpf9_6simple FNDA:0,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer16new_with_optionsNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core8gaussian9GaussiansECs49roiI3Bpf9_6simple FNDA:0,_RINvMCsh1qtJxU4GWl_16wgpu_3dgs_viewerNtB3_6Viewer3newNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core8gaussian9GaussiansECs49roiI3Bpf9_6simple @@ -472,14 +472,14 @@ DA:196,14 DA:197,14 DA:198,14 DA:199,14 -DA:202,249 -DA:203,249 -DA:204,249 -DA:205,249 -DA:206,249 -DA:207,249 -DA:208,249 -DA:209,249 +DA:202,657 +DA:203,657 +DA:204,657 +DA:205,657 +DA:206,657 +DA:207,657 +DA:208,657 +DA:209,657 DA:212,12 DA:213,12 DA:214,12 @@ -523,14 +523,14 @@ DA:260,1 DA:261,1 DA:262,1 DA:263,1 -DA:266,261 -DA:267,261 -DA:268,261 -DA:270,261 -DA:271,261 -DA:273,261 -DA:274,261 -DA:275,261 +DA:266,669 +DA:267,669 +DA:268,669 +DA:270,669 +DA:271,669 +DA:273,669 +DA:274,669 +DA:275,669 DA:287,22 DA:288,22 DA:289,22 @@ -1087,7 +1087,7 @@ FNDA:0,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12Preprocess FNDA:8,_RNCNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB7_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_group0Cs8i3LEZ4i8f6_9selection FNDA:1,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB2_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE17create_bind_groupCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB5_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_groupCs8i3LEZ4i8f6_9selection -FNDA:248,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE10preprocessCs8i3LEZ4i8f6_9selection +FNDA:656,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE10preprocessCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE24create_bind_group_staticCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB4_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE3newCs8i3LEZ4i8f6_9selection FNDA:0,_RNCNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12preprocessorINtB7_12PreprocessorNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_group0Cs49roiI3Bpf9_6simple @@ -1177,12 +1177,12 @@ DA:257,14 DA:258,14 DA:259,14 DA:260,14 -DA:263,261 -DA:264,261 -DA:266,261 -DA:267,261 -DA:269,261 -DA:270,261 +DA:263,669 +DA:264,669 +DA:266,669 +DA:267,669 +DA:269,669 +DA:270,669 DA:274,30 DA:275,30 DA:276,30 @@ -1385,16 +1385,16 @@ FN:812,_RNvYpNtNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort16Sor FNDA:22,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterINtB5_11RadixSorteruE23new_without_bind_groups FNDA:15,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterINtB5_11RadixSorteruE4sort FNDA:14,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterNtB4_11RadixSorter3new -FNDA:261,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterNtB4_11RadixSorter4sort +FNDA:669,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterNtB4_11RadixSorter4sort FNDA:30,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorterINtB2_11RadixSorteruE18create_bind_groupsB4_ FNDA:52,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter17bind_group_layout FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter17general_info_data -FNDA:276,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter23record_prefix_histogram +FNDA:684,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter23record_prefix_histogram FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter26create_internal_mem_buffer FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter28create_internal_sort_buffers -FNDA:276,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter28record_scatter_keys_indirect +FNDA:684,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter28record_scatter_keys_indirect FNDA:30,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter30create_internal_keyval_buffers -FNDA:276,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter35record_calculate_histogram_indirect +FNDA:684,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter35record_calculate_histogram_indirect FNDA:22,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB2_9GPUSorter3new FNDA:91,_RNvNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort15histo_blocks_ru FNDA:91,_RNvNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort16keys_buffer_size @@ -1403,10 +1403,10 @@ FNDA:31,_RNvNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sort22keys_b FNDA:0,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_11SortBuffersNtB5_16SortBuffersTrait10bind_group FNDA:0,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_11SortBuffersNtB5_16SortBuffersTrait12state_buffer FNDA:0,_RNvXs0_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_11SortBuffersNtB5_16SortBuffersTrait3len -FNDA:276,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait10bind_group +FNDA:684,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait10bind_group FNDA:0,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait12state_buffer FNDA:0,_RNvXs1_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB5_19InternalSortBuffersNtB5_16SortBuffersTrait3len -FNDA:276,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter13sort_indirectNtB3_19InternalSortBuffersEB7_ +FNDA:684,_RINvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter13sort_indirectNtB3_19InternalSortBuffersEB7_ FNDA:0,_RINvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter13sort_indirectpEB7_ FNDA:0,_RINvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorter9wgpu_sortNtB3_9GPUSorter4sortpEB7_ FNDA:0,_RNvMNtCsegerxfp6ECu_16wgpu_3dgs_viewer12radix_sorterINtB2_11RadixSorterpE18create_bind_groupsB4_ @@ -1468,16 +1468,16 @@ DA:50,14 DA:51,14 DA:52,14 DA:53,14 -DA:56,261 -DA:57,261 -DA:58,261 -DA:59,261 -DA:60,261 -DA:61,261 -DA:62,261 -DA:63,261 -DA:64,261 -DA:66,261 +DA:56,669 +DA:57,669 +DA:58,669 +DA:59,669 +DA:60,669 +DA:61,669 +DA:62,669 +DA:63,669 +DA:64,669 +DA:66,669 DA:71,22 DA:72,22 DA:73,22 @@ -1759,46 +1759,46 @@ DA:521,0 DA:522,0 DA:523,0 DA:524,0 -DA:526,276 -DA:527,276 -DA:528,276 -DA:529,276 -DA:530,276 -DA:531,276 -DA:532,276 -DA:533,276 -DA:534,276 -DA:535,276 -DA:536,276 -DA:537,276 -DA:538,276 -DA:539,276 -DA:540,276 -DA:541,276 -DA:543,276 -DA:544,276 -DA:545,276 -DA:546,276 -DA:547,276 -DA:548,276 -DA:549,276 -DA:550,276 -DA:551,276 -DA:552,276 -DA:553,276 -DA:556,276 -DA:557,276 -DA:558,276 -DA:559,276 -DA:560,276 -DA:561,276 -DA:562,276 -DA:563,276 -DA:564,276 -DA:566,276 -DA:567,276 -DA:568,276 -DA:569,276 +DA:526,684 +DA:527,684 +DA:528,684 +DA:529,684 +DA:530,684 +DA:531,684 +DA:532,684 +DA:533,684 +DA:534,684 +DA:535,684 +DA:536,684 +DA:537,684 +DA:538,684 +DA:539,684 +DA:540,684 +DA:541,684 +DA:543,684 +DA:544,684 +DA:545,684 +DA:546,684 +DA:547,684 +DA:548,684 +DA:549,684 +DA:550,684 +DA:551,684 +DA:552,684 +DA:553,684 +DA:556,684 +DA:557,684 +DA:558,684 +DA:559,684 +DA:560,684 +DA:561,684 +DA:562,684 +DA:563,684 +DA:564,684 +DA:566,684 +DA:567,684 +DA:568,684 +DA:569,684 DA:571,0 DA:572,0 DA:573,0 @@ -1820,26 +1820,26 @@ DA:592,0 DA:594,0 DA:595,0 DA:596,0 -DA:598,276 -DA:599,276 -DA:600,276 -DA:601,276 -DA:602,276 -DA:603,276 -DA:604,276 -DA:605,276 -DA:606,276 -DA:607,276 -DA:609,276 -DA:610,276 -DA:611,276 -DA:613,276 -DA:614,276 -DA:616,276 -DA:617,276 -DA:619,276 -DA:620,276 -DA:621,276 +DA:598,684 +DA:599,684 +DA:600,684 +DA:601,684 +DA:602,684 +DA:603,684 +DA:604,684 +DA:605,684 +DA:606,684 +DA:607,684 +DA:609,684 +DA:610,684 +DA:611,684 +DA:613,684 +DA:614,684 +DA:616,684 +DA:617,684 +DA:619,684 +DA:620,684 +DA:621,684 DA:628,0 DA:629,0 DA:630,0 @@ -1854,17 +1854,17 @@ DA:641,0 DA:642,0 DA:643,0 DA:644,0 -DA:658,276 -DA:659,276 -DA:660,276 -DA:661,276 -DA:662,276 -DA:663,276 -DA:664,276 -DA:666,276 -DA:667,276 -DA:668,276 -DA:669,276 +DA:658,684 +DA:659,684 +DA:660,684 +DA:661,684 +DA:662,684 +DA:663,684 +DA:664,684 +DA:666,684 +DA:667,684 +DA:668,684 +DA:669,684 DA:672,0 DA:673,0 DA:674,0 @@ -1996,9 +1996,9 @@ DA:878,0 DA:909,0 DA:910,0 DA:911,0 -DA:913,276 -DA:914,276 -DA:915,276 +DA:913,684 +DA:914,684 +DA:915,684 DA:917,0 DA:918,0 DA:919,0 @@ -2072,10 +2072,10 @@ FNDA:0,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB5_8RendererNtNtNtC FNDA:0,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE24create_bind_group_staticCs5eqtLxP0hPX_11multi_model FNDA:1,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB2_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE17create_bind_groupCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB5_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_groupCs8i3LEZ4i8f6_9selection -FNDA:248,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE16render_with_passCs8i3LEZ4i8f6_9selection +FNDA:656,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE16render_with_passCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE24create_bind_group_staticCs8i3LEZ4i8f6_9selection FNDA:1,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE3newCs8i3LEZ4i8f6_9selection -FNDA:248,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE6renderCs8i3LEZ4i8f6_9selection +FNDA:656,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE6renderCs8i3LEZ4i8f6_9selection FNDA:0,_RNvMNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB2_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE17create_bind_groupCs49roiI3Bpf9_6simple FNDA:0,_RNvMs0_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB5_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsuE22new_without_bind_groupCs49roiI3Bpf9_6simple FNDA:0,_RNvMs_NtCsh1qtJxU4GWl_16wgpu_3dgs_viewer8rendererINtB4_8RendererNtNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer8gaussian41GaussianPodWithShSingleCov3dSingleConfigsE16render_with_passCs49roiI3Bpf9_6simple @@ -2134,36 +2134,36 @@ DA:143,14 DA:144,14 DA:145,14 DA:146,14 -DA:149,261 -DA:150,261 -DA:151,261 -DA:152,261 -DA:153,261 -DA:154,261 -DA:155,261 -DA:156,261 -DA:157,261 -DA:158,261 -DA:159,261 -DA:160,261 -DA:161,261 -DA:162,261 -DA:163,261 -DA:164,261 -DA:165,261 -DA:166,261 -DA:167,261 -DA:169,261 -DA:170,261 -DA:173,261 -DA:174,261 -DA:175,261 -DA:176,261 -DA:177,261 -DA:178,261 -DA:179,261 -DA:180,261 -DA:181,261 +DA:149,669 +DA:150,669 +DA:151,669 +DA:152,669 +DA:153,669 +DA:154,669 +DA:155,669 +DA:156,669 +DA:157,669 +DA:158,669 +DA:159,669 +DA:160,669 +DA:161,669 +DA:162,669 +DA:163,669 +DA:164,669 +DA:165,669 +DA:166,669 +DA:167,669 +DA:169,669 +DA:170,669 +DA:173,669 +DA:174,669 +DA:175,669 +DA:176,669 +DA:177,669 +DA:178,669 +DA:179,669 +DA:180,669 +DA:181,669 DA:185,30 DA:186,30 DA:187,30 @@ -2349,8 +2349,8 @@ FN:138,_RNvXs7_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_24Viewp FN:175,_RNvXsa_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_33PreprocessorInvertSelectionBufferNtNtCs3BY6ADzPIDT_14wgpu_3dgs_core6buffer13BufferWrapper6buffer FN:181,_RNvXsb_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferINtNtCs6joXTnudZij_4core7convert4FromNtB5_33PreprocessorInvertSelectionBufferE4from FN:189,_RNvXsc_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_33PreprocessorInvertSelectionBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from -FNDA:18,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture3new -FNDA:35,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture4view +FNDA:11,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture3new +FNDA:21,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture4view FNDA:23,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB2_15ViewportTexture7texture FNDA:8,_RNvMs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB5_24ViewportTextureF32Buffer3new FNDA:9,_RNvMs4_NtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection6bufferNtB5_24ViewportTextureF32Buffer6update @@ -2393,30 +2393,30 @@ FNDA:0,_RNvXsb_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtNtNtCslVmK FNDA:0,_RNvXsc_NtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection6bufferNtB5_33PreprocessorInvertSelectionBufferINtNtCs6joXTnudZij_4core7convert7TryFromNtNtNtCslVmKeilYcE_4wgpu3api6buffer6BufferE8try_from FNF:21 FNH:21 -DA:16,18 -DA:17,18 -DA:18,18 -DA:19,18 -DA:20,18 -DA:21,18 -DA:22,18 -DA:23,18 -DA:24,18 -DA:25,18 -DA:26,18 -DA:27,18 -DA:28,18 -DA:29,18 -DA:30,18 -DA:32,18 -DA:34,18 -DA:35,18 +DA:16,11 +DA:17,11 +DA:18,11 +DA:19,11 +DA:20,11 +DA:21,11 +DA:22,11 +DA:23,11 +DA:24,11 +DA:25,11 +DA:26,11 +DA:27,11 +DA:28,11 +DA:29,11 +DA:30,11 +DA:32,11 +DA:34,11 +DA:35,11 DA:38,23 DA:39,23 DA:40,23 -DA:43,35 -DA:44,35 -DA:45,35 +DA:43,21 +DA:44,21 +DA:45,21 DA:57,15 DA:58,15 DA:59,15 @@ -2544,9 +2544,9 @@ FNDA:7,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB FNDA:1,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector5clear FNDA:6,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector5start FNDA:6,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6render -FNDA:10,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6resize +FNDA:3,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6resize FNDA:6,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector6update -FNDA:28,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector7texture +FNDA:14,_RNvMNtNtCsh1qtJxU4GWl_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector7texture FNDA:0,_RNvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector16set_brush_radius FNDA:0,_RNvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector3new FNDA:0,_RNvMNtNtCsegerxfp6ECu_16wgpu_3dgs_viewer9selection17viewport_selectorNtB2_16ViewportSelector5clear @@ -2642,16 +2642,16 @@ DA:295,3 DA:296,3 DA:298,3 DA:301,6 -DA:304,28 -DA:305,28 -DA:306,28 +DA:304,14 +DA:305,14 +DA:306,14 DA:309,1 DA:310,1 DA:311,1 DA:312,1 -DA:317,10 -DA:318,10 -DA:319,10 +DA:317,3 +DA:318,3 +DA:319,3 BRF:0 BRH:0 LF:95 diff --git a/examples/multi_model.rs b/examples/multi_model.rs index 247f150..5551702 100644 --- a/examples/multi_model.rs +++ b/examples/multi_model.rs @@ -62,10 +62,7 @@ fn main() -> Result<(), EventLoopError> { /// The application system. #[allow(dead_code)] struct System { - surface: wgpu::Surface<'static>, - queue: wgpu::Queue, - device: wgpu::Device, - config: wgpu::SurfaceConfiguration, + core: core::WgpuCore, camera: gs::Camera, gaussians: Vec, @@ -79,49 +76,9 @@ impl core::System for System { async fn init(window: Arc, args: &Args) -> Self { let model_paths = &args.models; let model_offset = Vec3::from_slice(&args.offset); - let size = window.inner_size(); - log::debug!("Creating wgpu instance"); - let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); - - log::debug!("Creating window surface"); - let surface = instance.create_surface(window.clone()).expect("surface"); - - log::debug!("Requesting adapter"); - let adapter = instance - .request_adapter(&wgpu::RequestAdapterOptions { - power_preference: wgpu::PowerPreference::HighPerformance, - compatible_surface: Some(&surface), - force_fallback_adapter: false, - }) - .await - .expect("adapter"); - - log::debug!("Requesting device"); - let (device, queue) = adapter - .request_device(&wgpu::DeviceDescriptor { - label: Some("Device"), - required_limits: adapter.limits(), - ..Default::default() - }) - .await - .expect("device"); - - let surface_caps = surface.get_capabilities(&adapter); - let surface_format = surface_caps.formats[0]; - let config = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: surface_format, - width: size.width.max(1), - height: size.height.max(1), - present_mode: surface_caps.present_modes[0], - alpha_mode: surface_caps.alpha_modes[0], - view_formats: vec![surface_format.remove_srgb_suffix()], - desired_maximum_frame_latency: 2, - }; - - log::debug!("Configuring surface"); - surface.configure(&device, &config); + log::debug!("Creating wgpu core"); + let core = core::WgpuCore::new(window).await; log::debug!("Creating gaussians"); let gaussians = model_paths @@ -152,7 +109,7 @@ impl core::System for System { log::debug!("Creating viewer"); let mut viewer = - gs::MultiModelViewer::new(&device, config.view_formats[0]).expect("viewer"); + gs::MultiModelViewer::new(&core.device, core.config.view_formats[0]).expect("viewer"); let quat = Quat::from_axis_angle(Vec3::Z, 180f32.to_radians()); for (i, gaussians) in gaussians.iter().enumerate() { @@ -160,9 +117,9 @@ impl core::System for System { log::debug!("Pushing model {i}"); - viewer.insert_model(&device, i, gaussians); + viewer.insert_model(&core.device, i, gaussians); viewer - .update_model_transform(&queue, &i, offset, quat, Vec3::ONE) + .update_model_transform(&core.queue, &i, offset, quat, Vec3::ONE) .expect("update model"); gaussian_centroids[i] = quat.mul_vec3(gaussian_centroids[i]) + offset; @@ -171,10 +128,7 @@ impl core::System for System { log::info!("System initialized"); Self { - surface, - device, - queue, - config, + core, camera, gaussians, @@ -225,31 +179,41 @@ impl core::System for System { // Update the viewer self.viewer.update_camera( - &self.queue, + &self.core.queue, &self.camera, - uvec2(self.config.width, self.config.height), + uvec2(self.core.config.width, self.core.config.height), ); } fn render(&mut self) { - let texture = match self.surface.get_current_texture() { - Ok(texture) => texture, - Err(e) => { - log::error!("Failed to get current texture: {e:?}"); - return; - } + #[cfg(not(coverage))] + let (surface_texture, texture) = { + let surface_texture = match self.core.surface.get_current_texture() { + Ok(texture) => texture, + Err(e) => { + log::error!("Failed to get current texture: {e:?}"); + return; + } + }; + let texture = surface_texture.texture.clone(); + + (surface_texture, texture) }; - let texture_view = texture.texture.create_view(&wgpu::TextureViewDescriptor { + #[cfg(coverage)] + let texture = self.core.get_current_texture_for_coverage(); + + let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { label: Some("Texture View"), - format: Some(self.config.view_formats[0]), + format: Some(self.core.config.view_formats[0]), ..Default::default() }); - let mut encoder = self - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = + self.core + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); let mut render_keys = self .gaussian_centroids @@ -278,18 +242,22 @@ impl core::System for System { ) .expect("render"); - self.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { + self.core.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } - texture.present(); + #[cfg(not(coverage))] + surface_texture.present(); } fn resize(&mut self, size: winit::dpi::PhysicalSize) { if size.width > 0 && size.height > 0 { - self.config.width = size.width; - self.config.height = size.height; - self.surface.configure(&self.device, &self.config); + self.core.config.width = size.width; + self.core.config.height = size.height; + #[cfg(not(coverage))] + self.core + .surface + .configure(&self.core.device, &self.core.config); } } } diff --git a/examples/selection.rs b/examples/selection.rs index ad39513..79e4ef8 100644 --- a/examples/selection.rs +++ b/examples/selection.rs @@ -68,10 +68,7 @@ fn main() -> Result<(), EventLoopError> { /// The application system. #[allow(dead_code)] struct System { - surface: wgpu::Surface<'static>, - queue: wgpu::Queue, - device: wgpu::Device, - config: wgpu::SurfaceConfiguration, + core: core::WgpuCore, filter: bool, immediate: bool, @@ -99,47 +96,8 @@ impl core::System for System { let immediate = args.immediate; let size = window.inner_size(); - log::debug!("Creating wgpu instance"); - let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); - - log::debug!("Creating window surface"); - let surface = instance.create_surface(window.clone()).expect("surface"); - - log::debug!("Requesting adapter"); - let adapter = instance - .request_adapter(&wgpu::RequestAdapterOptions { - power_preference: wgpu::PowerPreference::HighPerformance, - compatible_surface: Some(&surface), - force_fallback_adapter: false, - }) - .await - .expect("adapter"); - - log::debug!("Requesting device"); - let (device, queue) = adapter - .request_device(&wgpu::DeviceDescriptor { - label: Some("Device"), - required_limits: adapter.limits(), - ..Default::default() - }) - .await - .expect("device"); - - let surface_caps = surface.get_capabilities(&adapter); - let surface_format = surface_caps.formats[0]; - let config = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: surface_format, - width: size.width.max(1), - height: size.height.max(1), - present_mode: surface_caps.present_modes[0], - alpha_mode: surface_caps.alpha_modes[0], - view_formats: vec![surface_format.remove_srgb_suffix()], - desired_maximum_frame_latency: 2, - }; - - log::debug!("Configuring surface"); - surface.configure(&device, &config); + log::debug!("Creating wgpu core"); + let core = core::WgpuCore::new(window).await; log::debug!("Creating gaussians"); let gaussians = [GaussiansSource::Ply, GaussiansSource::Spz] @@ -152,8 +110,8 @@ impl core::System for System { log::debug!("Creating viewer"); let mut viewer = gs::Viewer::new_with_options( - &device, - config.view_formats[0], + &core.device, + core.config.view_formats[0], &gaussians, gs::ViewerCreateOptions { gaussians_buffer_usage: @@ -164,7 +122,7 @@ impl core::System for System { ) .expect("viewer"); viewer.update_model_transform( - &queue, + &core.queue, Vec3::ZERO, Quat::from_axis_angle(Vec3::Z, 180f32.to_radians()), Vec3::ONE, @@ -172,8 +130,8 @@ impl core::System for System { log::debug!("Creating selector"); let mut selector = gs::selection::ViewportSelector::new( - &device, - &queue, + &core.device, + &core.queue, UVec2::new(size.width, size.height), &viewer.camera_buffer, ) @@ -182,16 +140,16 @@ impl core::System for System { log::debug!("Creating selection viewport selection modifier"); let mut viewport_selection_modifier = gs::editor::NonDestructiveModifier::new( - &device, - &queue, + &core.device, + &core.queue, gs::editor::BasicSelectionModifier::new_with_basic_modifier( - &device, + &core.device, &viewer.gaussians_buffer, &viewer.model_transform_buffer, &viewer.gaussian_transform_buffer, vec![gs::selection::create_viewport_bundle::< gs::DefaultGaussianPod, - >(&device)], + >(&core.device)], ), &viewer.gaussians_buffer, ) @@ -200,7 +158,7 @@ impl core::System for System { let viewport_selection_bind_group = viewport_selection_modifier.modifier.selection.bundles [0] .create_bind_group( - &device, + &core.device, // index 0 is the Gaussians buffer, so we use 1, // see docs of create_viewport_bundle 1, @@ -219,7 +177,7 @@ impl core::System for System { .modifier // Basic modifier .basic_color_modifiers_buffer .update_with_pod( - &queue, + &core.queue, &gs::editor::BasicColorModifiersPod { rgb_or_hsv: BasicColorRgbOverrideOrHsvModifiersPod::new_rgb_override( Vec3::new(1.0, 1.0, 0.0), @@ -231,18 +189,15 @@ impl core::System for System { log::debug!("Creating selection viewport texture overlay renderer"); let viewport_texture_overlay_renderer = utils::selection::ViewportTextureOverlayRenderer::new( - &device, - config.view_formats[0], + &core.device, + core.config.view_formats[0], selector.texture(), ); log::info!("System initialized"); Self { - surface, - device, - queue, - config, + core, filter, immediate, @@ -281,7 +236,7 @@ impl core::System for System { if self.filter { self.viewer .invert_selection_buffer - .update(&self.queue, self.inverted); + .update(&self.core.queue, self.inverted); } } @@ -293,31 +248,41 @@ impl core::System for System { // Update the viewer self.viewer.update_camera( - &self.queue, + &self.core.queue, &self.camera, - uvec2(self.config.width, self.config.height), + uvec2(self.core.config.width, self.core.config.height), ); } fn render(&mut self) { - let texture = match self.surface.get_current_texture() { - Ok(texture) => texture, - Err(e) => { - log::error!("Failed to get current texture: {e:?}"); - return; - } + #[cfg(not(coverage))] + let (surface_texture, texture) = { + let surface_texture = match self.core.surface.get_current_texture() { + Ok(texture) => texture, + Err(e) => { + log::error!("Failed to get current texture: {e:?}"); + return; + } + }; + let texture = surface_texture.texture.clone(); + + (surface_texture, texture) }; - let texture_view = texture.texture.create_view(&wgpu::TextureViewDescriptor { + #[cfg(coverage)] + let texture = self.core.get_current_texture_for_coverage(); + + let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { label: Some("Texture View"), - format: Some(self.config.view_formats[0]), + format: Some(self.core.config.view_formats[0]), ..Default::default() }); - let mut encoder = self - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = + self.core + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); self.viewer.render(&mut encoder, &texture_view); @@ -326,28 +291,32 @@ impl core::System for System { .render(&mut encoder, &texture_view); } - self.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { + self.core.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } - texture.present(); + #[cfg(not(coverage))] + surface_texture.present(); } fn resize(&mut self, size: winit::dpi::PhysicalSize) { if size.width > 0 && size.height > 0 { - self.config.width = size.width; - self.config.height = size.height; - self.surface.configure(&self.device, &self.config); + self.core.config.width = size.width; + self.core.config.height = size.height; + #[cfg(not(coverage))] + self.core + .surface + .configure(&self.core.device, &self.core.config); // Update selector viewport texture self.selector - .resize(&self.device, UVec2::new(size.width, size.height)); + .resize(&self.core.device, UVec2::new(size.width, size.height)); // Update viewport selection bundle let viewport_selection_bind_group = self.viewport_selection_modifier.modifier.selection.bundles[0] .create_bind_group( - &self.device, + &self.core.device, // index 0 is the Gaussians buffer, so we use 1, // see docs of create_viewport_bundle 1, @@ -364,28 +333,29 @@ impl core::System for System { // Update viewport texture overlay renderer self.viewport_texture_overlay_renderer - .update_bind_group(&self.device, self.selector.texture()); + .update_bind_group(&self.core.device, self.selector.texture()); } } } impl System { fn update_selection(&mut self, input: &core::Input, _delta_time: f32) { - let mut encoder = self - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = + self.core + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); if input .pressed_mouse .contains(&winit::event::MouseButton::Left) { - self.selector.start(&self.queue, input.mouse_pos); + self.selector.start(&self.core.queue, input.mouse_pos); } if input.held_mouse.contains(&winit::event::MouseButton::Left) { - self.selector.update(&self.queue, input.mouse_pos); + self.selector.update(&self.core.queue, input.mouse_pos); if self.immediate { self.apply_selection(&mut encoder); @@ -404,8 +374,8 @@ impl System { self.selector.render(&mut encoder); } - self.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { + self.core.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } } @@ -420,7 +390,7 @@ impl System { &self.viewer.gaussians_buffer, |encoder, modifier, gaussians| { modifier.selection.evaluate( - &self.device, + &self.core.device, encoder, &modifier.selection_expr, &self.viewer.selection_buffer, @@ -440,7 +410,7 @@ impl System { } self.viewport_selection_modifier.apply( - &self.device, + &self.core.device, encoder, &self.viewer.gaussians_buffer, &self.viewer.model_transform_buffer, diff --git a/examples/simple.rs b/examples/simple.rs index 9dbb101..c5d4747 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -94,10 +94,7 @@ fn main() -> Result<(), EventLoopError> { /// The application system. #[allow(dead_code)] struct System { - surface: wgpu::Surface<'static>, - queue: wgpu::Queue, - device: wgpu::Device, - config: wgpu::SurfaceConfiguration, + core: core::WgpuCore, camera: gs::Camera, gaussians: gs::core::Gaussians, @@ -109,49 +106,9 @@ impl core::System for System { async fn init(window: Arc, args: &Args) -> Self { let model_path = &args.model; - let size = window.inner_size(); - - log::debug!("Creating wgpu instance"); - let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); - - log::debug!("Creating window surface"); - let surface = instance.create_surface(window.clone()).expect("surface"); - - log::debug!("Requesting adapter"); - let adapter = instance - .request_adapter(&wgpu::RequestAdapterOptions { - power_preference: wgpu::PowerPreference::HighPerformance, - compatible_surface: Some(&surface), - force_fallback_adapter: false, - }) - .await - .expect("adapter"); - - log::debug!("Requesting device"); - let (device, queue) = adapter - .request_device(&wgpu::DeviceDescriptor { - label: Some("Device"), - required_limits: adapter.limits(), - ..Default::default() - }) - .await - .expect("device"); - - let surface_caps = surface.get_capabilities(&adapter); - let surface_format = surface_caps.formats[0]; - let config = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: surface_format, - width: size.width.max(1), - height: size.height.max(1), - present_mode: surface_caps.present_modes[0], - alpha_mode: surface_caps.alpha_modes[0], - view_formats: vec![surface_format.remove_srgb_suffix()], - desired_maximum_frame_latency: 2, - }; - log::debug!("Configuring surface"); - surface.configure(&device, &config); + log::debug!("Creating wgpu core"); + let core = core::WgpuCore::new(window).await; log::debug!("Creating gaussians"); let gaussians = [GaussiansSource::Ply, GaussiansSource::Spz] @@ -164,16 +121,16 @@ impl core::System for System { log::debug!("Creating viewer"); let mut viewer = - gs::Viewer::new(&device, config.view_formats[0], &gaussians).expect("viewer"); + gs::Viewer::new(&core.device, core.config.view_formats[0], &gaussians).expect("viewer"); viewer.update_model_transform( - &queue, + &core.queue, Vec3::ZERO, Quat::from_axis_angle(Vec3::Z, 180f32.to_radians()), Vec3::ONE, ); viewer.update_gaussian_transform( - &queue, + &core.queue, args.size, match args.mode { DisplayMode::Splat => gs::core::GaussianDisplayMode::Splat, @@ -188,10 +145,7 @@ impl core::System for System { log::info!("System initialized"); Self { - surface, - device, - queue, - config, + core, camera, gaussians, @@ -242,46 +196,58 @@ impl core::System for System { // Update the viewer self.viewer.update_camera( - &self.queue, + &self.core.queue, &self.camera, - uvec2(self.config.width, self.config.height), + uvec2(self.core.config.width, self.core.config.height), ); } fn render(&mut self) { - let texture = match self.surface.get_current_texture() { - Ok(texture) => texture, - Err(e) => { - log::error!("Failed to get current texture: {e:?}"); - return; - } + #[cfg(not(coverage))] + let (surface_texture, texture) = { + let surface_texture = match self.core.surface.get_current_texture() { + Ok(texture) => texture, + Err(e) => { + log::error!("Failed to get current texture: {e:?}"); + return; + } + }; + let texture = surface_texture.texture.clone(); + + (surface_texture, texture) }; - let texture_view = texture.texture.create_view(&wgpu::TextureViewDescriptor { + #[cfg(coverage)] + let texture = self.core.get_current_texture_for_coverage(); + + let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { label: Some("Texture View"), - format: Some(self.config.view_formats[0]), + format: Some(self.core.config.view_formats[0]), ..Default::default() }); - let mut encoder = self - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = + self.core + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); self.viewer.render(&mut encoder, &texture_view); - self.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { + self.core.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } - texture.present(); + #[cfg(not(coverage))] + surface_texture.present(); } fn resize(&mut self, size: winit::dpi::PhysicalSize) { - if size.width > 0 && size.height > 0 { - self.config.width = size.width; - self.config.height = size.height; - self.surface.configure(&self.device, &self.config); - } + self.core.config.width = size.width; + self.core.config.height = size.height; + #[cfg(not(coverage))] + self.core + .surface + .configure(&self.core.device, &self.core.config); } } diff --git a/examples/utils/core.rs b/examples/utils/core.rs index 7a7b9ba..68683d3 100644 --- a/examples/utils/core.rs +++ b/examples/utils/core.rs @@ -244,3 +244,101 @@ impl ApplicationHandler for App { self.input.device_event(&event); } } + +pub struct WgpuCore { + #[cfg(not(coverage))] + pub surface: wgpu::Surface<'static>, + pub queue: wgpu::Queue, + pub device: wgpu::Device, + pub config: wgpu::SurfaceConfiguration, +} + +impl WgpuCore { + pub async fn new(window: Arc) -> Self { + let size = window.inner_size(); + + log::debug!("Creating wgpu instance"); + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); + + #[cfg(not(coverage))] + let surface = { + log::debug!("Creating window surface"); + let surface = instance.create_surface(window.clone()).expect("surface"); + Some(surface) + }; + #[cfg(coverage)] + let surface = None; + + log::debug!("Requesting adapter"); + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: surface.as_ref(), + force_fallback_adapter: false, + }) + .await + .expect("adapter"); + + log::debug!("Requesting device"); + let (device, queue) = adapter + .request_device(&wgpu::DeviceDescriptor { + label: Some("Device"), + required_limits: adapter.limits(), + ..Default::default() + }) + .await + .expect("device"); + + let surface_caps = surface + .as_ref() + .map(|s| s.get_capabilities(&adapter)) + .unwrap_or_else(|| wgpu::SurfaceCapabilities { + formats: vec![wgpu::TextureFormat::Rgba8Unorm], + present_modes: vec![wgpu::PresentMode::Fifo], + alpha_modes: vec![wgpu::CompositeAlphaMode::Opaque], + ..Default::default() + }); + let surface_format = surface_caps.formats[0]; + let config = wgpu::SurfaceConfiguration { + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + format: surface_format, + width: size.width.max(1), + height: size.height.max(1), + present_mode: surface_caps.present_modes[0], + alpha_mode: surface_caps.alpha_modes[0], + view_formats: vec![surface_format.remove_srgb_suffix()], + desired_maximum_frame_latency: 2, + }; + + log::debug!("Configuring surface"); + if let Some(surface) = &surface { + surface.configure(&device, &config); + } + + Self { + #[cfg(not(coverage))] + surface: surface.expect("surface"), + queue, + device, + config, + } + } + + #[cfg(coverage)] + pub fn get_current_texture_for_coverage(&self) -> wgpu::Texture { + self.device.create_texture(&wgpu::TextureDescriptor { + label: Some("Coverage Texture"), + size: wgpu::Extent3d { + width: self.config.width, + height: self.config.height, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: self.config.format, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_SRC, + view_formats: &[], + }) + } +} From a6c53340dde3a65a6526e3f4ca8ba260c305f717 Mon Sep 17 00:00:00 2001 From: LioQing Date: Fri, 9 Jan 2026 22:23:31 +0800 Subject: [PATCH 9/9] Remove test coverage job from CI --- .github/workflows/ci.yml | 16 ---- coverage/README.md | 4 + examples/multi_model.rs | 116 +++++++++++++++++---------- examples/selection.rs | 166 +++++++++++++++++++++++---------------- examples/simple.rs | 118 ++++++++++++++++++---------- examples/utils/core.rs | 98 ----------------------- 6 files changed, 252 insertions(+), 266 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d01eca..6d291ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,6 @@ jobs: checks: runs-on: ubuntu-latest timeout-minutes: 30 - needs: build steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable @@ -35,18 +34,3 @@ jobs: run: cargo fmt -- --check --verbose - name: Lint run: cargo clippy --all-targets --all-features -- -D warnings - - test: - runs-on: ubuntu-latest - timeout-minutes: 30 - needs: build - steps: - - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable - - uses: Swatinem/rust-cache@v2 - - name: Install Xvfb - run: sudo apt-get update && sudo apt-get install -y --no-install-recommends xvfb libxkbcommon-x11-0 - - uses: taiki-e/install-action@cargo-nextest - - uses: taiki-e/install-action@cargo-llvm-cov - - name: Test - run: xvfb-run -a -s "-screen 0 1600x1200x24" sh ./coverage/run.sh diff --git a/coverage/README.md b/coverage/README.md index d1333c6..883f722 100644 --- a/coverage/README.md +++ b/coverage/README.md @@ -5,3 +5,7 @@ This directory contains code coverage reports. The coverage reports are generated using the [run.ps1](./run.ps1) (for Windows) and [run.sh](./run.sh) (for Linux/\*nix) scripts. To run the script, you need to install [cargo-llvm-cov](https://crates.io/crates/cargo-llvm-cov) and [cargo-nextest](https://crates.io/crates/cargo-nextest). + +> [!NOTE] +> +> Because the crate requires GPU support, the coverage report is not run in CI. diff --git a/examples/multi_model.rs b/examples/multi_model.rs index 5551702..247f150 100644 --- a/examples/multi_model.rs +++ b/examples/multi_model.rs @@ -62,7 +62,10 @@ fn main() -> Result<(), EventLoopError> { /// The application system. #[allow(dead_code)] struct System { - core: core::WgpuCore, + surface: wgpu::Surface<'static>, + queue: wgpu::Queue, + device: wgpu::Device, + config: wgpu::SurfaceConfiguration, camera: gs::Camera, gaussians: Vec, @@ -76,9 +79,49 @@ impl core::System for System { async fn init(window: Arc, args: &Args) -> Self { let model_paths = &args.models; let model_offset = Vec3::from_slice(&args.offset); + let size = window.inner_size(); - log::debug!("Creating wgpu core"); - let core = core::WgpuCore::new(window).await; + log::debug!("Creating wgpu instance"); + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); + + log::debug!("Creating window surface"); + let surface = instance.create_surface(window.clone()).expect("surface"); + + log::debug!("Requesting adapter"); + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: Some(&surface), + force_fallback_adapter: false, + }) + .await + .expect("adapter"); + + log::debug!("Requesting device"); + let (device, queue) = adapter + .request_device(&wgpu::DeviceDescriptor { + label: Some("Device"), + required_limits: adapter.limits(), + ..Default::default() + }) + .await + .expect("device"); + + let surface_caps = surface.get_capabilities(&adapter); + let surface_format = surface_caps.formats[0]; + let config = wgpu::SurfaceConfiguration { + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + format: surface_format, + width: size.width.max(1), + height: size.height.max(1), + present_mode: surface_caps.present_modes[0], + alpha_mode: surface_caps.alpha_modes[0], + view_formats: vec![surface_format.remove_srgb_suffix()], + desired_maximum_frame_latency: 2, + }; + + log::debug!("Configuring surface"); + surface.configure(&device, &config); log::debug!("Creating gaussians"); let gaussians = model_paths @@ -109,7 +152,7 @@ impl core::System for System { log::debug!("Creating viewer"); let mut viewer = - gs::MultiModelViewer::new(&core.device, core.config.view_formats[0]).expect("viewer"); + gs::MultiModelViewer::new(&device, config.view_formats[0]).expect("viewer"); let quat = Quat::from_axis_angle(Vec3::Z, 180f32.to_radians()); for (i, gaussians) in gaussians.iter().enumerate() { @@ -117,9 +160,9 @@ impl core::System for System { log::debug!("Pushing model {i}"); - viewer.insert_model(&core.device, i, gaussians); + viewer.insert_model(&device, i, gaussians); viewer - .update_model_transform(&core.queue, &i, offset, quat, Vec3::ONE) + .update_model_transform(&queue, &i, offset, quat, Vec3::ONE) .expect("update model"); gaussian_centroids[i] = quat.mul_vec3(gaussian_centroids[i]) + offset; @@ -128,7 +171,10 @@ impl core::System for System { log::info!("System initialized"); Self { - core, + surface, + device, + queue, + config, camera, gaussians, @@ -179,41 +225,31 @@ impl core::System for System { // Update the viewer self.viewer.update_camera( - &self.core.queue, + &self.queue, &self.camera, - uvec2(self.core.config.width, self.core.config.height), + uvec2(self.config.width, self.config.height), ); } fn render(&mut self) { - #[cfg(not(coverage))] - let (surface_texture, texture) = { - let surface_texture = match self.core.surface.get_current_texture() { - Ok(texture) => texture, - Err(e) => { - log::error!("Failed to get current texture: {e:?}"); - return; - } - }; - let texture = surface_texture.texture.clone(); - - (surface_texture, texture) + let texture = match self.surface.get_current_texture() { + Ok(texture) => texture, + Err(e) => { + log::error!("Failed to get current texture: {e:?}"); + return; + } }; - #[cfg(coverage)] - let texture = self.core.get_current_texture_for_coverage(); - - let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { + let texture_view = texture.texture.create_view(&wgpu::TextureViewDescriptor { label: Some("Texture View"), - format: Some(self.core.config.view_formats[0]), + format: Some(self.config.view_formats[0]), ..Default::default() }); - let mut encoder = - self.core - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = self + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); let mut render_keys = self .gaussian_centroids @@ -242,22 +278,18 @@ impl core::System for System { ) .expect("render"); - self.core.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { + self.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } - #[cfg(not(coverage))] - surface_texture.present(); + texture.present(); } fn resize(&mut self, size: winit::dpi::PhysicalSize) { if size.width > 0 && size.height > 0 { - self.core.config.width = size.width; - self.core.config.height = size.height; - #[cfg(not(coverage))] - self.core - .surface - .configure(&self.core.device, &self.core.config); + self.config.width = size.width; + self.config.height = size.height; + self.surface.configure(&self.device, &self.config); } } } diff --git a/examples/selection.rs b/examples/selection.rs index 79e4ef8..ad39513 100644 --- a/examples/selection.rs +++ b/examples/selection.rs @@ -68,7 +68,10 @@ fn main() -> Result<(), EventLoopError> { /// The application system. #[allow(dead_code)] struct System { - core: core::WgpuCore, + surface: wgpu::Surface<'static>, + queue: wgpu::Queue, + device: wgpu::Device, + config: wgpu::SurfaceConfiguration, filter: bool, immediate: bool, @@ -96,8 +99,47 @@ impl core::System for System { let immediate = args.immediate; let size = window.inner_size(); - log::debug!("Creating wgpu core"); - let core = core::WgpuCore::new(window).await; + log::debug!("Creating wgpu instance"); + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); + + log::debug!("Creating window surface"); + let surface = instance.create_surface(window.clone()).expect("surface"); + + log::debug!("Requesting adapter"); + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: Some(&surface), + force_fallback_adapter: false, + }) + .await + .expect("adapter"); + + log::debug!("Requesting device"); + let (device, queue) = adapter + .request_device(&wgpu::DeviceDescriptor { + label: Some("Device"), + required_limits: adapter.limits(), + ..Default::default() + }) + .await + .expect("device"); + + let surface_caps = surface.get_capabilities(&adapter); + let surface_format = surface_caps.formats[0]; + let config = wgpu::SurfaceConfiguration { + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + format: surface_format, + width: size.width.max(1), + height: size.height.max(1), + present_mode: surface_caps.present_modes[0], + alpha_mode: surface_caps.alpha_modes[0], + view_formats: vec![surface_format.remove_srgb_suffix()], + desired_maximum_frame_latency: 2, + }; + + log::debug!("Configuring surface"); + surface.configure(&device, &config); log::debug!("Creating gaussians"); let gaussians = [GaussiansSource::Ply, GaussiansSource::Spz] @@ -110,8 +152,8 @@ impl core::System for System { log::debug!("Creating viewer"); let mut viewer = gs::Viewer::new_with_options( - &core.device, - core.config.view_formats[0], + &device, + config.view_formats[0], &gaussians, gs::ViewerCreateOptions { gaussians_buffer_usage: @@ -122,7 +164,7 @@ impl core::System for System { ) .expect("viewer"); viewer.update_model_transform( - &core.queue, + &queue, Vec3::ZERO, Quat::from_axis_angle(Vec3::Z, 180f32.to_radians()), Vec3::ONE, @@ -130,8 +172,8 @@ impl core::System for System { log::debug!("Creating selector"); let mut selector = gs::selection::ViewportSelector::new( - &core.device, - &core.queue, + &device, + &queue, UVec2::new(size.width, size.height), &viewer.camera_buffer, ) @@ -140,16 +182,16 @@ impl core::System for System { log::debug!("Creating selection viewport selection modifier"); let mut viewport_selection_modifier = gs::editor::NonDestructiveModifier::new( - &core.device, - &core.queue, + &device, + &queue, gs::editor::BasicSelectionModifier::new_with_basic_modifier( - &core.device, + &device, &viewer.gaussians_buffer, &viewer.model_transform_buffer, &viewer.gaussian_transform_buffer, vec![gs::selection::create_viewport_bundle::< gs::DefaultGaussianPod, - >(&core.device)], + >(&device)], ), &viewer.gaussians_buffer, ) @@ -158,7 +200,7 @@ impl core::System for System { let viewport_selection_bind_group = viewport_selection_modifier.modifier.selection.bundles [0] .create_bind_group( - &core.device, + &device, // index 0 is the Gaussians buffer, so we use 1, // see docs of create_viewport_bundle 1, @@ -177,7 +219,7 @@ impl core::System for System { .modifier // Basic modifier .basic_color_modifiers_buffer .update_with_pod( - &core.queue, + &queue, &gs::editor::BasicColorModifiersPod { rgb_or_hsv: BasicColorRgbOverrideOrHsvModifiersPod::new_rgb_override( Vec3::new(1.0, 1.0, 0.0), @@ -189,15 +231,18 @@ impl core::System for System { log::debug!("Creating selection viewport texture overlay renderer"); let viewport_texture_overlay_renderer = utils::selection::ViewportTextureOverlayRenderer::new( - &core.device, - core.config.view_formats[0], + &device, + config.view_formats[0], selector.texture(), ); log::info!("System initialized"); Self { - core, + surface, + device, + queue, + config, filter, immediate, @@ -236,7 +281,7 @@ impl core::System for System { if self.filter { self.viewer .invert_selection_buffer - .update(&self.core.queue, self.inverted); + .update(&self.queue, self.inverted); } } @@ -248,41 +293,31 @@ impl core::System for System { // Update the viewer self.viewer.update_camera( - &self.core.queue, + &self.queue, &self.camera, - uvec2(self.core.config.width, self.core.config.height), + uvec2(self.config.width, self.config.height), ); } fn render(&mut self) { - #[cfg(not(coverage))] - let (surface_texture, texture) = { - let surface_texture = match self.core.surface.get_current_texture() { - Ok(texture) => texture, - Err(e) => { - log::error!("Failed to get current texture: {e:?}"); - return; - } - }; - let texture = surface_texture.texture.clone(); - - (surface_texture, texture) + let texture = match self.surface.get_current_texture() { + Ok(texture) => texture, + Err(e) => { + log::error!("Failed to get current texture: {e:?}"); + return; + } }; - #[cfg(coverage)] - let texture = self.core.get_current_texture_for_coverage(); - - let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { + let texture_view = texture.texture.create_view(&wgpu::TextureViewDescriptor { label: Some("Texture View"), - format: Some(self.core.config.view_formats[0]), + format: Some(self.config.view_formats[0]), ..Default::default() }); - let mut encoder = - self.core - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = self + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); self.viewer.render(&mut encoder, &texture_view); @@ -291,32 +326,28 @@ impl core::System for System { .render(&mut encoder, &texture_view); } - self.core.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { + self.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } - #[cfg(not(coverage))] - surface_texture.present(); + texture.present(); } fn resize(&mut self, size: winit::dpi::PhysicalSize) { if size.width > 0 && size.height > 0 { - self.core.config.width = size.width; - self.core.config.height = size.height; - #[cfg(not(coverage))] - self.core - .surface - .configure(&self.core.device, &self.core.config); + self.config.width = size.width; + self.config.height = size.height; + self.surface.configure(&self.device, &self.config); // Update selector viewport texture self.selector - .resize(&self.core.device, UVec2::new(size.width, size.height)); + .resize(&self.device, UVec2::new(size.width, size.height)); // Update viewport selection bundle let viewport_selection_bind_group = self.viewport_selection_modifier.modifier.selection.bundles[0] .create_bind_group( - &self.core.device, + &self.device, // index 0 is the Gaussians buffer, so we use 1, // see docs of create_viewport_bundle 1, @@ -333,29 +364,28 @@ impl core::System for System { // Update viewport texture overlay renderer self.viewport_texture_overlay_renderer - .update_bind_group(&self.core.device, self.selector.texture()); + .update_bind_group(&self.device, self.selector.texture()); } } } impl System { fn update_selection(&mut self, input: &core::Input, _delta_time: f32) { - let mut encoder = - self.core - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = self + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); if input .pressed_mouse .contains(&winit::event::MouseButton::Left) { - self.selector.start(&self.core.queue, input.mouse_pos); + self.selector.start(&self.queue, input.mouse_pos); } if input.held_mouse.contains(&winit::event::MouseButton::Left) { - self.selector.update(&self.core.queue, input.mouse_pos); + self.selector.update(&self.queue, input.mouse_pos); if self.immediate { self.apply_selection(&mut encoder); @@ -374,8 +404,8 @@ impl System { self.selector.render(&mut encoder); } - self.core.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { + self.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } } @@ -390,7 +420,7 @@ impl System { &self.viewer.gaussians_buffer, |encoder, modifier, gaussians| { modifier.selection.evaluate( - &self.core.device, + &self.device, encoder, &modifier.selection_expr, &self.viewer.selection_buffer, @@ -410,7 +440,7 @@ impl System { } self.viewport_selection_modifier.apply( - &self.core.device, + &self.device, encoder, &self.viewer.gaussians_buffer, &self.viewer.model_transform_buffer, diff --git a/examples/simple.rs b/examples/simple.rs index c5d4747..9dbb101 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -94,7 +94,10 @@ fn main() -> Result<(), EventLoopError> { /// The application system. #[allow(dead_code)] struct System { - core: core::WgpuCore, + surface: wgpu::Surface<'static>, + queue: wgpu::Queue, + device: wgpu::Device, + config: wgpu::SurfaceConfiguration, camera: gs::Camera, gaussians: gs::core::Gaussians, @@ -106,9 +109,49 @@ impl core::System for System { async fn init(window: Arc, args: &Args) -> Self { let model_path = &args.model; + let size = window.inner_size(); + + log::debug!("Creating wgpu instance"); + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); + + log::debug!("Creating window surface"); + let surface = instance.create_surface(window.clone()).expect("surface"); + + log::debug!("Requesting adapter"); + let adapter = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::HighPerformance, + compatible_surface: Some(&surface), + force_fallback_adapter: false, + }) + .await + .expect("adapter"); + + log::debug!("Requesting device"); + let (device, queue) = adapter + .request_device(&wgpu::DeviceDescriptor { + label: Some("Device"), + required_limits: adapter.limits(), + ..Default::default() + }) + .await + .expect("device"); + + let surface_caps = surface.get_capabilities(&adapter); + let surface_format = surface_caps.formats[0]; + let config = wgpu::SurfaceConfiguration { + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + format: surface_format, + width: size.width.max(1), + height: size.height.max(1), + present_mode: surface_caps.present_modes[0], + alpha_mode: surface_caps.alpha_modes[0], + view_formats: vec![surface_format.remove_srgb_suffix()], + desired_maximum_frame_latency: 2, + }; - log::debug!("Creating wgpu core"); - let core = core::WgpuCore::new(window).await; + log::debug!("Configuring surface"); + surface.configure(&device, &config); log::debug!("Creating gaussians"); let gaussians = [GaussiansSource::Ply, GaussiansSource::Spz] @@ -121,16 +164,16 @@ impl core::System for System { log::debug!("Creating viewer"); let mut viewer = - gs::Viewer::new(&core.device, core.config.view_formats[0], &gaussians).expect("viewer"); + gs::Viewer::new(&device, config.view_formats[0], &gaussians).expect("viewer"); viewer.update_model_transform( - &core.queue, + &queue, Vec3::ZERO, Quat::from_axis_angle(Vec3::Z, 180f32.to_radians()), Vec3::ONE, ); viewer.update_gaussian_transform( - &core.queue, + &queue, args.size, match args.mode { DisplayMode::Splat => gs::core::GaussianDisplayMode::Splat, @@ -145,7 +188,10 @@ impl core::System for System { log::info!("System initialized"); Self { - core, + surface, + device, + queue, + config, camera, gaussians, @@ -196,58 +242,46 @@ impl core::System for System { // Update the viewer self.viewer.update_camera( - &self.core.queue, + &self.queue, &self.camera, - uvec2(self.core.config.width, self.core.config.height), + uvec2(self.config.width, self.config.height), ); } fn render(&mut self) { - #[cfg(not(coverage))] - let (surface_texture, texture) = { - let surface_texture = match self.core.surface.get_current_texture() { - Ok(texture) => texture, - Err(e) => { - log::error!("Failed to get current texture: {e:?}"); - return; - } - }; - let texture = surface_texture.texture.clone(); - - (surface_texture, texture) + let texture = match self.surface.get_current_texture() { + Ok(texture) => texture, + Err(e) => { + log::error!("Failed to get current texture: {e:?}"); + return; + } }; - #[cfg(coverage)] - let texture = self.core.get_current_texture_for_coverage(); - - let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { + let texture_view = texture.texture.create_view(&wgpu::TextureViewDescriptor { label: Some("Texture View"), - format: Some(self.core.config.view_formats[0]), + format: Some(self.config.view_formats[0]), ..Default::default() }); - let mut encoder = - self.core - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Command Encoder"), - }); + let mut encoder = self + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("Command Encoder"), + }); self.viewer.render(&mut encoder, &texture_view); - self.core.queue.submit(std::iter::once(encoder.finish())); - if let Err(e) = self.core.device.poll(wgpu::PollType::wait_indefinitely()) { + self.queue.submit(std::iter::once(encoder.finish())); + if let Err(e) = self.device.poll(wgpu::PollType::wait_indefinitely()) { log::error!("Failed to poll device: {e:?}"); } - #[cfg(not(coverage))] - surface_texture.present(); + texture.present(); } fn resize(&mut self, size: winit::dpi::PhysicalSize) { - self.core.config.width = size.width; - self.core.config.height = size.height; - #[cfg(not(coverage))] - self.core - .surface - .configure(&self.core.device, &self.core.config); + if size.width > 0 && size.height > 0 { + self.config.width = size.width; + self.config.height = size.height; + self.surface.configure(&self.device, &self.config); + } } } diff --git a/examples/utils/core.rs b/examples/utils/core.rs index 68683d3..7a7b9ba 100644 --- a/examples/utils/core.rs +++ b/examples/utils/core.rs @@ -244,101 +244,3 @@ impl ApplicationHandler for App { self.input.device_event(&event); } } - -pub struct WgpuCore { - #[cfg(not(coverage))] - pub surface: wgpu::Surface<'static>, - pub queue: wgpu::Queue, - pub device: wgpu::Device, - pub config: wgpu::SurfaceConfiguration, -} - -impl WgpuCore { - pub async fn new(window: Arc) -> Self { - let size = window.inner_size(); - - log::debug!("Creating wgpu instance"); - let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default()); - - #[cfg(not(coverage))] - let surface = { - log::debug!("Creating window surface"); - let surface = instance.create_surface(window.clone()).expect("surface"); - Some(surface) - }; - #[cfg(coverage)] - let surface = None; - - log::debug!("Requesting adapter"); - let adapter = instance - .request_adapter(&wgpu::RequestAdapterOptions { - power_preference: wgpu::PowerPreference::HighPerformance, - compatible_surface: surface.as_ref(), - force_fallback_adapter: false, - }) - .await - .expect("adapter"); - - log::debug!("Requesting device"); - let (device, queue) = adapter - .request_device(&wgpu::DeviceDescriptor { - label: Some("Device"), - required_limits: adapter.limits(), - ..Default::default() - }) - .await - .expect("device"); - - let surface_caps = surface - .as_ref() - .map(|s| s.get_capabilities(&adapter)) - .unwrap_or_else(|| wgpu::SurfaceCapabilities { - formats: vec![wgpu::TextureFormat::Rgba8Unorm], - present_modes: vec![wgpu::PresentMode::Fifo], - alpha_modes: vec![wgpu::CompositeAlphaMode::Opaque], - ..Default::default() - }); - let surface_format = surface_caps.formats[0]; - let config = wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: surface_format, - width: size.width.max(1), - height: size.height.max(1), - present_mode: surface_caps.present_modes[0], - alpha_mode: surface_caps.alpha_modes[0], - view_formats: vec![surface_format.remove_srgb_suffix()], - desired_maximum_frame_latency: 2, - }; - - log::debug!("Configuring surface"); - if let Some(surface) = &surface { - surface.configure(&device, &config); - } - - Self { - #[cfg(not(coverage))] - surface: surface.expect("surface"), - queue, - device, - config, - } - } - - #[cfg(coverage)] - pub fn get_current_texture_for_coverage(&self) -> wgpu::Texture { - self.device.create_texture(&wgpu::TextureDescriptor { - label: Some("Coverage Texture"), - size: wgpu::Extent3d { - width: self.config.width, - height: self.config.height, - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: self.config.format, - usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_SRC, - view_formats: &[], - }) - } -}