diff --git a/piet-gpu-types/src/scene.rs b/piet-gpu-types/src/scene.rs index 5e4899f..0d72650 100644 --- a/piet-gpu-types/src/scene.rs +++ b/piet-gpu-types/src/scene.rs @@ -1,60 +1,10 @@ use piet_gpu_derive::piet_gpu; -pub use self::scene::{ - Bbox, PietCircle, PietFill, PietItem, PietStrokeLine, PietStrokePolyLine, Point, SimpleGroup, -}; - pub use self::scene::{CubicSeg, Element, Fill, LineSeg, QuadSeg, SetLineWidth, Stroke, Transform}; piet_gpu! { #[rust_encode] mod scene { - struct Bbox { - bbox: [i16; 4], - } - struct Point { - xy: [f32; 2], - } - struct SimpleGroup { - n_items: u32, - // Note: both of the following items are actually arrays - items: Ref, - bboxes: Ref, - offset: Point, - } - struct PietCircle { - rgba_color: u32, - center: Point, - radius: f32, - } - struct PietStrokeLine { - flags: u32, - rgba_color: u32, - width: f32, - start: Point, - end: Point, - } - struct PietFill { - flags: u32, - rgba_color: u32, - n_points: u32, - points: Ref, - } - struct PietStrokePolyLine { - rgba_color: u32, - width: f32, - n_points: u32, - points: Ref, - } - enum PietItem { - Group(SimpleGroup), - Circle(PietCircle), - Line(PietStrokeLine), - Fill(PietFill), - Poly(PietStrokePolyLine), - } - - // New approach follows (above to be deleted) struct LineSeg { p0: [f32; 2], p1: [f32; 2], diff --git a/piet-gpu/shader/build.ninja b/piet-gpu/shader/build.ninja index 13fb1b2..cce8615 100644 --- a/piet-gpu/shader/build.ninja +++ b/piet-gpu/shader/build.ninja @@ -7,8 +7,6 @@ glslang_validator = glslangValidator rule glsl command = $glslang_validator -V -o $out $in -build image.spv: glsl image.comp | scene.h - build elements.spv: glsl elements.comp | scene.h state.h annotated.h diff --git a/piet-gpu/shader/image.comp b/piet-gpu/shader/image.comp deleted file mode 100644 index 6d84eb5..0000000 --- a/piet-gpu/shader/image.comp +++ /dev/null @@ -1,54 +0,0 @@ -// A simple kernel to create an image. - -// Right now, this kernel stores the image in a buffer, but a better -// plan is to use a texture. This is because of limited support. - -#version 450 -#extension GL_GOOGLE_include_directive : enable - -layout(local_size_x = 16, local_size_y = 16) in; - -layout(set = 0, binding = 0) readonly buffer SceneBuf { - uint[] scene; -}; - -layout(set = 0, binding = 1) buffer ImageBuf { - uint[] image; -}; - -#include "scene.h" - -// TODO: make the image size dynamic. -#define IMAGE_WIDTH 2048 -#define IMAGE_HEIGHT 1535 - -void main() { - uvec2 xy_uint = gl_GlobalInvocationID.xy; - vec2 xy = vec2(xy_uint); - vec2 uv = xy * vec2(1.0 / IMAGE_WIDTH, 1.0 / IMAGE_HEIGHT); - vec3 rgb = uv.xyy; - - // Render the scene. Right now, every pixel traverses the scene graph, - // which is horribly wasteful, but the goal is to get *some* output and - // then optimize. - - SimpleGroup group = PietItem_Group_read(PietItemRef(0)); - for (uint i = 0; i < group.n_items; i++) { - PietItemRef item_ref = PietItem_index(group.items, i); - uint tag = PietItem_tag(item_ref); - tag = PietItem_Circle; - if (tag == PietItem_Circle) { - PietCircle circle = PietItem_Circle_read(item_ref); - float r = length(xy + vec2(0.5, 0.5) - circle.center.xy); - float alpha = clamp(0.5 + circle.radius - r, 0.0, 1.0); - vec4 fg_rgba = unpackUnorm4x8(circle.rgba_color); - // TODO: sRGB - rgb = mix(rgb, fg_rgba.rgb, alpha * fg_rgba.a); - } - } - - // TODO: sRGB - uvec4 s = uvec4(round(vec4(rgb, 1.0) * 255.0)); - uint rgba_packed = s.r | (s.g << 8) | (s.b << 16) | (s.a << 24); - image[xy_uint.y * IMAGE_WIDTH + xy_uint.x] = rgba_packed; -} diff --git a/piet-gpu/shader/image.spv b/piet-gpu/shader/image.spv deleted file mode 100644 index 097add1..0000000 Binary files a/piet-gpu/shader/image.spv and /dev/null differ diff --git a/piet-gpu/shader/scene.h b/piet-gpu/shader/scene.h index 3e57303..eee8075 100644 --- a/piet-gpu/shader/scene.h +++ b/piet-gpu/shader/scene.h @@ -1,37 +1,5 @@ // Code auto-generated by piet-gpu-derive -struct BboxRef { - uint offset; -}; - -struct PointRef { - uint offset; -}; - -struct SimpleGroupRef { - uint offset; -}; - -struct PietCircleRef { - uint offset; -}; - -struct PietStrokeLineRef { - uint offset; -}; - -struct PietFillRef { - uint offset; -}; - -struct PietStrokePolyLineRef { - uint offset; -}; - -struct PietItemRef { - uint offset; -}; - struct LineSegRef { uint offset; }; @@ -64,102 +32,6 @@ struct ElementRef { uint offset; }; -struct Bbox { - ivec4 bbox; -}; - -#define Bbox_size 8 - -BboxRef Bbox_index(BboxRef ref, uint index) { - return BboxRef(ref.offset + index * Bbox_size); -} - -struct Point { - vec2 xy; -}; - -#define Point_size 8 - -PointRef Point_index(PointRef ref, uint index) { - return PointRef(ref.offset + index * Point_size); -} - -struct SimpleGroup { - uint n_items; - PietItemRef items; - BboxRef bboxes; - Point offset; -}; - -#define SimpleGroup_size 20 - -SimpleGroupRef SimpleGroup_index(SimpleGroupRef ref, uint index) { - return SimpleGroupRef(ref.offset + index * SimpleGroup_size); -} - -struct PietCircle { - uint rgba_color; - Point center; - float radius; -}; - -#define PietCircle_size 16 - -PietCircleRef PietCircle_index(PietCircleRef ref, uint index) { - return PietCircleRef(ref.offset + index * PietCircle_size); -} - -struct PietStrokeLine { - uint flags; - uint rgba_color; - float width; - Point start; - Point end; -}; - -#define PietStrokeLine_size 28 - -PietStrokeLineRef PietStrokeLine_index(PietStrokeLineRef ref, uint index) { - return PietStrokeLineRef(ref.offset + index * PietStrokeLine_size); -} - -struct PietFill { - uint flags; - uint rgba_color; - uint n_points; - PointRef points; -}; - -#define PietFill_size 16 - -PietFillRef PietFill_index(PietFillRef ref, uint index) { - return PietFillRef(ref.offset + index * PietFill_size); -} - -struct PietStrokePolyLine { - uint rgba_color; - float width; - uint n_points; - PointRef points; -}; - -#define PietStrokePolyLine_size 16 - -PietStrokePolyLineRef PietStrokePolyLine_index(PietStrokePolyLineRef ref, uint index) { - return PietStrokePolyLineRef(ref.offset + index * PietStrokePolyLine_size); -} - -#define PietItem_Group 0 -#define PietItem_Circle 1 -#define PietItem_Line 2 -#define PietItem_Fill 3 -#define PietItem_Poly 4 -#define PietItem_size 32 - -PietItemRef PietItem_index(PietItemRef ref, uint index) { - return PietItemRef(ref.offset + index * PietItem_size); -} - struct LineSeg { vec2 p0; vec2 p1; @@ -254,114 +126,6 @@ ElementRef Element_index(ElementRef ref, uint index) { return ElementRef(ref.offset + index * Element_size); } -Bbox Bbox_read(BboxRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = scene[ix + 0]; - uint raw1 = scene[ix + 1]; - Bbox s; - s.bbox = ivec4(int(raw0 << 16) >> 16, int(raw0) >> 16, int(raw1 << 16) >> 16, int(raw1) >> 16); - return s; -} - -Point Point_read(PointRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = scene[ix + 0]; - uint raw1 = scene[ix + 1]; - Point s; - s.xy = vec2(uintBitsToFloat(raw0), uintBitsToFloat(raw1)); - return s; -} - -SimpleGroup SimpleGroup_read(SimpleGroupRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = scene[ix + 0]; - uint raw1 = scene[ix + 1]; - uint raw2 = scene[ix + 2]; - SimpleGroup s; - s.n_items = raw0; - s.items = PietItemRef(raw1); - s.bboxes = BboxRef(raw2); - s.offset = Point_read(PointRef(ref.offset + 12)); - return s; -} - -PietCircle PietCircle_read(PietCircleRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = scene[ix + 0]; - uint raw3 = scene[ix + 3]; - PietCircle s; - s.rgba_color = raw0; - s.center = Point_read(PointRef(ref.offset + 4)); - s.radius = uintBitsToFloat(raw3); - return s; -} - -PietStrokeLine PietStrokeLine_read(PietStrokeLineRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = scene[ix + 0]; - uint raw1 = scene[ix + 1]; - uint raw2 = scene[ix + 2]; - PietStrokeLine s; - s.flags = raw0; - s.rgba_color = raw1; - s.width = uintBitsToFloat(raw2); - s.start = Point_read(PointRef(ref.offset + 12)); - s.end = Point_read(PointRef(ref.offset + 20)); - return s; -} - -PietFill PietFill_read(PietFillRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = scene[ix + 0]; - uint raw1 = scene[ix + 1]; - uint raw2 = scene[ix + 2]; - uint raw3 = scene[ix + 3]; - PietFill s; - s.flags = raw0; - s.rgba_color = raw1; - s.n_points = raw2; - s.points = PointRef(raw3); - return s; -} - -PietStrokePolyLine PietStrokePolyLine_read(PietStrokePolyLineRef ref) { - uint ix = ref.offset >> 2; - uint raw0 = scene[ix + 0]; - uint raw1 = scene[ix + 1]; - uint raw2 = scene[ix + 2]; - uint raw3 = scene[ix + 3]; - PietStrokePolyLine s; - s.rgba_color = raw0; - s.width = uintBitsToFloat(raw1); - s.n_points = raw2; - s.points = PointRef(raw3); - return s; -} - -uint PietItem_tag(PietItemRef ref) { - return scene[ref.offset >> 2]; -} - -SimpleGroup PietItem_Group_read(PietItemRef ref) { - return SimpleGroup_read(SimpleGroupRef(ref.offset + 4)); -} - -PietCircle PietItem_Circle_read(PietItemRef ref) { - return PietCircle_read(PietCircleRef(ref.offset + 4)); -} - -PietStrokeLine PietItem_Line_read(PietItemRef ref) { - return PietStrokeLine_read(PietStrokeLineRef(ref.offset + 4)); -} - -PietFill PietItem_Fill_read(PietItemRef ref) { - return PietFill_read(PietFillRef(ref.offset + 4)); -} - -PietStrokePolyLine PietItem_Poly_read(PietItemRef ref) { - return PietStrokePolyLine_read(PietStrokePolyLineRef(ref.offset + 4)); -} - LineSeg LineSeg_read(LineSegRef ref) { uint ix = ref.offset >> 2; uint raw0 = scene[ix + 0];