# 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/vello_shaders and //vello/vello_encoding, respectively. The WGSL shader source # files live under //vello/vello_shaders/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, using that setup I (armansito@) haven't found a good way to both: # # (a) Conditionally toggle the "wgsl" and "msl" cargo features for these libraries. Bazel wants # config settings and cargo features to be declared by the relevant library rules and not # consumers of that library; # (b) Support local iteration using a cargo "path" dependency. # # Until we find a way around these limitations, we maintain our own build rules for the vello crates # here. rust_library( name = "vello_encoding", srcs = glob( include = ["vello_encoding/src/**/*.rs"], allow_empty = False, ), crate_features = ["bump_estimate"], visibility = ["//visibility:public"], deps = [ "@crates//:bytemuck", "@crates//: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 = ["vello_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 = [ "vello_shaders/build.rs", "vello_shaders/src/compile/mod.rs", "vello_shaders/src/compile/msl.rs", "vello_shaders/src/compile/permutations.rs", "vello_shaders/src/compile/preprocess.rs", "vello_shaders/src/types.rs", ], build_script_env = { "UNSTABLE_BAZEL_VELLO_SHADERS_CRATE_MANIFEST_PATH": "$(execpath vello_shaders/Cargo.toml)", }, crate_features = select({ ":msl_shaders": ["msl"], "//conditions:default": [], }) + select({ ":wgsl_shaders": ["wgsl"], "//conditions:default": [], }), crate_root = "vello_shaders/build.rs", data = [ # This is needed to define BAZEL_CRATE_MANIFEST_PATH above. "vello_shaders/Cargo.toml", "vello_shaders/shader/permutations", ] + glob( include = [ "vello_shaders/shader/**/*.wgsl", ], allow_empty = False, ), deps = [ "@crates//:naga", "@crates//:regex", "@crates//:thiserror", ], )