mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-10 20:51:29 +11:00
6a4e26ef2a
Defining MEM_DEBUG in mem.h will add a size field to Alloc and enable bounds and alignment checks for every memory read and write. Notes: - Deriving an Alloc from Path.tiles is unsound, but it's more trouble to convert Path.tiles from TileRef to a variable sized Alloc. - elements.comp note that "We should be able to use an array of structs but the NV shader compiler doesn't seem to like it". If that's still relevant, does the shared arrays of Allocs work? Signed-off-by: Elias Naur <mail@eliasnaur.com>
256 lines
7.8 KiB
C
256 lines
7.8 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
|
|
|
// Code auto-generated by piet-gpu-derive
|
|
|
|
struct PathFillLineRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct PathStrokeLineRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct PathFillCubicRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct PathStrokeCubicRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct PathSegRef {
|
|
uint offset;
|
|
};
|
|
|
|
struct PathFillLine {
|
|
vec2 p0;
|
|
vec2 p1;
|
|
uint path_ix;
|
|
};
|
|
|
|
#define PathFillLine_size 20
|
|
|
|
PathFillLineRef PathFillLine_index(PathFillLineRef ref, uint index) {
|
|
return PathFillLineRef(ref.offset + index * PathFillLine_size);
|
|
}
|
|
|
|
struct PathStrokeLine {
|
|
vec2 p0;
|
|
vec2 p1;
|
|
uint path_ix;
|
|
vec2 stroke;
|
|
};
|
|
|
|
#define PathStrokeLine_size 28
|
|
|
|
PathStrokeLineRef PathStrokeLine_index(PathStrokeLineRef ref, uint index) {
|
|
return PathStrokeLineRef(ref.offset + index * PathStrokeLine_size);
|
|
}
|
|
|
|
struct PathFillCubic {
|
|
vec2 p0;
|
|
vec2 p1;
|
|
vec2 p2;
|
|
vec2 p3;
|
|
uint path_ix;
|
|
};
|
|
|
|
#define PathFillCubic_size 36
|
|
|
|
PathFillCubicRef PathFillCubic_index(PathFillCubicRef ref, uint index) {
|
|
return PathFillCubicRef(ref.offset + index * PathFillCubic_size);
|
|
}
|
|
|
|
struct PathStrokeCubic {
|
|
vec2 p0;
|
|
vec2 p1;
|
|
vec2 p2;
|
|
vec2 p3;
|
|
uint path_ix;
|
|
vec2 stroke;
|
|
};
|
|
|
|
#define PathStrokeCubic_size 44
|
|
|
|
PathStrokeCubicRef PathStrokeCubic_index(PathStrokeCubicRef ref, uint index) {
|
|
return PathStrokeCubicRef(ref.offset + index * PathStrokeCubic_size);
|
|
}
|
|
|
|
#define PathSeg_Nop 0
|
|
#define PathSeg_FillLine 1
|
|
#define PathSeg_StrokeLine 2
|
|
#define PathSeg_FillCubic 3
|
|
#define PathSeg_StrokeCubic 4
|
|
#define PathSeg_size 48
|
|
|
|
PathSegRef PathSeg_index(PathSegRef ref, uint index) {
|
|
return PathSegRef(ref.offset + index * PathSeg_size);
|
|
}
|
|
|
|
PathFillLine PathFillLine_read(Alloc a, PathFillLineRef ref) {
|
|
uint ix = ref.offset >> 2;
|
|
uint raw0 = read_mem(a, ix + 0);
|
|
uint raw1 = read_mem(a, ix + 1);
|
|
uint raw2 = read_mem(a, ix + 2);
|
|
uint raw3 = read_mem(a, ix + 3);
|
|
uint raw4 = read_mem(a, ix + 4);
|
|
PathFillLine s;
|
|
s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
|
|
s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
|
|
s.path_ix = raw4;
|
|
return s;
|
|
}
|
|
|
|
void PathFillLine_write(Alloc a, PathFillLineRef ref, PathFillLine s) {
|
|
uint ix = ref.offset >> 2;
|
|
write_mem(a, ix + 0, floatBitsToUint(s.p0.x));
|
|
write_mem(a, ix + 1, floatBitsToUint(s.p0.y));
|
|
write_mem(a, ix + 2, floatBitsToUint(s.p1.x));
|
|
write_mem(a, ix + 3, floatBitsToUint(s.p1.y));
|
|
write_mem(a, ix + 4, s.path_ix);
|
|
}
|
|
|
|
PathStrokeLine PathStrokeLine_read(Alloc a, PathStrokeLineRef ref) {
|
|
uint ix = ref.offset >> 2;
|
|
uint raw0 = read_mem(a, ix + 0);
|
|
uint raw1 = read_mem(a, ix + 1);
|
|
uint raw2 = read_mem(a, ix + 2);
|
|
uint raw3 = read_mem(a, ix + 3);
|
|
uint raw4 = read_mem(a, ix + 4);
|
|
uint raw5 = read_mem(a, ix + 5);
|
|
uint raw6 = read_mem(a, ix + 6);
|
|
PathStrokeLine s;
|
|
s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
|
|
s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
|
|
s.path_ix = raw4;
|
|
s.stroke = vec2(uintBitsToFloat(raw5), uintBitsToFloat(raw6));
|
|
return s;
|
|
}
|
|
|
|
void PathStrokeLine_write(Alloc a, PathStrokeLineRef ref, PathStrokeLine s) {
|
|
uint ix = ref.offset >> 2;
|
|
write_mem(a, ix + 0, floatBitsToUint(s.p0.x));
|
|
write_mem(a, ix + 1, floatBitsToUint(s.p0.y));
|
|
write_mem(a, ix + 2, floatBitsToUint(s.p1.x));
|
|
write_mem(a, ix + 3, floatBitsToUint(s.p1.y));
|
|
write_mem(a, ix + 4, s.path_ix);
|
|
write_mem(a, ix + 5, floatBitsToUint(s.stroke.x));
|
|
write_mem(a, ix + 6, floatBitsToUint(s.stroke.y));
|
|
}
|
|
|
|
PathFillCubic PathFillCubic_read(Alloc a, PathFillCubicRef ref) {
|
|
uint ix = ref.offset >> 2;
|
|
uint raw0 = read_mem(a, ix + 0);
|
|
uint raw1 = read_mem(a, ix + 1);
|
|
uint raw2 = read_mem(a, ix + 2);
|
|
uint raw3 = read_mem(a, ix + 3);
|
|
uint raw4 = read_mem(a, ix + 4);
|
|
uint raw5 = read_mem(a, ix + 5);
|
|
uint raw6 = read_mem(a, ix + 6);
|
|
uint raw7 = read_mem(a, ix + 7);
|
|
uint raw8 = read_mem(a, ix + 8);
|
|
PathFillCubic s;
|
|
s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
|
|
s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
|
|
s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
|
|
s.p3 = vec2(uintBitsToFloat(raw6), uintBitsToFloat(raw7));
|
|
s.path_ix = raw8;
|
|
return s;
|
|
}
|
|
|
|
void PathFillCubic_write(Alloc a, PathFillCubicRef ref, PathFillCubic s) {
|
|
uint ix = ref.offset >> 2;
|
|
write_mem(a, ix + 0, floatBitsToUint(s.p0.x));
|
|
write_mem(a, ix + 1, floatBitsToUint(s.p0.y));
|
|
write_mem(a, ix + 2, floatBitsToUint(s.p1.x));
|
|
write_mem(a, ix + 3, floatBitsToUint(s.p1.y));
|
|
write_mem(a, ix + 4, floatBitsToUint(s.p2.x));
|
|
write_mem(a, ix + 5, floatBitsToUint(s.p2.y));
|
|
write_mem(a, ix + 6, floatBitsToUint(s.p3.x));
|
|
write_mem(a, ix + 7, floatBitsToUint(s.p3.y));
|
|
write_mem(a, ix + 8, s.path_ix);
|
|
}
|
|
|
|
PathStrokeCubic PathStrokeCubic_read(Alloc a, PathStrokeCubicRef ref) {
|
|
uint ix = ref.offset >> 2;
|
|
uint raw0 = read_mem(a, ix + 0);
|
|
uint raw1 = read_mem(a, ix + 1);
|
|
uint raw2 = read_mem(a, ix + 2);
|
|
uint raw3 = read_mem(a, ix + 3);
|
|
uint raw4 = read_mem(a, ix + 4);
|
|
uint raw5 = read_mem(a, ix + 5);
|
|
uint raw6 = read_mem(a, ix + 6);
|
|
uint raw7 = read_mem(a, ix + 7);
|
|
uint raw8 = read_mem(a, ix + 8);
|
|
uint raw9 = read_mem(a, ix + 9);
|
|
uint raw10 = read_mem(a, ix + 10);
|
|
PathStrokeCubic s;
|
|
s.p0 = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1));
|
|
s.p1 = vec2(uintBitsToFloat(raw2), uintBitsToFloat(raw3));
|
|
s.p2 = vec2(uintBitsToFloat(raw4), uintBitsToFloat(raw5));
|
|
s.p3 = vec2(uintBitsToFloat(raw6), uintBitsToFloat(raw7));
|
|
s.path_ix = raw8;
|
|
s.stroke = vec2(uintBitsToFloat(raw9), uintBitsToFloat(raw10));
|
|
return s;
|
|
}
|
|
|
|
void PathStrokeCubic_write(Alloc a, PathStrokeCubicRef ref, PathStrokeCubic s) {
|
|
uint ix = ref.offset >> 2;
|
|
write_mem(a, ix + 0, floatBitsToUint(s.p0.x));
|
|
write_mem(a, ix + 1, floatBitsToUint(s.p0.y));
|
|
write_mem(a, ix + 2, floatBitsToUint(s.p1.x));
|
|
write_mem(a, ix + 3, floatBitsToUint(s.p1.y));
|
|
write_mem(a, ix + 4, floatBitsToUint(s.p2.x));
|
|
write_mem(a, ix + 5, floatBitsToUint(s.p2.y));
|
|
write_mem(a, ix + 6, floatBitsToUint(s.p3.x));
|
|
write_mem(a, ix + 7, floatBitsToUint(s.p3.y));
|
|
write_mem(a, ix + 8, s.path_ix);
|
|
write_mem(a, ix + 9, floatBitsToUint(s.stroke.x));
|
|
write_mem(a, ix + 10, floatBitsToUint(s.stroke.y));
|
|
}
|
|
|
|
uint PathSeg_tag(Alloc a, PathSegRef ref) {
|
|
return read_mem(a, ref.offset >> 2);
|
|
}
|
|
|
|
PathFillLine PathSeg_FillLine_read(Alloc a, PathSegRef ref) {
|
|
return PathFillLine_read(a, PathFillLineRef(ref.offset + 4));
|
|
}
|
|
|
|
PathStrokeLine PathSeg_StrokeLine_read(Alloc a, PathSegRef ref) {
|
|
return PathStrokeLine_read(a, PathStrokeLineRef(ref.offset + 4));
|
|
}
|
|
|
|
PathFillCubic PathSeg_FillCubic_read(Alloc a, PathSegRef ref) {
|
|
return PathFillCubic_read(a, PathFillCubicRef(ref.offset + 4));
|
|
}
|
|
|
|
PathStrokeCubic PathSeg_StrokeCubic_read(Alloc a, PathSegRef ref) {
|
|
return PathStrokeCubic_read(a, PathStrokeCubicRef(ref.offset + 4));
|
|
}
|
|
|
|
void PathSeg_Nop_write(Alloc a, PathSegRef ref) {
|
|
write_mem(a, ref.offset >> 2, PathSeg_Nop);
|
|
}
|
|
|
|
void PathSeg_FillLine_write(Alloc a, PathSegRef ref, PathFillLine s) {
|
|
write_mem(a, ref.offset >> 2, PathSeg_FillLine);
|
|
PathFillLine_write(a, PathFillLineRef(ref.offset + 4), s);
|
|
}
|
|
|
|
void PathSeg_StrokeLine_write(Alloc a, PathSegRef ref, PathStrokeLine s) {
|
|
write_mem(a, ref.offset >> 2, PathSeg_StrokeLine);
|
|
PathStrokeLine_write(a, PathStrokeLineRef(ref.offset + 4), s);
|
|
}
|
|
|
|
void PathSeg_FillCubic_write(Alloc a, PathSegRef ref, PathFillCubic s) {
|
|
write_mem(a, ref.offset >> 2, PathSeg_FillCubic);
|
|
PathFillCubic_write(a, PathFillCubicRef(ref.offset + 4), s);
|
|
}
|
|
|
|
void PathSeg_StrokeCubic_write(Alloc a, PathSegRef ref, PathStrokeCubic s) {
|
|
write_mem(a, ref.offset >> 2, PathSeg_StrokeCubic);
|
|
PathStrokeCubic_write(a, PathStrokeCubicRef(ref.offset + 4), s);
|
|
}
|
|
|