1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*c8dee2aaSAndroid Build Coastguard Worker //
3*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*c8dee2aaSAndroid Build Coastguard Worker // found in the LICENSE file.
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard Worker use crate::ffi;
7*c8dee2aaSAndroid Build Coastguard Worker use vello_shaders::{BindType, WorkgroupBufferInfo};
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker pub(crate) struct Shader(&'static vello_shaders::ComputeShader<'static>);
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker impl Shader {
name(&self) -> &str12*c8dee2aaSAndroid Build Coastguard Worker pub fn name(&self) -> &str {
13*c8dee2aaSAndroid Build Coastguard Worker &self.0.name
14*c8dee2aaSAndroid Build Coastguard Worker }
15*c8dee2aaSAndroid Build Coastguard Worker
workgroup_size(&self) -> ffi::WorkgroupSize16*c8dee2aaSAndroid Build Coastguard Worker pub fn workgroup_size(&self) -> ffi::WorkgroupSize {
17*c8dee2aaSAndroid Build Coastguard Worker self.0.workgroup_size.into()
18*c8dee2aaSAndroid Build Coastguard Worker }
19*c8dee2aaSAndroid Build Coastguard Worker
bindings(&self) -> Vec<ffi::BindType>20*c8dee2aaSAndroid Build Coastguard Worker pub fn bindings(&self) -> Vec<ffi::BindType> {
21*c8dee2aaSAndroid Build Coastguard Worker self.0.bindings.iter().map(|t| t.into()).collect()
22*c8dee2aaSAndroid Build Coastguard Worker }
23*c8dee2aaSAndroid Build Coastguard Worker
workgroup_buffers(&self) -> Vec<ffi::WorkgroupBufferInfo>24*c8dee2aaSAndroid Build Coastguard Worker pub fn workgroup_buffers(&self) -> Vec<ffi::WorkgroupBufferInfo> {
25*c8dee2aaSAndroid Build Coastguard Worker self.0.workgroup_buffers.iter().map(|t| t.into()).collect()
26*c8dee2aaSAndroid Build Coastguard Worker }
27*c8dee2aaSAndroid Build Coastguard Worker
28*c8dee2aaSAndroid Build Coastguard Worker #[cfg(feature = "wgsl")]
wgsl(&self) -> &str29*c8dee2aaSAndroid Build Coastguard Worker pub fn wgsl(&self) -> &str {
30*c8dee2aaSAndroid Build Coastguard Worker &self.0.wgsl.code
31*c8dee2aaSAndroid Build Coastguard Worker }
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker #[cfg(feature = "msl")]
msl(&self) -> &str34*c8dee2aaSAndroid Build Coastguard Worker pub fn msl(&self) -> &str {
35*c8dee2aaSAndroid Build Coastguard Worker &self.0.msl.code
36*c8dee2aaSAndroid Build Coastguard Worker }
37*c8dee2aaSAndroid Build Coastguard Worker }
38*c8dee2aaSAndroid Build Coastguard Worker
39*c8dee2aaSAndroid Build Coastguard Worker macro_rules! decl_shader {
40*c8dee2aaSAndroid Build Coastguard Worker ($name:ident, $field:tt) => {
41*c8dee2aaSAndroid Build Coastguard Worker const $name: Shader = Shader(&vello_shaders::SHADERS.$field);
42*c8dee2aaSAndroid Build Coastguard Worker };
43*c8dee2aaSAndroid Build Coastguard Worker }
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(BACKDROP, backdrop);
46*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(BACKDROP_DYN, backdrop_dyn);
47*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(BBOX_CLEAR, bbox_clear);
48*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(BINNING, binning);
49*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(CLIP_LEAF, clip_leaf);
50*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(CLIP_REDUCE, clip_reduce);
51*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(COARSE, coarse);
52*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(DRAW_LEAF, draw_leaf);
53*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(DRAW_REDUCE, draw_reduce);
54*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(FINE_AREA, fine_area);
55*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(FINE_MSAA16, fine_msaa16);
56*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(FINE_MSAA8, fine_msaa8);
57*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(FINE_AREA_R8, fine_area_r8);
58*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(FINE_MSAA16_R8, fine_msaa16_r8);
59*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(FINE_MSAA8_R8, fine_msaa8_r8);
60*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(FLATTEN, flatten);
61*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATH_COUNT, path_count);
62*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATH_COUNT_SETUP, path_count_setup);
63*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATH_TILING, path_tiling);
64*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATH_TILING_SETUP, path_tiling_setup);
65*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATHTAG_REDUCE, pathtag_reduce);
66*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATHTAG_REDUCE2, pathtag_reduce2);
67*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATHTAG_SCAN1, pathtag_scan1);
68*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATHTAG_SCAN_LARGE, pathtag_scan_large);
69*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(PATHTAG_SCAN_SMALL, pathtag_scan_small);
70*c8dee2aaSAndroid Build Coastguard Worker decl_shader!(TILE_ALLOC, tile_alloc);
71*c8dee2aaSAndroid Build Coastguard Worker
shader(stage: ffi::ShaderStage) -> &'static Shader72*c8dee2aaSAndroid Build Coastguard Worker pub(crate) fn shader(stage: ffi::ShaderStage) -> &'static Shader {
73*c8dee2aaSAndroid Build Coastguard Worker match stage {
74*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::Backdrop => &BACKDROP,
75*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::BackdropDyn => &BACKDROP_DYN,
76*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::BboxClear => &BBOX_CLEAR,
77*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::Binning => &BINNING,
78*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::ClipLeaf => &CLIP_LEAF,
79*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::ClipReduce => &CLIP_REDUCE,
80*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::Coarse => &COARSE,
81*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::DrawLeaf => &DRAW_LEAF,
82*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::DrawReduce => &DRAW_REDUCE,
83*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::FineArea => &FINE_AREA,
84*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::FineMsaa16 => &FINE_MSAA16,
85*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::FineMsaa8 => &FINE_MSAA8,
86*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::FineAreaR8 => &FINE_AREA_R8,
87*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::FineMsaa16R8 => &FINE_MSAA16_R8,
88*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::FineMsaa8R8 => &FINE_MSAA8_R8,
89*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::Flatten => &FLATTEN,
90*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathCount => &PATH_COUNT,
91*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathCountSetup => &PATH_COUNT_SETUP,
92*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathTiling => &PATH_TILING,
93*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathTilingSetup => &PATH_TILING_SETUP,
94*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathtagReduce => &PATHTAG_REDUCE,
95*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathtagReduce2 => &PATHTAG_REDUCE2,
96*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathtagScan1 => &PATHTAG_SCAN1,
97*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathtagScanLarge => &PATHTAG_SCAN_LARGE,
98*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::PathtagScanSmall => &PATHTAG_SCAN_SMALL,
99*c8dee2aaSAndroid Build Coastguard Worker ffi::ShaderStage::TileAlloc => &TILE_ALLOC,
100*c8dee2aaSAndroid Build Coastguard Worker _ => unreachable!(),
101*c8dee2aaSAndroid Build Coastguard Worker }
102*c8dee2aaSAndroid Build Coastguard Worker }
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Worker impl From<&BindType> for ffi::BindType {
from(src: &BindType) -> Self105*c8dee2aaSAndroid Build Coastguard Worker fn from(src: &BindType) -> Self {
106*c8dee2aaSAndroid Build Coastguard Worker match src {
107*c8dee2aaSAndroid Build Coastguard Worker BindType::Buffer => Self::Buffer,
108*c8dee2aaSAndroid Build Coastguard Worker BindType::BufReadOnly => Self::BufReadOnly,
109*c8dee2aaSAndroid Build Coastguard Worker BindType::Uniform => Self::Uniform,
110*c8dee2aaSAndroid Build Coastguard Worker BindType::Image => Self::Image,
111*c8dee2aaSAndroid Build Coastguard Worker BindType::ImageRead => Self::ImageRead,
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker }
114*c8dee2aaSAndroid Build Coastguard Worker }
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard Worker impl From<&WorkgroupBufferInfo> for ffi::WorkgroupBufferInfo {
from(src: &WorkgroupBufferInfo) -> Self117*c8dee2aaSAndroid Build Coastguard Worker fn from(src: &WorkgroupBufferInfo) -> Self {
118*c8dee2aaSAndroid Build Coastguard Worker Self {
119*c8dee2aaSAndroid Build Coastguard Worker size_in_bytes: src.size_in_bytes,
120*c8dee2aaSAndroid Build Coastguard Worker index: src.index,
121*c8dee2aaSAndroid Build Coastguard Worker }
122*c8dee2aaSAndroid Build Coastguard Worker }
123*c8dee2aaSAndroid Build Coastguard Worker }
124*c8dee2aaSAndroid Build Coastguard Worker
125*c8dee2aaSAndroid Build Coastguard Worker impl From<[u32; 3]> for ffi::WorkgroupSize {
from(src: [u32; 3]) -> Self126*c8dee2aaSAndroid Build Coastguard Worker fn from(src: [u32; 3]) -> Self {
127*c8dee2aaSAndroid Build Coastguard Worker Self {
128*c8dee2aaSAndroid Build Coastguard Worker x: src[0],
129*c8dee2aaSAndroid Build Coastguard Worker y: src[1],
130*c8dee2aaSAndroid Build Coastguard Worker z: src[2],
131*c8dee2aaSAndroid Build Coastguard Worker }
132*c8dee2aaSAndroid Build Coastguard Worker }
133*c8dee2aaSAndroid Build Coastguard Worker }
134