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 #[cxx::bridge(namespace = "vello_cpp")]
7*c8dee2aaSAndroid Build Coastguard Worker mod ffi {
8*c8dee2aaSAndroid Build Coastguard Worker // === vello_shaders FFI types ===
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker enum ShaderStage {
11*c8dee2aaSAndroid Build Coastguard Worker Backdrop,
12*c8dee2aaSAndroid Build Coastguard Worker BackdropDyn,
13*c8dee2aaSAndroid Build Coastguard Worker BboxClear,
14*c8dee2aaSAndroid Build Coastguard Worker Binning,
15*c8dee2aaSAndroid Build Coastguard Worker ClipLeaf,
16*c8dee2aaSAndroid Build Coastguard Worker ClipReduce,
17*c8dee2aaSAndroid Build Coastguard Worker Coarse,
18*c8dee2aaSAndroid Build Coastguard Worker DrawLeaf,
19*c8dee2aaSAndroid Build Coastguard Worker DrawReduce,
20*c8dee2aaSAndroid Build Coastguard Worker FineArea,
21*c8dee2aaSAndroid Build Coastguard Worker FineMsaa16,
22*c8dee2aaSAndroid Build Coastguard Worker FineMsaa8,
23*c8dee2aaSAndroid Build Coastguard Worker FineAreaR8,
24*c8dee2aaSAndroid Build Coastguard Worker FineMsaa16R8,
25*c8dee2aaSAndroid Build Coastguard Worker FineMsaa8R8,
26*c8dee2aaSAndroid Build Coastguard Worker Flatten,
27*c8dee2aaSAndroid Build Coastguard Worker PathCount,
28*c8dee2aaSAndroid Build Coastguard Worker PathCountSetup,
29*c8dee2aaSAndroid Build Coastguard Worker PathTiling,
30*c8dee2aaSAndroid Build Coastguard Worker PathTilingSetup,
31*c8dee2aaSAndroid Build Coastguard Worker Pathseg,
32*c8dee2aaSAndroid Build Coastguard Worker PathtagReduce,
33*c8dee2aaSAndroid Build Coastguard Worker PathtagReduce2,
34*c8dee2aaSAndroid Build Coastguard Worker PathtagScan1,
35*c8dee2aaSAndroid Build Coastguard Worker PathtagScanLarge,
36*c8dee2aaSAndroid Build Coastguard Worker PathtagScanSmall,
37*c8dee2aaSAndroid Build Coastguard Worker TileAlloc,
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker
40*c8dee2aaSAndroid Build Coastguard Worker enum BindType {
41*c8dee2aaSAndroid Build Coastguard Worker Buffer,
42*c8dee2aaSAndroid Build Coastguard Worker BufReadOnly,
43*c8dee2aaSAndroid Build Coastguard Worker Uniform,
44*c8dee2aaSAndroid Build Coastguard Worker Image,
45*c8dee2aaSAndroid Build Coastguard Worker ImageRead,
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker struct WorkgroupBufferInfo {
49*c8dee2aaSAndroid Build Coastguard Worker size_in_bytes: u32,
50*c8dee2aaSAndroid Build Coastguard Worker index: u32,
51*c8dee2aaSAndroid Build Coastguard Worker }
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Worker // === vello_encoding FFI types ===
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker /// Represents a 3x3 affine transformation matrix. The coordinates are laid out using the
56*c8dee2aaSAndroid Build Coastguard Worker /// following column-major construction, where the entries
57*c8dee2aaSAndroid Build Coastguard Worker ///
58*c8dee2aaSAndroid Build Coastguard Worker /// [a, b, c, d, e, f]
59*c8dee2aaSAndroid Build Coastguard Worker ///
60*c8dee2aaSAndroid Build Coastguard Worker /// correspond to the matrix
61*c8dee2aaSAndroid Build Coastguard Worker ///
62*c8dee2aaSAndroid Build Coastguard Worker /// | a c e |
63*c8dee2aaSAndroid Build Coastguard Worker /// | b d f |
64*c8dee2aaSAndroid Build Coastguard Worker /// | 0 0 1 |
65*c8dee2aaSAndroid Build Coastguard Worker ///
66*c8dee2aaSAndroid Build Coastguard Worker struct Affine {
67*c8dee2aaSAndroid Build Coastguard Worker matrix: [f32; 6],
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker struct Color {
71*c8dee2aaSAndroid Build Coastguard Worker r: u8,
72*c8dee2aaSAndroid Build Coastguard Worker g: u8,
73*c8dee2aaSAndroid Build Coastguard Worker b: u8,
74*c8dee2aaSAndroid Build Coastguard Worker a: u8,
75*c8dee2aaSAndroid Build Coastguard Worker }
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker enum BrushKind {
78*c8dee2aaSAndroid Build Coastguard Worker Solid,
79*c8dee2aaSAndroid Build Coastguard Worker }
80*c8dee2aaSAndroid Build Coastguard Worker
81*c8dee2aaSAndroid Build Coastguard Worker struct BrushData {
82*c8dee2aaSAndroid Build Coastguard Worker solid: Color,
83*c8dee2aaSAndroid Build Coastguard Worker }
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker struct Brush {
86*c8dee2aaSAndroid Build Coastguard Worker kind: BrushKind,
87*c8dee2aaSAndroid Build Coastguard Worker data: BrushData,
88*c8dee2aaSAndroid Build Coastguard Worker }
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker enum Fill {
91*c8dee2aaSAndroid Build Coastguard Worker NonZero,
92*c8dee2aaSAndroid Build Coastguard Worker EvenOdd,
93*c8dee2aaSAndroid Build Coastguard Worker }
94*c8dee2aaSAndroid Build Coastguard Worker
95*c8dee2aaSAndroid Build Coastguard Worker enum CapStyle {
96*c8dee2aaSAndroid Build Coastguard Worker Butt,
97*c8dee2aaSAndroid Build Coastguard Worker Square,
98*c8dee2aaSAndroid Build Coastguard Worker Round,
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker
101*c8dee2aaSAndroid Build Coastguard Worker enum JoinStyle {
102*c8dee2aaSAndroid Build Coastguard Worker Bevel,
103*c8dee2aaSAndroid Build Coastguard Worker Miter,
104*c8dee2aaSAndroid Build Coastguard Worker Round,
105*c8dee2aaSAndroid Build Coastguard Worker }
106*c8dee2aaSAndroid Build Coastguard Worker
107*c8dee2aaSAndroid Build Coastguard Worker struct Stroke {
108*c8dee2aaSAndroid Build Coastguard Worker width: f32,
109*c8dee2aaSAndroid Build Coastguard Worker miter_limit: f32,
110*c8dee2aaSAndroid Build Coastguard Worker cap: CapStyle,
111*c8dee2aaSAndroid Build Coastguard Worker join: JoinStyle,
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker
114*c8dee2aaSAndroid Build Coastguard Worker #[derive(Copy, Clone, Default, Debug)]
115*c8dee2aaSAndroid Build Coastguard Worker struct Point {
116*c8dee2aaSAndroid Build Coastguard Worker x: f32,
117*c8dee2aaSAndroid Build Coastguard Worker y: f32,
118*c8dee2aaSAndroid Build Coastguard Worker }
119*c8dee2aaSAndroid Build Coastguard Worker
120*c8dee2aaSAndroid Build Coastguard Worker #[derive(Debug)]
121*c8dee2aaSAndroid Build Coastguard Worker enum PathVerb {
122*c8dee2aaSAndroid Build Coastguard Worker MoveTo,
123*c8dee2aaSAndroid Build Coastguard Worker LineTo,
124*c8dee2aaSAndroid Build Coastguard Worker QuadTo,
125*c8dee2aaSAndroid Build Coastguard Worker CurveTo,
126*c8dee2aaSAndroid Build Coastguard Worker Close,
127*c8dee2aaSAndroid Build Coastguard Worker }
128*c8dee2aaSAndroid Build Coastguard Worker
129*c8dee2aaSAndroid Build Coastguard Worker #[derive(Default, Debug)]
130*c8dee2aaSAndroid Build Coastguard Worker struct PathElement {
131*c8dee2aaSAndroid Build Coastguard Worker verb: PathVerb,
132*c8dee2aaSAndroid Build Coastguard Worker points: [Point; 4],
133*c8dee2aaSAndroid Build Coastguard Worker }
134*c8dee2aaSAndroid Build Coastguard Worker
135*c8dee2aaSAndroid Build Coastguard Worker // Types that contain dispatch metadata
136*c8dee2aaSAndroid Build Coastguard Worker
137*c8dee2aaSAndroid Build Coastguard Worker struct WorkgroupSize {
138*c8dee2aaSAndroid Build Coastguard Worker x: u32,
139*c8dee2aaSAndroid Build Coastguard Worker y: u32,
140*c8dee2aaSAndroid Build Coastguard Worker z: u32,
141*c8dee2aaSAndroid Build Coastguard Worker }
142*c8dee2aaSAndroid Build Coastguard Worker
143*c8dee2aaSAndroid Build Coastguard Worker struct DispatchInfo {
144*c8dee2aaSAndroid Build Coastguard Worker use_large_path_scan: bool,
145*c8dee2aaSAndroid Build Coastguard Worker
146*c8dee2aaSAndroid Build Coastguard Worker // Dispatch workgroup counts for each pipeline
147*c8dee2aaSAndroid Build Coastguard Worker path_reduce: WorkgroupSize,
148*c8dee2aaSAndroid Build Coastguard Worker path_reduce2: WorkgroupSize,
149*c8dee2aaSAndroid Build Coastguard Worker path_scan1: WorkgroupSize,
150*c8dee2aaSAndroid Build Coastguard Worker path_scan: WorkgroupSize,
151*c8dee2aaSAndroid Build Coastguard Worker bbox_clear: WorkgroupSize,
152*c8dee2aaSAndroid Build Coastguard Worker flatten: WorkgroupSize,
153*c8dee2aaSAndroid Build Coastguard Worker draw_reduce: WorkgroupSize,
154*c8dee2aaSAndroid Build Coastguard Worker draw_leaf: WorkgroupSize,
155*c8dee2aaSAndroid Build Coastguard Worker clip_reduce: WorkgroupSize,
156*c8dee2aaSAndroid Build Coastguard Worker clip_leaf: WorkgroupSize,
157*c8dee2aaSAndroid Build Coastguard Worker binning: WorkgroupSize,
158*c8dee2aaSAndroid Build Coastguard Worker tile_alloc: WorkgroupSize,
159*c8dee2aaSAndroid Build Coastguard Worker path_count_setup: WorkgroupSize,
160*c8dee2aaSAndroid Build Coastguard Worker // Note: `path_count` must use an indirect dispatch
161*c8dee2aaSAndroid Build Coastguard Worker backdrop: WorkgroupSize,
162*c8dee2aaSAndroid Build Coastguard Worker coarse: WorkgroupSize,
163*c8dee2aaSAndroid Build Coastguard Worker path_tiling_setup: WorkgroupSize,
164*c8dee2aaSAndroid Build Coastguard Worker // Note: `path_tiling` must use an indirect dispatch
165*c8dee2aaSAndroid Build Coastguard Worker fine: WorkgroupSize,
166*c8dee2aaSAndroid Build Coastguard Worker }
167*c8dee2aaSAndroid Build Coastguard Worker
168*c8dee2aaSAndroid Build Coastguard Worker /// Computed sizes for all buffers.
169*c8dee2aaSAndroid Build Coastguard Worker struct BufferSizes {
170*c8dee2aaSAndroid Build Coastguard Worker // Known size buffers
171*c8dee2aaSAndroid Build Coastguard Worker path_reduced: u32,
172*c8dee2aaSAndroid Build Coastguard Worker path_reduced2: u32,
173*c8dee2aaSAndroid Build Coastguard Worker path_reduced_scan: u32,
174*c8dee2aaSAndroid Build Coastguard Worker path_monoids: u32,
175*c8dee2aaSAndroid Build Coastguard Worker path_bboxes: u32,
176*c8dee2aaSAndroid Build Coastguard Worker draw_reduced: u32,
177*c8dee2aaSAndroid Build Coastguard Worker draw_monoids: u32,
178*c8dee2aaSAndroid Build Coastguard Worker info: u32,
179*c8dee2aaSAndroid Build Coastguard Worker clip_inps: u32,
180*c8dee2aaSAndroid Build Coastguard Worker clip_els: u32,
181*c8dee2aaSAndroid Build Coastguard Worker clip_bics: u32,
182*c8dee2aaSAndroid Build Coastguard Worker clip_bboxes: u32,
183*c8dee2aaSAndroid Build Coastguard Worker draw_bboxes: u32,
184*c8dee2aaSAndroid Build Coastguard Worker bump_alloc: u32,
185*c8dee2aaSAndroid Build Coastguard Worker indirect_count: u32,
186*c8dee2aaSAndroid Build Coastguard Worker bin_headers: u32,
187*c8dee2aaSAndroid Build Coastguard Worker paths: u32,
188*c8dee2aaSAndroid Build Coastguard Worker // Bump allocated buffers
189*c8dee2aaSAndroid Build Coastguard Worker lines: u32,
190*c8dee2aaSAndroid Build Coastguard Worker bin_data: u32,
191*c8dee2aaSAndroid Build Coastguard Worker tiles: u32,
192*c8dee2aaSAndroid Build Coastguard Worker seg_counts: u32,
193*c8dee2aaSAndroid Build Coastguard Worker segments: u32,
194*c8dee2aaSAndroid Build Coastguard Worker ptcl: u32,
195*c8dee2aaSAndroid Build Coastguard Worker }
196*c8dee2aaSAndroid Build Coastguard Worker
197*c8dee2aaSAndroid Build Coastguard Worker extern "Rust" {
198*c8dee2aaSAndroid Build Coastguard Worker type Shader;
shader(stage: ShaderStage) -> &'static Shader199*c8dee2aaSAndroid Build Coastguard Worker fn shader(stage: ShaderStage) -> &'static Shader;
name(self: &Shader) -> &str200*c8dee2aaSAndroid Build Coastguard Worker fn name(self: &Shader) -> &str;
workgroup_size(self: &Shader) -> WorkgroupSize201*c8dee2aaSAndroid Build Coastguard Worker fn workgroup_size(self: &Shader) -> WorkgroupSize;
bindings(self: &Shader) -> Vec<BindType>202*c8dee2aaSAndroid Build Coastguard Worker fn bindings(self: &Shader) -> Vec<BindType>;
workgroup_buffers(self: &Shader) -> Vec<WorkgroupBufferInfo>203*c8dee2aaSAndroid Build Coastguard Worker fn workgroup_buffers(self: &Shader) -> Vec<WorkgroupBufferInfo>;
204*c8dee2aaSAndroid Build Coastguard Worker #[cfg(feature = "wgsl")]
wgsl(self: &Shader) -> &str205*c8dee2aaSAndroid Build Coastguard Worker fn wgsl(self: &Shader) -> &str;
206*c8dee2aaSAndroid Build Coastguard Worker #[cfg(feature = "msl")]
msl(self: &Shader) -> &str207*c8dee2aaSAndroid Build Coastguard Worker fn msl(self: &Shader) -> &str;
208*c8dee2aaSAndroid Build Coastguard Worker
209*c8dee2aaSAndroid Build Coastguard Worker type Encoding;
new_encoding() -> Box<Encoding>210*c8dee2aaSAndroid Build Coastguard Worker fn new_encoding() -> Box<Encoding>;
is_empty(self: &Encoding) -> bool211*c8dee2aaSAndroid Build Coastguard Worker fn is_empty(self: &Encoding) -> bool;
reset(self: &mut Encoding)212*c8dee2aaSAndroid Build Coastguard Worker fn reset(self: &mut Encoding);
fill( self: &mut Encoding, style: Fill, transform: Affine, brush: &Brush, path_iter: Pin<&mut PathIterator>, )213*c8dee2aaSAndroid Build Coastguard Worker fn fill(
214*c8dee2aaSAndroid Build Coastguard Worker self: &mut Encoding,
215*c8dee2aaSAndroid Build Coastguard Worker style: Fill,
216*c8dee2aaSAndroid Build Coastguard Worker transform: Affine,
217*c8dee2aaSAndroid Build Coastguard Worker brush: &Brush,
218*c8dee2aaSAndroid Build Coastguard Worker path_iter: Pin<&mut PathIterator>,
219*c8dee2aaSAndroid Build Coastguard Worker );
stroke( self: &mut Encoding, style: &Stroke, transform: Affine, brush: &Brush, path_iter: Pin<&mut PathIterator>, )220*c8dee2aaSAndroid Build Coastguard Worker fn stroke(
221*c8dee2aaSAndroid Build Coastguard Worker self: &mut Encoding,
222*c8dee2aaSAndroid Build Coastguard Worker style: &Stroke,
223*c8dee2aaSAndroid Build Coastguard Worker transform: Affine,
224*c8dee2aaSAndroid Build Coastguard Worker brush: &Brush,
225*c8dee2aaSAndroid Build Coastguard Worker path_iter: Pin<&mut PathIterator>,
226*c8dee2aaSAndroid Build Coastguard Worker );
begin_clip(self: &mut Encoding, transform: Affine, path_iter: Pin<&mut PathIterator>)227*c8dee2aaSAndroid Build Coastguard Worker fn begin_clip(self: &mut Encoding, transform: Affine, path_iter: Pin<&mut PathIterator>);
end_clip(self: &mut Encoding)228*c8dee2aaSAndroid Build Coastguard Worker fn end_clip(self: &mut Encoding);
append(self: &mut Encoding, other: &Encoding)229*c8dee2aaSAndroid Build Coastguard Worker fn append(self: &mut Encoding, other: &Encoding);
prepare_render( self: &Encoding, width: u32, height: u32, background: &Color, ) -> Box<RenderConfiguration>230*c8dee2aaSAndroid Build Coastguard Worker fn prepare_render(
231*c8dee2aaSAndroid Build Coastguard Worker self: &Encoding,
232*c8dee2aaSAndroid Build Coastguard Worker width: u32,
233*c8dee2aaSAndroid Build Coastguard Worker height: u32,
234*c8dee2aaSAndroid Build Coastguard Worker background: &Color,
235*c8dee2aaSAndroid Build Coastguard Worker ) -> Box<RenderConfiguration>;
236*c8dee2aaSAndroid Build Coastguard Worker
237*c8dee2aaSAndroid Build Coastguard Worker /// Resolved scene encoding metadata that can be used to initiate pipeline dispatches.
238*c8dee2aaSAndroid Build Coastguard Worker type RenderConfiguration;
config_uniform_buffer_size(self: &RenderConfiguration) -> usize239*c8dee2aaSAndroid Build Coastguard Worker fn config_uniform_buffer_size(self: &RenderConfiguration) -> usize;
scene_buffer_size(self: &RenderConfiguration) -> usize240*c8dee2aaSAndroid Build Coastguard Worker fn scene_buffer_size(self: &RenderConfiguration) -> usize;
write_config_uniform_buffer(self: &RenderConfiguration, out_buffer: &mut [u8]) -> bool241*c8dee2aaSAndroid Build Coastguard Worker fn write_config_uniform_buffer(self: &RenderConfiguration, out_buffer: &mut [u8]) -> bool;
write_scene_buffer(self: &RenderConfiguration, out_buffer: &mut [u8]) -> bool242*c8dee2aaSAndroid Build Coastguard Worker fn write_scene_buffer(self: &RenderConfiguration, out_buffer: &mut [u8]) -> bool;
workgroup_counts(self: &RenderConfiguration) -> DispatchInfo243*c8dee2aaSAndroid Build Coastguard Worker fn workgroup_counts(self: &RenderConfiguration) -> DispatchInfo;
buffer_sizes(self: &RenderConfiguration) -> BufferSizes244*c8dee2aaSAndroid Build Coastguard Worker fn buffer_sizes(self: &RenderConfiguration) -> BufferSizes;
245*c8dee2aaSAndroid Build Coastguard Worker
246*c8dee2aaSAndroid Build Coastguard Worker /// Sample mask lookup tables used in MSAA modes. This data can be computed once and reused
247*c8dee2aaSAndroid Build Coastguard Worker /// across all renders.
build_mask_lut_16() -> Vec<u8>248*c8dee2aaSAndroid Build Coastguard Worker fn build_mask_lut_16() -> Vec<u8>;
build_mask_lut_8() -> Vec<u8>249*c8dee2aaSAndroid Build Coastguard Worker fn build_mask_lut_8() -> Vec<u8>;
250*c8dee2aaSAndroid Build Coastguard Worker }
251*c8dee2aaSAndroid Build Coastguard Worker
252*c8dee2aaSAndroid Build Coastguard Worker unsafe extern "C++" {
253*c8dee2aaSAndroid Build Coastguard Worker include!("third_party/vello/cpp/path_iterator.h");
254*c8dee2aaSAndroid Build Coastguard Worker
255*c8dee2aaSAndroid Build Coastguard Worker type PathIterator;
next_element(self: Pin<&mut PathIterator>, out_elem: *mut PathElement) -> bool256*c8dee2aaSAndroid Build Coastguard Worker unsafe fn next_element(self: Pin<&mut PathIterator>, out_elem: *mut PathElement) -> bool;
257*c8dee2aaSAndroid Build Coastguard Worker }
258*c8dee2aaSAndroid Build Coastguard Worker }
259*c8dee2aaSAndroid Build Coastguard Worker
260*c8dee2aaSAndroid Build Coastguard Worker mod encoding;
261*c8dee2aaSAndroid Build Coastguard Worker mod shaders;
262*c8dee2aaSAndroid Build Coastguard Worker
263*c8dee2aaSAndroid Build Coastguard Worker use {
264*c8dee2aaSAndroid Build Coastguard Worker encoding::{new_encoding, Encoding, RenderConfiguration},
265*c8dee2aaSAndroid Build Coastguard Worker shaders::{shader, Shader},
266*c8dee2aaSAndroid Build Coastguard Worker };
267*c8dee2aaSAndroid Build Coastguard Worker
build_mask_lut_16() -> Vec<u8>268*c8dee2aaSAndroid Build Coastguard Worker fn build_mask_lut_16() -> Vec<u8> {
269*c8dee2aaSAndroid Build Coastguard Worker vello_encoding::make_mask_lut_16()
270*c8dee2aaSAndroid Build Coastguard Worker }
271*c8dee2aaSAndroid Build Coastguard Worker
build_mask_lut_8() -> Vec<u8>272*c8dee2aaSAndroid Build Coastguard Worker fn build_mask_lut_8() -> Vec<u8> {
273*c8dee2aaSAndroid Build Coastguard Worker vello_encoding::make_mask_lut()
274*c8dee2aaSAndroid Build Coastguard Worker }
275