| # This file will be copied into //third_party/externals/vello via the new_local_repository |
| # rule in WORKSPACE.bazel, so all files should be relative to that path. |
| load("@rules_rust//cargo:defs.bzl", "cargo_build_script") |
| load("@rules_rust//rust:defs.bzl", "rust_library") |
| |
| # The vello repository is organized as a workspace where the vello_shaders and vello_encoding crates |
| # live in //vello/crates/shaders and //vello/crates/encoding, respectively. The WGSL shader source |
| # files themselves live outside the crates directory in //vello/shader. |
| # |
| # Normally we would simply list the following dependencies in our Cargo.toml file and Bazel's |
| # `crates_repository` rule would automatically create targets for both crates that could be compiled |
| # out-of-the-box: |
| # |
| # vello_shaders = { git = "https://skia.googlesource.com/external/github.com/linebender/vello", rev = "123456" } |
| # vello_encoding = { git = "https://skia.googlesource.com/external/github.com/linebender/vello", rev = "123456" } |
| # |
| # However, Bazel's restrictions on external repositories around accessing files in a parent |
| # directory via relative path are not compatible with Vello's shader organization and the way |
| # the vello_shader build script locates shader files for pre-compilation. For that reason, we |
| # define our own Bazel rules here that run the build script with an environment variable that points |
| # at the repository root to help it locate the shaders. |
| |
| rust_library( |
| name = "vello_encoding", |
| srcs = glob( |
| include = ["crates/encoding/src/**/*.rs"], |
| allow_empty = False, |
| ), |
| crate_features = ["bump_estimate"], |
| visibility = ["//visibility:public"], |
| deps = [ |
| "@vello_deps//:bytemuck", |
| "@vello_deps//:peniko", |
| ], |
| ) |
| |
| # The following setting is used to enable the WGSL -> MSL translation feature. Pass |
| # `--define VELLO_MSL_SHADERS=true` to Bazel to bundle vello shaders in the Metal Shading Language. |
| config_setting( |
| name = "msl_shaders", |
| values = { |
| "define": "VELLO_MSL_SHADERS=true", |
| }, |
| ) |
| |
| # Pass `--define VELLO_WGSL_SHADERS=true` to Bazel to bundle the vello shaders in their native |
| # WebGPU Shading Language.. |
| config_setting( |
| name = "wgsl_shaders", |
| values = { |
| "define": "VELLO_WGSL_SHADERS=true", |
| }, |
| ) |
| |
| rust_library( |
| name = "vello_shaders", |
| srcs = glob( |
| include = ["crates/shaders/src/**/*.rs"], |
| allow_empty = False, |
| ), |
| crate_features = select({ |
| ":msl_shaders": ["msl"], |
| "//conditions:default": [], |
| }) + select({ |
| ":wgsl_shaders": ["wgsl"], |
| "//conditions:default": [], |
| }), |
| visibility = ["//visibility:public"], |
| deps = [":vello_shaders_build_script"], |
| ) |
| |
| cargo_build_script( |
| name = "vello_shaders_build_script", |
| srcs = [ |
| "crates/shaders/build.rs", |
| ], |
| build_script_env = { |
| "WORKSPACE_MANIFEST_FILE": "$(location Cargo.toml)", |
| }, |
| crate_features = select({ |
| ":msl_shaders": ["msl"], |
| "//conditions:default": [], |
| }) + select({ |
| ":wgsl_shaders": ["wgsl"], |
| "//conditions:default": [], |
| }), |
| data = glob( |
| include = [ |
| "Cargo.toml", # Used to obtain WORKSPACE_MANIFEST_FILE |
| "crates/shaders/src/compile/mod.rs", |
| "crates/shaders/src/compile/msl.rs", |
| "crates/shaders/src/compile/permutations.rs", |
| "crates/shaders/src/compile/preprocess.rs", |
| "crates/shaders/src/types.rs", |
| "shader/permutations", |
| "shader/**/*.wgsl", |
| ], |
| allow_empty = False, |
| ), |
| deps = [ |
| "@vello_deps//:naga", |
| "@vello_deps//:regex", |
| "@vello_deps//:thiserror", |
| ], |
| ) |