blob: ed6600ae149727191037c27187d2fa037a894e2e [file] [log] [blame]
# 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
),
deps = [
"@vello_deps//:bytemuck",
"@vello_deps//:peniko",
],
visibility = ["//visibility:public"],
)
# 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",
crate_features = select({
":msl_shaders": ["msl"],
"//conditions:default": [],
}) + select({
":wgsl_shaders": ["wgsl"],
"//conditions:default": [],
}),
srcs = glob(
include = ["crates/shaders/src/**/*.rs"],
allow_empty = False
),
deps = [":vello_shaders_build_script"],
visibility = ["//visibility:public"],
)
cargo_build_script(
name = "vello_shaders_build_script",
crate_features = select({
":msl_shaders": ["msl"],
"//conditions:default": [],
}) + select({
":wgsl_shaders": ["wgsl"],
"//conditions:default": [],
}),
build_script_env = {
"WORKSPACE_MANIFEST_FILE": "$(location Cargo.toml)"
},
srcs = [
"crates/shaders/build.rs",
],
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",
]
)