Shaders: rust-gpu integration to compile shader nodes to WGSL (#3097)
* shaders: shader compilation setup * nix: use rustc_codegen_spirv.so from nix * shaders: codegen for per_pixel_adjust shader nodes * shaders: disable nodes needing bool * shaders: `#[repr(u32)]` some enums * shaders: add lint ignores from rust-gpu * shaders: fix node-macro tests * gcore-shaders: toml cleanup * shader-nodes feature: put rust-gpu to wgsl compile behind feature gate * shaders: fix use TokenStream2 * shaders: allow providing shader externally * Update iai runner in workflow --------- Co-authored-by: Timon Schelling <me@timon.zip> Co-authored-by: Dennis Kobert <dennis@kobert.dev>
This commit is contained in:
parent
083dfa5f49
commit
a10103311e
|
|
@ -34,12 +34,12 @@ jobs:
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cargo/bin/iai-callgrind-runner
|
path: ~/.cargo/bin/iai-callgrind-runner
|
||||||
key: ${{ runner.os }}-iai-callgrind-runner-0.12.3
|
key: ${{ runner.os }}-iai-callgrind-runner-0.16.1
|
||||||
|
|
||||||
- name: Install iai-callgrind
|
- name: Install iai-callgrind
|
||||||
if: steps.cache-iai.outputs.cache-hit != 'true'
|
if: steps.cache-iai.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
cargo install iai-callgrind-runner@0.12.3
|
cargo install iai-callgrind-runner@0.16.1
|
||||||
|
|
||||||
- name: Checkout master branch
|
- name: Checkout master branch
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
|
|
@ -637,6 +637,75 @@ dependencies = [
|
||||||
"wayland-client",
|
"wayland-client",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "camino"
|
||||||
|
version = "1.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cargo-gpu"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "git+https://github.com/rust-gpu/cargo-gpu?rev=f969528e87baa17a7d48eecf4a6fcfdcaaf30566#f969528e87baa17a7d48eecf4a6fcfdcaaf30566"
|
||||||
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
|
"cargo_metadata",
|
||||||
|
"clap",
|
||||||
|
"crossterm",
|
||||||
|
"directories",
|
||||||
|
"env_logger",
|
||||||
|
"log",
|
||||||
|
"relative-path",
|
||||||
|
"rustc_codegen_spirv-target-specs 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"semver",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"spirv-builder",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cargo-platform"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "84982c6c0ae343635a3a4ee6dedef965513735c8b183caa7289fa6e27399ebd4"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cargo-util-schemas"
|
||||||
|
version = "0.8.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7dc1a6f7b5651af85774ae5a34b4e8be397d9cf4bc063b7e6dbd99a841837830"
|
||||||
|
dependencies = [
|
||||||
|
"semver",
|
||||||
|
"serde",
|
||||||
|
"serde-untagged",
|
||||||
|
"serde-value",
|
||||||
|
"thiserror 2.0.16",
|
||||||
|
"toml",
|
||||||
|
"unicode-xid",
|
||||||
|
"url",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cargo_metadata"
|
||||||
|
version = "0.21.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5cfca2aaa699835ba88faf58a06342a314a950d2b9686165e038286c30316868"
|
||||||
|
dependencies = [
|
||||||
|
"camino",
|
||||||
|
"cargo-platform",
|
||||||
|
"cargo-util-schemas",
|
||||||
|
"semver",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"thiserror 2.0.16",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cast"
|
name = "cast"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
|
|
@ -866,6 +935,15 @@ dependencies = [
|
||||||
"windows-sys 0.60.2",
|
"windows-sys 0.60.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "convert_case"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-segmentation",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "convert_case"
|
name = "convert_case"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
|
|
@ -1029,6 +1107,33 @@ version = "0.8.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossterm"
|
||||||
|
version = "0.29.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.9.3",
|
||||||
|
"crossterm_winapi",
|
||||||
|
"derive_more",
|
||||||
|
"document-features",
|
||||||
|
"mio",
|
||||||
|
"parking_lot",
|
||||||
|
"rustix 1.0.8",
|
||||||
|
"signal-hook",
|
||||||
|
"signal-hook-mio",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossterm_winapi"
|
||||||
|
version = "0.9.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
|
||||||
|
dependencies = [
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crunchy"
|
name = "crunchy"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
|
|
@ -1105,6 +1210,7 @@ version = "2.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
|
checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"convert_case 0.7.1",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.106",
|
"syn 2.0.106",
|
||||||
|
|
@ -1126,6 +1232,15 @@ dependencies = [
|
||||||
"crypto-common",
|
"crypto-common",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "directories"
|
||||||
|
version = "6.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d"
|
||||||
|
dependencies = [
|
||||||
|
"dirs-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs"
|
name = "dirs"
|
||||||
version = "6.0.0"
|
version = "6.0.0"
|
||||||
|
|
@ -1344,6 +1459,16 @@ version = "1.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "erased-serde"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"typeid",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "errno"
|
name = "errno"
|
||||||
version = "0.3.13"
|
version = "0.3.13"
|
||||||
|
|
@ -1609,6 +1734,15 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fsevent-sys"
|
||||||
|
version = "4.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures"
|
name = "futures"
|
||||||
version = "0.3.31"
|
version = "0.3.31"
|
||||||
|
|
@ -2045,6 +2179,7 @@ dependencies = [
|
||||||
"glam",
|
"glam",
|
||||||
"graphene-core",
|
"graphene-core",
|
||||||
"graphene-core-shaders",
|
"graphene-core-shaders",
|
||||||
|
"graphene-raster-nodes-shaders",
|
||||||
"image",
|
"image",
|
||||||
"kurbo",
|
"kurbo",
|
||||||
"ndarray",
|
"ndarray",
|
||||||
|
|
@ -2054,9 +2189,18 @@ dependencies = [
|
||||||
"rand_chacha 0.9.0",
|
"rand_chacha 0.9.0",
|
||||||
"serde",
|
"serde",
|
||||||
"specta",
|
"specta",
|
||||||
|
"spirv-std",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "graphene-raster-nodes-shaders"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"cargo-gpu",
|
||||||
|
"env_logger",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "graphene-std"
|
name = "graphene-std"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
@ -2699,6 +2843,26 @@ version = "2.0.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
|
checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "inotify"
|
||||||
|
version = "0.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.9.3",
|
||||||
|
"inotify-sys",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "inotify-sys"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "interpolate_name"
|
name = "interpolate_name"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
|
|
@ -2894,6 +3058,26 @@ version = "3.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
|
checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kqueue"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a"
|
||||||
|
dependencies = [
|
||||||
|
"kqueue-sys",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kqueue-sys"
|
||||||
|
version = "1.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 1.3.2",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kurbo"
|
name = "kurbo"
|
||||||
version = "0.11.3"
|
version = "0.11.3"
|
||||||
|
|
@ -3157,6 +3341,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
|
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
|
"log",
|
||||||
"wasi 0.11.1+wasi-snapshot-preview1",
|
"wasi 0.11.1+wasi-snapshot-preview1",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
@ -3281,7 +3466,7 @@ dependencies = [
|
||||||
name = "node-macro"
|
name = "node-macro"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"convert_case",
|
"convert_case 0.8.0",
|
||||||
"graphene-core",
|
"graphene-core",
|
||||||
"indoc",
|
"indoc",
|
||||||
"proc-macro-crate",
|
"proc-macro-crate",
|
||||||
|
|
@ -3308,6 +3493,30 @@ version = "0.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
|
checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "notify"
|
||||||
|
version = "8.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.9.3",
|
||||||
|
"fsevent-sys",
|
||||||
|
"inotify",
|
||||||
|
"kqueue",
|
||||||
|
"libc",
|
||||||
|
"log",
|
||||||
|
"mio",
|
||||||
|
"notify-types",
|
||||||
|
"walkdir",
|
||||||
|
"windows-sys 0.60.2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "notify-types"
|
||||||
|
version = "2.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nu-ansi-term"
|
name = "nu-ansi-term"
|
||||||
version = "0.50.1"
|
version = "0.50.1"
|
||||||
|
|
@ -3794,6 +4003,15 @@ dependencies = [
|
||||||
"libredox",
|
"libredox",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ordered-float"
|
||||||
|
version = "2.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ordered-float"
|
name = "ordered-float"
|
||||||
version = "4.6.0"
|
version = "4.6.0"
|
||||||
|
|
@ -4435,6 +4653,12 @@ dependencies = [
|
||||||
"rgb",
|
"rgb",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "raw-string"
|
||||||
|
version = "0.3.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e0501e134c6905fee1f10fed25b0a7e1261bf676cffac9543a7d0730dec01af2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "raw-window-handle"
|
name = "raw-window-handle"
|
||||||
version = "0.6.2"
|
version = "0.6.2"
|
||||||
|
|
@ -4545,6 +4769,15 @@ version = "0.8.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
|
checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "relative-path"
|
||||||
|
version = "2.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bca40a312222d8ba74837cb474edef44b37f561da5f773981007a10bbaa992b0"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "renderdoc-sys"
|
name = "renderdoc-sys"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
|
@ -4686,6 +4919,16 @@ version = "0.20.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
|
checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rspirv"
|
||||||
|
version = "0.12.0+sdk-1.3.268.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "69cf3a93856b6e5946537278df0d3075596371b1950ccff012f02b0f7eafec8d"
|
||||||
|
dependencies = [
|
||||||
|
"rustc-hash 1.1.0",
|
||||||
|
"spirv",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-demangle"
|
name = "rustc-demangle"
|
||||||
version = "0.1.26"
|
version = "0.1.26"
|
||||||
|
|
@ -4704,6 +4947,33 @@ version = "2.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
|
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_codegen_spirv-target-specs"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6c89eaf493b3dfc730cda42a77014aad65e03213992c7afe0dff60a9f7d3dd94"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_codegen_spirv-target-specs"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "git+https://github.com/rust-gpu/rust-gpu?rev=c12f216121820580731440ee79ebc7403d6ea04f#c12f216121820580731440ee79ebc7403d6ea04f"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"strum 0.27.2",
|
||||||
|
"thiserror 2.0.16",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_codegen_spirv-types"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "git+https://github.com/rust-gpu/rust-gpu?rev=c12f216121820580731440ee79ebc7403d6ea04f#c12f216121820580731440ee79ebc7403d6ea04f"
|
||||||
|
dependencies = [
|
||||||
|
"rspirv",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"spirv",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.44"
|
version = "0.38.44"
|
||||||
|
|
@ -4894,6 +5164,9 @@ name = "semver"
|
||||||
version = "1.0.26"
|
version = "1.0.26"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
|
checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
|
|
@ -4904,6 +5177,27 @@ dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde-untagged"
|
||||||
|
version = "0.1.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34836a629bcbc6f1afdf0907a744870039b1e14c0561cb26094fa683b158eff3"
|
||||||
|
dependencies = [
|
||||||
|
"erased-serde",
|
||||||
|
"serde",
|
||||||
|
"typeid",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde-value"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"
|
||||||
|
dependencies = [
|
||||||
|
"ordered-float 2.10.1",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde-wasm-bindgen"
|
name = "serde-wasm-bindgen"
|
||||||
version = "0.6.5"
|
version = "0.6.5"
|
||||||
|
|
@ -5002,6 +5296,27 @@ version = "1.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook"
|
||||||
|
version = "0.3.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"signal-hook-registry",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook-mio"
|
||||||
|
version = "0.2.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"mio",
|
||||||
|
"signal-hook",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal-hook-registry"
|
name = "signal-hook-registry"
|
||||||
version = "1.4.6"
|
version = "1.4.6"
|
||||||
|
|
@ -5179,8 +5494,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"
|
checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.3",
|
"bitflags 2.9.3",
|
||||||
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spirv-builder"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "git+https://github.com/rust-gpu/rust-gpu?rev=c12f216121820580731440ee79ebc7403d6ea04f#c12f216121820580731440ee79ebc7403d6ea04f"
|
||||||
|
dependencies = [
|
||||||
|
"cargo_metadata",
|
||||||
|
"clap",
|
||||||
|
"log",
|
||||||
|
"memchr",
|
||||||
|
"notify",
|
||||||
|
"raw-string",
|
||||||
|
"rustc_codegen_spirv-target-specs 0.9.0 (git+https://github.com/rust-gpu/rust-gpu?rev=c12f216121820580731440ee79ebc7403d6ea04f)",
|
||||||
|
"rustc_codegen_spirv-types",
|
||||||
|
"semver",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"thiserror 2.0.16",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spirv-std"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "git+https://github.com/rust-gpu/rust-gpu?rev=c12f216121820580731440ee79ebc7403d6ea04f#c12f216121820580731440ee79ebc7403d6ea04f"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 1.3.2",
|
||||||
|
"glam",
|
||||||
|
"libm",
|
||||||
|
"num-traits",
|
||||||
|
"spirv-std-macros",
|
||||||
|
"spirv-std-types",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spirv-std-macros"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "git+https://github.com/rust-gpu/rust-gpu?rev=c12f216121820580731440ee79ebc7403d6ea04f#c12f216121820580731440ee79ebc7403d6ea04f"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"spirv-std-types",
|
||||||
|
"syn 2.0.106",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spirv-std-types"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "git+https://github.com/rust-gpu/rust-gpu?rev=c12f216121820580731440ee79ebc7403d6ea04f#c12f216121820580731440ee79ebc7403d6ea04f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "stable_deref_trait"
|
name = "stable_deref_trait"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
|
|
@ -5659,9 +6023,16 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_spanned",
|
"serde_spanned",
|
||||||
"toml_datetime",
|
"toml_datetime",
|
||||||
|
"toml_write",
|
||||||
"winnow",
|
"winnow",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_write"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower"
|
name = "tower"
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
|
|
@ -5792,6 +6163,12 @@ dependencies = [
|
||||||
"core_maths",
|
"core_maths",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typeid"
|
||||||
|
version = "1.0.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typenum"
|
name = "typenum"
|
||||||
version = "1.18.0"
|
version = "1.18.0"
|
||||||
|
|
@ -5881,6 +6258,12 @@ version = "0.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c"
|
checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.2.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unit-prefix"
|
name = "unit-prefix"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
|
|
@ -6480,7 +6863,7 @@ dependencies = [
|
||||||
"naga",
|
"naga",
|
||||||
"ndk-sys 0.5.0+25.2.9519653",
|
"ndk-sys 0.5.0+25.2.9519653",
|
||||||
"objc",
|
"objc",
|
||||||
"ordered-float",
|
"ordered-float 4.6.0",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"portable-atomic",
|
"portable-atomic",
|
||||||
"profiling",
|
"profiling",
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ members = [
|
||||||
"node-graph/graph-craft",
|
"node-graph/graph-craft",
|
||||||
"node-graph/graphene-cli",
|
"node-graph/graphene-cli",
|
||||||
"node-graph/graster-nodes",
|
"node-graph/graster-nodes",
|
||||||
|
"node-graph/graster-nodes/shaders",
|
||||||
"node-graph/gstd",
|
"node-graph/gstd",
|
||||||
"node-graph/gsvg-renderer",
|
"node-graph/gsvg-renderer",
|
||||||
"node-graph/interpreted-executor",
|
"node-graph/interpreted-executor",
|
||||||
|
|
@ -37,6 +38,7 @@ default-members = [
|
||||||
"node-graph/gbrush",
|
"node-graph/gbrush",
|
||||||
"node-graph/gcore",
|
"node-graph/gcore",
|
||||||
"node-graph/gcore-shaders",
|
"node-graph/gcore-shaders",
|
||||||
|
"node-graph/graster-nodes/shaders",
|
||||||
"node-graph/gmath-nodes",
|
"node-graph/gmath-nodes",
|
||||||
"node-graph/gpath-bool",
|
"node-graph/gpath-bool",
|
||||||
"node-graph/graph-craft",
|
"node-graph/graph-craft",
|
||||||
|
|
@ -191,6 +193,11 @@ open = "5.3"
|
||||||
poly-cool = "0.3"
|
poly-cool = "0.3"
|
||||||
spin = "0.10"
|
spin = "0.10"
|
||||||
clap = "4.5"
|
clap = "4.5"
|
||||||
|
spirv-std = { git = "https://github.com/rust-gpu/rust-gpu", rev = "c12f216121820580731440ee79ebc7403d6ea04f" }
|
||||||
|
cargo-gpu = { git = "https://github.com/rust-gpu/cargo-gpu", rev = "f969528e87baa17a7d48eecf4a6fcfdcaaf30566" }
|
||||||
|
|
||||||
|
[workspace.lints.rust]
|
||||||
|
unexpected_cfgs = { level = "allow", check-cfg = ['cfg(target_arch, values("spirv"))'] }
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
opt-level = 1
|
opt-level = 1
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,10 @@ repository = "https://github.com/GraphiteEditor/Graphite"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["gpu"]
|
default = ["gpu", "shader-nodes"]
|
||||||
gpu = ["editor/gpu"]
|
gpu = ["editor/gpu"]
|
||||||
native = []
|
native = []
|
||||||
|
shader-nodes = ["graphene-std/shader-nodes", "gpu"]
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,23 @@ authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
std = ["dep:dyn-any", "dep:serde", "dep:specta", "dep:log", "glam/debug-glam-assert", "glam/std", "glam/serde", "half/std", "half/serde", "num-traits/std"]
|
# any feature that
|
||||||
|
# * must be usable in shaders
|
||||||
|
# * but requires std
|
||||||
|
# * and should be on by default
|
||||||
|
# should be in this list instead of `[workspace.dependency]`
|
||||||
|
std = [
|
||||||
|
"dep:dyn-any",
|
||||||
|
"dep:serde",
|
||||||
|
"dep:specta",
|
||||||
|
"dep:log",
|
||||||
|
"glam/debug-glam-assert",
|
||||||
|
"glam/std",
|
||||||
|
"glam/serde",
|
||||||
|
"half/std",
|
||||||
|
"half/serde",
|
||||||
|
"num-traits/std"
|
||||||
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Local std dependencies
|
# Local std dependencies
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ use super::discrete_srgb::{float_to_srgb_u8, srgb_u8_to_float};
|
||||||
use bytemuck::{Pod, Zeroable};
|
use bytemuck::{Pod, Zeroable};
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use core::hash::Hash;
|
use core::hash::Hash;
|
||||||
|
use glam::Vec4;
|
||||||
use half::f16;
|
use half::f16;
|
||||||
#[cfg(not(feature = "std"))]
|
#[cfg(not(feature = "std"))]
|
||||||
use num_traits::Euclid;
|
use num_traits::Euclid;
|
||||||
|
|
@ -1075,6 +1076,21 @@ impl Color {
|
||||||
..*self
|
..*self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub const fn from_vec4(vec: Vec4) -> Self {
|
||||||
|
Self {
|
||||||
|
red: vec.x,
|
||||||
|
green: vec.y,
|
||||||
|
blue: vec.z,
|
||||||
|
alpha: vec.w,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn to_vec4(&self) -> Vec4 {
|
||||||
|
Vec4::new(self.red, self.green, self.blue, self.alpha)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,18 @@ description = "graphene raster data format"
|
||||||
authors = ["Graphite Authors <contact@graphite.rs>"]
|
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["rlib", "dylib"]
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["std"]
|
default = ["std"]
|
||||||
|
shader-nodes = [
|
||||||
|
"std",
|
||||||
|
"dep:graphene-raster-nodes-shaders",
|
||||||
|
]
|
||||||
std = [
|
std = [
|
||||||
"dep:graphene-core",
|
"dep:graphene-core",
|
||||||
"dep:dyn-any",
|
"dep:dyn-any",
|
||||||
|
|
@ -19,8 +29,6 @@ std = [
|
||||||
"dep:serde",
|
"dep:serde",
|
||||||
"dep:specta",
|
"dep:specta",
|
||||||
"dep:kurbo",
|
"dep:kurbo",
|
||||||
"glam/debug-glam-assert",
|
|
||||||
"glam/serde",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
@ -31,10 +39,12 @@ node-macro = { workspace = true }
|
||||||
# Local std dependencies
|
# Local std dependencies
|
||||||
dyn-any = { workspace = true, optional = true }
|
dyn-any = { workspace = true, optional = true }
|
||||||
graphene-core = { workspace = true, optional = true }
|
graphene-core = { workspace = true, optional = true }
|
||||||
|
graphene-raster-nodes-shaders = { path = "./shaders", optional = true }
|
||||||
|
|
||||||
# Workspace dependencies
|
# Workspace dependencies
|
||||||
bytemuck = { workspace = true }
|
bytemuck = { workspace = true }
|
||||||
glam = { workspace = true }
|
glam = { workspace = true }
|
||||||
|
spirv-std = { workspace = true }
|
||||||
num-traits = { workspace = true }
|
num-traits = { workspace = true }
|
||||||
|
|
||||||
# Workspace std dependencies
|
# Workspace std dependencies
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
[package]
|
||||||
|
name = "graphene-raster-nodes-shaders"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
description = "graphene raster data format"
|
||||||
|
authors = ["Graphite Authors <contact@graphite.rs>"]
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cargo-gpu = { workspace = true }
|
||||||
|
env_logger = { workspace = true }
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
use cargo_gpu::InstalledBackend;
|
||||||
|
use cargo_gpu::spirv_builder::{MetadataPrintout, SpirvMetadata};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
pub fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
env_logger::builder().init();
|
||||||
|
|
||||||
|
// Skip building the shader if they are provided externally
|
||||||
|
println!("cargo:rerun-if-env-changed=GRAPHENE_RASTER_NODES_SHADER_PATH");
|
||||||
|
if !std::env::var("GRAPHENE_RASTER_NODES_SHADER_PATH").unwrap_or_default().is_empty() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allows overriding the PATH to inject the rust-gpu rust toolchain when building the rest of the project with stable rustc.
|
||||||
|
// Used in nix shell. Do not remove without checking with developers using nix.
|
||||||
|
println!("cargo:rerun-if-env-changed=RUST_GPU_PATH_OVERRIDE");
|
||||||
|
if let Ok(path_override) = std::env::var("RUST_GPU_PATH_OVERRIDE") {
|
||||||
|
let current_path = std::env::var("PATH").unwrap_or_default();
|
||||||
|
let new_path = format!("{path_override}:{current_path}");
|
||||||
|
// SAFETY: Build script is single-threaded therefore this cannot lead to undefined behavior.
|
||||||
|
unsafe {
|
||||||
|
std::env::set_var("PATH", &new_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let shader_crate = PathBuf::from(concat!(env!("CARGO_MANIFEST_DIR"), "/.."));
|
||||||
|
|
||||||
|
println!("cargo:rerun-if-env-changed=RUSTC_CODEGEN_SPIRV_PATH");
|
||||||
|
let rustc_codegen_spirv_path = std::env::var("RUSTC_CODEGEN_SPIRV_PATH").unwrap_or_default();
|
||||||
|
let backend = if rustc_codegen_spirv_path.is_empty() {
|
||||||
|
// install the toolchain and build the `rustc_codegen_spirv` codegen backend with it
|
||||||
|
cargo_gpu::Install::from_shader_crate(shader_crate.clone()).run()?
|
||||||
|
} else {
|
||||||
|
// use the `RUSTC_CODEGEN_SPIRV` environment variable to find the codegen backend
|
||||||
|
let mut backend = InstalledBackend::default();
|
||||||
|
backend.rustc_codegen_spirv_location = PathBuf::from(rustc_codegen_spirv_path);
|
||||||
|
backend.toolchain_channel = "nightly".to_string();
|
||||||
|
backend.target_spec_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
backend
|
||||||
|
};
|
||||||
|
|
||||||
|
// build the shader crate
|
||||||
|
let mut builder = backend.to_spirv_builder(shader_crate, "spirv-unknown-naga-wgsl");
|
||||||
|
builder.print_metadata = MetadataPrintout::DependencyOnly;
|
||||||
|
builder.spirv_metadata = SpirvMetadata::Full;
|
||||||
|
builder.shader_crate_features.default_features = false;
|
||||||
|
let wgsl_result = builder.build()?;
|
||||||
|
let path_to_spv = wgsl_result.module.unwrap_single();
|
||||||
|
|
||||||
|
// needs to be fixed upstream
|
||||||
|
let path_to_wgsl = path_to_spv.with_extension("wgsl");
|
||||||
|
|
||||||
|
println!("cargo::rustc-env=GRAPHENE_RASTER_NODES_SHADER_PATH={}", path_to_wgsl.display());
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"allows-weak-linkage": false,
|
||||||
|
"arch": "spirv",
|
||||||
|
"crt-objects-fallback": "false",
|
||||||
|
"crt-static-allows-dylibs": true,
|
||||||
|
"crt-static-respected": true,
|
||||||
|
"data-layout": "e-m:e-p:32:32:32-i64:64-n8:16:32:64",
|
||||||
|
"dll-prefix": "",
|
||||||
|
"dll-suffix": ".spv.json",
|
||||||
|
"dynamic-linking": true,
|
||||||
|
"emit-debug-gdb-scripts": false,
|
||||||
|
"env": "naga-wgsl",
|
||||||
|
"linker-flavor": "unix",
|
||||||
|
"linker-is-gnu": false,
|
||||||
|
"llvm-target": "spirv-unknown-naga-wgsl",
|
||||||
|
"main-needs-argc-argv": false,
|
||||||
|
"metadata": {
|
||||||
|
"description": null,
|
||||||
|
"host_tools": null,
|
||||||
|
"std": null,
|
||||||
|
"tier": null
|
||||||
|
},
|
||||||
|
"panic-strategy": "abort",
|
||||||
|
"simd-types-indirect": false,
|
||||||
|
"target-pointer-width": "32"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
pub const WGSL_SHADER: &str = include_str!(env!("GRAPHENE_RASTER_NODES_SHADER_PATH"));
|
||||||
|
|
@ -33,6 +33,7 @@ use num_traits::float::Float;
|
||||||
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, node_macro::ChoiceType)]
|
#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, Hash, node_macro::ChoiceType)]
|
||||||
#[cfg_attr(feature = "std", derive(dyn_any::DynAny, specta::Type, serde::Serialize, serde::Deserialize))]
|
#[cfg_attr(feature = "std", derive(dyn_any::DynAny, specta::Type, serde::Serialize, serde::Deserialize))]
|
||||||
#[widget(Dropdown)]
|
#[widget(Dropdown)]
|
||||||
|
#[repr(u32)]
|
||||||
pub enum LuminanceCalculation {
|
pub enum LuminanceCalculation {
|
||||||
#[default]
|
#[default]
|
||||||
#[label("sRGB")]
|
#[label("sRGB")]
|
||||||
|
|
@ -52,6 +53,7 @@ fn luminance<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
luminance_calc: LuminanceCalculation,
|
luminance_calc: LuminanceCalculation,
|
||||||
) -> T {
|
) -> T {
|
||||||
|
|
@ -68,7 +70,7 @@ fn luminance<T: Adjust<Color>>(
|
||||||
input
|
input
|
||||||
}
|
}
|
||||||
|
|
||||||
#[node_macro::node(category("Raster"), shader_node(PerPixelAdjust))]
|
#[node_macro::node(category("Raster"), cfg(feature = "std"))]
|
||||||
fn gamma_correction<T: Adjust<Color>>(
|
fn gamma_correction<T: Adjust<Color>>(
|
||||||
_: impl Ctx,
|
_: impl Ctx,
|
||||||
#[implementations(
|
#[implementations(
|
||||||
|
|
@ -77,6 +79,7 @@ fn gamma_correction<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
#[default(2.2)]
|
#[default(2.2)]
|
||||||
#[range((0.01, 10.))]
|
#[range((0.01, 10.))]
|
||||||
|
|
@ -98,6 +101,7 @@ fn extract_channel<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
channel: RedGreenBlueAlpha,
|
channel: RedGreenBlueAlpha,
|
||||||
) -> T {
|
) -> T {
|
||||||
|
|
@ -122,6 +126,7 @@ fn make_opaque<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
) -> T {
|
) -> T {
|
||||||
input.adjust(|color| {
|
input.adjust(|color| {
|
||||||
|
|
@ -139,7 +144,7 @@ fn make_opaque<T: Adjust<Color>>(
|
||||||
//
|
//
|
||||||
// Some further analysis available at:
|
// Some further analysis available at:
|
||||||
// https://geraldbakker.nl/psnumbers/brightness-contrast.html
|
// https://geraldbakker.nl/psnumbers/brightness-contrast.html
|
||||||
#[node_macro::node(name("Brightness/Contrast"), category("Raster: Adjustment"), properties("brightness_contrast_properties"), shader_node(PerPixelAdjust))]
|
#[node_macro::node(name("Brightness/Contrast"), category("Raster: Adjustment"), properties("brightness_contrast_properties"), cfg(feature = "std"))]
|
||||||
fn brightness_contrast<T: Adjust<Color>>(
|
fn brightness_contrast<T: Adjust<Color>>(
|
||||||
_: impl Ctx,
|
_: impl Ctx,
|
||||||
#[implementations(
|
#[implementations(
|
||||||
|
|
@ -148,6 +153,7 @@ fn brightness_contrast<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
brightness: SignedPercentageF32,
|
brightness: SignedPercentageF32,
|
||||||
contrast: SignedPercentageF32,
|
contrast: SignedPercentageF32,
|
||||||
|
|
@ -238,6 +244,7 @@ fn levels<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut image: T,
|
mut image: T,
|
||||||
#[default(0.)] shadows: PercentageF32,
|
#[default(0.)] shadows: PercentageF32,
|
||||||
#[default(50.)] midtones: PercentageF32,
|
#[default(50.)] midtones: PercentageF32,
|
||||||
|
|
@ -306,6 +313,7 @@ fn black_and_white<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut image: T,
|
mut image: T,
|
||||||
#[default(Color::BLACK)] tint: Color,
|
#[default(Color::BLACK)] tint: Color,
|
||||||
#[default(40.)]
|
#[default(40.)]
|
||||||
|
|
@ -379,6 +387,7 @@ fn hue_saturation<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
hue_shift: AngleF32,
|
hue_shift: AngleF32,
|
||||||
saturation_shift: SignedPercentageF32,
|
saturation_shift: SignedPercentageF32,
|
||||||
|
|
@ -414,6 +423,7 @@ fn invert<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
) -> T {
|
) -> T {
|
||||||
input.adjust(|color| {
|
input.adjust(|color| {
|
||||||
|
|
@ -437,6 +447,7 @@ fn threshold<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut image: T,
|
mut image: T,
|
||||||
#[default(50.)] min_luminance: PercentageF32,
|
#[default(50.)] min_luminance: PercentageF32,
|
||||||
#[default(100.)] max_luminance: PercentageF32,
|
#[default(100.)] max_luminance: PercentageF32,
|
||||||
|
|
@ -483,6 +494,7 @@ fn vibrance<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut image: T,
|
mut image: T,
|
||||||
vibrance: SignedPercentageF32,
|
vibrance: SignedPercentageF32,
|
||||||
) -> T {
|
) -> T {
|
||||||
|
|
@ -551,6 +563,7 @@ pub enum RedGreenBlue {
|
||||||
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, node_macro::ChoiceType)]
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, node_macro::ChoiceType)]
|
||||||
#[cfg_attr(feature = "std", derive(dyn_any::DynAny, specta::Type, serde::Serialize, serde::Deserialize))]
|
#[cfg_attr(feature = "std", derive(dyn_any::DynAny, specta::Type, serde::Serialize, serde::Deserialize))]
|
||||||
#[widget(Radio)]
|
#[widget(Radio)]
|
||||||
|
#[repr(u32)]
|
||||||
pub enum RedGreenBlueAlpha {
|
pub enum RedGreenBlueAlpha {
|
||||||
#[default]
|
#[default]
|
||||||
Red,
|
Red,
|
||||||
|
|
@ -640,7 +653,7 @@ pub enum DomainWarpType {
|
||||||
// Aims for interoperable compatibility with:
|
// Aims for interoperable compatibility with:
|
||||||
// https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=%27mixr%27%20%3D%20Channel%20Mixer
|
// https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=%27mixr%27%20%3D%20Channel%20Mixer
|
||||||
// https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=Lab%20color%20only-,Channel%20Mixer,-Key%20is%20%27mixr
|
// https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=Lab%20color%20only-,Channel%20Mixer,-Key%20is%20%27mixr
|
||||||
#[node_macro::node(category("Raster: Adjustment"), properties("channel_mixer_properties"), shader_node(PerPixelAdjust))]
|
#[node_macro::node(category("Raster: Adjustment"), properties("channel_mixer_properties"), cfg(feature = "std"))]
|
||||||
fn channel_mixer<T: Adjust<Color>>(
|
fn channel_mixer<T: Adjust<Color>>(
|
||||||
_: impl Ctx,
|
_: impl Ctx,
|
||||||
#[implementations(
|
#[implementations(
|
||||||
|
|
@ -649,6 +662,7 @@ fn channel_mixer<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut image: T,
|
mut image: T,
|
||||||
|
|
||||||
monochrome: bool,
|
monochrome: bool,
|
||||||
|
|
@ -769,7 +783,7 @@ pub enum SelectiveColorChoice {
|
||||||
//
|
//
|
||||||
// Algorithm based on:
|
// Algorithm based on:
|
||||||
// https://blog.pkh.me/p/22-understanding-selective-coloring-in-adobe-photoshop.html
|
// https://blog.pkh.me/p/22-understanding-selective-coloring-in-adobe-photoshop.html
|
||||||
#[node_macro::node(category("Raster: Adjustment"), properties("selective_color_properties"), shader_node(PerPixelAdjust))]
|
#[node_macro::node(category("Raster: Adjustment"), properties("selective_color_properties"), cfg(feature = "std"))]
|
||||||
fn selective_color<T: Adjust<Color>>(
|
fn selective_color<T: Adjust<Color>>(
|
||||||
_: impl Ctx,
|
_: impl Ctx,
|
||||||
#[implementations(
|
#[implementations(
|
||||||
|
|
@ -778,6 +792,7 @@ fn selective_color<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut image: T,
|
mut image: T,
|
||||||
|
|
||||||
mode: RelativeAbsolute,
|
mode: RelativeAbsolute,
|
||||||
|
|
@ -921,6 +936,7 @@ fn posterize<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
#[default(4)]
|
#[default(4)]
|
||||||
#[hard_min(2.)]
|
#[hard_min(2.)]
|
||||||
|
|
@ -955,6 +971,7 @@ fn exposure<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut input: T,
|
mut input: T,
|
||||||
exposure: f32,
|
exposure: f32,
|
||||||
offset: f32,
|
offset: f32,
|
||||||
|
|
|
||||||
|
|
@ -141,6 +141,7 @@ fn blend<T: Blend<Color> + Send>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
over: T,
|
over: T,
|
||||||
#[expose]
|
#[expose]
|
||||||
#[implementations(
|
#[implementations(
|
||||||
|
|
@ -149,6 +150,7 @@ fn blend<T: Blend<Color> + Send>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
under: T,
|
under: T,
|
||||||
blend_mode: BlendMode,
|
blend_mode: BlendMode,
|
||||||
#[default(100.)] opacity: PercentageF32,
|
#[default(100.)] opacity: PercentageF32,
|
||||||
|
|
@ -165,6 +167,7 @@ fn color_overlay<T: Adjust<Color>>(
|
||||||
Table<GradientStops>,
|
Table<GradientStops>,
|
||||||
GradientStops,
|
GradientStops,
|
||||||
)]
|
)]
|
||||||
|
#[gpu_image]
|
||||||
mut image: T,
|
mut image: T,
|
||||||
#[default(Color::BLACK)] color: Color,
|
#[default(Color::BLACK)] color: Color,
|
||||||
blend_mode: BlendMode,
|
blend_mode: BlendMode,
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ image-compare = []
|
||||||
vello = ["dep:vello", "gpu"]
|
vello = ["dep:vello", "gpu"]
|
||||||
resvg = []
|
resvg = []
|
||||||
wayland = ["graph-craft/wayland"]
|
wayland = ["graph-craft/wayland"]
|
||||||
|
shader-nodes = ["graphene-raster-nodes/shader-nodes"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Local dependencies
|
# Local dependencies
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,9 @@ mod benchmark_util;
|
||||||
|
|
||||||
use benchmark_util::setup_network;
|
use benchmark_util::setup_network;
|
||||||
use graphene_std::application_io::RenderConfig;
|
use graphene_std::application_io::RenderConfig;
|
||||||
use iai_callgrind::{black_box, library_benchmark, library_benchmark_group, main};
|
use iai_callgrind::{library_benchmark, library_benchmark_group, main};
|
||||||
use interpreted_executor::dynamic_executor::DynamicExecutor;
|
use interpreted_executor::dynamic_executor::DynamicExecutor;
|
||||||
|
use std::hint::black_box;
|
||||||
|
|
||||||
fn setup_run_cached(name: &str) -> DynamicExecutor {
|
fn setup_run_cached(name: &str) -> DynamicExecutor {
|
||||||
let (executor, _) = setup_network(name);
|
let (executor, _) = setup_network(name);
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,9 @@ mod benchmark_util;
|
||||||
|
|
||||||
use benchmark_util::setup_network;
|
use benchmark_util::setup_network;
|
||||||
use graphene_std::application_io;
|
use graphene_std::application_io;
|
||||||
use iai_callgrind::{black_box, library_benchmark, library_benchmark_group, main};
|
use iai_callgrind::{library_benchmark, library_benchmark_group, main};
|
||||||
use interpreted_executor::dynamic_executor::DynamicExecutor;
|
use interpreted_executor::dynamic_executor::DynamicExecutor;
|
||||||
|
use std::hint::black_box;
|
||||||
|
|
||||||
fn setup_run_once(name: &str) -> DynamicExecutor {
|
fn setup_run_once(name: &str) -> DynamicExecutor {
|
||||||
let (executor, _) = setup_network(name);
|
let (executor, _) = setup_network(name);
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,9 @@ mod benchmark_util;
|
||||||
|
|
||||||
use benchmark_util::setup_network;
|
use benchmark_util::setup_network;
|
||||||
use graph_craft::proto::ProtoNetwork;
|
use graph_craft::proto::ProtoNetwork;
|
||||||
use iai_callgrind::{black_box, library_benchmark, library_benchmark_group, main};
|
use iai_callgrind::{library_benchmark, library_benchmark_group, main};
|
||||||
use interpreted_executor::dynamic_executor::DynamicExecutor;
|
use interpreted_executor::dynamic_executor::DynamicExecutor;
|
||||||
|
use std::hint::black_box;
|
||||||
|
|
||||||
fn setup_update_executor(name: &str) -> (DynamicExecutor, ProtoNetwork) {
|
fn setup_update_executor(name: &str) -> (DynamicExecutor, ProtoNetwork) {
|
||||||
let (_, proto_network) = setup_network(name);
|
let (_, proto_network) = setup_network(name);
|
||||||
|
|
|
||||||
|
|
@ -295,6 +295,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
||||||
|
|
||||||
let cfg = crate::shader_nodes::modify_cfg(attributes);
|
let cfg = crate::shader_nodes::modify_cfg(attributes);
|
||||||
let node_input_accessor = generate_node_input_references(parsed, fn_generics, &field_idents, &graphene_core, &identifier, &cfg);
|
let node_input_accessor = generate_node_input_references(parsed, fn_generics, &field_idents, &graphene_core, &identifier, &cfg);
|
||||||
|
let shader_entry_point = attributes.shader_node.as_ref().map(|n| n.codegen_shader_entry_point(parsed)).unwrap_or(Ok(TokenStream2::new()))?;
|
||||||
Ok(quote! {
|
Ok(quote! {
|
||||||
/// Underlying implementation for [#struct_name]
|
/// Underlying implementation for [#struct_name]
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
@ -384,6 +385,8 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
|
||||||
NODE_METADATA.lock().unwrap().insert(#identifier(), metadata);
|
NODE_METADATA.lock().unwrap().insert(#identifier(), metadata);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#shader_entry_point
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -586,6 +589,7 @@ fn generate_register_node_impl(parsed: &ParsedNodeFn, field_names: &[&Ident], st
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::shader_nodes::CodegenShaderEntryPoint;
|
||||||
use syn::visit_mut::VisitMut;
|
use syn::visit_mut::VisitMut;
|
||||||
use syn::{GenericArgument, Lifetime, Type};
|
use syn::{GenericArgument, Lifetime, Type};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,8 @@ pub enum ParsedFieldType {
|
||||||
Node(NodeParsedField),
|
Node(NodeParsedField),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// a param of any kind, either a concrete type or a generic type with a set of possible types specified via
|
||||||
|
/// `#[implementation(type)]`
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct RegularParsedField {
|
pub struct RegularParsedField {
|
||||||
pub ty: Type,
|
pub ty: Type,
|
||||||
|
|
@ -131,8 +133,10 @@ pub struct RegularParsedField {
|
||||||
pub number_hard_max: Option<LitFloat>,
|
pub number_hard_max: Option<LitFloat>,
|
||||||
pub number_mode_range: Option<ExprTuple>,
|
pub number_mode_range: Option<ExprTuple>,
|
||||||
pub implementations: Punctuated<Type, Comma>,
|
pub implementations: Punctuated<Type, Comma>,
|
||||||
|
pub gpu_image: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// a param of `impl Node` with `#[implementation(in -> out)]`
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct NodeParsedField {
|
pub struct NodeParsedField {
|
||||||
pub input_type: Type,
|
pub input_type: Type,
|
||||||
|
|
@ -529,6 +533,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
|
||||||
.map_err(|e| Error::new_spanned(attr, format!("Invalid `step` for argument '{ident}': {e}\nUSAGE EXAMPLE: #[step(2.)]")))
|
.map_err(|e| Error::new_spanned(attr, format!("Invalid `step` for argument '{ident}': {e}\nUSAGE EXAMPLE: #[step(2.)]")))
|
||||||
})
|
})
|
||||||
.transpose()?;
|
.transpose()?;
|
||||||
|
let gpu_image = extract_attribute(attrs, "gpu_image").is_some();
|
||||||
|
|
||||||
let (is_node, node_input_type, node_output_type) = parse_node_type(&ty);
|
let (is_node, node_input_type, node_output_type) = parse_node_type(&ty);
|
||||||
let description = attrs
|
let description = attrs
|
||||||
|
|
@ -590,6 +595,7 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
|
||||||
ty,
|
ty,
|
||||||
value_source,
|
value_source,
|
||||||
implementations,
|
implementations,
|
||||||
|
gpu_image,
|
||||||
}),
|
}),
|
||||||
name,
|
name,
|
||||||
description,
|
description,
|
||||||
|
|
@ -829,6 +835,7 @@ mod tests {
|
||||||
number_hard_max: None,
|
number_hard_max: None,
|
||||||
number_mode_range: None,
|
number_mode_range: None,
|
||||||
implementations: Punctuated::new(),
|
implementations: Punctuated::new(),
|
||||||
|
gpu_image: false,
|
||||||
}),
|
}),
|
||||||
number_display_decimal_places: None,
|
number_display_decimal_places: None,
|
||||||
number_step: None,
|
number_step: None,
|
||||||
|
|
@ -909,6 +916,7 @@ mod tests {
|
||||||
number_hard_max: None,
|
number_hard_max: None,
|
||||||
number_mode_range: None,
|
number_mode_range: None,
|
||||||
implementations: Punctuated::new(),
|
implementations: Punctuated::new(),
|
||||||
|
gpu_image: false,
|
||||||
}),
|
}),
|
||||||
number_display_decimal_places: None,
|
number_display_decimal_places: None,
|
||||||
number_step: None,
|
number_step: None,
|
||||||
|
|
@ -972,6 +980,7 @@ mod tests {
|
||||||
number_hard_max: None,
|
number_hard_max: None,
|
||||||
number_mode_range: None,
|
number_mode_range: None,
|
||||||
implementations: Punctuated::new(),
|
implementations: Punctuated::new(),
|
||||||
|
gpu_image: false,
|
||||||
}),
|
}),
|
||||||
number_display_decimal_places: None,
|
number_display_decimal_places: None,
|
||||||
number_step: None,
|
number_step: None,
|
||||||
|
|
@ -1038,6 +1047,7 @@ mod tests {
|
||||||
p.push(parse_quote!(f64));
|
p.push(parse_quote!(f64));
|
||||||
p
|
p
|
||||||
},
|
},
|
||||||
|
gpu_image: false,
|
||||||
}),
|
}),
|
||||||
number_display_decimal_places: None,
|
number_display_decimal_places: None,
|
||||||
number_step: None,
|
number_step: None,
|
||||||
|
|
@ -1106,6 +1116,7 @@ mod tests {
|
||||||
number_hard_max: None,
|
number_hard_max: None,
|
||||||
number_mode_range: Some(parse_quote!((0., 100.))),
|
number_mode_range: Some(parse_quote!((0., 100.))),
|
||||||
implementations: Punctuated::new(),
|
implementations: Punctuated::new(),
|
||||||
|
gpu_image: false,
|
||||||
}),
|
}),
|
||||||
number_display_decimal_places: None,
|
number_display_decimal_places: None,
|
||||||
number_step: None,
|
number_step: None,
|
||||||
|
|
@ -1167,6 +1178,7 @@ mod tests {
|
||||||
number_hard_max: None,
|
number_hard_max: None,
|
||||||
number_mode_range: None,
|
number_mode_range: None,
|
||||||
implementations: Punctuated::new(),
|
implementations: Punctuated::new(),
|
||||||
|
gpu_image: false,
|
||||||
}),
|
}),
|
||||||
number_display_decimal_places: None,
|
number_display_decimal_places: None,
|
||||||
number_step: None,
|
number_step: None,
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,13 @@
|
||||||
use crate::parsing::NodeFnAttributes;
|
use crate::parsing::{NodeFnAttributes, ParsedNodeFn};
|
||||||
|
use crate::shader_nodes::per_pixel_adjust::PerPixelAdjust;
|
||||||
use proc_macro2::{Ident, TokenStream};
|
use proc_macro2::{Ident, TokenStream};
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
use strum::{EnumString, VariantNames};
|
use strum::VariantNames;
|
||||||
use syn::Error;
|
use syn::Error;
|
||||||
use syn::parse::{Parse, ParseStream};
|
use syn::parse::{Parse, ParseStream};
|
||||||
|
|
||||||
|
pub mod per_pixel_adjust;
|
||||||
|
|
||||||
pub const STD_FEATURE_GATE: &str = "std";
|
pub const STD_FEATURE_GATE: &str = "std";
|
||||||
|
|
||||||
pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
|
pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
|
||||||
|
|
@ -16,17 +19,33 @@ pub fn modify_cfg(attributes: &NodeFnAttributes) -> TokenStream {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, EnumString, VariantNames)]
|
#[derive(Debug, VariantNames)]
|
||||||
pub(crate) enum ShaderNodeType {
|
pub(crate) enum ShaderNodeType {
|
||||||
PerPixelAdjust,
|
PerPixelAdjust(PerPixelAdjust),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Parse for ShaderNodeType {
|
impl Parse for ShaderNodeType {
|
||||||
fn parse(input: ParseStream) -> syn::Result<Self> {
|
fn parse(input: ParseStream) -> syn::Result<Self> {
|
||||||
let ident: Ident = input.parse()?;
|
let ident: Ident = input.parse()?;
|
||||||
Ok(match ident.to_string().as_str() {
|
Ok(match ident.to_string().as_str() {
|
||||||
"PerPixelAdjust" => ShaderNodeType::PerPixelAdjust,
|
"PerPixelAdjust" => ShaderNodeType::PerPixelAdjust(PerPixelAdjust::parse(input)?),
|
||||||
_ => return Err(Error::new_spanned(&ident, format!("attr 'shader_node' must be one of {:?}", Self::VARIANTS))),
|
_ => return Err(Error::new_spanned(&ident, format!("attr 'shader_node' must be one of {:?}", Self::VARIANTS))),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait CodegenShaderEntryPoint {
|
||||||
|
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CodegenShaderEntryPoint for ShaderNodeType {
|
||||||
|
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
||||||
|
if parsed.is_async {
|
||||||
|
return Err(Error::new_spanned(&parsed.fn_name, "Shader nodes must not be async"));
|
||||||
|
}
|
||||||
|
|
||||||
|
match self {
|
||||||
|
ShaderNodeType::PerPixelAdjust(x) => x.codegen_shader_entry_point(parsed),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
use crate::parsing::{ParsedFieldType, ParsedNodeFn, RegularParsedField};
|
||||||
|
use crate::shader_nodes::CodegenShaderEntryPoint;
|
||||||
|
use proc_macro2::{Ident, TokenStream};
|
||||||
|
use quote::{ToTokens, format_ident, quote};
|
||||||
|
use std::borrow::Cow;
|
||||||
|
use syn::parse::{Parse, ParseStream};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct PerPixelAdjust {}
|
||||||
|
|
||||||
|
impl Parse for PerPixelAdjust {
|
||||||
|
fn parse(_input: ParseStream) -> syn::Result<Self> {
|
||||||
|
Ok(Self {})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CodegenShaderEntryPoint for PerPixelAdjust {
|
||||||
|
fn codegen_shader_entry_point(&self, parsed: &ParsedNodeFn) -> syn::Result<TokenStream> {
|
||||||
|
let fn_name = &parsed.fn_name;
|
||||||
|
let gpu_mod = format_ident!("{}_gpu", parsed.fn_name);
|
||||||
|
let spirv_image_ty = quote!(Image2d);
|
||||||
|
|
||||||
|
// bindings for images start at 1
|
||||||
|
let mut binding_cnt = 0;
|
||||||
|
let params = parsed
|
||||||
|
.fields
|
||||||
|
.iter()
|
||||||
|
.map(|f| {
|
||||||
|
let ident = &f.pat_ident;
|
||||||
|
match &f.ty {
|
||||||
|
ParsedFieldType::Node { .. } => Err(syn::Error::new_spanned(ident, "PerPixelAdjust shader nodes cannot accept other nodes as generics")),
|
||||||
|
ParsedFieldType::Regular(RegularParsedField { gpu_image: false, ty, .. }) => Ok(Param {
|
||||||
|
ident: Cow::Borrowed(&ident.ident),
|
||||||
|
ty: Cow::Owned(ty.to_token_stream()),
|
||||||
|
param_type: ParamType::Uniform,
|
||||||
|
}),
|
||||||
|
ParsedFieldType::Regular(RegularParsedField { gpu_image: true, .. }) => {
|
||||||
|
binding_cnt += 1;
|
||||||
|
Ok(Param {
|
||||||
|
ident: Cow::Owned(format_ident!("image_{}", &ident.ident)),
|
||||||
|
ty: Cow::Borrowed(&spirv_image_ty),
|
||||||
|
param_type: ParamType::Image { binding: binding_cnt },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<syn::Result<Vec<_>>>()?;
|
||||||
|
|
||||||
|
let uniform_members = params
|
||||||
|
.iter()
|
||||||
|
.filter_map(|Param { ident, ty, param_type }| match param_type {
|
||||||
|
ParamType::Image { .. } => None,
|
||||||
|
ParamType::Uniform => Some(quote! {#ident: #ty}),
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let image_params = params
|
||||||
|
.iter()
|
||||||
|
.filter_map(|Param { ident, ty, param_type }| match param_type {
|
||||||
|
ParamType::Image { binding } => Some(quote! {#[spirv(descriptor_set = 0, binding = #binding)] #ident: &#ty}),
|
||||||
|
ParamType::Uniform => None,
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let call_args = params
|
||||||
|
.iter()
|
||||||
|
.map(|Param { ident, param_type, .. }| match param_type {
|
||||||
|
ParamType::Image { .. } => quote!(Color::from_vec4(#ident.fetch_with(texel_coord, lod(0)))),
|
||||||
|
ParamType::Uniform => quote!(uniform.#ident),
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
let context = quote!(());
|
||||||
|
|
||||||
|
Ok(quote! {
|
||||||
|
pub mod #gpu_mod {
|
||||||
|
use super::*;
|
||||||
|
use graphene_core_shaders::color::Color;
|
||||||
|
use spirv_std::spirv;
|
||||||
|
use spirv_std::glam::{Vec4, Vec4Swizzles};
|
||||||
|
use spirv_std::image::{Image2d, ImageWithMethods};
|
||||||
|
use spirv_std::image::sample_with::lod;
|
||||||
|
|
||||||
|
pub struct Uniform {
|
||||||
|
#(#uniform_members),*
|
||||||
|
}
|
||||||
|
|
||||||
|
#[spirv(fragment)]
|
||||||
|
pub fn entry_point(
|
||||||
|
#[spirv(frag_coord)] frag_coord: Vec4,
|
||||||
|
color_out: &mut Vec4,
|
||||||
|
#[spirv(descriptor_set = 0, binding = 0, storage_buffer)] uniform: &Uniform,
|
||||||
|
#(#image_params),*
|
||||||
|
) {
|
||||||
|
let texel_coord = frag_coord.xy().as_uvec2();
|
||||||
|
let color: Color = #fn_name(#context, #(#call_args),*);
|
||||||
|
*color_out = color.to_vec4();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Param<'a> {
|
||||||
|
ident: Cow<'a, Ident>,
|
||||||
|
ty: Cow<'a, TokenStream>,
|
||||||
|
param_type: ParamType,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ParamType {
|
||||||
|
Image { binding: u32 },
|
||||||
|
Uniform,
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue