mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-10 12:41:30 +11:00
commit
14e922e17e
|
@ -8,6 +8,7 @@ use crate::parse::{GpuScalar, GpuType};
|
|||
|
||||
pub fn gen_glsl(module: &LayoutModule) -> String {
|
||||
let mut r = String::new();
|
||||
writeln!(&mut r, "// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense\n").unwrap();
|
||||
writeln!(&mut r, "// Code auto-generated by piet-gpu-derive\n").unwrap();
|
||||
// Note: GLSL needs definitions before uses. We could do a topological sort here,
|
||||
// but easiest for now to just require that in spec.
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct AnnoFillRef {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Propagation of tile backdrop for filling.
|
||||
//
|
||||
// Each thread reads one path element and calculates the number of spanned tiles
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// The binning stage of the pipeline.
|
||||
//
|
||||
// Each workgroup processes N_TILE paths.
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct BinInstanceRef {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// The coarse rasterizer stage of the pipeline.
|
||||
//
|
||||
// As input we have the ordered partitions of paths from the binning phase and
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// The element processing stage, first in the pipeline.
|
||||
//
|
||||
// This stage is primarily about applying transforms and computing bounding
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// This is "kernel 4" in a 4-kernel pipeline. It renders the commands
|
||||
// in the per-tile command list to an image.
|
||||
|
||||
|
@ -184,7 +186,7 @@ void main() {
|
|||
float solid_alpha = begin_solid_clip.alpha;
|
||||
for (uint k = 0; k < CHUNK; k++) {
|
||||
blend_stack[blend_slot][k] = packUnorm4x8(vec4(rgb[k], solid_alpha));
|
||||
}
|
||||
}
|
||||
}
|
||||
blend_sp++;
|
||||
break;
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Coarse rasterization of path segments.
|
||||
|
||||
// Allocation and initialization of tiles for paths.
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct PathFillLineRef {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct CmdCircleRef {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct LineSegRef {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Various constants for the sizes of groups and tiles.
|
||||
|
||||
// Much of this will be made dynamic in various ways, but for now it's easiest
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct StateRef {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct PathRef {
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||||
|
||||
// Allocation and initialization of tiles for paths.
|
||||
|
||||
#version 450
|
||||
|
|
|
@ -1,132 +0,0 @@
|
|||
// Code auto-generated by piet-gpu-derive
|
||||
|
||||
struct InstanceRef {
|
||||
uint offset;
|
||||
};
|
||||
|
||||
struct JumpRef {
|
||||
uint offset;
|
||||
};
|
||||
|
||||
struct ChunkRef {
|
||||
uint offset;
|
||||
};
|
||||
|
||||
struct TileGroupRef {
|
||||
uint offset;
|
||||
};
|
||||
|
||||
struct Instance {
|
||||
uint item_ref;
|
||||
vec2 offset;
|
||||
};
|
||||
|
||||
#define Instance_size 12
|
||||
|
||||
InstanceRef Instance_index(InstanceRef ref, uint index) {
|
||||
return InstanceRef(ref.offset + index * Instance_size);
|
||||
}
|
||||
|
||||
struct Jump {
|
||||
TileGroupRef new_ref;
|
||||
};
|
||||
|
||||
#define Jump_size 4
|
||||
|
||||
JumpRef Jump_index(JumpRef ref, uint index) {
|
||||
return JumpRef(ref.offset + index * Jump_size);
|
||||
}
|
||||
|
||||
struct Chunk {
|
||||
uint chunk_n;
|
||||
ChunkRef next;
|
||||
};
|
||||
|
||||
#define Chunk_size 8
|
||||
|
||||
ChunkRef Chunk_index(ChunkRef ref, uint index) {
|
||||
return ChunkRef(ref.offset + index * Chunk_size);
|
||||
}
|
||||
|
||||
#define TileGroup_Instance 0
|
||||
#define TileGroup_Jump 1
|
||||
#define TileGroup_End 2
|
||||
#define TileGroup_size 16
|
||||
|
||||
TileGroupRef TileGroup_index(TileGroupRef ref, uint index) {
|
||||
return TileGroupRef(ref.offset + index * TileGroup_size);
|
||||
}
|
||||
|
||||
Instance Instance_read(InstanceRef ref) {
|
||||
uint ix = ref.offset >> 2;
|
||||
uint raw0 = tilegroup[ix + 0];
|
||||
uint raw1 = tilegroup[ix + 1];
|
||||
uint raw2 = tilegroup[ix + 2];
|
||||
Instance s;
|
||||
s.item_ref = raw0;
|
||||
s.offset = vec2(uintBitsToFloat(raw1), uintBitsToFloat(raw2));
|
||||
return s;
|
||||
}
|
||||
|
||||
void Instance_write(InstanceRef ref, Instance s) {
|
||||
uint ix = ref.offset >> 2;
|
||||
tilegroup[ix + 0] = s.item_ref;
|
||||
tilegroup[ix + 1] = floatBitsToUint(s.offset.x);
|
||||
tilegroup[ix + 2] = floatBitsToUint(s.offset.y);
|
||||
}
|
||||
|
||||
Jump Jump_read(JumpRef ref) {
|
||||
uint ix = ref.offset >> 2;
|
||||
uint raw0 = tilegroup[ix + 0];
|
||||
Jump s;
|
||||
s.new_ref = TileGroupRef(raw0);
|
||||
return s;
|
||||
}
|
||||
|
||||
void Jump_write(JumpRef ref, Jump s) {
|
||||
uint ix = ref.offset >> 2;
|
||||
tilegroup[ix + 0] = s.new_ref.offset;
|
||||
}
|
||||
|
||||
Chunk Chunk_read(ChunkRef ref) {
|
||||
uint ix = ref.offset >> 2;
|
||||
uint raw0 = tilegroup[ix + 0];
|
||||
uint raw1 = tilegroup[ix + 1];
|
||||
Chunk s;
|
||||
s.chunk_n = raw0;
|
||||
s.next = ChunkRef(raw1);
|
||||
return s;
|
||||
}
|
||||
|
||||
void Chunk_write(ChunkRef ref, Chunk s) {
|
||||
uint ix = ref.offset >> 2;
|
||||
tilegroup[ix + 0] = s.chunk_n;
|
||||
tilegroup[ix + 1] = s.next.offset;
|
||||
}
|
||||
|
||||
uint TileGroup_tag(TileGroupRef ref) {
|
||||
return tilegroup[ref.offset >> 2];
|
||||
}
|
||||
|
||||
Instance TileGroup_Instance_read(TileGroupRef ref) {
|
||||
return Instance_read(InstanceRef(ref.offset + 4));
|
||||
}
|
||||
|
||||
Jump TileGroup_Jump_read(TileGroupRef ref) {
|
||||
return Jump_read(JumpRef(ref.offset + 4));
|
||||
}
|
||||
|
||||
void TileGroup_Instance_write(TileGroupRef ref, Instance s) {
|
||||
tilegroup[ref.offset >> 2] = TileGroup_Instance;
|
||||
Instance_write(InstanceRef(ref.offset + 4), s);
|
||||
}
|
||||
|
||||
void TileGroup_Jump_write(TileGroupRef ref, Jump s) {
|
||||
tilegroup[ref.offset >> 2] = TileGroup_Jump;
|
||||
Jump_write(JumpRef(ref.offset + 4), s);
|
||||
}
|
||||
|
||||
void TileGroup_End_write(TileGroupRef ref) {
|
||||
tilegroup[ref.offset >> 2] = TileGroup_End;
|
||||
}
|
||||
|
Loading…
Reference in a new issue