xref: /aosp_15_r20/external/skia/third_party/vello/src/shaders.rs (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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