From acb3933d94d65543539a7d529c87b958d139cb47 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Wed, 2 Mar 2022 14:44:03 -0800 Subject: [PATCH 1/3] Variable size encoding of draw objects This patch switches to a variable size encoding of draw objects. In addition to the CPU-side scene encoding, it changes the representation of intermediate per draw object state from the `Annotated` struct to a variable "info" encoding. In addition, the bounding boxes are moved to a separate array (for a more "structure of "arrays" approach). Data that's unchanged from the scene encoding is not copied. Rather, downstream stages can access the data from the scene buffer (reducing allocation and copying). Prefix sums, computed in `DrawMonoid` track the offset of both scene and intermediate data. The tags for the CPU-side encoding have been split into their own stream (again a change from AoS to SoA style). This is not necessarily the final form. There's some stuff (including at least one piet-gpu-derive type) that can be deleted. In addition, the linewidth field should probably move from the info to path-specific. Also, the 1:1 correspondence between draw object and path has not yet been broken. Closes #152 --- piet-gpu/shader/backdrop.comp | 43 +- piet-gpu/shader/bbox_clear.comp | 2 +- piet-gpu/shader/binning.comp | 37 +- piet-gpu/shader/build.ninja | 22 +- piet-gpu/shader/clip_leaf.comp | 6 +- piet-gpu/shader/clip_reduce.comp | 4 +- piet-gpu/shader/coarse.comp | 128 ++-- piet-gpu/shader/draw_leaf.comp | 110 ++- piet-gpu/shader/draw_reduce.comp | 10 +- piet-gpu/shader/draw_scan.comp | 4 +- piet-gpu/shader/drawtag.h | 39 +- piet-gpu/shader/gen/backdrop.dxil | Bin 4672 -> 4584 bytes piet-gpu/shader/gen/backdrop.hlsl | 162 ++-- piet-gpu/shader/gen/backdrop.msl | 160 ++-- piet-gpu/shader/gen/backdrop.spv | Bin 12840 -> 11508 bytes piet-gpu/shader/gen/backdrop_lg.dxil | Bin 4676 -> 4584 bytes piet-gpu/shader/gen/backdrop_lg.hlsl | 162 ++-- piet-gpu/shader/gen/backdrop_lg.msl | 160 ++-- piet-gpu/shader/gen/backdrop_lg.spv | Bin 12872 -> 11540 bytes piet-gpu/shader/gen/bbox_clear.dxil | Bin 3156 -> 3168 bytes piet-gpu/shader/gen/bbox_clear.hlsl | 8 +- piet-gpu/shader/gen/bbox_clear.msl | 8 +- piet-gpu/shader/gen/bbox_clear.spv | Bin 3000 -> 3212 bytes piet-gpu/shader/gen/binning.dxil | Bin 6388 -> 6336 bytes piet-gpu/shader/gen/binning.hlsl | 263 +++---- piet-gpu/shader/gen/binning.msl | 251 +++---- piet-gpu/shader/gen/binning.spv | Bin 19728 -> 18536 bytes piet-gpu/shader/gen/clip_leaf.dxil | Bin 7232 -> 7232 bytes piet-gpu/shader/gen/clip_leaf.hlsl | 12 +- piet-gpu/shader/gen/clip_leaf.msl | 10 +- piet-gpu/shader/gen/clip_leaf.spv | Bin 19028 -> 19240 bytes piet-gpu/shader/gen/clip_reduce.dxil | Bin 4624 -> 4632 bytes piet-gpu/shader/gen/clip_reduce.hlsl | 6 +- piet-gpu/shader/gen/clip_reduce.msl | 8 +- piet-gpu/shader/gen/clip_reduce.spv | Bin 9484 -> 9696 bytes piet-gpu/shader/gen/coarse.dxil | Bin 10776 -> 10460 bytes piet-gpu/shader/gen/coarse.hlsl | 867 +++++++-------------- piet-gpu/shader/gen/coarse.msl | 871 ++++++++-------------- piet-gpu/shader/gen/coarse.spv | Bin 65388 -> 51712 bytes piet-gpu/shader/gen/draw_leaf.dxil | Bin 6988 -> 6068 bytes piet-gpu/shader/gen/draw_leaf.hlsl | 719 +++--------------- piet-gpu/shader/gen/draw_leaf.msl | 776 +++---------------- piet-gpu/shader/gen/draw_leaf.spv | Bin 40588 -> 16412 bytes piet-gpu/shader/gen/draw_reduce.dxil | Bin 3940 -> 4264 bytes piet-gpu/shader/gen/draw_reduce.hlsl | 106 +-- piet-gpu/shader/gen/draw_reduce.msl | 140 ++-- piet-gpu/shader/gen/draw_reduce.spv | Bin 7108 -> 7124 bytes piet-gpu/shader/gen/draw_root.dxil | Bin 3944 -> 4468 bytes piet-gpu/shader/gen/draw_root.hlsl | 56 +- piet-gpu/shader/gen/draw_root.msl | 44 +- piet-gpu/shader/gen/draw_root.spv | Bin 4668 -> 5440 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 14236 -> 14232 bytes piet-gpu/shader/gen/kernel4.hlsl | 6 +- piet-gpu/shader/gen/kernel4.msl | 6 +- piet-gpu/shader/gen/kernel4.spv | Bin 58384 -> 58596 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 14140 -> 14136 bytes piet-gpu/shader/gen/kernel4_gray.hlsl | 6 +- piet-gpu/shader/gen/kernel4_gray.msl | 6 +- piet-gpu/shader/gen/kernel4_gray.spv | Bin 58140 -> 58352 bytes piet-gpu/shader/gen/path_coarse.dxil | Bin 7064 -> 7068 bytes piet-gpu/shader/gen/path_coarse.hlsl | 6 +- piet-gpu/shader/gen/path_coarse.msl | 6 +- piet-gpu/shader/gen/path_coarse.spv | Bin 39576 -> 39788 bytes piet-gpu/shader/gen/pathseg.dxil | Bin 9592 -> 9604 bytes piet-gpu/shader/gen/pathseg.hlsl | 12 +- piet-gpu/shader/gen/pathseg.msl | 8 +- piet-gpu/shader/gen/pathseg.spv | Bin 35000 -> 35212 bytes piet-gpu/shader/gen/pathtag_reduce.dxil | Bin 4644 -> 4640 bytes piet-gpu/shader/gen/pathtag_reduce.hlsl | 8 +- piet-gpu/shader/gen/pathtag_reduce.msl | 6 +- piet-gpu/shader/gen/pathtag_reduce.spv | Bin 8088 -> 8300 bytes piet-gpu/shader/gen/pathtag_root.dxil | Bin 4716 -> 4720 bytes piet-gpu/shader/gen/tile_alloc.dxil | Bin 5048 -> 5148 bytes piet-gpu/shader/gen/tile_alloc.hlsl | 237 ++---- piet-gpu/shader/gen/tile_alloc.msl | 227 ++---- piet-gpu/shader/gen/tile_alloc.spv | Bin 15692 -> 13460 bytes piet-gpu/shader/gen/transform_leaf.dxil | Bin 5664 -> 5664 bytes piet-gpu/shader/gen/transform_leaf.hlsl | 8 +- piet-gpu/shader/gen/transform_leaf.msl | 6 +- piet-gpu/shader/gen/transform_leaf.spv | Bin 12760 -> 12972 bytes piet-gpu/shader/gen/transform_reduce.dxil | Bin 4700 -> 4700 bytes piet-gpu/shader/gen/transform_reduce.hlsl | 8 +- piet-gpu/shader/gen/transform_reduce.msl | 6 +- piet-gpu/shader/gen/transform_reduce.spv | Bin 8112 -> 8324 bytes piet-gpu/shader/gen/transform_root.dxil | Bin 4824 -> 4828 bytes piet-gpu/shader/pathseg.comp | 2 +- piet-gpu/shader/setup.h | 14 +- piet-gpu/shader/tile_alloc.comp | 53 +- piet-gpu/src/encoder.rs | 117 +-- piet-gpu/src/lib.rs | 46 +- piet-gpu/src/render_ctx.rs | 49 +- piet-gpu/src/stages.rs | 6 +- piet-gpu/src/stages/draw.rs | 4 +- tests/src/clip.rs | 5 +- tests/src/draw.rs | 40 +- tests/src/path.rs | 4 +- 96 files changed, 2018 insertions(+), 4078 deletions(-) diff --git a/piet-gpu/shader/backdrop.comp b/piet-gpu/shader/backdrop.comp index 0c698b1..4a45d28 100644 --- a/piet-gpu/shader/backdrop.comp +++ b/piet-gpu/shader/backdrop.comp @@ -38,7 +38,6 @@ layout(set = 0, binding = 1) readonly buffer ConfigBuf { Config conf; }; -#include "annotated.h" #include "tile.h" shared uint sh_row_count[BACKDROP_WG]; @@ -48,39 +47,29 @@ shared uint sh_row_width[BACKDROP_WG]; void main() { uint th_ix = gl_LocalInvocationIndex; uint element_ix = gl_GlobalInvocationID.x; - AnnotatedRef ref = AnnotatedRef(conf.anno_alloc.offset + element_ix * Annotated_size); // Work assignment: 1 thread : 1 path element uint row_count = 0; bool mem_ok = mem_error == NO_ERROR; if (gl_LocalInvocationID.y == 0) { if (element_ix < conf.n_elements) { - AnnotatedTag tag = Annotated_tag(conf.anno_alloc, ref); - switch (tag.tag) { - case Annotated_Image: - case Annotated_LinGradient: - case Annotated_BeginClip: - case Annotated_Color: - if (fill_mode_from_flags(tag.flags) != MODE_NONZERO) { - break; - } - // Fall through. - PathRef path_ref = PathRef(conf.tile_alloc.offset + element_ix * Path_size); - Path path = Path_read(conf.tile_alloc, path_ref); - sh_row_width[th_ix] = path.bbox.z - path.bbox.x; - row_count = path.bbox.w - path.bbox.y; - // Paths that don't cross tile top edges don't have backdrops. - // Don't apply the optimization to paths that may cross the y = 0 - // top edge, but clipped to 1 row. - if (row_count == 1 && path.bbox.y > 0) { - // Note: this can probably be expanded to width = 2 as - // long as it doesn't cross the left edge. - row_count = 0; - } - Alloc path_alloc = new_alloc( - path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size, mem_ok); - sh_row_alloc[th_ix] = path_alloc; + // Possible TODO: it's not necessary to process backdrops of stroked paths. + // We had logic for that but took it out because it used the Annotated struct. + PathRef path_ref = PathRef(conf.tile_alloc.offset + element_ix * Path_size); + Path path = Path_read(conf.tile_alloc, path_ref); + sh_row_width[th_ix] = path.bbox.z - path.bbox.x; + row_count = path.bbox.w - path.bbox.y; + // Paths that don't cross tile top edges don't have backdrops. + // Don't apply the optimization to paths that may cross the y = 0 + // top edge, but clipped to 1 row. + if (row_count == 1 && path.bbox.y > 0) { + // Note: this can probably be expanded to width = 2 as + // long as it doesn't cross the left edge. + row_count = 0; } + Alloc path_alloc = new_alloc( + path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size, mem_ok); + sh_row_alloc[th_ix] = path_alloc; } sh_row_count[th_ix] = row_count; } diff --git a/piet-gpu/shader/bbox_clear.comp b/piet-gpu/shader/bbox_clear.comp index c609642..52577f9 100644 --- a/piet-gpu/shader/bbox_clear.comp +++ b/piet-gpu/shader/bbox_clear.comp @@ -20,7 +20,7 @@ layout(binding = 1) readonly buffer ConfigBuf { void main() { uint ix = gl_GlobalInvocationID.x; if (ix < conf.n_path) { - uint out_ix = (conf.bbox_alloc.offset >> 2) + 6 * ix; + uint out_ix = (conf.path_bbox_alloc.offset >> 2) + 6 * ix; memory[out_ix] = 0xffff; memory[out_ix + 1] = 0xffff; memory[out_ix + 2] = 0; diff --git a/piet-gpu/shader/binning.comp b/piet-gpu/shader/binning.comp index 2304ea2..9b04400 100644 --- a/piet-gpu/shader/binning.comp +++ b/piet-gpu/shader/binning.comp @@ -18,7 +18,6 @@ layout(set = 0, binding = 1) readonly buffer ConfigBuf { Config conf; }; -#include "annotated.h" #include "bins.h" #include "drawtag.h" @@ -37,10 +36,12 @@ shared Alloc sh_chunk_alloc[N_TILE]; shared bool sh_alloc_failed; DrawMonoid load_draw_monoid(uint element_ix) { - uint base = (conf.drawmonoid_alloc.offset >> 2) + 2 * element_ix; + uint base = (conf.drawmonoid_alloc.offset >> 2) + 4 * element_ix; uint path_ix = memory[base]; uint clip_ix = memory[base + 1]; - return DrawMonoid(path_ix, clip_ix); + uint scene_offset = memory[base + 2]; + uint info_offset = memory[base + 3]; + return DrawMonoid(path_ix, clip_ix, scene_offset, info_offset); } // Load bounding box computed by clip processing @@ -60,7 +61,7 @@ vec4 bbox_intersect(vec4 a, vec4 b) { // Load path's bbox from bbox (as written by pathseg). vec4 load_path_bbox(uint path_ix) { - uint base = (conf.bbox_alloc.offset >> 2) + 6 * path_ix; + uint base = (conf.path_bbox_alloc.offset >> 2) + 6 * path_ix; float bbox_l = float(memory[base]) - 32768.0; float bbox_t = float(memory[base + 1]) - 32768.0; float bbox_r = float(memory[base + 2]) - 32768.0; @@ -69,16 +70,15 @@ vec4 load_path_bbox(uint path_ix) { return bbox; } -void store_path_bbox(AnnotatedRef ref, vec4 bbox) { - uint ix = ref.offset >> 2; - memory[ix + 1] = floatBitsToUint(bbox.x); - memory[ix + 2] = floatBitsToUint(bbox.y); - memory[ix + 3] = floatBitsToUint(bbox.z); - memory[ix + 4] = floatBitsToUint(bbox.w); +void store_draw_bbox(uint draw_ix, vec4 bbox) { + uint base = (conf.draw_bbox_alloc.offset >> 2) + 4 * draw_ix; + memory[base] = floatBitsToUint(bbox.x); + memory[base + 1] = floatBitsToUint(bbox.y); + memory[base + 2] = floatBitsToUint(bbox.z); + memory[base + 3] = floatBitsToUint(bbox.w); } void main() { - uint my_n_elements = conf.n_elements; uint my_partition = gl_WorkGroupID.x; for (uint i = 0; i < N_SLICE; i++) { @@ -91,18 +91,8 @@ void main() { // Read inputs and determine coverage of bins uint element_ix = my_partition * N_TILE + gl_LocalInvocationID.x; - AnnotatedRef ref = AnnotatedRef(conf.anno_alloc.offset + element_ix * Annotated_size); - uint tag = Annotated_Nop; - if (element_ix < my_n_elements) { - tag = Annotated_tag(conf.anno_alloc, ref).tag; - } int x0 = 0, y0 = 0, x1 = 0, y1 = 0; - switch (tag) { - case Annotated_Color: - case Annotated_LinGradient: - case Annotated_Image: - case Annotated_BeginClip: - case Annotated_EndClip: + if (element_ix < conf.n_elements) { DrawMonoid draw_monoid = load_draw_monoid(element_ix); uint path_ix = draw_monoid.path_ix; vec4 clip_bbox = vec4(-1e9, -1e9, 1e9, 1e9); @@ -119,12 +109,11 @@ void main() { // Avoid negative-size bbox (is this necessary)? bbox.zw = max(bbox.xy, bbox.zw); // Store clip-intersected bbox for tile_alloc. - store_path_bbox(ref, bbox); + store_draw_bbox(element_ix, bbox); x0 = int(floor(bbox.x * SX)); y0 = int(floor(bbox.y * SY)); x1 = int(ceil(bbox.z * SX)); y1 = int(ceil(bbox.w * SY)); - break; } // At this point, we run an iterator over the coverage area, diff --git a/piet-gpu/shader/build.ninja b/piet-gpu/shader/build.ninja index ac4f3d7..785e016 100644 --- a/piet-gpu/shader/build.ninja +++ b/piet-gpu/shader/build.ninja @@ -22,43 +22,43 @@ rule dxil rule msl command = $spirv_cross --msl $in --output $out $msl_flags -build gen/binning.spv: glsl binning.comp | annotated.h bins.h drawtag.h setup.h mem.h +build gen/binning.spv: glsl binning.comp | bins.h drawtag.h setup.h mem.h build gen/binning.hlsl: hlsl gen/binning.spv build gen/binning.dxil: dxil gen/binning.hlsl build gen/binning.msl: msl gen/binning.spv -build gen/tile_alloc.spv: glsl tile_alloc.comp | annotated.h tile.h setup.h +build gen/tile_alloc.spv: glsl tile_alloc.comp | drawtag.h tile.h setup.h mem.h build gen/tile_alloc.hlsl: hlsl gen/tile_alloc.spv build gen/tile_alloc.dxil: dxil gen/tile_alloc.hlsl build gen/tile_alloc.msl: msl gen/tile_alloc.spv -build gen/path_coarse.spv: glsl path_coarse.comp | annotated.h pathseg.h tile.h setup.h +build gen/path_coarse.spv: glsl path_coarse.comp | pathseg.h tile.h setup.h mem.h build gen/path_coarse.hlsl: hlsl gen/path_coarse.spv build gen/path_coarse.dxil: dxil gen/path_coarse.hlsl build gen/path_coarse.msl: msl gen/path_coarse.spv -build gen/backdrop.spv: glsl backdrop.comp | annotated.h tile.h setup.h +build gen/backdrop.spv: glsl backdrop.comp | tile.h setup.h mem.h build gen/backdrop.hlsl: hlsl gen/backdrop.spv build gen/backdrop.dxil: dxil gen/backdrop.hlsl build gen/backdrop.msl: msl gen/backdrop.spv -build gen/backdrop_lg.spv: glsl backdrop.comp | annotated.h tile.h setup.h +build gen/backdrop_lg.spv: glsl backdrop.comp | tile.h setup.h mem.h flags = -DBACKDROP_DIST_FACTOR=4 build gen/backdrop_lg.hlsl: hlsl gen/backdrop_lg.spv build gen/backdrop_lg.dxil: dxil gen/backdrop_lg.hlsl build gen/backdrop_lg.msl: msl gen/backdrop_lg.spv -build gen/coarse.spv: glsl coarse.comp | annotated.h bins.h ptcl.h setup.h +build gen/coarse.spv: glsl coarse.comp | drawtag.h bins.h ptcl.h setup.h mem.h build gen/coarse.hlsl: hlsl gen/coarse.spv build gen/coarse.dxil: dxil gen/coarse.hlsl build gen/coarse.msl: msl gen/coarse.spv -build gen/kernel4.spv: glsl kernel4.comp | blend.h ptcl.h setup.h +build gen/kernel4.spv: glsl kernel4.comp | blend.h ptcl.h setup.h mem.h build gen/kernel4.hlsl: hlsl gen/kernel4.spv build gen/kernel4.dxil: dxil gen/kernel4.hlsl build gen/kernel4.msl: msl gen/kernel4.spv -build gen/kernel4_gray.spv: glsl kernel4.comp | ptcl.h setup.h +build gen/kernel4_gray.spv: glsl kernel4.comp | ptcl.h setup.h mem.h flags = -DGRAY build gen/kernel4_gray.hlsl: hlsl gen/kernel4_gray.spv build gen/kernel4_gray.dxil: dxil gen/kernel4_gray.hlsl @@ -114,17 +114,17 @@ build gen/draw_root.hlsl: hlsl gen/draw_root.spv build gen/draw_root.dxil: dxil gen/draw_root.hlsl build gen/draw_root.msl: msl gen/draw_root.spv -build gen/draw_leaf.spv: glsl draw_leaf.comp | blend.h scene.h drawtag.h annotated.h setup.h mem.h +build gen/draw_leaf.spv: glsl draw_leaf.comp | blend.h scene.h drawtag.h setup.h mem.h build gen/draw_leaf.hlsl: hlsl gen/draw_leaf.spv build gen/draw_leaf.dxil: dxil gen/draw_leaf.hlsl build gen/draw_leaf.msl: msl gen/draw_leaf.spv -build gen/clip_reduce.spv: glsl clip_reduce.comp | mem.h setup.h annotated.h +build gen/clip_reduce.spv: glsl clip_reduce.comp | mem.h setup.h build gen/clip_reduce.hlsl: hlsl gen/clip_reduce.spv build gen/clip_reduce.dxil: dxil gen/clip_reduce.hlsl build gen/clip_reduce.msl: msl gen/clip_reduce.spv -build gen/clip_leaf.spv: glsl clip_leaf.comp | mem.h setup.h annotated.h +build gen/clip_leaf.spv: glsl clip_leaf.comp | mem.h setup.h build gen/clip_leaf.hlsl: hlsl gen/clip_leaf.spv build gen/clip_leaf.dxil: dxil gen/clip_leaf.hlsl build gen/clip_leaf.msl: msl gen/clip_leaf.spv diff --git a/piet-gpu/shader/clip_leaf.comp b/piet-gpu/shader/clip_leaf.comp index 5f7e79b..5353b0b 100644 --- a/piet-gpu/shader/clip_leaf.comp +++ b/piet-gpu/shader/clip_leaf.comp @@ -18,8 +18,6 @@ layout(binding = 1) readonly buffer ConfigBuf { Config conf; }; -#include "annotated.h" - // Some of this is cut'n'paste duplication with the reduce pass, and // arguably should be moved to a common .h file. // The bicyclic monoid @@ -43,7 +41,7 @@ Bic bic_combine(Bic x, Bic y) { // Load path's bbox from bbox (as written by pathseg). vec4 load_path_bbox(uint path_ix) { - uint base = (conf.bbox_alloc.offset >> 2) + 6 * path_ix; + uint base = (conf.path_bbox_alloc.offset >> 2) + 6 * path_ix; float bbox_l = float(memory[base]) - 32768.0; float bbox_t = float(memory[base + 1]) - 32768.0; float bbox_r = float(memory[base + 2]) - 32768.0; @@ -271,7 +269,7 @@ void main() { // and is in the ClipEl for cross-partition. // If not, can probably get rid of it in the stack intermediate buf. path_ix = load_path_ix(parent); - uint drawmonoid_out_base = (conf.drawmonoid_alloc.offset >> 2) + 2 * ~inp; + uint drawmonoid_out_base = (conf.drawmonoid_alloc.offset >> 2) + 4 * ~inp; // Fix up drawmonoid so path_ix at EndClip matches BeginClip memory[drawmonoid_out_base] = path_ix; diff --git a/piet-gpu/shader/clip_reduce.comp b/piet-gpu/shader/clip_reduce.comp index c62b239..8b247ab 100644 --- a/piet-gpu/shader/clip_reduce.comp +++ b/piet-gpu/shader/clip_reduce.comp @@ -31,8 +31,6 @@ layout(binding = 1) readonly buffer ConfigBuf { Config conf; }; -#include "annotated.h" - // The intermediate state for clip processing. struct ClipEl { // index of parent node @@ -59,7 +57,7 @@ shared vec4 sh_bbox[WG_SIZE]; // Load path's bbox from bbox (as written by pathseg). vec4 load_path_bbox(uint path_ix) { - uint base = (conf.bbox_alloc.offset >> 2) + 6 * path_ix; + uint base = (conf.path_bbox_alloc.offset >> 2) + 6 * path_ix; float bbox_l = float(memory[base]) - 32768.0; float bbox_t = float(memory[base + 1]) - 32768.0; float bbox_r = float(memory[base + 2]) - 32768.0; diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index df306e0..961fc99 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -19,11 +19,15 @@ layout(local_size_x = N_TILE, local_size_y = 1) in; -layout(set = 0, binding = 1) readonly buffer ConfigBuf { +layout(binding = 1) readonly buffer ConfigBuf { Config conf; }; -#include "annotated.h" +layout(binding = 2) readonly buffer SceneBuf { + uint[] scene; +}; + +#include "drawtag.h" #include "bins.h" #include "tile.h" #include "ptcl.h" @@ -92,8 +96,8 @@ bool alloc_cmd(inout Alloc cmd_alloc, inout CmdRef cmd_ref, inout uint cmd_limit return true; } -void write_fill(Alloc alloc, inout CmdRef cmd_ref, uint flags, Tile tile, float linewidth) { - if (fill_mode_from_flags(flags) == MODE_NONZERO) { +void write_fill(Alloc alloc, inout CmdRef cmd_ref, Tile tile, float linewidth) { + if (linewidth < 0.0) { if (tile.tile.offset != 0) { CmdFill cmd_fill = CmdFill(tile.tile.offset, tile.backdrop); Cmd_Fill_write(alloc, cmd_ref, cmd_fill); @@ -146,6 +150,10 @@ void main() { uint part_start_ix = 0; uint ready_ix = 0; + uint drawmonoid_start = conf.drawmonoid_alloc.offset >> 2; + uint drawtag_start = conf.drawtag_offset >> 2; + uint drawdata_start = conf.drawdata_offset >> 2; + uint drawinfo_start = conf.drawinfo_alloc.offset >> 2; bool mem_ok = mem_error == NO_ERROR; while (true) { for (uint i = 0; i < N_SLICE; i++) { @@ -207,24 +215,22 @@ void main() { // We've done the merge and filled the buffer. // Read one element, compute coverage. - uint tag = Annotated_Nop; + uint tag = Drawtag_Nop; uint element_ix; - AnnotatedRef ref; if (th_ix + rd_ix < wr_ix) { element_ix = sh_elements[th_ix]; - ref = AnnotatedRef(conf.anno_alloc.offset + element_ix * Annotated_size); - tag = Annotated_tag(conf.anno_alloc, ref).tag; + tag = scene[drawtag_start + element_ix]; } // Bounding box of element in pixel coordinates. uint tile_count; switch (tag) { - case Annotated_Color: - case Annotated_Image: - case Annotated_LinGradient: - case Annotated_BeginClip: - case Annotated_EndClip: - uint drawmonoid_base = (conf.drawmonoid_alloc.offset >> 2) + 2 * element_ix; + case Drawtag_FillColor: + case Drawtag_FillImage: + case Drawtag_FillLinGradient: + case Drawtag_BeginClip: + case Drawtag_EndClip: + uint drawmonoid_base = drawmonoid_start + 4 * element_ix; uint path_ix = memory[drawmonoid_base]; Path path = Path_read(conf.tile_alloc, PathRef(conf.tile_alloc.offset + path_ix * Path_size)); uint stride = path.bbox.z - path.bbox.x; @@ -272,9 +278,7 @@ void main() { el_ix = probe; } } - AnnotatedRef ref = AnnotatedRef(conf.anno_alloc.offset + sh_elements[el_ix] * Annotated_size); - AnnotatedTag anno_tag = Annotated_tag(conf.anno_alloc, ref); - uint tag = anno_tag.tag; + uint tag = scene[drawtag_start + sh_elements[el_ix]]; uint seq_ix = ix - (el_ix > 0 ? sh_tile_count[el_ix - 1] : 0); uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + seq_ix % width; @@ -283,15 +287,16 @@ void main() { if (mem_ok) { Tile tile = Tile_read(read_tile_alloc(el_ix, mem_ok), TileRef(sh_tile_base[el_ix] + (sh_tile_stride[el_ix] * y + x) * Tile_size)); - bool is_clip = tag == Annotated_BeginClip || tag == Annotated_EndClip; + bool is_clip = (tag & 1) != 0; // Always include the tile if it contains a path segment. // For draws, include the tile if it is solid. // For clips, include the tile if it is empty - this way, logic // below will suppress the drawing of inner elements. // For blends, include the tile if // (blend_mode, composition_mode) != (Normal, SrcOver) + bool is_blend = false; // TODO include_tile = tile.tile.offset != 0 || (tile.backdrop == 0) == is_clip - || (is_clip && (anno_tag.flags & 0x2) != 0); + || (is_clip && is_blend); } if (include_tile) { uint el_slice = el_ix / 32; @@ -302,8 +307,8 @@ void main() { barrier(); - // Output non-segment elements for this tile. The thread does a sequential walk - // through the non-segment elements. + // Output draw objects for this tile. The thread does a sequential walk + // through the draw objects. uint slice_ix = 0; uint bitmap = sh_bitmaps[0][th_ix]; while (mem_ok) { @@ -323,59 +328,55 @@ void main() { // Clear LSB bitmap &= bitmap - 1; - // At this point, we read the element again from global memory. - // If that turns out to be expensive, maybe we can pack it into - // shared memory (or perhaps just the tag). - ref = AnnotatedRef(conf.anno_alloc.offset + element_ix * Annotated_size); - AnnotatedTag tag = Annotated_tag(conf.anno_alloc, ref); + uint drawtag = scene[drawtag_start + element_ix]; if (clip_zero_depth == 0) { - switch (tag.tag) { - case Annotated_Color: - Tile tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), - TileRef(sh_tile_base[element_ref_ix] + - (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); - AnnoColor fill = Annotated_Color_read(conf.anno_alloc, ref); + Tile tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), + TileRef(sh_tile_base[element_ref_ix] + + (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); + uint drawmonoid_base = drawmonoid_start + 4 * element_ix; + uint scene_offset = memory[drawmonoid_base + 2]; + uint info_offset = memory[drawmonoid_base + 3]; + uint dd = drawdata_start + (scene_offset >> 2); + uint di = drawinfo_start + (info_offset >> 2); + switch (drawtag) { + case Drawtag_FillColor: + float linewidth = uintBitsToFloat(memory[di]); if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { break; } - write_fill(cmd_alloc, cmd_ref, tag.flags, tile, fill.linewidth); - Cmd_Color_write(cmd_alloc, cmd_ref, CmdColor(fill.rgba_color)); + write_fill(cmd_alloc, cmd_ref, tile, linewidth); + uint rgba = scene[dd]; + Cmd_Color_write(cmd_alloc, cmd_ref, CmdColor(rgba)); cmd_ref.offset += 4 + CmdColor_size; break; - case Annotated_LinGradient: - tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), - TileRef(sh_tile_base[element_ref_ix] + - (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); - AnnoLinGradient lin = Annotated_LinGradient_read(conf.anno_alloc, ref); + case Drawtag_FillLinGradient: if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { break; } - write_fill(cmd_alloc, cmd_ref, tag.flags, tile, fill.linewidth); + linewidth = uintBitsToFloat(memory[di]); + write_fill(cmd_alloc, cmd_ref, tile, linewidth); CmdLinGrad cmd_lin; - cmd_lin.index = lin.index; - cmd_lin.line_x = lin.line_x; - cmd_lin.line_y = lin.line_y; - cmd_lin.line_c = lin.line_c; + cmd_lin.index = scene[dd]; + cmd_lin.line_x = uintBitsToFloat(memory[di + 1]); + cmd_lin.line_y = uintBitsToFloat(memory[di + 2]); + cmd_lin.line_c = uintBitsToFloat(memory[di + 3]); Cmd_LinGrad_write(cmd_alloc, cmd_ref, cmd_lin); cmd_ref.offset += 4 + CmdLinGrad_size; break; - case Annotated_Image: - tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), - TileRef(sh_tile_base[element_ref_ix] + - (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); - AnnoImage fill_img = Annotated_Image_read(conf.anno_alloc, ref); + case Drawtag_FillImage: + linewidth = uintBitsToFloat(memory[di]); if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { break; } - write_fill(cmd_alloc, cmd_ref, tag.flags, tile, fill_img.linewidth); - Cmd_Image_write(cmd_alloc, cmd_ref, CmdImage(fill_img.index, fill_img.offset)); + write_fill(cmd_alloc, cmd_ref, tile, linewidth); + uint index = scene[dd]; + uint raw1 = scene[dd + 1]; + ivec2 offset = ivec2(int(raw1 << 16) >> 16, int(raw1) >> 16); + Cmd_Image_write(cmd_alloc, cmd_ref, CmdImage(index, offset)); cmd_ref.offset += 4 + CmdImage_size; break; - case Annotated_BeginClip: - tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), - TileRef(sh_tile_base[element_ref_ix] + - (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); + case Drawtag_BeginClip: if (tile.tile.offset == 0 && tile.backdrop == 0) { clip_zero_depth = clip_depth + 1; } else { @@ -387,27 +388,24 @@ void main() { } clip_depth++; break; - case Annotated_EndClip: - tile = Tile_read(read_tile_alloc(element_ref_ix, mem_ok), - TileRef(sh_tile_base[element_ref_ix] + - (sh_tile_stride[element_ref_ix] * tile_y + tile_x) * Tile_size)); - AnnoEndClip end_clip = Annotated_EndClip_read(conf.anno_alloc, ref); + case Drawtag_EndClip: clip_depth--; if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { break; } - write_fill(cmd_alloc, cmd_ref, MODE_NONZERO, tile, 0.0); - Cmd_EndClip_write(cmd_alloc, cmd_ref, CmdEndClip(end_clip.blend)); + write_fill(cmd_alloc, cmd_ref, tile, -1.0); + uint blend = scene[dd]; + Cmd_EndClip_write(cmd_alloc, cmd_ref, CmdEndClip(blend)); cmd_ref.offset += 4 + CmdEndClip_size; break; } } else { // In "clip zero" state, suppress all drawing - switch (tag.tag) { - case Annotated_BeginClip: + switch (drawtag) { + case Drawtag_BeginClip: clip_depth++; break; - case Annotated_EndClip: + case Drawtag_EndClip: if (clip_depth == clip_zero_depth) { clip_zero_depth = 0; } diff --git a/piet-gpu/shader/draw_leaf.comp b/piet-gpu/shader/draw_leaf.comp index 74fc2f8..1cee0ef 100644 --- a/piet-gpu/shader/draw_leaf.comp +++ b/piet-gpu/shader/draw_leaf.comp @@ -27,7 +27,6 @@ layout(binding = 2) readonly buffer SceneBuf { #include "scene.h" #include "tile.h" #include "drawtag.h" -#include "annotated.h" #include "blend.h" #define Monoid DrawMonoid @@ -42,14 +41,14 @@ void main() { Monoid local[N_ROWS]; uint ix = gl_GlobalInvocationID.x * N_ROWS; - ElementRef ref = ElementRef(ix * Element_size); - uint tag_word = Element_tag(ref).tag; + uint drawtag_base = conf.drawtag_offset >> 2; + uint tag_word = scene[drawtag_base + ix]; Monoid agg = map_tag(tag_word); local[0] = agg; for (uint i = 1; i < N_ROWS; i++) { - tag_word = Element_tag(Element_index(ref, i)).tag; - agg = combine_tag_monoid(agg, map_tag(tag_word)); + tag_word = scene[drawtag_base + ix + i]; + agg = combine_draw_monoid(agg, map_tag(tag_word)); local[i] = agg; } sh_scratch[gl_LocalInvocationID.x] = agg; @@ -57,41 +56,47 @@ void main() { barrier(); if (gl_LocalInvocationID.x >= (1u << i)) { Monoid other = sh_scratch[gl_LocalInvocationID.x - (1u << i)]; - agg = combine_tag_monoid(other, agg); + agg = combine_draw_monoid(other, agg); } barrier(); sh_scratch[gl_LocalInvocationID.x] = agg; } barrier(); - Monoid row = tag_monoid_identity(); + Monoid row = draw_monoid_identity(); if (gl_WorkGroupID.x > 0) { row = parent[gl_WorkGroupID.x - 1]; } if (gl_LocalInvocationID.x > 0) { - row = combine_tag_monoid(row, sh_scratch[gl_LocalInvocationID.x - 1]); + row = combine_draw_monoid(row, sh_scratch[gl_LocalInvocationID.x - 1]); } + uint drawdata_base = conf.drawdata_offset >> 2; + uint drawinfo_base = conf.drawinfo_alloc.offset >> 2; uint out_ix = gl_GlobalInvocationID.x * N_ROWS; - uint out_base = (conf.drawmonoid_alloc.offset >> 2) + out_ix * 2; + uint out_base = (conf.drawmonoid_alloc.offset >> 2) + out_ix * 4; uint clip_out_base = conf.clip_alloc.offset >> 2; - AnnotatedRef out_ref = AnnotatedRef(conf.anno_alloc.offset + out_ix * Annotated_size); for (uint i = 0; i < N_ROWS; i++) { Monoid m = row; if (i > 0) { - m = combine_tag_monoid(m, local[i - 1]); + m = combine_draw_monoid(m, local[i - 1]); } // m now holds exclusive scan of draw monoid - memory[out_base + i * 2] = m.path_ix; - memory[out_base + i * 2 + 1] = m.clip_ix; + memory[out_base + i * 4] = m.path_ix; + memory[out_base + i * 4 + 1] = m.clip_ix; + memory[out_base + i * 4 + 2] = m.scene_offset; + memory[out_base + i * 4 + 3] = m.info_offset; + + // u32 offset of drawobj data + uint dd = drawdata_base + (m.scene_offset >> 2); + uint di = drawinfo_base + (m.info_offset >> 2); // For compatibility, we'll generate an Annotated object, same as old // pipeline. However, going forward we'll get rid of that, and have // later stages read scene + bbox etc. - ElementRef this_ref = Element_index(ref, i); - tag_word = Element_tag(this_ref).tag; - if (tag_word == Element_FillColor || tag_word == Element_FillLinGradient || tag_word == Element_FillImage || - tag_word == Element_BeginClip) { - uint bbox_offset = (conf.bbox_alloc.offset >> 2) + 6 * m.path_ix; + tag_word = scene[drawtag_base + ix + i]; + if (tag_word == Drawtag_FillColor || tag_word == Drawtag_FillLinGradient || tag_word == Drawtag_FillImage || + tag_word == Drawtag_BeginClip) { + uint bbox_offset = (conf.path_bbox_alloc.offset >> 2) + 6 * m.path_ix; float bbox_l = float(memory[bbox_offset]) - 32768.0; float bbox_t = float(memory[bbox_offset + 1]) - 32768.0; float bbox_r = float(memory[bbox_offset + 2]) - 32768.0; @@ -101,11 +106,11 @@ void main() { uint fill_mode = uint(linewidth >= 0.0); vec4 mat; vec2 translate; - if (linewidth >= 0.0 || tag_word == Element_FillLinGradient) { + if (linewidth >= 0.0 || tag_word == Drawtag_FillLinGradient) { uint trans_ix = memory[bbox_offset + 5]; uint t = (conf.trans_alloc.offset >> 2) + 6 * trans_ix; mat = uintBitsToFloat(uvec4(memory[t], memory[t + 1], memory[t + 2], memory[t + 3])); - if (tag_word == Element_FillLinGradient) { + if (tag_word == Drawtag_FillLinGradient) { translate = uintBitsToFloat(uvec2(memory[t + 4], memory[t + 5])); } } @@ -113,69 +118,38 @@ void main() { // TODO: need to deal with anisotropic case linewidth *= sqrt(abs(mat.x * mat.w - mat.y * mat.z)); } - linewidth = max(linewidth, 0.0); switch (tag_word) { - case Element_FillColor: - FillColor fill = Element_FillColor_read(this_ref); - AnnoColor anno_fill; - anno_fill.bbox = bbox; - anno_fill.linewidth = linewidth; - anno_fill.rgba_color = fill.rgba_color; - Annotated_Color_write(conf.anno_alloc, out_ref, fill_mode, anno_fill); + case Drawtag_FillColor: + case Drawtag_FillImage: + memory[di] = floatBitsToUint(linewidth); break; - case Element_FillLinGradient: - FillLinGradient lin = Element_FillLinGradient_read(this_ref); - AnnoLinGradient anno_lin; - anno_lin.bbox = bbox; - anno_lin.linewidth = linewidth; - anno_lin.index = lin.index; - vec2 p0 = mat.xy * lin.p0.x + mat.zw * lin.p0.y + translate; - vec2 p1 = mat.xy * lin.p1.x + mat.zw * lin.p1.y + translate; + case Drawtag_FillLinGradient: + memory[di] = floatBitsToUint(linewidth); + uint index = scene[dd]; + vec2 p0 = uintBitsToFloat(uvec2(scene[dd + 1], scene[dd + 2])); + vec2 p1 = uintBitsToFloat(uvec2(scene[dd + 3], scene[dd + 4])); + p0 = mat.xy * p0.x + mat.zw * p0.y + translate; + p1 = mat.xy * p1.x + mat.zw * p1.y + translate; vec2 dxy = p1 - p0; float scale = 1.0 / (dxy.x * dxy.x + dxy.y * dxy.y); float line_x = dxy.x * scale; float line_y = dxy.y * scale; - anno_lin.line_x = line_x; - anno_lin.line_y = line_y; - anno_lin.line_c = -(p0.x * line_x + p0.y * line_y); - Annotated_LinGradient_write(conf.anno_alloc, out_ref, fill_mode, anno_lin); + float line_c = -(p0.x * line_x + p0.y * line_y); + memory[di + 1] = floatBitsToUint(line_x); + memory[di + 2] = floatBitsToUint(line_y); + memory[di + 3] = floatBitsToUint(line_c); break; - case Element_FillImage: - FillImage fill_img = Element_FillImage_read(this_ref); - AnnoImage anno_img; - anno_img.bbox = bbox; - anno_img.linewidth = linewidth; - anno_img.index = fill_img.index; - anno_img.offset = fill_img.offset; - Annotated_Image_write(conf.anno_alloc, out_ref, fill_mode, anno_img); - break; - case Element_BeginClip: - Clip begin_clip = Element_BeginClip_read(this_ref); - AnnoBeginClip anno_begin_clip; - anno_begin_clip.bbox = bbox; - anno_begin_clip.linewidth = 0.0; // don't support clip-with-stroke - anno_begin_clip.blend = begin_clip.blend; - uint flags = uint(begin_clip.blend != BlendComp_default) << 1; - Annotated_BeginClip_write(conf.anno_alloc, out_ref, flags, anno_begin_clip); + case Drawtag_BeginClip: break; } - } else if (tag_word == Element_EndClip) { - Clip end_clip = Element_BeginClip_read(this_ref); - AnnoEndClip anno_end_clip; - // The actual bbox will be reconstructed from clip stream output. - anno_end_clip.bbox = vec4(-1e9, -1e9, 1e9, 1e9); - anno_end_clip.blend = end_clip.blend; - uint flags = uint(end_clip.blend != BlendComp_default) << 1; - Annotated_EndClip_write(conf.anno_alloc, out_ref, flags, anno_end_clip); } // Generate clip stream. - if (tag_word == Element_BeginClip || tag_word == Element_EndClip) { + if (tag_word == Drawtag_BeginClip || tag_word == Drawtag_EndClip) { uint path_ix = ~(out_ix + i); - if (tag_word == Element_BeginClip) { + if (tag_word == Drawtag_BeginClip) { path_ix = m.path_ix; } memory[clip_out_base + m.clip_ix] = path_ix; } - out_ref.offset += Annotated_size; } } diff --git a/piet-gpu/shader/draw_reduce.comp b/piet-gpu/shader/draw_reduce.comp index 68d43e9..d125d6e 100644 --- a/piet-gpu/shader/draw_reduce.comp +++ b/piet-gpu/shader/draw_reduce.comp @@ -36,13 +36,13 @@ shared Monoid sh_scratch[WG_SIZE]; void main() { uint ix = gl_GlobalInvocationID.x * N_ROWS; - ElementRef ref = ElementRef(ix * Element_size); - uint tag_word = Element_tag(ref).tag; + uint drawtag_base = conf.drawtag_offset >> 2; + uint tag_word = scene[drawtag_base + ix]; Monoid agg = map_tag(tag_word); for (uint i = 1; i < N_ROWS; i++) { - tag_word = Element_tag(Element_index(ref, i)).tag; - agg = combine_tag_monoid(agg, map_tag(tag_word)); + uint tag_word = scene[drawtag_base + ix + i]; + agg = combine_draw_monoid(agg, map_tag(tag_word)); } sh_scratch[gl_LocalInvocationID.x] = agg; for (uint i = 0; i < LG_WG_SIZE; i++) { @@ -50,7 +50,7 @@ void main() { // We could make this predicate tighter, but would it help? if (gl_LocalInvocationID.x + (1u << i) < WG_SIZE) { Monoid other = sh_scratch[gl_LocalInvocationID.x + (1u << i)]; - agg = combine_tag_monoid(agg, other); + agg = combine_draw_monoid(agg, other); } barrier(); sh_scratch[gl_LocalInvocationID.x] = agg; diff --git a/piet-gpu/shader/draw_scan.comp b/piet-gpu/shader/draw_scan.comp index 1c26c26..d285020 100644 --- a/piet-gpu/shader/draw_scan.comp +++ b/piet-gpu/shader/draw_scan.comp @@ -16,8 +16,8 @@ layout(local_size_x = WG_SIZE, local_size_y = 1) in; #define Monoid DrawMonoid -#define combine_monoid combine_tag_monoid -#define monoid_identity tag_monoid_identity +#define combine_monoid combine_draw_monoid +#define monoid_identity draw_monoid_identity layout(binding = 0) buffer DataBuf { Monoid[] data; diff --git a/piet-gpu/shader/drawtag.h b/piet-gpu/shader/drawtag.h index 17105f6..7f73546 100644 --- a/piet-gpu/shader/drawtag.h +++ b/piet-gpu/shader/drawtag.h @@ -2,36 +2,39 @@ // Common data structures and functions for the draw tag stream. +// Design of draw tag: & 0x1c gives scene size in bytes +// & 1 gives clip +// (tag >> 4) & 0x1c is info size in bytes + +#define Drawtag_Nop 0 +#define Drawtag_FillColor 0x44 +#define Drawtag_FillLinGradient 0x114 +#define Drawtag_FillImage 0x48 +#define Drawtag_BeginClip 0x05 +#define Drawtag_EndClip 0x25 + struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; -DrawMonoid tag_monoid_identity() { - return DrawMonoid(0, 0); +DrawMonoid draw_monoid_identity() { + return DrawMonoid(0, 0, 0, 0); } -DrawMonoid combine_tag_monoid(DrawMonoid a, DrawMonoid b) { +DrawMonoid combine_draw_monoid(DrawMonoid a, DrawMonoid b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; + c.scene_offset = a.scene_offset + b.scene_offset; + c.info_offset = a.info_offset + b.info_offset; return c; } -#ifdef Element_size DrawMonoid map_tag(uint tag_word) { - switch (tag_word) { - case Element_FillColor: - case Element_FillLinGradient: - case Element_FillImage: - return DrawMonoid(1, 0); - case Element_BeginClip: - // TODO: endclip should be (0, 1), ie not generate a path. But for now - // we generate a dummy path. - case Element_EndClip: - return DrawMonoid(1, 1); - default: - return DrawMonoid(0, 0); - } + // TODO: at some point, EndClip should not generate a path + uint has_path = uint(tag_word != Drawtag_Nop); + return DrawMonoid(has_path, tag_word & 1, tag_word & 0x1c, (tag_word >> 4) & 0x1c); } -#endif diff --git a/piet-gpu/shader/gen/backdrop.dxil b/piet-gpu/shader/gen/backdrop.dxil index 4ebcb1cc55f84fabfcb69250b09215f2e5f48a4a..df2be88d04c2feced45175e7cabf1f0b1f17135d 100644 GIT binary patch delta 1806 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 P&?;o!0GpMxKaBqX*b{zj diff --git a/piet-gpu/shader/gen/backdrop.hlsl b/piet-gpu/shader/gen/backdrop.hlsl index a2e71a8..aba3cff 100644 --- a/piet-gpu/shader/gen/backdrop.hlsl +++ b/piet-gpu/shader/gen/backdrop.hlsl @@ -3,17 +3,6 @@ struct Alloc uint offset; }; -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct PathRef { uint offset; @@ -42,12 +31,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -55,12 +46,14 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -RWByteAddressBuffer _79 : register(u0, space0); -ByteAddressBuffer _186 : register(t1, space0); +RWByteAddressBuffer _67 : register(u0, space0); +ByteAddressBuffer _166 : register(t1, space0); static uint3 gl_LocalInvocationID; static uint3 gl_GlobalInvocationID; @@ -89,24 +82,10 @@ uint read_mem(Alloc alloc, uint offset) { return 0u; } - uint v = _79.Load(offset * 4 + 8); + uint v = _67.Load(offset * 4 + 8); return v; } -AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1); - AnnotatedTag _121 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _121; -} - -uint fill_mode_from_flags(uint flags) -{ - return flags & 1u; -} - Path Path_read(Alloc a, PathRef ref) { uint ix = ref.offset >> uint(2); @@ -121,8 +100,8 @@ Path Path_read(Alloc a, PathRef ref) uint raw2 = read_mem(param_4, param_5); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); - TileRef _165 = { raw2 }; - s.tiles = _165; + TileRef _134 = { raw2 }; + s.tiles = _134; return s; } @@ -141,88 +120,65 @@ void write_mem(Alloc alloc, uint offset, uint val) { return; } - _79.Store(offset * 4 + 8, val); + _67.Store(offset * 4 + 8, val); } void comp_main() { uint th_ix = gl_LocalInvocationIndex; uint element_ix = gl_GlobalInvocationID.x; - AnnotatedRef _194 = { _186.Load(32) + (element_ix * 40u) }; - AnnotatedRef ref = _194; uint row_count = 0u; - bool mem_ok = _79.Load(4) == 0u; + bool mem_ok = _67.Load(4) == 0u; if (gl_LocalInvocationID.y == 0u) { - if (element_ix < _186.Load(0)) + if (element_ix < _166.Load(0)) { - Alloc _217; - _217.offset = _186.Load(32); + PathRef _180 = { _166.Load(16) + (element_ix * 12u) }; + PathRef path_ref = _180; + Alloc _185; + _185.offset = _166.Load(16); Alloc param; - param.offset = _217.offset; - AnnotatedRef param_1 = ref; - AnnotatedTag tag = Annotated_tag(param, param_1); - switch (tag.tag) + param.offset = _185.offset; + PathRef param_1 = path_ref; + Path path = Path_read(param, param_1); + sh_row_width[th_ix] = path.bbox.z - path.bbox.x; + row_count = path.bbox.w - path.bbox.y; + bool _210 = row_count == 1u; + bool _216; + if (_210) { - case 3u: - case 2u: - case 4u: - case 1u: - { - uint param_2 = tag.flags; - if (fill_mode_from_flags(param_2) != 0u) - { - break; - } - PathRef _243 = { _186.Load(16) + (element_ix * 12u) }; - PathRef path_ref = _243; - Alloc _247; - _247.offset = _186.Load(16); - Alloc param_3; - param_3.offset = _247.offset; - PathRef param_4 = path_ref; - Path path = Path_read(param_3, param_4); - sh_row_width[th_ix] = path.bbox.z - path.bbox.x; - row_count = path.bbox.w - path.bbox.y; - bool _272 = row_count == 1u; - bool _278; - if (_272) - { - _278 = path.bbox.y > 0u; - } - else - { - _278 = _272; - } - if (_278) - { - row_count = 0u; - } - uint param_5 = path.tiles.offset; - uint param_6 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_7 = mem_ok; - Alloc path_alloc = new_alloc(param_5, param_6, param_7); - sh_row_alloc[th_ix] = path_alloc; - break; - } + _216 = path.bbox.y > 0u; } + else + { + _216 = _210; + } + if (_216) + { + row_count = 0u; + } + uint param_2 = path.tiles.offset; + uint param_3 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_4 = mem_ok; + Alloc path_alloc = new_alloc(param_2, param_3, param_4); + sh_row_alloc[th_ix] = path_alloc; } sh_row_count[th_ix] = row_count; } for (uint i = 0u; i < 8u; i++) { GroupMemoryBarrierWithGroupSync(); - bool _325 = gl_LocalInvocationID.y == 0u; - bool _332; - if (_325) + bool _262 = gl_LocalInvocationID.y == 0u; + bool _269; + if (_262) { - _332 = th_ix >= (1u << i); + _269 = th_ix >= (1u << i); } else { - _332 = _325; + _269 = _262; } - if (_332) + if (_269) { row_count += sh_row_count[th_ix - (1u << i)]; } @@ -234,7 +190,7 @@ void comp_main() } GroupMemoryBarrierWithGroupSync(); uint total_rows = sh_row_count[255]; - uint _411; + uint _348; for (uint row = th_ix; row < total_rows; row += 256u) { uint el_ix = 0u; @@ -252,27 +208,27 @@ void comp_main() Alloc tiles_alloc = sh_row_alloc[el_ix]; if (el_ix > 0u) { - _411 = sh_row_count[el_ix - 1u]; + _348 = sh_row_count[el_ix - 1u]; } else { - _411 = 0u; + _348 = 0u; } - uint seq_ix = row - _411; + uint seq_ix = row - _348; uint tile_el_ix = ((tiles_alloc.offset >> uint(2)) + 1u) + ((seq_ix * 2u) * width); - Alloc param_8 = tiles_alloc; - uint param_9 = tile_el_ix; - uint sum = read_mem(param_8, param_9); + Alloc param_5 = tiles_alloc; + uint param_6 = tile_el_ix; + uint sum = read_mem(param_5, param_6); for (uint x = 1u; x < width; x++) { tile_el_ix += 2u; - Alloc param_10 = tiles_alloc; - uint param_11 = tile_el_ix; - sum += read_mem(param_10, param_11); - Alloc param_12 = tiles_alloc; - uint param_13 = tile_el_ix; - uint param_14 = sum; - write_mem(param_12, param_13, param_14); + Alloc param_7 = tiles_alloc; + uint param_8 = tile_el_ix; + sum += read_mem(param_7, param_8); + Alloc param_9 = tiles_alloc; + uint param_10 = tile_el_ix; + uint param_11 = sum; + write_mem(param_9, param_10, param_11); } } } diff --git a/piet-gpu/shader/gen/backdrop.msl b/piet-gpu/shader/gen/backdrop.msl index be670fc..1c0a0bb 100644 --- a/piet-gpu/shader/gen/backdrop.msl +++ b/piet-gpu/shader/gen/backdrop.msl @@ -10,17 +10,6 @@ struct Alloc uint offset; }; -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct PathRef { uint offset; @@ -61,12 +50,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -74,6 +65,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -90,7 +83,7 @@ bool touch_mem(thread const Alloc& alloc, thread const uint& offset) } static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_79) +uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_67) { Alloc param = alloc; uint param_1 = offset; @@ -98,38 +91,23 @@ uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memor { return 0u; } - uint v = v_79.memory[offset]; + uint v = v_67.memory[offset]; return v; } static inline __attribute__((always_inline)) -AnnotatedTag Annotated_tag(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_79) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1, v_79); - return AnnotatedTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; -} - -static inline __attribute__((always_inline)) -uint fill_mode_from_flags(thread const uint& flags) -{ - return flags & 1u; -} - -static inline __attribute__((always_inline)) -Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_79) +Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_67) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_79); + uint raw0 = read_mem(param, param_1, v_67); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_79); + uint raw1 = read_mem(param_2, param_3, v_67); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_79); + uint raw2 = read_mem(param_4, param_5, v_67); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); s.tiles = TileRef{ raw2 }; @@ -145,7 +123,7 @@ Alloc new_alloc(thread const uint& offset, thread const uint& size, thread const } static inline __attribute__((always_inline)) -void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_79) +void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_67) { Alloc param = alloc; uint param_1 = offset; @@ -153,85 +131,65 @@ void write_mem(thread const Alloc& alloc, thread const uint& offset, thread cons { return; } - v_79.memory[offset] = val; + v_67.memory[offset] = val; } -kernel void main0(device Memory& v_79 [[buffer(0)]], const device ConfigBuf& _186 [[buffer(1)]], uint gl_LocalInvocationIndex [[thread_index_in_threadgroup]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(device Memory& v_67 [[buffer(0)]], const device ConfigBuf& _166 [[buffer(1)]], uint gl_LocalInvocationIndex [[thread_index_in_threadgroup]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { threadgroup uint sh_row_width[256]; threadgroup Alloc sh_row_alloc[256]; threadgroup uint sh_row_count[256]; uint th_ix = gl_LocalInvocationIndex; uint element_ix = gl_GlobalInvocationID.x; - AnnotatedRef ref = AnnotatedRef{ _186.conf.anno_alloc.offset + (element_ix * 40u) }; uint row_count = 0u; - bool mem_ok = v_79.mem_error == 0u; + bool mem_ok = v_67.mem_error == 0u; if (gl_LocalInvocationID.y == 0u) { - if (element_ix < _186.conf.n_elements) + if (element_ix < _166.conf.n_elements) { + PathRef path_ref = PathRef{ _166.conf.tile_alloc.offset + (element_ix * 12u) }; Alloc param; - param.offset = _186.conf.anno_alloc.offset; - AnnotatedRef param_1 = ref; - AnnotatedTag tag = Annotated_tag(param, param_1, v_79); - switch (tag.tag) + param.offset = _166.conf.tile_alloc.offset; + PathRef param_1 = path_ref; + Path path = Path_read(param, param_1, v_67); + sh_row_width[th_ix] = path.bbox.z - path.bbox.x; + row_count = path.bbox.w - path.bbox.y; + bool _210 = row_count == 1u; + bool _216; + if (_210) { - case 3u: - case 2u: - case 4u: - case 1u: - { - uint param_2 = tag.flags; - if (fill_mode_from_flags(param_2) != 0u) - { - break; - } - PathRef path_ref = PathRef{ _186.conf.tile_alloc.offset + (element_ix * 12u) }; - Alloc param_3; - param_3.offset = _186.conf.tile_alloc.offset; - PathRef param_4 = path_ref; - Path path = Path_read(param_3, param_4, v_79); - sh_row_width[th_ix] = path.bbox.z - path.bbox.x; - row_count = path.bbox.w - path.bbox.y; - bool _272 = row_count == 1u; - bool _278; - if (_272) - { - _278 = path.bbox.y > 0u; - } - else - { - _278 = _272; - } - if (_278) - { - row_count = 0u; - } - uint param_5 = path.tiles.offset; - uint param_6 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_7 = mem_ok; - Alloc path_alloc = new_alloc(param_5, param_6, param_7); - sh_row_alloc[th_ix] = path_alloc; - break; - } + _216 = path.bbox.y > 0u; } + else + { + _216 = _210; + } + if (_216) + { + row_count = 0u; + } + uint param_2 = path.tiles.offset; + uint param_3 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_4 = mem_ok; + Alloc path_alloc = new_alloc(param_2, param_3, param_4); + sh_row_alloc[th_ix] = path_alloc; } sh_row_count[th_ix] = row_count; } for (uint i = 0u; i < 8u; i++) { threadgroup_barrier(mem_flags::mem_threadgroup); - bool _325 = gl_LocalInvocationID.y == 0u; - bool _332; - if (_325) + bool _262 = gl_LocalInvocationID.y == 0u; + bool _269; + if (_262) { - _332 = th_ix >= (1u << i); + _269 = th_ix >= (1u << i); } else { - _332 = _325; + _269 = _262; } - if (_332) + if (_269) { row_count += sh_row_count[th_ix - (1u << i)]; } @@ -243,7 +201,7 @@ kernel void main0(device Memory& v_79 [[buffer(0)]], const device ConfigBuf& _18 } threadgroup_barrier(mem_flags::mem_threadgroup); uint total_rows = sh_row_count[255]; - uint _411; + uint _348; for (uint row = th_ix; row < total_rows; row += 256u) { uint el_ix = 0u; @@ -261,27 +219,27 @@ kernel void main0(device Memory& v_79 [[buffer(0)]], const device ConfigBuf& _18 Alloc tiles_alloc = sh_row_alloc[el_ix]; if (el_ix > 0u) { - _411 = sh_row_count[el_ix - 1u]; + _348 = sh_row_count[el_ix - 1u]; } else { - _411 = 0u; + _348 = 0u; } - uint seq_ix = row - _411; + uint seq_ix = row - _348; uint tile_el_ix = ((tiles_alloc.offset >> uint(2)) + 1u) + ((seq_ix * 2u) * width); - Alloc param_8 = tiles_alloc; - uint param_9 = tile_el_ix; - uint sum = read_mem(param_8, param_9, v_79); + Alloc param_5 = tiles_alloc; + uint param_6 = tile_el_ix; + uint sum = read_mem(param_5, param_6, v_67); for (uint x = 1u; x < width; x++) { tile_el_ix += 2u; - Alloc param_10 = tiles_alloc; - uint param_11 = tile_el_ix; - sum += read_mem(param_10, param_11, v_79); - Alloc param_12 = tiles_alloc; - uint param_13 = tile_el_ix; - uint param_14 = sum; - write_mem(param_12, param_13, param_14, v_79); + Alloc param_7 = tiles_alloc; + uint param_8 = tile_el_ix; + sum += read_mem(param_7, param_8, v_67); + Alloc param_9 = tiles_alloc; + uint param_10 = tile_el_ix; + uint param_11 = sum; + write_mem(param_9, param_10, param_11, v_67); } } } diff --git a/piet-gpu/shader/gen/backdrop.spv b/piet-gpu/shader/gen/backdrop.spv index f90bf6e577b8d16768e7caa5e093ab6b80ff3021..2bd17d8069b3d234ab7866cc0dfca0df47d22062 100644 GIT binary patch literal 11508 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 U9ItJR;|I|1MD+W9ihV!74`1Evg#Z8m literal 12840 zcmb7~d7NBTmB(Mw)t!*AB!qnl9TG@@5J(7t5KzKmzzHTm5L~dV?yl~XR97|K)k$Db zBZ~+kA|R-^fRRPRW)wx-B18$|?u;`!8#B!M(b>fX2le}X^-lVBD}T(Bwlz z?8UfFbO{-()EYV-Lbf40ks0LBHxn_LW0Vg5HyQmTMv2*1tuC)xvu4%mv&+3hL*SlUTaj#eYN3gZ>zSUYTVQ$uGZ+SkM^YjokXN{XisB~mGyeF7u`jr+CI(x{*h`c zgPFn_vaC_vSgshiV07^c{^?n~0$(ZHeOzoQ+XH)~b|uv~wnQ&jcXhDbyi9vqwl8+8 zIoi9v47*^YH9XqeIyNuh*wMv#=JvQ*#O3o9dGCQFzm7VcFX2r_t)z6@?eua=pSwlmiz0K zff3t>E6*|47|Go3%8o>@Y&4p!N~_v;LA4(<-xGPCvHV@x0_na2KJxTIDEhzU> z+w(Lw&x~v#_O7vIBL8q7Vq=nO^8F!WM|L#hD~R|Q^f0B`lSSaQmDYMocW!N;vARpy zV(fLbdNpFSebSgE*yfQpkG4-wPjizxIM>x8SG#|EX3MZ0S9Swmc1=Zv?d9ZaSjxCq z&xzpndOEU`ck!j{Oz==;xH5=#t!GcL&%-{iI@lb(!uq;0ZJ+$?7w=N=)-7Kh9&QeU zU61j;@9=pJd%FhP$N4Tor}JMt&hE&{*cBOZntueu3;XZ8qj)p~WX+Gyp29J39M zF{|p$o^gZD%5!#PkD=pSe-4~qQE2x{+b2D#Mba^(-Nrk@U7uWW2A5d@9&83>sb8Me2vrL`#4yG%|^4< z7v8a&{XOZe*M`Cqwe1mnPpx;%*Uss0Og?6$Rq4GfykmX!_bc}&1-Xy*d)!t zb2D?!PMD+3?VWRG8Ou8huD$j+3HsVK`FrK>b9+Bie|xX}9driY)9}Vx_bYsyj$J;_ z@#FCAGj_(PKMvL==hMsCQ+sbbA>eV$Q|RI5#&U0Sw9(4BQnmw~-%DH+z6(3C|H%8} ztB~jWbF{xFzNbF|r+3I-Pq3dKXLn{l&F%b7F6t{~KQA~`p7Vv=9=ls#9A|S{d0|Gl z)mcW~&i1&@>_B*X7&~r#^K))2*U=N~W5(HC+40y#?s!e8sViGH#z*V&UYr77%j@pU zD&Q8s)^$tc{kHd2IIMhKO>ngy_f$tVv}jhnBMK<9wz3yE7g8^aTGi z6YOUbdlj{=W?k$YD9g^Fn)p4Oi|rE}!!o%v&U;YKJ7*O=b!^KJ;v z9?2b$aNfgmQL}T{3%PD2#(MY4%}Y4%UAYAb=lbOqCY-g(`2!#Mykq5-CY*Px+{p>& zeJXcq!nsbl(-Y2nRPL;V^B$EuC*izD#>|(e}?jZ)pDjhqix)n8h!)XLSzQ%qQNL827Xr z@#)5PKNb0Xh;lFG-9LHl*<^6v+HU^*jDJw0Y(B$M&r0^W89Z zabcT#30S|JxlcgLncF<}bve2lnS>lu*r$Mfjv}9ZI2}0@>{)WI+2r#65G(T5_8PQ3 z(zl|py-VaGw`Wh=_zMec4*lv&5udOJz)_q27V^8_jpf^jJp+mOTfmY34zRs)&CYjE zVcV0aXA9W;`tK|J_DlQ0!sooMN87v5czgdSTA%0C_)nwt$s4b|t>D}n?@8llbJD$k z#Hr~2|42G^B6dFCN$0V)FQDyQrzgr^z2?cgc%$a9O><8ByA@G~{YYZZ2S1kB#yyqT-fue++dcEUGxB*4{3x-_ z=eKA0)z2rkcg9Z>`wsBW6We@#cgA?*{q77~zu%W(tNpf2ZNDwUwtl}Y!&dvPnA(*I zw%>}W-|xlL_Iok4{bo#UzZt`}UcVW`R{On}+ILN`{eDdSemjP3KEEHsR{Q;!+I~NV zZT$AcmiO;2Q@`JkVXOUyOl`j*wNK+b`K~;Sc!#}$)8^UIUdf5`Zu<=4eRU}k@t-Yt z<2`%YE6M2H{UyXZ#NP|=4t0$CGFX4uUjaM*TIRBj?TDOr%;tjo8rX5$k+sx&B>G82 z-uXT2+G5YSby~Z%d>vVXY(ZkqZxsBei18kH8j*9HIea(dV*Ss6z2gRu$nj0EeB^i* zEN6~ilH=QGpBJfD-?tDs-(zv)`3~6iuVnSs`&}e@m-g*@h40a#=I>)WR^Iu3i1u+l zeLq0toKI|i@8Z8iBENfM9p249E_~+~J^x9;q4GX>R{jd{Ua&6vq-~rz+>^gS+zWl) z7uw62*WZG_MHV8C*Jq4(j=X&~|KA~U=8yh72bOn@|A6-S4PR`}p|v}Zzegq)+B;Kw zQlVYHcFggQVCP8B!#`omThsGs?d3%u{uw+Ek>6VM{$IfIvDg0w_ObW+{uPmPZt<_t z)~YQZ@5#S|pFmvi&k7yu{ts;ZVgD!Ca}w{#e}m=x?Tq*2f548@=X)PtAa!A>f^7$FCf-#Zf)bt;k>^=oKN42h3#2b0{%Z_8RB?- z#`t?7AM2gO25!Z+R?o&{Y-61779`?2;PpjZDT#A`BCZo&-_^ywc7Yu$pPvo1zu6uf z=e8zo<0AJoaMa*8MdY3i))#TRCvgKw4ST@riyHO>J67KLo+4H*^6mwei#uipwwyVA zANB_Oc<%JgMC3eY;;3g9IO&9}KTA;tomT(mg&DUSITgHrTQ9G4?QU%#rS4 zH@v=xo0G()Jv$s;U(7KV>{$7DH|K$!TVHTTg5{4uVvYr1YuSQ$u4CVig4buy=A*U6 zegm1uIQL>9cn4aa-$UBV*(bkEj|K0AcD&>C8|QbHzL;w<*!N7^aZ9j`@tyEncPVl_ zVw~f(jY;n`?>6oDy-`R0lZcJ{UGOJkd#2-^TaNAbvvKCvHpYDMd#TpvH(s2d6=2Vn z`WMuG8u}H8k7Hk1_|;L%>0oojZ|F*}oO|NA)jkz5m$}8y!Fv{!GqA1uLGYR2o#^yz zoCPNz@9WuMIcxSESq1iSE`6^;|C62n*fYZ9xVyAVTk8NG@@qSzYcAUQ0^9#Z5 zxxUD~4lEz`MPScK{IE@dL39U_UjE`AN!*3 z^@yB(5l5|W1gCwu6gxfRZ^CxH##y_zG1eaW)Y_h5^Q$9&8El`U7jFj3ZK1Y!FXSA* z0_}Lu@E_~N6!>1mdU}wUqp#r2R{?8>uOICC^i{#y&NYB`F17Dq4gD6xNB?DoUmdyX zU~_~$2zI`BCmUd6%sOT*8VQAT%28fa_QdL=NNw@*#5>k-wni0^uzBMAd<-m?o}at1 zJwN(l+&y4Xag$KHMpY~R)1ZI7eB zfcWTtqVTI@?k|GP5%!nBt~KtuFN2Md_Z(?|9x=CbiDT?nz^)^D@>Q^$y|h++a>m<} zuYsc{+riqA>nU*byvZ*0NU}j+&_tb$2ckfduI2^KPUK1M^0kg z6!h*1-lM>~q4z}0GXw44J-e?Wm9e_(}MBt)P5GW`CON=+R=wsfz7YaaoV17*R=|9ZI03R0KJeu2hr#6&a2TrzL)anB68L! zeu+I4%f+1MgPk+%3&5_+KXYD)UWcqfyf=-tHaX+W7rpat>PCDHMWT1J3v5pgL!5sO zI{I}HIPKTP6YO$fNB>@nZBFZOtaj9X3D`OGnMXVN_d2lsbBw;|-|NBp?B5&FKK4)k z4TzjIi#;!w7PfrM`)087M$anX=$XEV>jCStKG&rkzFx4LbBNQv&cpUO9I>zVYc674 zN1!7|f5AUpd`qs!mK#9Ks~ve4fEOY@M1u<-65PZ28Lz zJKp6wws}rLqRv6EeEc>yz;d23W2T{p5Nokl&Y>+fzwvSR4}-fAWAqtgjq)+y2v{!q zG76S!ArZ3yY)sU&2`sk}SxZ0d*A<9k_1RDD=;spfGQ{TuB>K6uz{jCaMC|8D=;-HF z;OM7%b7I@yYZ6=kbrbCC6WjP36WjQkCfGM8w(++nw(++o_8s6m3p@7nt=O(3-OsmS z%SZ3t4wiF2-4E9&7rlN5ST25tt_I8bZpHpz3$}NTw+Gr{*Kd66|2x6mh%x$%*^HKt z`Q8Oi=eq%0ZlH+qyuBNV`Rt*#x$K|uG2eT@-H0*zjByX-W4`x-)A`D3|p@Ko=nOAJCVDwt-(3WVT|YJ9`wf%&y?rKwP@dsL=B$+yFUMY i#A5Wlh@9i^L*I`$ehcDwZDSnoJNN*i-}h7O`}uoa@2jT( diff --git a/piet-gpu/shader/gen/backdrop_lg.dxil b/piet-gpu/shader/gen/backdrop_lg.dxil index e6b2f1aa3f98102c410ab7d255fec28fe675633d..81f9b65020f5dac11613769a9743e7e8296c7629 100644 GIT binary patch delta 1806 zcmZWp4@?`^8Gm=aJOANK&Ng-~I7l`GW@56Qy%s}7w>!=ul#uMwLII^x&LIXj1wvvv zb;>mV;ZI0qDkzMg5H*)jF_JlvQ@Rw^Z1Q0zjVNho+HSOB8QB^O4FU-b7oi>oWe zl|CEM$P#{$XiiF8_Jo|B;H*>f8gWSI?z?sQR(@Z6uCJ|%sy@EH2vg3}P+5WI8puj+3RG>07gleXKQd0nt{3t=q1 z3qYZ%C#cVV0EU`@WA3riKZZ*4p#lv%$i4CH=oHh+?`r_R zK3W+Z`^!ImzcNfbsHj`1P`i691@8y8U(&yRi9EFG5BNiPSCzvN;Mew0B`>9xA{^a9 zKkd?V>Qi)#qicMPlP?FK&2t9FMvYjlQi9p#l{ruaSgbYW!Q3G%i- zb4M&*efe*F@mOnB{}3$RfOGWtuLiA7sC@PRDQ|t$aFf5w$VEd4>|PW0LXpzJM)+V& zKk1n!sSw~)uiw7SKHw<>O-og*9I*Xknz-mZYJBsZ{ax?^EH z_#GCHSjyG)71lt`Pr?P1z24W4KflnU?`3IVeT^bL*abkO^t-lqad>pECypB8%mV7{ zk`svGNfoo3A!|UFWRi9K_orrP(n>`bFo~r@EWTs{t~q0t%A6e1q*+|ZKgh*s8s-o= zmLaXFpURN+9*JX!S|akHo8BcHX3{#oWTBizXtRyk-3|js?dCj!fQm`$==L)+MXERA z@SxJw8SBPDCkwBE&U-zQIVlcvg;9e_1vo}X`$FcL$Qp><>nYXT6o-8mq77)1gsz^{ z=2-5im>z4FNRC^pxUErLm2bxgPQ{rdUy5agU5jC?k@=%QbNI!CWf|4HK;QS}pt>a8 z)*f|@v^io@w7ov#=LqH`*QreiE|MNWrmH)BEXKwo;Ff9`=WJ*jV#fLrcawq&nG)D4ks0=rTQ|=F@?4FlY3_+8JE) zEWYN&o)nO>fs5=@pI|kjsSeq@!GHOR$!=Iv_%-dxUQPvL)U=*6hPH9*-Zj&YzBD;} z>iw)ZW&c*G&}-3#=!F-3`EcKhyGQ)ugg7kCglS-bpXh$VrMV$~Fi*&I%a*TgbmtD< zfi))lCEX%kgO_G$kGXg{4h&l`?f`0%0FRa F{2M5!TKE6} delta 1905 zcmZWoeNYo;8h`gAo6WMw1_CS}wTWO31LB53KuhN~iBO8*1+)~@-fch}K?#gluU?(W zCNVM6=s+Wia`hHLC+9~e!YLoc83M?06fJnY79EBGhO^XRZn&HN(V1he_vWyj>D)WB z`|kUDf6uee^Lw6WIcYRGepk8C^!E#GdrTHDXD~c6pZ&)-PY?jWuE>`7c$p*zV6bIJ zul5cBfBg1(pBJMw zu9BB%-n*(B#zB7hJTPBFq&G3%0*&E1#RAaaJ4Km%-(!sWS^i=w@#n)1kdqK;tngR_ zQZP*wF`S;b%4}GasC6{01XJ;EgAiR|I1leXoTw5?sGQ|6X@c~0ZUoe4gVC3)2 z%&a^=_;h??cKIf5h|b83{Vb!u|4-SyTaf89^cRoPy^lXFvKE@Z)QmJ<*=Gt%O7$K6 zT~caQd!)L0eD&bc#EZF?OJfr+ZsL14L*s$mzHW7PZ}tE;0DbgtLCVh3U)-2Hzb8H7 z<<`gNt=7WT_o1h_4{tYiruy33BS(>*dYK;GQUA%|tfC*{Tq$qe<($Sp{3@imNUhgE zLVsR^BM|?w2A6xD$-hU4Pr`DSG{6^z)%bXd)zH-?q^y8Hjf-<6_$S%{wLe9O!?0%S z>K8-xi){(Ss9H-_Y)aG2@j=fh8Dwd8E30bEm{ zppFe3o#C0UTI*8$R9ohT8taMEbI)g=&d)7FLHV(%;U%{C#{J;ERy+NWzI#VBD`c`d za!`TB*0DziBIqpoAS(vl26`0Gw*vQ`-S6*eY3-jbRycHrK1e@VeY~-z-ntjPu86z# z(R*zBdsk*J4*5;)Z!*rtMMHYbUg=ww^eC z%3Kd4YTS#4_cX}VsLi4VAQm=q6#i~nsF_vp!4CsUFR5!KzDZj9A%e=3k_$f-bsaR- zc^WIsmPCxY1rX(gO(#P`5GOid-w)(!)=EzCbQ6ocW+japTF0KeWM>^p3kvSo}T*Mv+BXllb)Jr5Y%`E4|Bp&e$nm=t&Z z2jtTXz=Oiat`g2Es`717sIG_|{iAuSn_GD7cVc>|e(@a!eTLuyGE`h!(af$}OwsuE4CT`hv7W-)2qm zLLX_?b?$a@Y#wFa!2`o$Os>)lV>iu5SlQ=|vqA_NrxS z(#IE*9o?apsX%KaG$&ab?*|*tc?g~OR_SHGyIZ6t7j@>J_}gX{H#;7L_|yhgerY_;|e6Jxi6vfe#k>xCd#lTrT;LagO zh0llNcJ^3YsfKZG#nSM~Ky|>y(+}v+7*Ft$CK1)oWc=QwCJwkyhR9q*i2Sb*dE}QN UGJ7sWPEkU#L5u34+n?5d0gnxSr2qf` diff --git a/piet-gpu/shader/gen/backdrop_lg.hlsl b/piet-gpu/shader/gen/backdrop_lg.hlsl index 5071af2..c506403 100644 --- a/piet-gpu/shader/gen/backdrop_lg.hlsl +++ b/piet-gpu/shader/gen/backdrop_lg.hlsl @@ -3,17 +3,6 @@ struct Alloc uint offset; }; -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct PathRef { uint offset; @@ -42,12 +31,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -55,12 +46,14 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 4u, 1u); -RWByteAddressBuffer _79 : register(u0, space0); -ByteAddressBuffer _186 : register(t1, space0); +RWByteAddressBuffer _67 : register(u0, space0); +ByteAddressBuffer _166 : register(t1, space0); static uint3 gl_LocalInvocationID; static uint3 gl_GlobalInvocationID; @@ -89,24 +82,10 @@ uint read_mem(Alloc alloc, uint offset) { return 0u; } - uint v = _79.Load(offset * 4 + 8); + uint v = _67.Load(offset * 4 + 8); return v; } -AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1); - AnnotatedTag _121 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _121; -} - -uint fill_mode_from_flags(uint flags) -{ - return flags & 1u; -} - Path Path_read(Alloc a, PathRef ref) { uint ix = ref.offset >> uint(2); @@ -121,8 +100,8 @@ Path Path_read(Alloc a, PathRef ref) uint raw2 = read_mem(param_4, param_5); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); - TileRef _165 = { raw2 }; - s.tiles = _165; + TileRef _134 = { raw2 }; + s.tiles = _134; return s; } @@ -141,88 +120,65 @@ void write_mem(Alloc alloc, uint offset, uint val) { return; } - _79.Store(offset * 4 + 8, val); + _67.Store(offset * 4 + 8, val); } void comp_main() { uint th_ix = gl_LocalInvocationIndex; uint element_ix = gl_GlobalInvocationID.x; - AnnotatedRef _194 = { _186.Load(32) + (element_ix * 40u) }; - AnnotatedRef ref = _194; uint row_count = 0u; - bool mem_ok = _79.Load(4) == 0u; + bool mem_ok = _67.Load(4) == 0u; if (gl_LocalInvocationID.y == 0u) { - if (element_ix < _186.Load(0)) + if (element_ix < _166.Load(0)) { - Alloc _217; - _217.offset = _186.Load(32); + PathRef _180 = { _166.Load(16) + (element_ix * 12u) }; + PathRef path_ref = _180; + Alloc _185; + _185.offset = _166.Load(16); Alloc param; - param.offset = _217.offset; - AnnotatedRef param_1 = ref; - AnnotatedTag tag = Annotated_tag(param, param_1); - switch (tag.tag) + param.offset = _185.offset; + PathRef param_1 = path_ref; + Path path = Path_read(param, param_1); + sh_row_width[th_ix] = path.bbox.z - path.bbox.x; + row_count = path.bbox.w - path.bbox.y; + bool _210 = row_count == 1u; + bool _216; + if (_210) { - case 3u: - case 2u: - case 4u: - case 1u: - { - uint param_2 = tag.flags; - if (fill_mode_from_flags(param_2) != 0u) - { - break; - } - PathRef _243 = { _186.Load(16) + (element_ix * 12u) }; - PathRef path_ref = _243; - Alloc _247; - _247.offset = _186.Load(16); - Alloc param_3; - param_3.offset = _247.offset; - PathRef param_4 = path_ref; - Path path = Path_read(param_3, param_4); - sh_row_width[th_ix] = path.bbox.z - path.bbox.x; - row_count = path.bbox.w - path.bbox.y; - bool _272 = row_count == 1u; - bool _278; - if (_272) - { - _278 = path.bbox.y > 0u; - } - else - { - _278 = _272; - } - if (_278) - { - row_count = 0u; - } - uint param_5 = path.tiles.offset; - uint param_6 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_7 = mem_ok; - Alloc path_alloc = new_alloc(param_5, param_6, param_7); - sh_row_alloc[th_ix] = path_alloc; - break; - } + _216 = path.bbox.y > 0u; } + else + { + _216 = _210; + } + if (_216) + { + row_count = 0u; + } + uint param_2 = path.tiles.offset; + uint param_3 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_4 = mem_ok; + Alloc path_alloc = new_alloc(param_2, param_3, param_4); + sh_row_alloc[th_ix] = path_alloc; } sh_row_count[th_ix] = row_count; } for (uint i = 0u; i < 8u; i++) { GroupMemoryBarrierWithGroupSync(); - bool _325 = gl_LocalInvocationID.y == 0u; - bool _332; - if (_325) + bool _262 = gl_LocalInvocationID.y == 0u; + bool _269; + if (_262) { - _332 = th_ix >= (1u << i); + _269 = th_ix >= (1u << i); } else { - _332 = _325; + _269 = _262; } - if (_332) + if (_269) { row_count += sh_row_count[th_ix - (1u << i)]; } @@ -234,7 +190,7 @@ void comp_main() } GroupMemoryBarrierWithGroupSync(); uint total_rows = sh_row_count[255]; - uint _411; + uint _348; for (uint row = th_ix; row < total_rows; row += 1024u) { uint el_ix = 0u; @@ -252,27 +208,27 @@ void comp_main() Alloc tiles_alloc = sh_row_alloc[el_ix]; if (el_ix > 0u) { - _411 = sh_row_count[el_ix - 1u]; + _348 = sh_row_count[el_ix - 1u]; } else { - _411 = 0u; + _348 = 0u; } - uint seq_ix = row - _411; + uint seq_ix = row - _348; uint tile_el_ix = ((tiles_alloc.offset >> uint(2)) + 1u) + ((seq_ix * 2u) * width); - Alloc param_8 = tiles_alloc; - uint param_9 = tile_el_ix; - uint sum = read_mem(param_8, param_9); + Alloc param_5 = tiles_alloc; + uint param_6 = tile_el_ix; + uint sum = read_mem(param_5, param_6); for (uint x = 1u; x < width; x++) { tile_el_ix += 2u; - Alloc param_10 = tiles_alloc; - uint param_11 = tile_el_ix; - sum += read_mem(param_10, param_11); - Alloc param_12 = tiles_alloc; - uint param_13 = tile_el_ix; - uint param_14 = sum; - write_mem(param_12, param_13, param_14); + Alloc param_7 = tiles_alloc; + uint param_8 = tile_el_ix; + sum += read_mem(param_7, param_8); + Alloc param_9 = tiles_alloc; + uint param_10 = tile_el_ix; + uint param_11 = sum; + write_mem(param_9, param_10, param_11); } } } diff --git a/piet-gpu/shader/gen/backdrop_lg.msl b/piet-gpu/shader/gen/backdrop_lg.msl index 31cd6cd..de43ebe 100644 --- a/piet-gpu/shader/gen/backdrop_lg.msl +++ b/piet-gpu/shader/gen/backdrop_lg.msl @@ -10,17 +10,6 @@ struct Alloc uint offset; }; -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct PathRef { uint offset; @@ -61,12 +50,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -74,6 +65,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -90,7 +83,7 @@ bool touch_mem(thread const Alloc& alloc, thread const uint& offset) } static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_79) +uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_67) { Alloc param = alloc; uint param_1 = offset; @@ -98,38 +91,23 @@ uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memor { return 0u; } - uint v = v_79.memory[offset]; + uint v = v_67.memory[offset]; return v; } static inline __attribute__((always_inline)) -AnnotatedTag Annotated_tag(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_79) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1, v_79); - return AnnotatedTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; -} - -static inline __attribute__((always_inline)) -uint fill_mode_from_flags(thread const uint& flags) -{ - return flags & 1u; -} - -static inline __attribute__((always_inline)) -Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_79) +Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_67) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_79); + uint raw0 = read_mem(param, param_1, v_67); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_79); + uint raw1 = read_mem(param_2, param_3, v_67); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_79); + uint raw2 = read_mem(param_4, param_5, v_67); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); s.tiles = TileRef{ raw2 }; @@ -145,7 +123,7 @@ Alloc new_alloc(thread const uint& offset, thread const uint& size, thread const } static inline __attribute__((always_inline)) -void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_79) +void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_67) { Alloc param = alloc; uint param_1 = offset; @@ -153,85 +131,65 @@ void write_mem(thread const Alloc& alloc, thread const uint& offset, thread cons { return; } - v_79.memory[offset] = val; + v_67.memory[offset] = val; } -kernel void main0(device Memory& v_79 [[buffer(0)]], const device ConfigBuf& _186 [[buffer(1)]], uint gl_LocalInvocationIndex [[thread_index_in_threadgroup]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(device Memory& v_67 [[buffer(0)]], const device ConfigBuf& _166 [[buffer(1)]], uint gl_LocalInvocationIndex [[thread_index_in_threadgroup]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { threadgroup uint sh_row_width[256]; threadgroup Alloc sh_row_alloc[256]; threadgroup uint sh_row_count[256]; uint th_ix = gl_LocalInvocationIndex; uint element_ix = gl_GlobalInvocationID.x; - AnnotatedRef ref = AnnotatedRef{ _186.conf.anno_alloc.offset + (element_ix * 40u) }; uint row_count = 0u; - bool mem_ok = v_79.mem_error == 0u; + bool mem_ok = v_67.mem_error == 0u; if (gl_LocalInvocationID.y == 0u) { - if (element_ix < _186.conf.n_elements) + if (element_ix < _166.conf.n_elements) { + PathRef path_ref = PathRef{ _166.conf.tile_alloc.offset + (element_ix * 12u) }; Alloc param; - param.offset = _186.conf.anno_alloc.offset; - AnnotatedRef param_1 = ref; - AnnotatedTag tag = Annotated_tag(param, param_1, v_79); - switch (tag.tag) + param.offset = _166.conf.tile_alloc.offset; + PathRef param_1 = path_ref; + Path path = Path_read(param, param_1, v_67); + sh_row_width[th_ix] = path.bbox.z - path.bbox.x; + row_count = path.bbox.w - path.bbox.y; + bool _210 = row_count == 1u; + bool _216; + if (_210) { - case 3u: - case 2u: - case 4u: - case 1u: - { - uint param_2 = tag.flags; - if (fill_mode_from_flags(param_2) != 0u) - { - break; - } - PathRef path_ref = PathRef{ _186.conf.tile_alloc.offset + (element_ix * 12u) }; - Alloc param_3; - param_3.offset = _186.conf.tile_alloc.offset; - PathRef param_4 = path_ref; - Path path = Path_read(param_3, param_4, v_79); - sh_row_width[th_ix] = path.bbox.z - path.bbox.x; - row_count = path.bbox.w - path.bbox.y; - bool _272 = row_count == 1u; - bool _278; - if (_272) - { - _278 = path.bbox.y > 0u; - } - else - { - _278 = _272; - } - if (_278) - { - row_count = 0u; - } - uint param_5 = path.tiles.offset; - uint param_6 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_7 = mem_ok; - Alloc path_alloc = new_alloc(param_5, param_6, param_7); - sh_row_alloc[th_ix] = path_alloc; - break; - } + _216 = path.bbox.y > 0u; } + else + { + _216 = _210; + } + if (_216) + { + row_count = 0u; + } + uint param_2 = path.tiles.offset; + uint param_3 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_4 = mem_ok; + Alloc path_alloc = new_alloc(param_2, param_3, param_4); + sh_row_alloc[th_ix] = path_alloc; } sh_row_count[th_ix] = row_count; } for (uint i = 0u; i < 8u; i++) { threadgroup_barrier(mem_flags::mem_threadgroup); - bool _325 = gl_LocalInvocationID.y == 0u; - bool _332; - if (_325) + bool _262 = gl_LocalInvocationID.y == 0u; + bool _269; + if (_262) { - _332 = th_ix >= (1u << i); + _269 = th_ix >= (1u << i); } else { - _332 = _325; + _269 = _262; } - if (_332) + if (_269) { row_count += sh_row_count[th_ix - (1u << i)]; } @@ -243,7 +201,7 @@ kernel void main0(device Memory& v_79 [[buffer(0)]], const device ConfigBuf& _18 } threadgroup_barrier(mem_flags::mem_threadgroup); uint total_rows = sh_row_count[255]; - uint _411; + uint _348; for (uint row = th_ix; row < total_rows; row += 1024u) { uint el_ix = 0u; @@ -261,27 +219,27 @@ kernel void main0(device Memory& v_79 [[buffer(0)]], const device ConfigBuf& _18 Alloc tiles_alloc = sh_row_alloc[el_ix]; if (el_ix > 0u) { - _411 = sh_row_count[el_ix - 1u]; + _348 = sh_row_count[el_ix - 1u]; } else { - _411 = 0u; + _348 = 0u; } - uint seq_ix = row - _411; + uint seq_ix = row - _348; uint tile_el_ix = ((tiles_alloc.offset >> uint(2)) + 1u) + ((seq_ix * 2u) * width); - Alloc param_8 = tiles_alloc; - uint param_9 = tile_el_ix; - uint sum = read_mem(param_8, param_9, v_79); + Alloc param_5 = tiles_alloc; + uint param_6 = tile_el_ix; + uint sum = read_mem(param_5, param_6, v_67); for (uint x = 1u; x < width; x++) { tile_el_ix += 2u; - Alloc param_10 = tiles_alloc; - uint param_11 = tile_el_ix; - sum += read_mem(param_10, param_11, v_79); - Alloc param_12 = tiles_alloc; - uint param_13 = tile_el_ix; - uint param_14 = sum; - write_mem(param_12, param_13, param_14, v_79); + Alloc param_7 = tiles_alloc; + uint param_8 = tile_el_ix; + sum += read_mem(param_7, param_8, v_67); + Alloc param_9 = tiles_alloc; + uint param_10 = tile_el_ix; + uint param_11 = sum; + write_mem(param_9, param_10, param_11, v_67); } } } diff --git a/piet-gpu/shader/gen/backdrop_lg.spv b/piet-gpu/shader/gen/backdrop_lg.spv index 3f90d2e7a26fc770c7f9d83ca91b5fb72d63fe74..ff2b1d72fea710d523ddc3d06141513d45abef9c 100644 GIT binary patch literal 11540 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 literal 12872 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 F3;<2Umy7@a delta 559 zcmaDLaYaJXCBn)1zN*=?<5A%TH|BQnDBJh`V`N}p2-zqZ&u01b!~NImu3jnR7cgg% zUeL1MCBoC^2rC0a0s|{UAy65J&j6$afI8Ly#hsiF+*9OXV940Kk&U0pkP9emBsW7q zQqX5Y52u>@F&1YjRRg8~p431N)((eEmWG_hfVqqdESVV?DkT^g>?TJtJJ+jm9Ny?C z!NZkYEX{UAL5*Xwb3&7Wg0zrRWJh8GM}qSOAAwbAO%rsa#U4d+Bqbb#Ecy!CUG8GkR!1n@rHxIwW+xpE4XHC(aOmw%hk(FNzE$>Zd$-4 zIj=i*=AD>Zvu{sn$Z%?Vo+N%OE!;xQT-D&!goiuNENq=P^`zz`Xf7%S6WdL_h6@Ckz1IEt&+lcvU;)=MA+ALRTuTB@OgR8lpv=a}(3G&Cpr;}6a)%>RgMx%c zta6H!X;K1%0tefX;~C0q96$vZDkd;^F6Lx3xMRSQVsKi3<6s9PNU=$xfvCUfECGg8 zhoDF&22qzNM;2u^UZ9Q-Ga8Sv+}@fyJJ<;(GUwnm7MWv(cY>W^A`2Lwv&@w&iDefR dJlNsL3^dRt^MY+-IorJFuA5nyn1CJt0RZ_uwG03N diff --git a/piet-gpu/shader/gen/bbox_clear.hlsl b/piet-gpu/shader/gen/bbox_clear.hlsl index 903d84c..8a884d3 100644 --- a/piet-gpu/shader/gen/bbox_clear.hlsl +++ b/piet-gpu/shader/gen/bbox_clear.hlsl @@ -15,12 +15,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -28,6 +30,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(512u, 1u, 1u); @@ -44,7 +48,7 @@ struct SPIRV_Cross_Input void comp_main() { uint ix = gl_GlobalInvocationID.x; - if (ix < _21.Load(68)) + if (ix < _21.Load(76)) { uint out_ix = (_21.Load(40) >> uint(2)) + (6u * ix); _45.Store(out_ix * 4 + 8, 65535u); diff --git a/piet-gpu/shader/gen/bbox_clear.msl b/piet-gpu/shader/gen/bbox_clear.msl index e80f15e..c278c68 100644 --- a/piet-gpu/shader/gen/bbox_clear.msl +++ b/piet-gpu/shader/gen/bbox_clear.msl @@ -20,12 +20,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -33,6 +35,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -54,7 +58,7 @@ kernel void main0(device Memory& _45 [[buffer(0)]], const device ConfigBuf& _21 uint ix = gl_GlobalInvocationID.x; if (ix < _21.conf.n_path) { - uint out_ix = (_21.conf.bbox_alloc.offset >> uint(2)) + (6u * ix); + uint out_ix = (_21.conf.path_bbox_alloc.offset >> uint(2)) + (6u * ix); _45.memory[out_ix] = 65535u; _45.memory[out_ix + 1u] = 65535u; _45.memory[out_ix + 2u] = 0u; diff --git a/piet-gpu/shader/gen/bbox_clear.spv b/piet-gpu/shader/gen/bbox_clear.spv index e3e88d76ca71de0a37372ee9df7f1c6c39a54ecc..58a270e31e9ca8418dc37845943753f44fd4208d 100644 GIT binary patch delta 341 zcmdlX-Xpoeh)I&2L5P8YfeVNW5=%1Tlalf);uCXn@{=dKGflRK$O-^uQ;HJHkz^Uz z7$9%`(WhOshPhb?@?8s5h3;_BvK#~9e delta 168 zcmeB?+#$Zfh)I-?EqmSsaWun9?A2&Eekt6s316oFcM-3^gO1tuz05Op@Gw9!({S+7@0 zYc?Uo6tRX8soJX-luo%TJ!7?0ul|uhO4Z^OJUfFu+5^kAw$t{I)>cP4y|)nP&FxGw z`+M*AKEL1l{@(lT52mOo!&+r20sr?P(2kzUATe^)30L#6@NU_q&a71jP1tU|b9>za z0=#1|v^CLq02E@EF+_Pu?3-6Ha5{=n*n{ccym5HV#rGns_g&w01u2VKt5%i`rvV^< zB=DmQ0Lcb0042qMX9g00Z%@nRX4E6Yg)4WWo!@)+E>He7E3#hA05oCKlk+)% zB@A}FTAXG{ws7HdfJk8JiH4FZ5>kAk_ zBrJMzH#Y}o#}V28P6c74*=1Y304NV4*u1=~<_=>@2aq?5S5zWu*nx=y8Nl)+2p&cl z2M$0z4Z!+?CbHaWS;UXOt^yk*ocN%llvcsOHt0%n|+O zBl>$T&>IhDo%r*a!r~rtsNwpEd5U;jV_n~JGio0s;-0x@!cAz`_DcxEu1qJMSstE)4skLW*bW4bJXFP$3}6ut7}7lnDu(a_kr z;igm94qYslw=CQG+>&Qpj;*!3%6D$9ty|~oBr}ff+jMQD=CzTkYa?yKUrGXBuKj{6 zz3-LeTkT(z78T_UpJwq8y2Zf&a38F4I=0a$RWS?xumPZPa(6V=yf!E2(5%WhwAQ3` zaVs^pi(1Blm^F+QS*u}6kzJa#*EALNnkPA>W+!(C*Q_6V%*JcW5WLO8bCs**VkLgS`jrmgH3iKpbT;vJRJC~ zxPm;*roM7(mB)9Y_u#bMeL+f+Ma@bw8Eg{|YT2n+g@Dx(-P zmN1YPFOK(u0W~p`XJi7+9^uQwZfzOs6s3&_f}&HnY+2N@0E@c&s8Gz-MTQoU;03Pg@)(chtMr0 z#t_daPRJ2&0kg(B7ccdUfd9cRP1>!+o095*mb82GT}fxbY}jujiXGI16n4{K zo%WnG?wQW#=7eGwCHBosQ+r@}Mi-xzt5eaMB`NSRi- zA{b}wL&g4;l3@wQXOjc!??B4QiBu^$2T-iF0PXq4^;8<`nN>^ugFA(PSW+vgygHIH zvFPz^Ar26ZBBMgyq*sf+NS70$;^^BzH@a^1@;RN#ZkHIbUnHI871Z+i(KnbqqDqDV zo&}9ZX?YD{a~2rD64xbkv-nXkhCp$P1w?Hxa=N85c`B;>*gy8uSx{eZuI`q&I~Pxe znvAwIJxqO?@ZZX-{p^f?MRglym@UVYb@deb(AhZDEeoxazX7yo{p&$G>l~EOPEL2f zBNZv93i$MbQ>pKQn!eT1ATNU%1ijU9Y#CN)820$fhpi9&5v|iMMsjf_jLhIJQ~KA` zs9#Jk_NM>Gt%&^o0@gwoND0ziE6O7!;dEcc4Sz+vapiZ+pHwm#+^aZ#e7;Ws%!{+f zA8-m%bo=J8)s1kaLya$#k|e-lpjUB-SOP9|H-tV4dL((B*$zN}MBTSx>2yHdzA>l^aPYHr~jnAQS~p|e)Xc(yJrsw@li>xGujU2$I$~r ze$W*z4Eyd5E+*+61ZFy1D;yQ#f^?ggWGqS>u2N}krv2h-t@e4I2>TlKcvE{G`N;L0 zlP1_`FM$Db@d4O!{qhzvYK%QFh}csig3yhXY>K*r8Polgz=shMDP*~&qirt?1P@ug_ zk;ZEL&6Kh%8-{7aFIA?);yhA+P(+1Fchu-zYDWmIHQ&J;da!jNC{^yps_u*R-4~B`zZ4u$Z|eC{lbS6*yEAfkk2%1u8h%j84-c(A!}H?2EU($Zd;_; z8~dceJu0}wQ6PDSN})sGDgl>=Go@8qB&MuRa_-tMIrmIE7fH?&)6NsnIsZc@Tk`(< dbOw8{CnB%2tx=LF7&edEB%)c~4>L?W{{`q@gAo7# delta 2904 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 diff --git a/piet-gpu/shader/gen/binning.hlsl b/piet-gpu/shader/gen/binning.hlsl index e4de1b9..986f42b 100644 --- a/piet-gpu/shader/gen/binning.hlsl +++ b/piet-gpu/shader/gen/binning.hlsl @@ -9,17 +9,6 @@ struct MallocResult bool failed; }; -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct BinInstanceRef { uint offset; @@ -34,6 +23,8 @@ struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; struct Config @@ -48,12 +39,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -61,12 +54,14 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -RWByteAddressBuffer _94 : register(u0, space0); -ByteAddressBuffer _202 : register(t1, space0); +RWByteAddressBuffer _81 : register(u0, space0); +ByteAddressBuffer _156 : register(t1, space0); static uint3 gl_WorkGroupID; static uint3 gl_LocalInvocationID; @@ -81,59 +76,35 @@ groupshared bool sh_alloc_failed; groupshared uint count[8][256]; groupshared Alloc sh_chunk_alloc[256]; -bool touch_mem(Alloc alloc, uint offset) -{ - return true; -} - -uint read_mem(Alloc alloc, uint offset) -{ - Alloc param = alloc; - uint param_1 = offset; - if (!touch_mem(param, param_1)) - { - return 0u; - } - uint v = _94.Load(offset * 4 + 8); - return v; -} - -AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1); - AnnotatedTag _181 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _181; -} - DrawMonoid load_draw_monoid(uint element_ix) { - uint base = (_202.Load(44) >> uint(2)) + (2u * element_ix); - uint path_ix = _94.Load(base * 4 + 8); - uint clip_ix = _94.Load((base + 1u) * 4 + 8); - DrawMonoid _222 = { path_ix, clip_ix }; - return _222; + uint base = (_156.Load(44) >> uint(2)) + (4u * element_ix); + uint path_ix = _81.Load(base * 4 + 8); + uint clip_ix = _81.Load((base + 1u) * 4 + 8); + uint scene_offset = _81.Load((base + 2u) * 4 + 8); + uint info_offset = _81.Load((base + 3u) * 4 + 8); + DrawMonoid _190 = { path_ix, clip_ix, scene_offset, info_offset }; + return _190; } float4 load_clip_bbox(uint clip_ix) { - uint base = (_202.Load(60) >> uint(2)) + (4u * clip_ix); - float x0 = asfloat(_94.Load(base * 4 + 8)); - float y0 = asfloat(_94.Load((base + 1u) * 4 + 8)); - float x1 = asfloat(_94.Load((base + 2u) * 4 + 8)); - float y1 = asfloat(_94.Load((base + 3u) * 4 + 8)); + uint base = (_156.Load(60) >> uint(2)) + (4u * clip_ix); + float x0 = asfloat(_81.Load(base * 4 + 8)); + float y0 = asfloat(_81.Load((base + 1u) * 4 + 8)); + float x1 = asfloat(_81.Load((base + 2u) * 4 + 8)); + float y1 = asfloat(_81.Load((base + 3u) * 4 + 8)); float4 bbox = float4(x0, y0, x1, y1); return bbox; } float4 load_path_bbox(uint path_ix) { - uint base = (_202.Load(40) >> uint(2)) + (6u * path_ix); - float bbox_l = float(_94.Load(base * 4 + 8)) - 32768.0f; - float bbox_t = float(_94.Load((base + 1u) * 4 + 8)) - 32768.0f; - float bbox_r = float(_94.Load((base + 2u) * 4 + 8)) - 32768.0f; - float bbox_b = float(_94.Load((base + 3u) * 4 + 8)) - 32768.0f; + uint base = (_156.Load(40) >> uint(2)) + (6u * path_ix); + float bbox_l = float(_81.Load(base * 4 + 8)) - 32768.0f; + float bbox_t = float(_81.Load((base + 1u) * 4 + 8)) - 32768.0f; + float bbox_r = float(_81.Load((base + 2u) * 4 + 8)) - 32768.0f; + float bbox_b = float(_81.Load((base + 3u) * 4 + 8)) - 32768.0f; float4 bbox = float4(bbox_l, bbox_t, bbox_r, bbox_b); return bbox; } @@ -143,13 +114,13 @@ float4 bbox_intersect(float4 a, float4 b) return float4(max(a.xy, b.xy), min(a.zw, b.zw)); } -void store_path_bbox(AnnotatedRef ref, float4 bbox) +void store_draw_bbox(uint draw_ix, float4 bbox) { - uint ix = ref.offset >> uint(2); - _94.Store((ix + 1u) * 4 + 8, asuint(bbox.x)); - _94.Store((ix + 2u) * 4 + 8, asuint(bbox.y)); - _94.Store((ix + 3u) * 4 + 8, asuint(bbox.z)); - _94.Store((ix + 4u) * 4 + 8, asuint(bbox.w)); + uint base = (_156.Load(64) >> uint(2)) + (4u * draw_ix); + _81.Store(base * 4 + 8, asuint(bbox.x)); + _81.Store((base + 1u) * 4 + 8, asuint(bbox.y)); + _81.Store((base + 2u) * 4 + 8, asuint(bbox.z)); + _81.Store((base + 3u) * 4 + 8, asuint(bbox.w)); } Alloc new_alloc(uint offset, uint size, bool mem_ok) @@ -161,27 +132,32 @@ Alloc new_alloc(uint offset, uint size, bool mem_ok) MallocResult malloc(uint size) { - uint _100; - _94.InterlockedAdd(0, size, _100); - uint offset = _100; - uint _107; - _94.GetDimensions(_107); - _107 = (_107 - 8) / 4; + uint _87; + _81.InterlockedAdd(0, size, _87); + uint offset = _87; + uint _94; + _81.GetDimensions(_94); + _94 = (_94 - 8) / 4; MallocResult r; - r.failed = (offset + size) > uint(int(_107) * 4); + r.failed = (offset + size) > uint(int(_94) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _129; - _94.InterlockedMax(4, 1u, _129); + uint _116; + _81.InterlockedMax(4, 1u, _116); return r; } return r; } +bool touch_mem(Alloc alloc, uint offset) +{ + return true; +} + void write_mem(Alloc alloc, uint offset, uint val) { Alloc param = alloc; @@ -190,7 +166,7 @@ void write_mem(Alloc alloc, uint offset, uint val) { return; } - _94.Store(offset * 4 + 8, val); + _81.Store(offset * 4 + 8, val); } void BinInstance_write(Alloc a, BinInstanceRef ref, BinInstance s) @@ -204,7 +180,6 @@ void BinInstance_write(Alloc a, BinInstanceRef ref, BinInstance s) void comp_main() { - uint my_n_elements = _202.Load(0); uint my_partition = gl_WorkGroupID.x; for (uint i = 0u; i < 8u; i++) { @@ -216,62 +191,42 @@ void comp_main() } GroupMemoryBarrierWithGroupSync(); uint element_ix = (my_partition * 256u) + gl_LocalInvocationID.x; - AnnotatedRef _415 = { _202.Load(32) + (element_ix * 40u) }; - AnnotatedRef ref = _415; - uint tag = 0u; - if (element_ix < my_n_elements) - { - Alloc _425; - _425.offset = _202.Load(32); - Alloc param; - param.offset = _425.offset; - AnnotatedRef param_1 = ref; - tag = Annotated_tag(param, param_1).tag; - } int x0 = 0; int y0 = 0; int x1 = 0; int y1 = 0; - switch (tag) + if (element_ix < _156.Load(0)) { - case 1u: - case 2u: - case 3u: - case 4u: - case 5u: + uint param = element_ix; + DrawMonoid draw_monoid = load_draw_monoid(param); + uint path_ix = draw_monoid.path_ix; + float4 clip_bbox = float4(-1000000000.0f, -1000000000.0f, 1000000000.0f, 1000000000.0f); + uint clip_ix = draw_monoid.clip_ix; + if (clip_ix > 0u) { - uint param_2 = element_ix; - DrawMonoid draw_monoid = load_draw_monoid(param_2); - uint path_ix = draw_monoid.path_ix; - float4 clip_bbox = float4(-1000000000.0f, -1000000000.0f, 1000000000.0f, 1000000000.0f); - uint clip_ix = draw_monoid.clip_ix; - if (clip_ix > 0u) - { - uint param_3 = clip_ix - 1u; - clip_bbox = load_clip_bbox(param_3); - } - uint param_4 = path_ix; - float4 path_bbox = load_path_bbox(param_4); - float4 param_5 = path_bbox; - float4 param_6 = clip_bbox; - float4 bbox = bbox_intersect(param_5, param_6); - float4 _473 = bbox; - float4 _475 = bbox; - float2 _477 = max(_473.xy, _475.zw); - bbox.z = _477.x; - bbox.w = _477.y; - AnnotatedRef param_7 = ref; - float4 param_8 = bbox; - store_path_bbox(param_7, param_8); - x0 = int(floor(bbox.x * 0.00390625f)); - y0 = int(floor(bbox.y * 0.00390625f)); - x1 = int(ceil(bbox.z * 0.00390625f)); - y1 = int(ceil(bbox.w * 0.00390625f)); - break; + uint param_1 = clip_ix - 1u; + clip_bbox = load_clip_bbox(param_1); } + uint param_2 = path_ix; + float4 path_bbox = load_path_bbox(param_2); + float4 param_3 = path_bbox; + float4 param_4 = clip_bbox; + float4 bbox = bbox_intersect(param_3, param_4); + float4 _417 = bbox; + float4 _419 = bbox; + float2 _421 = max(_417.xy, _419.zw); + bbox.z = _421.x; + bbox.w = _421.y; + uint param_5 = element_ix; + float4 param_6 = bbox; + store_draw_bbox(param_5, param_6); + x0 = int(floor(bbox.x * 0.00390625f)); + y0 = int(floor(bbox.y * 0.00390625f)); + x1 = int(ceil(bbox.z * 0.00390625f)); + y1 = int(ceil(bbox.w * 0.00390625f)); } - uint width_in_bins = ((_202.Load(8) + 16u) - 1u) / 16u; - uint height_in_bins = ((_202.Load(12) + 16u) - 1u) / 16u; + uint width_in_bins = ((_156.Load(8) + 16u) - 1u) / 16u; + uint height_in_bins = ((_156.Load(12) + 16u) - 1u) / 16u; x0 = clamp(x0, 0, int(width_in_bins)); x1 = clamp(x1, x0, int(width_in_bins)); y0 = clamp(y0, 0, int(height_in_bins)); @@ -286,8 +241,8 @@ void comp_main() uint my_mask = 1u << (gl_LocalInvocationID.x & 31u); while (y < y1) { - uint _581; - InterlockedOr(bitmaps[my_slice][(uint(y) * width_in_bins) + uint(x)], my_mask, _581); + uint _523; + InterlockedOr(bitmaps[my_slice][(uint(y) * width_in_bins) + uint(x)], my_mask, _523); x++; if (x == x1) { @@ -302,15 +257,15 @@ void comp_main() element_count += uint(int(countbits(bitmaps[i_1][gl_LocalInvocationID.x]))); count[i_1][gl_LocalInvocationID.x] = element_count; } - uint param_9 = 0u; - uint param_10 = 0u; - bool param_11 = true; - Alloc chunk_alloc = new_alloc(param_9, param_10, param_11); + uint param_7 = 0u; + uint param_8 = 0u; + bool param_9 = true; + Alloc chunk_alloc = new_alloc(param_7, param_8, param_9); if (element_count != 0u) { - uint param_12 = element_count * 4u; - MallocResult _631 = malloc(param_12); - MallocResult chunk = _631; + uint param_10 = element_count * 4u; + MallocResult _573 = malloc(param_10); + MallocResult chunk = _573; chunk_alloc = chunk.alloc; sh_chunk_alloc[gl_LocalInvocationID.x] = chunk_alloc; if (chunk.failed) @@ -318,32 +273,32 @@ void comp_main() sh_alloc_failed = true; } } - uint out_ix = (_202.Load(20) >> uint(2)) + (((my_partition * 256u) + gl_LocalInvocationID.x) * 2u); - Alloc _660; - _660.offset = _202.Load(20); - Alloc param_13; - param_13.offset = _660.offset; - uint param_14 = out_ix; - uint param_15 = element_count; - write_mem(param_13, param_14, param_15); - Alloc _672; - _672.offset = _202.Load(20); - Alloc param_16; - param_16.offset = _672.offset; - uint param_17 = out_ix + 1u; - uint param_18 = chunk_alloc.offset; - write_mem(param_16, param_17, param_18); + uint out_ix = (_156.Load(20) >> uint(2)) + (((my_partition * 256u) + gl_LocalInvocationID.x) * 2u); + Alloc _603; + _603.offset = _156.Load(20); + Alloc param_11; + param_11.offset = _603.offset; + uint param_12 = out_ix; + uint param_13 = element_count; + write_mem(param_11, param_12, param_13); + Alloc _615; + _615.offset = _156.Load(20); + Alloc param_14; + param_14.offset = _615.offset; + uint param_15 = out_ix + 1u; + uint param_16 = chunk_alloc.offset; + write_mem(param_14, param_15, param_16); GroupMemoryBarrierWithGroupSync(); - bool _687; + bool _630; if (!sh_alloc_failed) { - _687 = _94.Load(4) != 0u; + _630 = _81.Load(4) != 0u; } else { - _687 = sh_alloc_failed; + _630 = sh_alloc_failed; } - if (_687) + if (_630) { return; } @@ -362,12 +317,12 @@ void comp_main() } Alloc out_alloc = sh_chunk_alloc[bin_ix]; uint out_offset = out_alloc.offset + (idx * 4u); - BinInstanceRef _749 = { out_offset }; - BinInstance _751 = { element_ix }; - Alloc param_19 = out_alloc; - BinInstanceRef param_20 = _749; - BinInstance param_21 = _751; - BinInstance_write(param_19, param_20, param_21); + BinInstanceRef _692 = { out_offset }; + BinInstance _694 = { element_ix }; + Alloc param_17 = out_alloc; + BinInstanceRef param_18 = _692; + BinInstance param_19 = _694; + BinInstance_write(param_17, param_18, param_19); } x++; if (x == x1) diff --git a/piet-gpu/shader/gen/binning.msl b/piet-gpu/shader/gen/binning.msl index 0e3b6c8..2ee5168 100644 --- a/piet-gpu/shader/gen/binning.msl +++ b/piet-gpu/shader/gen/binning.msl @@ -18,17 +18,6 @@ struct MallocResult bool failed; }; -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct BinInstanceRef { uint offset; @@ -43,6 +32,8 @@ struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; struct Memory @@ -69,12 +60,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -82,6 +75,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -92,62 +87,36 @@ struct ConfigBuf constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(256u, 1u, 1u); static inline __attribute__((always_inline)) -bool touch_mem(thread const Alloc& alloc, thread const uint& offset) +DrawMonoid load_draw_monoid(thread const uint& element_ix, device Memory& v_81, constant uint& v_81BufferSize, const device ConfigBuf& v_156) { - return true; + uint base = (v_156.conf.drawmonoid_alloc.offset >> uint(2)) + (4u * element_ix); + uint path_ix = v_81.memory[base]; + uint clip_ix = v_81.memory[base + 1u]; + uint scene_offset = v_81.memory[base + 2u]; + uint info_offset = v_81.memory[base + 3u]; + return DrawMonoid{ path_ix, clip_ix, scene_offset, info_offset }; } static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_94, constant uint& v_94BufferSize) +float4 load_clip_bbox(thread const uint& clip_ix, device Memory& v_81, constant uint& v_81BufferSize, const device ConfigBuf& v_156) { - Alloc param = alloc; - uint param_1 = offset; - if (!touch_mem(param, param_1)) - { - return 0u; - } - uint v = v_94.memory[offset]; - return v; -} - -static inline __attribute__((always_inline)) -AnnotatedTag Annotated_tag(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_94, constant uint& v_94BufferSize) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1, v_94, v_94BufferSize); - return AnnotatedTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; -} - -static inline __attribute__((always_inline)) -DrawMonoid load_draw_monoid(thread const uint& element_ix, device Memory& v_94, constant uint& v_94BufferSize, const device ConfigBuf& v_202) -{ - uint base = (v_202.conf.drawmonoid_alloc.offset >> uint(2)) + (2u * element_ix); - uint path_ix = v_94.memory[base]; - uint clip_ix = v_94.memory[base + 1u]; - return DrawMonoid{ path_ix, clip_ix }; -} - -static inline __attribute__((always_inline)) -float4 load_clip_bbox(thread const uint& clip_ix, device Memory& v_94, constant uint& v_94BufferSize, const device ConfigBuf& v_202) -{ - uint base = (v_202.conf.clip_bbox_alloc.offset >> uint(2)) + (4u * clip_ix); - float x0 = as_type(v_94.memory[base]); - float y0 = as_type(v_94.memory[base + 1u]); - float x1 = as_type(v_94.memory[base + 2u]); - float y1 = as_type(v_94.memory[base + 3u]); + uint base = (v_156.conf.clip_bbox_alloc.offset >> uint(2)) + (4u * clip_ix); + float x0 = as_type(v_81.memory[base]); + float y0 = as_type(v_81.memory[base + 1u]); + float x1 = as_type(v_81.memory[base + 2u]); + float y1 = as_type(v_81.memory[base + 3u]); float4 bbox = float4(x0, y0, x1, y1); return bbox; } static inline __attribute__((always_inline)) -float4 load_path_bbox(thread const uint& path_ix, device Memory& v_94, constant uint& v_94BufferSize, const device ConfigBuf& v_202) +float4 load_path_bbox(thread const uint& path_ix, device Memory& v_81, constant uint& v_81BufferSize, const device ConfigBuf& v_156) { - uint base = (v_202.conf.bbox_alloc.offset >> uint(2)) + (6u * path_ix); - float bbox_l = float(v_94.memory[base]) - 32768.0; - float bbox_t = float(v_94.memory[base + 1u]) - 32768.0; - float bbox_r = float(v_94.memory[base + 2u]) - 32768.0; - float bbox_b = float(v_94.memory[base + 3u]) - 32768.0; + uint base = (v_156.conf.path_bbox_alloc.offset >> uint(2)) + (6u * path_ix); + float bbox_l = float(v_81.memory[base]) - 32768.0; + float bbox_t = float(v_81.memory[base + 1u]) - 32768.0; + float bbox_r = float(v_81.memory[base + 2u]) - 32768.0; + float bbox_b = float(v_81.memory[base + 3u]) - 32768.0; float4 bbox = float4(bbox_l, bbox_t, bbox_r, bbox_b); return bbox; } @@ -159,13 +128,13 @@ float4 bbox_intersect(thread const float4& a, thread const float4& b) } static inline __attribute__((always_inline)) -void store_path_bbox(thread const AnnotatedRef& ref, thread const float4& bbox, device Memory& v_94, constant uint& v_94BufferSize) +void store_draw_bbox(thread const uint& draw_ix, thread const float4& bbox, device Memory& v_81, constant uint& v_81BufferSize, const device ConfigBuf& v_156) { - uint ix = ref.offset >> uint(2); - v_94.memory[ix + 1u] = as_type(bbox.x); - v_94.memory[ix + 2u] = as_type(bbox.y); - v_94.memory[ix + 3u] = as_type(bbox.z); - v_94.memory[ix + 4u] = as_type(bbox.w); + uint base = (v_156.conf.draw_bbox_alloc.offset >> uint(2)) + (4u * draw_ix); + v_81.memory[base] = as_type(bbox.x); + v_81.memory[base + 1u] = as_type(bbox.y); + v_81.memory[base + 2u] = as_type(bbox.z); + v_81.memory[base + 3u] = as_type(bbox.w); } static inline __attribute__((always_inline)) @@ -177,26 +146,32 @@ Alloc new_alloc(thread const uint& offset, thread const uint& size, thread const } static inline __attribute__((always_inline)) -MallocResult malloc(thread const uint& size, device Memory& v_94, constant uint& v_94BufferSize) +MallocResult malloc(thread const uint& size, device Memory& v_81, constant uint& v_81BufferSize) { - uint _100 = atomic_fetch_add_explicit((device atomic_uint*)&v_94.mem_offset, size, memory_order_relaxed); - uint offset = _100; + uint _87 = atomic_fetch_add_explicit((device atomic_uint*)&v_81.mem_offset, size, memory_order_relaxed); + uint offset = _87; MallocResult r; - r.failed = (offset + size) > uint(int((v_94BufferSize - 8) / 4) * 4); + r.failed = (offset + size) > uint(int((v_81BufferSize - 8) / 4) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _129 = atomic_fetch_max_explicit((device atomic_uint*)&v_94.mem_error, 1u, memory_order_relaxed); + uint _116 = atomic_fetch_max_explicit((device atomic_uint*)&v_81.mem_error, 1u, memory_order_relaxed); return r; } return r; } static inline __attribute__((always_inline)) -void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_94, constant uint& v_94BufferSize) +bool touch_mem(thread const Alloc& alloc, thread const uint& offset) +{ + return true; +} + +static inline __attribute__((always_inline)) +void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_81, constant uint& v_81BufferSize) { Alloc param = alloc; uint param_1 = offset; @@ -204,27 +179,26 @@ void write_mem(thread const Alloc& alloc, thread const uint& offset, thread cons { return; } - v_94.memory[offset] = val; + v_81.memory[offset] = val; } static inline __attribute__((always_inline)) -void BinInstance_write(thread const Alloc& a, thread const BinInstanceRef& ref, thread const BinInstance& s, device Memory& v_94, constant uint& v_94BufferSize) +void BinInstance_write(thread const Alloc& a, thread const BinInstanceRef& ref, thread const BinInstance& s, device Memory& v_81, constant uint& v_81BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.element_ix; - write_mem(param, param_1, param_2, v_94, v_94BufferSize); + write_mem(param, param_1, param_2, v_81, v_81BufferSize); } -kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_94 [[buffer(0)]], const device ConfigBuf& v_202 [[buffer(1)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_81 [[buffer(0)]], const device ConfigBuf& v_156 [[buffer(1)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { threadgroup uint bitmaps[8][256]; threadgroup short sh_alloc_failed; threadgroup uint count[8][256]; threadgroup Alloc sh_chunk_alloc[256]; - constant uint& v_94BufferSize = spvBufferSizeConstants[0]; - uint my_n_elements = v_202.conf.n_elements; + constant uint& v_81BufferSize = spvBufferSizeConstants[0]; uint my_partition = gl_WorkGroupID.x; for (uint i = 0u; i < 8u; i++) { @@ -236,59 +210,42 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } threadgroup_barrier(mem_flags::mem_threadgroup); uint element_ix = (my_partition * 256u) + gl_LocalInvocationID.x; - AnnotatedRef ref = AnnotatedRef{ v_202.conf.anno_alloc.offset + (element_ix * 40u) }; - uint tag = 0u; - if (element_ix < my_n_elements) - { - Alloc param; - param.offset = v_202.conf.anno_alloc.offset; - AnnotatedRef param_1 = ref; - tag = Annotated_tag(param, param_1, v_94, v_94BufferSize).tag; - } int x0 = 0; int y0 = 0; int x1 = 0; int y1 = 0; - switch (tag) + if (element_ix < v_156.conf.n_elements) { - case 1u: - case 2u: - case 3u: - case 4u: - case 5u: + uint param = element_ix; + DrawMonoid draw_monoid = load_draw_monoid(param, v_81, v_81BufferSize, v_156); + uint path_ix = draw_monoid.path_ix; + float4 clip_bbox = float4(-1000000000.0, -1000000000.0, 1000000000.0, 1000000000.0); + uint clip_ix = draw_monoid.clip_ix; + if (clip_ix > 0u) { - uint param_2 = element_ix; - DrawMonoid draw_monoid = load_draw_monoid(param_2, v_94, v_94BufferSize, v_202); - uint path_ix = draw_monoid.path_ix; - float4 clip_bbox = float4(-1000000000.0, -1000000000.0, 1000000000.0, 1000000000.0); - uint clip_ix = draw_monoid.clip_ix; - if (clip_ix > 0u) - { - uint param_3 = clip_ix - 1u; - clip_bbox = load_clip_bbox(param_3, v_94, v_94BufferSize, v_202); - } - uint param_4 = path_ix; - float4 path_bbox = load_path_bbox(param_4, v_94, v_94BufferSize, v_202); - float4 param_5 = path_bbox; - float4 param_6 = clip_bbox; - float4 bbox = bbox_intersect(param_5, param_6); - float4 _473 = bbox; - float4 _475 = bbox; - float2 _477 = fast::max(_473.xy, _475.zw); - bbox.z = _477.x; - bbox.w = _477.y; - AnnotatedRef param_7 = ref; - float4 param_8 = bbox; - store_path_bbox(param_7, param_8, v_94, v_94BufferSize); - x0 = int(floor(bbox.x * 0.00390625)); - y0 = int(floor(bbox.y * 0.00390625)); - x1 = int(ceil(bbox.z * 0.00390625)); - y1 = int(ceil(bbox.w * 0.00390625)); - break; + uint param_1 = clip_ix - 1u; + clip_bbox = load_clip_bbox(param_1, v_81, v_81BufferSize, v_156); } + uint param_2 = path_ix; + float4 path_bbox = load_path_bbox(param_2, v_81, v_81BufferSize, v_156); + float4 param_3 = path_bbox; + float4 param_4 = clip_bbox; + float4 bbox = bbox_intersect(param_3, param_4); + float4 _417 = bbox; + float4 _419 = bbox; + float2 _421 = fast::max(_417.xy, _419.zw); + bbox.z = _421.x; + bbox.w = _421.y; + uint param_5 = element_ix; + float4 param_6 = bbox; + store_draw_bbox(param_5, param_6, v_81, v_81BufferSize, v_156); + x0 = int(floor(bbox.x * 0.00390625)); + y0 = int(floor(bbox.y * 0.00390625)); + x1 = int(ceil(bbox.z * 0.00390625)); + y1 = int(ceil(bbox.w * 0.00390625)); } - uint width_in_bins = ((v_202.conf.width_in_tiles + 16u) - 1u) / 16u; - uint height_in_bins = ((v_202.conf.height_in_tiles + 16u) - 1u) / 16u; + uint width_in_bins = ((v_156.conf.width_in_tiles + 16u) - 1u) / 16u; + uint height_in_bins = ((v_156.conf.height_in_tiles + 16u) - 1u) / 16u; x0 = clamp(x0, 0, int(width_in_bins)); x1 = clamp(x1, x0, int(width_in_bins)); y0 = clamp(y0, 0, int(height_in_bins)); @@ -303,7 +260,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint my_mask = 1u << (gl_LocalInvocationID.x & 31u); while (y < y1) { - uint _581 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&bitmaps[my_slice][(uint(y) * width_in_bins) + uint(x)], my_mask, memory_order_relaxed); + uint _523 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&bitmaps[my_slice][(uint(y) * width_in_bins) + uint(x)], my_mask, memory_order_relaxed); x++; if (x == x1) { @@ -318,15 +275,15 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M element_count += uint(int(popcount(bitmaps[i_1][gl_LocalInvocationID.x]))); count[i_1][gl_LocalInvocationID.x] = element_count; } - uint param_9 = 0u; - uint param_10 = 0u; - bool param_11 = true; - Alloc chunk_alloc = new_alloc(param_9, param_10, param_11); + uint param_7 = 0u; + uint param_8 = 0u; + bool param_9 = true; + Alloc chunk_alloc = new_alloc(param_7, param_8, param_9); if (element_count != 0u) { - uint param_12 = element_count * 4u; - MallocResult _631 = malloc(param_12, v_94, v_94BufferSize); - MallocResult chunk = _631; + uint param_10 = element_count * 4u; + MallocResult _573 = malloc(param_10, v_81, v_81BufferSize); + MallocResult chunk = _573; chunk_alloc = chunk.alloc; sh_chunk_alloc[gl_LocalInvocationID.x] = chunk_alloc; if (chunk.failed) @@ -334,28 +291,28 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M sh_alloc_failed = short(true); } } - uint out_ix = (v_202.conf.bin_alloc.offset >> uint(2)) + (((my_partition * 256u) + gl_LocalInvocationID.x) * 2u); - Alloc param_13; - param_13.offset = v_202.conf.bin_alloc.offset; - uint param_14 = out_ix; - uint param_15 = element_count; - write_mem(param_13, param_14, param_15, v_94, v_94BufferSize); - Alloc param_16; - param_16.offset = v_202.conf.bin_alloc.offset; - uint param_17 = out_ix + 1u; - uint param_18 = chunk_alloc.offset; - write_mem(param_16, param_17, param_18, v_94, v_94BufferSize); + uint out_ix = (v_156.conf.bin_alloc.offset >> uint(2)) + (((my_partition * 256u) + gl_LocalInvocationID.x) * 2u); + Alloc param_11; + param_11.offset = v_156.conf.bin_alloc.offset; + uint param_12 = out_ix; + uint param_13 = element_count; + write_mem(param_11, param_12, param_13, v_81, v_81BufferSize); + Alloc param_14; + param_14.offset = v_156.conf.bin_alloc.offset; + uint param_15 = out_ix + 1u; + uint param_16 = chunk_alloc.offset; + write_mem(param_14, param_15, param_16, v_81, v_81BufferSize); threadgroup_barrier(mem_flags::mem_threadgroup); - bool _687; + bool _630; if (!bool(sh_alloc_failed)) { - _687 = v_94.mem_error != 0u; + _630 = v_81.mem_error != 0u; } else { - _687 = bool(sh_alloc_failed); + _630 = bool(sh_alloc_failed); } - if (_687) + if (_630) { return; } @@ -374,10 +331,10 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } Alloc out_alloc = sh_chunk_alloc[bin_ix]; uint out_offset = out_alloc.offset + (idx * 4u); - Alloc param_19 = out_alloc; - BinInstanceRef param_20 = BinInstanceRef{ out_offset }; - BinInstance param_21 = BinInstance{ element_ix }; - BinInstance_write(param_19, param_20, param_21, v_94, v_94BufferSize); + Alloc param_17 = out_alloc; + BinInstanceRef param_18 = BinInstanceRef{ out_offset }; + BinInstance param_19 = BinInstance{ element_ix }; + BinInstance_write(param_17, param_18, param_19, v_81, v_81BufferSize); } x++; if (x == x1) diff --git a/piet-gpu/shader/gen/binning.spv b/piet-gpu/shader/gen/binning.spv index eca06929486b44ac39aafe2c917f9fabf656b062..30eacd6b33c706f9056c8d9762669211821c186c 100644 GIT binary patch literal 18536 zcmbW8cYt0+xyDb(?j{D5-XSK`5JCw(1ds$sKohDo1(wZblPuZn#@!7eNC%@LDuN0s zAgCx^Pz1pWqS$-ySnowFSg>4Cf4}pcCz*WeKlix9JkRsK^S(24X6Br;S;wxo9b)quIi-jpe*a@ zAJi}pLpNn3+N*D@2-n{-mj9XRQAh`w=g#Y%d)#qz=N;AEyL@@~$mptpzV3nk!M^T= z{lk5|qy6Xh={LUc>mTeLSh28l=)|M!gM0!xW(^Ds^-_1yOS#w3qD3QpqZP_H`d?Lp zeJi_r^qaC``b>TnOrMFZquO8{-;V0J@R9!W>5XkWm=(cTRk6s zZqGnH2Rndg_YWR3I5OHZ*xPqv-=fwWsC%t#*IDfZFMOH7u3FQtZ=i2k-{5F>|9SRd zt7_`HzTI`-|9$+;gcMQfK|M47ZmDH+b+R6JrS56)6zX9*uD%<1q}DsDY1Bs!_pF>h zG&t1HJ#$T|c`ff5U1DdWd2f3M`j@w~akZaoex$dLg`HV2MptcfNA(Xb8j7it^}ZL{ zz);V^?u8`nURGyyi6WD^v)Yq--FX^U?VmPv@&yZq&TF;sKJJGteKNj*^yuy%9PJw( zVXI9!chP<`E%n%EV9%T!tS`kqa~O5quX@ny<~S5v=E59Dz(+=hhS{qQBF;^Yj%pV6 z+QQt~$Jub5sOml(McwK{M>QXunbY?;`24W z`=stYL9b(YzfXXBiBG52*IY}em-h_!ENl2VZG51OU)aVkUWbpZu7tPNc1LyfI<}7L znl^rI8@~>|pl4*wIdna|J_4v6m)xtItGB?97#dvEzqmD5a<9SeW(BdxohxbP2Wu2%LhbfFJ+k8*C+ZCW9st z`ts4`aB+6&*0!t42ks|^wHs-!I8$0SUwBZEZ;S@@%1>@$L5-B z?YKl-+i#x>^*(Ako|rx#THCI_H?6wZ1J0?>irU7x*t;~=wR5{+?Dd9h1y0%ncb_fV>a$}_e>&@&n_%N!IC|!(rEOYkj@;ZW&F9Wwx4m22pUu%)^OjYltu>Y{ zu=#v$t%cIw>eH6k%`n=tIL8@nTehtloA)p+W7`^=WBE_*eC}ym*fZLbhMs|MMQ^R^ z*(-R|)MHZf>SeuKyO(beaJiRnrLOONbLQL*ukTIGyQ+KO?dP<)?nhtujP9r&L0h{Q z$5x+(pT}F0Illy6)!=WaPjBhpQ?GGH^#pkBdDl_>U0&?%PBvq`BsgH~`v&2oExu_u z2bK11!a1zvlN(OhnopIliQiQn17Eg^%|1NZKiWSu*z)VD-{BSybe}pjymapH(2C{9 z9BKQp)$#cEH?ht%R{!X-p5-Ih#@FwBw3#>5+cR*?;JH*rw54skssa2*mb4adck|-o zybhtS`y3lvor{)vTnWxRo~Pc-<0|zUcUG5z>pjxiv_$QwE<-EN>{ryh^_({EtKhBu z+IryF=BjAT+IZ7CF*>X35~I0kwz+;CpN{Hn@baGC&}P4>jo;D6?^=g=ehz)@ncFgWkDf&L0V;k9ysE~X)o;Mu>yd%}-ZjsTKeV)EJtIr&m|Jkj=U(&< ztr%pP)p52&&wZZ)UTf>D_LeVMF_>e`Ihl@D&iy`ZeBU-cBQffH9n~T0*t@FPaMn(l zhJJNa^U#M@y(ft!H;aPtJ@oUo^fh-H(Jg=$MGOqIbRR8@rMgO7yo0)<#W(RvYUB+w2R<%as_SRbI zN2pr!nK_p=Vq2fz#yx?02Z~qtb}BUA3)H3*n(qT@(+bVLs&Txp$?Nl9 zZNEbExvzFmq4}&=JEYJYr`q9#wsE5!S!h1f^*g%Ie5R|-D>Uaw?f63TnXdNYLi1U! zc3PqN{8l@o(41ejvkPtOMq5~DKBx6tQfnRc^BK72{^Z%LkC*FDZETG@>gRO1{%$~b z{kfK0kMjWD5A(?VJ%fDPhJT6$Cbw^!vf5m4lZkG8@#eH~%}k)*N7H@dN1xArxf{^s9- zy4ClNdXClAw7G_3+Zn7)&3L;|C!X`JeImN+**0ad&wHS0GsYIgo=!c9vL&{CsO23L zefOnS)7SAG*kCos=eifGThtDxwm-H}^PbG1o;GaG(FqiH{}!L~EL^~sdvlb=HI(%=1H|GanU&r87Zp94Od;ymm||GbCiQ{uZC zY=68r*HasRA|vs<6PHE%|EH8O{u?&G`^&tJ>uuEbOU-$byT{bh_Zz{k@66LJV8
n|T@w5iRyS_V(w2EpSgwp~H(+|FrYUD9y(ZszXQ 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 diff --git a/piet-gpu/shader/gen/clip_leaf.dxil b/piet-gpu/shader/gen/clip_leaf.dxil index fe87a11b3330de6a6a251de88aaa1a42ac3aad16..b681a65dc37b137d61b26a7e37a94bac25cdcd78 100644 GIT binary patch delta 3602 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 uint(2)) + ix) * 4 + 8); } @@ -324,7 +328,7 @@ void comp_main() bool _725; if (_717) { - _725 = gl_GlobalInvocationID.x < _80.Load(72); + _725 = gl_GlobalInvocationID.x < _80.Load(80); } else { @@ -334,7 +338,7 @@ void comp_main() { uint param_15 = parent; path_ix = load_path_ix(param_15); - uint drawmonoid_out_base = (_80.Load(44) >> uint(2)) + (2u * (~inp)); + uint drawmonoid_out_base = (_80.Load(44) >> uint(2)) + (4u * (~inp)); _96.Store(drawmonoid_out_base * 4 + 8, path_ix); if (int(grandparent) >= 0) { diff --git a/piet-gpu/shader/gen/clip_leaf.msl b/piet-gpu/shader/gen/clip_leaf.msl index 4e2d059..5f5e0a7 100644 --- a/piet-gpu/shader/gen/clip_leaf.msl +++ b/piet-gpu/shader/gen/clip_leaf.msl @@ -34,12 +34,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -47,6 +49,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -112,7 +116,7 @@ uint load_path_ix(thread const uint& ix, const device ConfigBuf& v_80, device Me static inline __attribute__((always_inline)) float4 load_path_bbox(thread const uint& path_ix, const device ConfigBuf& v_80, device Memory& v_96) { - uint base = (v_80.conf.bbox_alloc.offset >> uint(2)) + (6u * path_ix); + uint base = (v_80.conf.path_bbox_alloc.offset >> uint(2)) + (6u * path_ix); float bbox_l = float(v_96.memory[base]) - 32768.0; float bbox_t = float(v_96.memory[base + 1u]) - 32768.0; float bbox_r = float(v_96.memory[base + 2u]) - 32768.0; @@ -341,7 +345,7 @@ kernel void main0(device Memory& v_96 [[buffer(0)]], const device ConfigBuf& v_8 { uint param_15 = parent; path_ix = load_path_ix(param_15, v_80, v_96); - uint drawmonoid_out_base = (v_80.conf.drawmonoid_alloc.offset >> uint(2)) + (2u * (~inp)); + uint drawmonoid_out_base = (v_80.conf.drawmonoid_alloc.offset >> uint(2)) + (4u * (~inp)); v_96.memory[drawmonoid_out_base] = path_ix; if (int(grandparent) >= 0) { diff --git a/piet-gpu/shader/gen/clip_leaf.spv b/piet-gpu/shader/gen/clip_leaf.spv index 7c4c174c68d8cc707df87de587187f814b46a37c..beac64bdaa072ba89007bfba4e7c1aac3ffa7c77 100644 GIT binary patch delta 373 zcmcaIg>l6+#tnKblI#q=3=9lhKwOYmk`bSjlwT2_n3I#AJlUCLaxg?z04SSMlvs`= z%fQ9}krRZUOl zO0#=IoCmT*8Hi(m*aPZh38+{Ck{HMekh&BkF_6(9v5d_#c~Y4eWhejVbDgZf&oSAB fUuJRuKgZ?-egh^(kWl@=BQ zii7kQr>4VHZvM_H&AvH_H-U*+lEHVfpn&k?8~g^71q5U^n+O;%F$!%?6=IfSDrDH4 IWw1{Q0LRlSi2wiq diff --git a/piet-gpu/shader/gen/clip_reduce.dxil b/piet-gpu/shader/gen/clip_reduce.dxil index 0dff71b61fa0aa0d74bdb368fd1693463e98304f..0ccaac9931c3cd4794fa780051ce12667dfc0386 100644 GIT binary patch delta 1313 zcmZ8he@qj16#w4!?l{_S>CsX=gt6-^rt-ra=s=WgSFVz_mRKAJM${_~Ws0VTZE?}8 z*I&@NYP!LU877utoSD^iRudMT_9#<=Owp)WOk*%I!s3=V7o+=QZdW5&viHyTeO}(@ z<@0^-eZLXo5o3X+t)2(}GepMpcLkTTYAbZsV_Wol+e4qW9GlgAQf+CoIZR3b1b~AB zC;%A@62##W(2!U*C&U6i@NG z)wyv)q?)>c0bRhy+{`~bTWy|>Wur_ZCBB!6s8fV*gx$qAZ2;%@SbK&a{&{!yF!8LR zb+#d^syBb})vnUh>O-gDyK|jgop``*GIjBf8!69<9jR%rneL`nR+4^oiVmCUX4lrl z&K}#MvYz2VE!Hyrxc#?@nb}+S(p<~Z}~!B}{g zJu+ZO^?X(~xbIYdVcFoI*71SNok-8kJc-`Fm7beDffZ&NpJ_mod@du!q6CC~)N>x` zJZ@eXl0s%wWN2=;vtUP@*vfVYfFX%1MV6iax!r7sn2G9&M2QMYUG?BLvk7+rJ#>2M zxe$^m;P_A=>~3N>8*xfOeH!^zpo6P~^=ud|UY;TX98AWMT&Q5zP_P+10b!5CIuVAe zkrA9yFCqxw6U5Ny!jtBwl3QUT~eV)YOmPsvC=tagY`y$!?N;_FTgA~I;>Kzuy8jMg}eG2#=^op9K;5qCieYpw+ zFthBAA$6N;#E?)dqj%GaR^Z>zJ4!Y{3Sg4(Io@RQ*U-V60dNw{ITHY-G=4goCyYfA zj)LE8T!B}U>%6vLvlXv3ndjrB?Od>$Y?hkv7H6>bND12jp8l{h+ zF(K5qhwN2{7!4udd|kxPc5~Ps79_BVkQb3B!aU+s2{s+g(#U-*cgTG#o^)wU;L6K^ zd1%L@xawm@b&>s&0&kA{1}F}{7}Y;V!!!d(pOmM0;8c27gcoB;e9MNY^6`>~3xqL{ zx%J|GY*q_--L>2RmOh{GwTf#iE`db^DUXo-J+<;;eKJSh1Gm(gKZWjB)@RX`9H20N zwsG2<@7qf^lA`L8=Pa{edfA#JY~C-#$AeYQKU}I!CWZd>b3bQ*LABYGfCm*s8NKZ* zUG8cWXy&N5^c*lsS19(ay6P zk7BE^C5Gb``|&_sJJwzDVxIJi#XiEvwWIdfn0+c$?)4*;r2Nn}5^s@LglkhuiS91g YY@q!Wd~pp+y4$fb&)g2CF|IqHp*a+;3oKZc?~Uno0rh zl>=`cwQwHfegp+XRDt!f095TM~kFVqYe~rJbzyp_V8inpjC5G!qd( z_|uRaDC9qi7<6L?T6+rHx-PxbYrCj$zWXM;?f%C|KI|_h&+VOr+5*rkUfFAgC5{z3 zZRr;R=sCVc1RRDAW|Y1C(ro8jq|NA4y+2CootH(l(t+Mef^6~tGY?IO6mn2J$$P^) zil@J1l(+MZ9@Vb`}6$5tl$X?fG5jWw} z^za=*l?(_yb&Usqj>E*D9zFs*4d^bcoFIT&4h05E>IaqwqhwT^Y9>xY#QAhQlQju| zQhSWs%SMSsF|}L=2k?DUG(0Y*e(tW7QamUy^Wz=MsqlQAS13?aFYN>t%ubg7*P}mP~Oj z0kct>Q<~{s8!*|PQJTZ-UgW^6FV|dPwFmK_8`>E$uqB-P5Gyf6f+w9}Wxf#^MCsg2 z6a{Wk8dnuW!w%2RL&_k7yfVn%+@Zq(z-FSDlIA~~E?jrzC&F)8z;|47tpzX%_sON? z7faP0>bDxzEBuEPNb75J?Fro(J}afD)JoSQKg$_*!@i-pelWF^mwW~~@?aevcCwtZ zLwQX5O9F=u4ri-F$k_%VIbpC?y=Hsnl6R%e z2#(P+ctWv&&y~sqbQP=xz^zIt^H-|P@ zx4H#7rrSMA%Ez&sZaN3jYM@3<#TKZfoBov=>-W*dtMu=Vl;Dl^Ezp3@xJ=5GSYGKQ tooCkGSCeQ2V9GUUM2}z*aW;m#*pBow2Fg=lEl{@v+k!)aa#mix{{T4%g1G> uint(2)) + (6u * path_ix); + uint base = (v_64.conf.path_bbox_alloc.offset >> uint(2)) + (6u * path_ix); float bbox_l = float(v_80.memory[base]) - 32768.0; float bbox_t = float(v_80.memory[base + 1u]) - 32768.0; float bbox_r = float(v_80.memory[base + 2u]) - 32768.0; diff --git a/piet-gpu/shader/gen/clip_reduce.spv b/piet-gpu/shader/gen/clip_reduce.spv index cbe8c1f03a0cf12750d3db1cde14df674037571c..ce0b9bb3caf196d74fc50dd627ba9bbf971c9794 100644 GIT binary patch delta 375 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 delta 7506 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 diff --git a/piet-gpu/shader/gen/coarse.hlsl b/piet-gpu/shader/gen/coarse.hlsl index f00eabe..db1e496 100644 --- a/piet-gpu/shader/gen/coarse.hlsl +++ b/piet-gpu/shader/gen/coarse.hlsl @@ -9,68 +9,6 @@ struct MallocResult bool failed; }; -struct AnnoImageRef -{ - uint offset; -}; - -struct AnnoImage -{ - float4 bbox; - float linewidth; - uint index; - int2 offset; -}; - -struct AnnoColorRef -{ - uint offset; -}; - -struct AnnoColor -{ - float4 bbox; - float linewidth; - uint rgba_color; -}; - -struct AnnoLinGradientRef -{ - uint offset; -}; - -struct AnnoLinGradient -{ - float4 bbox; - float linewidth; - uint index; - float line_x; - float line_y; - float line_c; -}; - -struct AnnoEndClipRef -{ - uint offset; -}; - -struct AnnoEndClip -{ - float4 bbox; - uint blend; -}; - -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct BinInstanceRef { uint offset; @@ -201,12 +139,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -214,12 +154,15 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -RWByteAddressBuffer _308 : register(u0, space0); -ByteAddressBuffer _1283 : register(t1, space0); +RWByteAddressBuffer _242 : register(u0, space0); +ByteAddressBuffer _854 : register(t1, space0); +ByteAddressBuffer _1222 : register(t2, space0); static uint3 gl_WorkGroupID; static uint3 gl_LocalInvocationID; @@ -242,8 +185,8 @@ groupshared uint sh_tile_count[256]; Alloc slice_mem(Alloc a, uint offset, uint size) { - Alloc _385 = { a.offset + offset }; - return _385; + Alloc _319 = { a.offset + offset }; + return _319; } bool touch_mem(Alloc alloc, uint offset) @@ -259,7 +202,7 @@ uint read_mem(Alloc alloc, uint offset) { return 0u; } - uint v = _308.Load(offset * 4 + 8); + uint v = _242.Load(offset * 4 + 8); return v; } @@ -272,8 +215,8 @@ Alloc new_alloc(uint offset, uint size, bool mem_ok) BinInstanceRef BinInstance_index(BinInstanceRef ref, uint index) { - BinInstanceRef _765 = { ref.offset + (index * 4u) }; - return _765; + BinInstanceRef _328 = { ref.offset + (index * 4u) }; + return _328; } BinInstance BinInstance_read(Alloc a, BinInstanceRef ref) @@ -287,15 +230,6 @@ BinInstance BinInstance_read(Alloc a, BinInstanceRef ref) return s; } -AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1); - AnnotatedTag _717 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _717; -} - Path Path_read(Alloc a, PathRef ref) { uint ix = ref.offset >> uint(2); @@ -310,8 +244,8 @@ Path Path_read(Alloc a, PathRef ref) uint raw2 = read_mem(param_4, param_5); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); - TileRef _825 = { raw2 }; - s.tiles = _825; + TileRef _391 = { raw2 }; + s.tiles = _391; return s; } @@ -321,11 +255,11 @@ void write_tile_alloc(uint el_ix, Alloc a) Alloc read_tile_alloc(uint el_ix, bool mem_ok) { - uint _1169; - _308.GetDimensions(_1169); - _1169 = (_1169 - 8) / 4; + uint _741; + _242.GetDimensions(_741); + _741 = (_741 - 8) / 4; uint param = 0u; - uint param_1 = uint(int(_1169) * 4); + uint param_1 = uint(int(_741) * 4); bool param_2 = mem_ok; return new_alloc(param, param_1, param_2); } @@ -339,67 +273,31 @@ Tile Tile_read(Alloc a, TileRef ref) Alloc param_2 = a; uint param_3 = ix + 1u; uint raw1 = read_mem(param_2, param_3); - TileSegRef _850 = { raw0 }; + TileSegRef _416 = { raw0 }; Tile s; - s.tile = _850; + s.tile = _416; s.backdrop = int(raw1); return s; } -AnnoColor AnnoColor_read(Alloc a, AnnoColorRef ref) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9); - Alloc param_10 = a; - uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11); - AnnoColor s; - s.bbox = float4(asfloat(raw0), asfloat(raw1), asfloat(raw2), asfloat(raw3)); - s.linewidth = asfloat(raw4); - s.rgba_color = raw5; - return s; -} - -AnnoColor Annotated_Color_read(Alloc a, AnnotatedRef ref) -{ - AnnoColorRef _723 = { ref.offset + 4u }; - Alloc param = a; - AnnoColorRef param_1 = _723; - return AnnoColor_read(param, param_1); -} - MallocResult malloc(uint size) { - uint _314; - _308.InterlockedAdd(0, size, _314); - uint offset = _314; - uint _321; - _308.GetDimensions(_321); - _321 = (_321 - 8) / 4; + uint _248; + _242.InterlockedAdd(0, size, _248); + uint offset = _248; + uint _255; + _242.GetDimensions(_255); + _255 = (_255 - 8) / 4; MallocResult r; - r.failed = (offset + size) > uint(int(_321) * 4); + r.failed = (offset + size) > uint(int(_255) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _343; - _308.InterlockedMax(4, 1u, _343); + uint _277; + _242.InterlockedMax(4, 1u, _277); return r; } return r; @@ -413,7 +311,7 @@ void write_mem(Alloc alloc, uint offset, uint val) { return; } - _308.Store(offset * 4 + 8, val); + _242.Store(offset * 4 + 8, val); } void CmdJump_write(Alloc a, CmdJumpRef ref, CmdJump s) @@ -431,9 +329,9 @@ void Cmd_Jump_write(Alloc a, CmdRef ref, CmdJump s) uint param_1 = ref.offset >> uint(2); uint param_2 = 10u; write_mem(param, param_1, param_2); - CmdJumpRef _1162 = { ref.offset + 4u }; + CmdJumpRef _734 = { ref.offset + 4u }; Alloc param_3 = a; - CmdJumpRef param_4 = _1162; + CmdJumpRef param_4 = _734; CmdJump param_5 = s; CmdJump_write(param_3, param_4, param_5); } @@ -445,30 +343,25 @@ bool alloc_cmd(inout Alloc cmd_alloc, inout CmdRef cmd_ref, inout uint cmd_limit return true; } uint param = 1024u; - MallocResult _1190 = malloc(param); - MallocResult new_cmd = _1190; + MallocResult _762 = malloc(param); + MallocResult new_cmd = _762; if (new_cmd.failed) { return false; } - CmdJump _1200 = { new_cmd.alloc.offset }; - CmdJump jump = _1200; + CmdJump _772 = { new_cmd.alloc.offset }; + CmdJump jump = _772; Alloc param_1 = cmd_alloc; CmdRef param_2 = cmd_ref; CmdJump param_3 = jump; Cmd_Jump_write(param_1, param_2, param_3); cmd_alloc = new_cmd.alloc; - CmdRef _1212 = { cmd_alloc.offset }; - cmd_ref = _1212; + CmdRef _784 = { cmd_alloc.offset }; + cmd_ref = _784; cmd_limit = (cmd_alloc.offset + 1024u) - 60u; return true; } -uint fill_mode_from_flags(uint flags) -{ - return flags & 1u; -} - void CmdFill_write(Alloc a, CmdFillRef ref, CmdFill s) { uint ix = ref.offset >> uint(2); @@ -488,9 +381,9 @@ void Cmd_Fill_write(Alloc a, CmdRef ref, CmdFill s) uint param_1 = ref.offset >> uint(2); uint param_2 = 1u; write_mem(param, param_1, param_2); - CmdFillRef _1036 = { ref.offset + 4u }; + CmdFillRef _604 = { ref.offset + 4u }; Alloc param_3 = a; - CmdFillRef param_4 = _1036; + CmdFillRef param_4 = _604; CmdFill param_5 = s; CmdFill_write(param_3, param_4, param_5); } @@ -522,44 +415,43 @@ void Cmd_Stroke_write(Alloc a, CmdRef ref, CmdStroke s) uint param_1 = ref.offset >> uint(2); uint param_2 = 2u; write_mem(param, param_1, param_2); - CmdStrokeRef _1054 = { ref.offset + 4u }; + CmdStrokeRef _622 = { ref.offset + 4u }; Alloc param_3 = a; - CmdStrokeRef param_4 = _1054; + CmdStrokeRef param_4 = _622; CmdStroke param_5 = s; CmdStroke_write(param_3, param_4, param_5); } -void write_fill(Alloc alloc, inout CmdRef cmd_ref, uint flags, Tile tile, float linewidth) +void write_fill(Alloc alloc, inout CmdRef cmd_ref, Tile tile, float linewidth) { - uint param = flags; - if (fill_mode_from_flags(param) == 0u) + if (linewidth < 0.0f) { if (tile.tile.offset != 0u) { - CmdFill _1236 = { tile.tile.offset, tile.backdrop }; - CmdFill cmd_fill = _1236; - Alloc param_1 = alloc; - CmdRef param_2 = cmd_ref; - CmdFill param_3 = cmd_fill; - Cmd_Fill_write(param_1, param_2, param_3); + CmdFill _807 = { tile.tile.offset, tile.backdrop }; + CmdFill cmd_fill = _807; + Alloc param = alloc; + CmdRef param_1 = cmd_ref; + CmdFill param_2 = cmd_fill; + Cmd_Fill_write(param, param_1, param_2); cmd_ref.offset += 12u; } else { - Alloc param_4 = alloc; - CmdRef param_5 = cmd_ref; - Cmd_Solid_write(param_4, param_5); + Alloc param_3 = alloc; + CmdRef param_4 = cmd_ref; + Cmd_Solid_write(param_3, param_4); cmd_ref.offset += 4u; } } else { - CmdStroke _1266 = { tile.tile.offset, 0.5f * linewidth }; - CmdStroke cmd_stroke = _1266; - Alloc param_6 = alloc; - CmdRef param_7 = cmd_ref; - CmdStroke param_8 = cmd_stroke; - Cmd_Stroke_write(param_6, param_7, param_8); + CmdStroke _837 = { tile.tile.offset, 0.5f * linewidth }; + CmdStroke cmd_stroke = _837; + Alloc param_5 = alloc; + CmdRef param_6 = cmd_ref; + CmdStroke param_7 = cmd_stroke; + Cmd_Stroke_write(param_5, param_6, param_7); cmd_ref.offset += 12u; } } @@ -579,61 +471,13 @@ void Cmd_Color_write(Alloc a, CmdRef ref, CmdColor s) uint param_1 = ref.offset >> uint(2); uint param_2 = 5u; write_mem(param, param_1, param_2); - CmdColorRef _1080 = { ref.offset + 4u }; + CmdColorRef _649 = { ref.offset + 4u }; Alloc param_3 = a; - CmdColorRef param_4 = _1080; + CmdColorRef param_4 = _649; CmdColor param_5 = s; CmdColor_write(param_3, param_4, param_5); } -AnnoLinGradient AnnoLinGradient_read(Alloc a, AnnoLinGradientRef ref) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9); - Alloc param_10 = a; - uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11); - Alloc param_12 = a; - uint param_13 = ix + 6u; - uint raw6 = read_mem(param_12, param_13); - Alloc param_14 = a; - uint param_15 = ix + 7u; - uint raw7 = read_mem(param_14, param_15); - Alloc param_16 = a; - uint param_17 = ix + 8u; - uint raw8 = read_mem(param_16, param_17); - AnnoLinGradient s; - s.bbox = float4(asfloat(raw0), asfloat(raw1), asfloat(raw2), asfloat(raw3)); - s.linewidth = asfloat(raw4); - s.index = raw5; - s.line_x = asfloat(raw6); - s.line_y = asfloat(raw7); - s.line_c = asfloat(raw8); - return s; -} - -AnnoLinGradient Annotated_LinGradient_read(Alloc a, AnnotatedRef ref) -{ - AnnoLinGradientRef _733 = { ref.offset + 4u }; - Alloc param = a; - AnnoLinGradientRef param_1 = _733; - return AnnoLinGradient_read(param, param_1); -} - void CmdLinGrad_write(Alloc a, CmdLinGradRef ref, CmdLinGrad s) { uint ix = ref.offset >> uint(2); @@ -661,53 +505,13 @@ void Cmd_LinGrad_write(Alloc a, CmdRef ref, CmdLinGrad s) uint param_1 = ref.offset >> uint(2); uint param_2 = 6u; write_mem(param, param_1, param_2); - CmdLinGradRef _1098 = { ref.offset + 4u }; + CmdLinGradRef _668 = { ref.offset + 4u }; Alloc param_3 = a; - CmdLinGradRef param_4 = _1098; + CmdLinGradRef param_4 = _668; CmdLinGrad param_5 = s; CmdLinGrad_write(param_3, param_4, param_5); } -AnnoImage AnnoImage_read(Alloc a, AnnoImageRef ref) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9); - Alloc param_10 = a; - uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11); - Alloc param_12 = a; - uint param_13 = ix + 6u; - uint raw6 = read_mem(param_12, param_13); - AnnoImage s; - s.bbox = float4(asfloat(raw0), asfloat(raw1), asfloat(raw2), asfloat(raw3)); - s.linewidth = asfloat(raw4); - s.index = raw5; - s.offset = int2(int(raw6 << uint(16)) >> 16, int(raw6) >> 16); - return s; -} - -AnnoImage Annotated_Image_read(Alloc a, AnnotatedRef ref) -{ - AnnoImageRef _743 = { ref.offset + 4u }; - Alloc param = a; - AnnoImageRef param_1 = _743; - return AnnoImage_read(param, param_1); -} - void CmdImage_write(Alloc a, CmdImageRef ref, CmdImage s) { uint ix = ref.offset >> uint(2); @@ -727,9 +531,9 @@ void Cmd_Image_write(Alloc a, CmdRef ref, CmdImage s) uint param_1 = ref.offset >> uint(2); uint param_2 = 7u; write_mem(param, param_1, param_2); - CmdImageRef _1116 = { ref.offset + 4u }; + CmdImageRef _687 = { ref.offset + 4u }; Alloc param_3 = a; - CmdImageRef param_4 = _1116; + CmdImageRef param_4 = _687; CmdImage param_5 = s; CmdImage_write(param_3, param_4, param_5); } @@ -742,38 +546,6 @@ void Cmd_BeginClip_write(Alloc a, CmdRef ref) write_mem(param, param_1, param_2); } -AnnoEndClip AnnoEndClip_read(Alloc a, AnnoEndClipRef ref) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9); - AnnoEndClip s; - s.bbox = float4(asfloat(raw0), asfloat(raw1), asfloat(raw2), asfloat(raw3)); - s.blend = raw4; - return s; -} - -AnnoEndClip Annotated_EndClip_read(Alloc a, AnnotatedRef ref) -{ - AnnoEndClipRef _753 = { ref.offset + 4u }; - Alloc param = a; - AnnoEndClipRef param_1 = _753; - return AnnoEndClip_read(param, param_1); -} - void CmdEndClip_write(Alloc a, CmdEndClipRef ref, CmdEndClip s) { uint ix = ref.offset >> uint(2); @@ -789,9 +561,9 @@ void Cmd_EndClip_write(Alloc a, CmdRef ref, CmdEndClip s) uint param_1 = ref.offset >> uint(2); uint param_2 = 9u; write_mem(param, param_1, param_2); - CmdEndClipRef _1143 = { ref.offset + 4u }; + CmdEndClipRef _715 = { ref.offset + 4u }; Alloc param_3 = a; - CmdEndClipRef param_4 = _1143; + CmdEndClipRef param_4 = _715; CmdEndClip param_5 = s; CmdEndClip_write(param_3, param_4, param_5); } @@ -806,25 +578,25 @@ void Cmd_End_write(Alloc a, CmdRef ref) void comp_main() { - uint width_in_bins = ((_1283.Load(8) + 16u) - 1u) / 16u; + uint width_in_bins = ((_854.Load(8) + 16u) - 1u) / 16u; uint bin_ix = (width_in_bins * gl_WorkGroupID.y) + gl_WorkGroupID.x; uint partition_ix = 0u; - uint n_partitions = ((_1283.Load(0) + 256u) - 1u) / 256u; + uint n_partitions = ((_854.Load(0) + 256u) - 1u) / 256u; uint th_ix = gl_LocalInvocationID.x; uint bin_tile_x = 16u * gl_WorkGroupID.x; uint bin_tile_y = 16u * gl_WorkGroupID.y; uint tile_x = gl_LocalInvocationID.x % 16u; uint tile_y = gl_LocalInvocationID.x / 16u; - uint this_tile_ix = (((bin_tile_y + tile_y) * _1283.Load(8)) + bin_tile_x) + tile_x; - Alloc _1348; - _1348.offset = _1283.Load(24); + uint this_tile_ix = (((bin_tile_y + tile_y) * _854.Load(8)) + bin_tile_x) + tile_x; + Alloc _919; + _919.offset = _854.Load(24); Alloc param; - param.offset = _1348.offset; + param.offset = _919.offset; uint param_1 = this_tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); - CmdRef _1357 = { cmd_alloc.offset }; - CmdRef cmd_ref = _1357; + CmdRef _928 = { cmd_alloc.offset }; + CmdRef cmd_ref = _928; uint cmd_limit = (cmd_ref.offset + 1024u) - 60u; uint clip_depth = 0u; uint clip_zero_depth = 0u; @@ -832,59 +604,54 @@ void comp_main() uint wr_ix = 0u; uint part_start_ix = 0u; uint ready_ix = 0u; - bool mem_ok = _308.Load(4) == 0u; + uint drawmonoid_start = _854.Load(44) >> uint(2); + uint drawtag_start = _854.Load(100) >> uint(2); + uint drawdata_start = _854.Load(104) >> uint(2); + uint drawinfo_start = _854.Load(68) >> uint(2); + bool mem_ok = _242.Load(4) == 0u; Alloc param_3; Alloc param_5; - uint _1562; + uint _1154; uint element_ix; - AnnotatedRef ref; Alloc param_14; - Alloc param_16; uint tile_count; - Alloc param_23; - uint _1887; - Alloc param_29; - Tile tile_1; - AnnoColor fill; - Alloc param_35; - Alloc param_52; + uint _1453; + float linewidth; CmdLinGrad cmd_lin; - Alloc param_69; - Alloc param_95; while (true) { for (uint i = 0u; i < 8u; i++) { sh_bitmaps[i][th_ix] = 0u; } - bool _1614; + bool _1206; for (;;) { if ((ready_ix == wr_ix) && (partition_ix < n_partitions)) { part_start_ix = ready_ix; uint count = 0u; - bool _1412 = th_ix < 256u; - bool _1420; - if (_1412) + bool _1003 = th_ix < 256u; + bool _1011; + if (_1003) { - _1420 = (partition_ix + th_ix) < n_partitions; + _1011 = (partition_ix + th_ix) < n_partitions; } else { - _1420 = _1412; + _1011 = _1003; } - if (_1420) + if (_1011) { - uint in_ix = (_1283.Load(20) >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); - Alloc _1437; - _1437.offset = _1283.Load(20); - param_3.offset = _1437.offset; + uint in_ix = (_854.Load(20) >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); + Alloc _1029; + _1029.offset = _854.Load(20); + param_3.offset = _1029.offset; uint param_4 = in_ix; count = read_mem(param_3, param_4); - Alloc _1448; - _1448.offset = _1283.Load(20); - param_5.offset = _1448.offset; + Alloc _1040; + _1040.offset = _854.Load(20); + param_5.offset = _1040.offset; uint param_6 = in_ix + 1u; uint offset = read_mem(param_5, param_6); uint param_7 = offset; @@ -930,16 +697,16 @@ void comp_main() } if (part_ix > 0u) { - _1562 = sh_part_count[part_ix - 1u]; + _1154 = sh_part_count[part_ix - 1u]; } else { - _1562 = part_start_ix; + _1154 = part_start_ix; } - ix -= _1562; + ix -= _1154; Alloc bin_alloc = sh_part_elements[part_ix]; - BinInstanceRef _1581 = { bin_alloc.offset }; - BinInstanceRef inst_ref = _1581; + BinInstanceRef _1173 = { bin_alloc.offset }; + BinInstanceRef inst_ref = _1173; BinInstanceRef param_10 = inst_ref; uint param_11 = ix; Alloc param_12 = bin_alloc; @@ -949,16 +716,16 @@ void comp_main() } GroupMemoryBarrierWithGroupSync(); wr_ix = min((rd_ix + 256u), ready_ix); - bool _1604 = (wr_ix - rd_ix) < 256u; - if (_1604) + bool _1196 = (wr_ix - rd_ix) < 256u; + if (_1196) { - _1614 = (wr_ix < ready_ix) || (partition_ix < n_partitions); + _1206 = (wr_ix < ready_ix) || (partition_ix < n_partitions); } else { - _1614 = _1604; + _1206 = _1196; } - if (_1614) + if (_1206) { continue; } @@ -971,30 +738,24 @@ void comp_main() if ((th_ix + rd_ix) < wr_ix) { element_ix = sh_elements[th_ix]; - AnnotatedRef _1635 = { _1283.Load(32) + (element_ix * 40u) }; - ref = _1635; - Alloc _1638; - _1638.offset = _1283.Load(32); - param_14.offset = _1638.offset; - AnnotatedRef param_15 = ref; - tag = Annotated_tag(param_14, param_15).tag; + tag = _1222.Load((drawtag_start + element_ix) * 4 + 0); } switch (tag) { - case 1u: - case 3u: - case 2u: - case 4u: + case 68u: + case 72u: + case 276u: case 5u: + case 37u: { - uint drawmonoid_base = (_1283.Load(44) >> uint(2)) + (2u * element_ix); - uint path_ix = _308.Load(drawmonoid_base * 4 + 8); - PathRef _1667 = { _1283.Load(16) + (path_ix * 12u) }; - Alloc _1670; - _1670.offset = _1283.Load(16); - param_16.offset = _1670.offset; - PathRef param_17 = _1667; - Path path = Path_read(param_16, param_17); + uint drawmonoid_base = drawmonoid_start + (4u * element_ix); + uint path_ix = _242.Load(drawmonoid_base * 4 + 8); + PathRef _1247 = { _854.Load(16) + (path_ix * 12u) }; + Alloc _1250; + _1250.offset = _854.Load(16); + param_14.offset = _1250.offset; + PathRef param_15 = _1247; + Path path = Path_read(param_14, param_15); uint stride = path.bbox.z - path.bbox.x; sh_tile_stride[th_ix] = stride; int dx = int(path.bbox.x) - int(bin_tile_x); @@ -1009,13 +770,13 @@ void comp_main() tile_count = uint(x1 - x0) * uint(y1 - y0); uint base = path.tiles.offset - (((uint(dy) * stride) + uint(dx)) * 8u); sh_tile_base[th_ix] = base; - uint param_18 = path.tiles.offset; - uint param_19 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_20 = mem_ok; - Alloc path_alloc = new_alloc(param_18, param_19, param_20); - uint param_21 = th_ix; - Alloc param_22 = path_alloc; - write_tile_alloc(param_21, param_22); + uint param_16 = path.tiles.offset; + uint param_17 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_18 = mem_ok; + Alloc path_alloc = new_alloc(param_16, param_17, param_18); + uint param_19 = th_ix; + Alloc param_20 = path_alloc; + write_tile_alloc(param_19, param_20); break; } default: @@ -1048,72 +809,57 @@ void comp_main() el_ix = probe_1; } } - AnnotatedRef _1869 = { _1283.Load(32) + (sh_elements[el_ix] * 40u) }; - AnnotatedRef ref_1 = _1869; - Alloc _1874; - _1874.offset = _1283.Load(32); - param_23.offset = _1874.offset; - AnnotatedRef param_24 = ref_1; - AnnotatedTag anno_tag = Annotated_tag(param_23, param_24); - uint tag_1 = anno_tag.tag; + uint tag_1 = _1222.Load((drawtag_start + sh_elements[el_ix]) * 4 + 0); if (el_ix > 0u) { - _1887 = sh_tile_count[el_ix - 1u]; + _1453 = sh_tile_count[el_ix - 1u]; } else { - _1887 = 0u; + _1453 = 0u; } - uint seq_ix = ix_1 - _1887; + uint seq_ix = ix_1 - _1453; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); bool include_tile = false; if (mem_ok) { - uint param_25 = el_ix; - bool param_26 = mem_ok; - TileRef _1939 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; - Alloc param_27 = read_tile_alloc(param_25, param_26); - TileRef param_28 = _1939; - Tile tile = Tile_read(param_27, param_28); - bool is_clip = (tag_1 == 4u) || (tag_1 == 5u); - bool _1951 = tile.tile.offset != 0u; - bool _1960; - if (!_1951) + uint param_21 = el_ix; + bool param_22 = mem_ok; + TileRef _1505 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; + Alloc param_23 = read_tile_alloc(param_21, param_22); + TileRef param_24 = _1505; + Tile tile = Tile_read(param_23, param_24); + bool is_clip = (tag_1 & 1u) != 0u; + bool is_blend = false; + bool _1516 = tile.tile.offset != 0u; + bool _1525; + if (!_1516) { - _1960 = (tile.backdrop == 0) == is_clip; + _1525 = (tile.backdrop == 0) == is_clip; } else { - _1960 = _1951; + _1525 = _1516; } - bool _1972; - if (!_1960) + bool _1532; + if (!_1525) { - bool _1971; - if (is_clip) - { - _1971 = (anno_tag.flags & 2u) != 0u; - } - else - { - _1971 = is_clip; - } - _1972 = _1971; + _1532 = is_clip && is_blend; } else { - _1972 = _1960; + _1532 = _1525; } - include_tile = _1972; + include_tile = _1532; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1992; - InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1992); + uint _1552; + InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1552); } } GroupMemoryBarrierWithGroupSync(); @@ -1137,217 +883,176 @@ void comp_main() uint element_ref_ix = (slice_ix * 32u) + uint(int(firstbitlow(bitmap))); uint element_ix_1 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - AnnotatedRef _2046 = { _1283.Load(32) + (element_ix_1 * 40u) }; - ref = _2046; - Alloc _2050; - _2050.offset = _1283.Load(32); - param_29.offset = _2050.offset; - AnnotatedRef param_30 = ref; - AnnotatedTag tag_2 = Annotated_tag(param_29, param_30); + uint drawtag = _1222.Load((drawtag_start + element_ix_1) * 4 + 0); if (clip_zero_depth == 0u) { - switch (tag_2.tag) + uint param_25 = element_ref_ix; + bool param_26 = mem_ok; + TileRef _1629 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + Alloc param_27 = read_tile_alloc(param_25, param_26); + TileRef param_28 = _1629; + Tile tile_1 = Tile_read(param_27, param_28); + uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); + uint scene_offset = _242.Load((drawmonoid_base_1 + 2u) * 4 + 8); + uint info_offset = _242.Load((drawmonoid_base_1 + 3u) * 4 + 8); + uint dd = drawdata_start + (scene_offset >> uint(2)); + uint di = drawinfo_start + (info_offset >> uint(2)); + switch (drawtag) { - case 1u: + case 68u: { - uint param_31 = element_ref_ix; - bool param_32 = mem_ok; - TileRef _2086 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - Alloc param_33 = read_tile_alloc(param_31, param_32); - TileRef param_34 = _2086; - tile_1 = Tile_read(param_33, param_34); - Alloc _2093; - _2093.offset = _1283.Load(32); - param_35.offset = _2093.offset; - AnnotatedRef param_36 = ref; - fill = Annotated_Color_read(param_35, param_36); - Alloc param_37 = cmd_alloc; - CmdRef param_38 = cmd_ref; - uint param_39 = cmd_limit; - bool _2105 = alloc_cmd(param_37, param_38, param_39); - cmd_alloc = param_37; - cmd_ref = param_38; - cmd_limit = param_39; - if (!_2105) + linewidth = asfloat(_242.Load(di * 4 + 8)); + Alloc param_29 = cmd_alloc; + CmdRef param_30 = cmd_ref; + uint param_31 = cmd_limit; + bool _1676 = alloc_cmd(param_29, param_30, param_31); + cmd_alloc = param_29; + cmd_ref = param_30; + cmd_limit = param_31; + if (!_1676) { break; } - Alloc param_40 = cmd_alloc; - CmdRef param_41 = cmd_ref; - uint param_42 = tag_2.flags; - Tile param_43 = tile_1; - float param_44 = fill.linewidth; - write_fill(param_40, param_41, param_42, param_43, param_44); - cmd_ref = param_41; - CmdColor _2129 = { fill.rgba_color }; - Alloc param_45 = cmd_alloc; - CmdRef param_46 = cmd_ref; - CmdColor param_47 = _2129; - Cmd_Color_write(param_45, param_46, param_47); + Alloc param_32 = cmd_alloc; + CmdRef param_33 = cmd_ref; + Tile param_34 = tile_1; + float param_35 = linewidth; + write_fill(param_32, param_33, param_34, param_35); + cmd_ref = param_33; + uint rgba = _1222.Load(dd * 4 + 0); + CmdColor _1699 = { rgba }; + Alloc param_36 = cmd_alloc; + CmdRef param_37 = cmd_ref; + CmdColor param_38 = _1699; + Cmd_Color_write(param_36, param_37, param_38); cmd_ref.offset += 8u; break; } - case 2u: + case 276u: { - uint param_48 = element_ref_ix; - bool param_49 = mem_ok; - TileRef _2158 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - Alloc param_50 = read_tile_alloc(param_48, param_49); - TileRef param_51 = _2158; - tile_1 = Tile_read(param_50, param_51); - Alloc _2165; - _2165.offset = _1283.Load(32); - param_52.offset = _2165.offset; - AnnotatedRef param_53 = ref; - AnnoLinGradient lin = Annotated_LinGradient_read(param_52, param_53); - Alloc param_54 = cmd_alloc; - CmdRef param_55 = cmd_ref; - uint param_56 = cmd_limit; - bool _2177 = alloc_cmd(param_54, param_55, param_56); - cmd_alloc = param_54; - cmd_ref = param_55; - cmd_limit = param_56; - if (!_2177) + Alloc param_39 = cmd_alloc; + CmdRef param_40 = cmd_ref; + uint param_41 = cmd_limit; + bool _1717 = alloc_cmd(param_39, param_40, param_41); + cmd_alloc = param_39; + cmd_ref = param_40; + cmd_limit = param_41; + if (!_1717) { break; } - Alloc param_57 = cmd_alloc; - CmdRef param_58 = cmd_ref; - uint param_59 = tag_2.flags; - Tile param_60 = tile_1; - float param_61 = fill.linewidth; - write_fill(param_57, param_58, param_59, param_60, param_61); - cmd_ref = param_58; - cmd_lin.index = lin.index; - cmd_lin.line_x = lin.line_x; - cmd_lin.line_y = lin.line_y; - cmd_lin.line_c = lin.line_c; - Alloc param_62 = cmd_alloc; - CmdRef param_63 = cmd_ref; - CmdLinGrad param_64 = cmd_lin; - Cmd_LinGrad_write(param_62, param_63, param_64); + linewidth = asfloat(_242.Load(di * 4 + 8)); + Alloc param_42 = cmd_alloc; + CmdRef param_43 = cmd_ref; + Tile param_44 = tile_1; + float param_45 = linewidth; + write_fill(param_42, param_43, param_44, param_45); + cmd_ref = param_43; + cmd_lin.index = _1222.Load(dd * 4 + 0); + cmd_lin.line_x = asfloat(_242.Load((di + 1u) * 4 + 8)); + cmd_lin.line_y = asfloat(_242.Load((di + 2u) * 4 + 8)); + cmd_lin.line_c = asfloat(_242.Load((di + 3u) * 4 + 8)); + Alloc param_46 = cmd_alloc; + CmdRef param_47 = cmd_ref; + CmdLinGrad param_48 = cmd_lin; + Cmd_LinGrad_write(param_46, param_47, param_48); cmd_ref.offset += 20u; break; } - case 3u: + case 72u: { - uint param_65 = element_ref_ix; - bool param_66 = mem_ok; - TileRef _2242 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - Alloc param_67 = read_tile_alloc(param_65, param_66); - TileRef param_68 = _2242; - tile_1 = Tile_read(param_67, param_68); - Alloc _2249; - _2249.offset = _1283.Load(32); - param_69.offset = _2249.offset; - AnnotatedRef param_70 = ref; - AnnoImage fill_img = Annotated_Image_read(param_69, param_70); - Alloc param_71 = cmd_alloc; - CmdRef param_72 = cmd_ref; - uint param_73 = cmd_limit; - bool _2261 = alloc_cmd(param_71, param_72, param_73); - cmd_alloc = param_71; - cmd_ref = param_72; - cmd_limit = param_73; - if (!_2261) + linewidth = asfloat(_242.Load(di * 4 + 8)); + Alloc param_49 = cmd_alloc; + CmdRef param_50 = cmd_ref; + uint param_51 = cmd_limit; + bool _1785 = alloc_cmd(param_49, param_50, param_51); + cmd_alloc = param_49; + cmd_ref = param_50; + cmd_limit = param_51; + if (!_1785) { break; } - Alloc param_74 = cmd_alloc; - CmdRef param_75 = cmd_ref; - uint param_76 = tag_2.flags; - Tile param_77 = tile_1; - float param_78 = fill_img.linewidth; - write_fill(param_74, param_75, param_76, param_77, param_78); - cmd_ref = param_75; - CmdImage _2287 = { fill_img.index, fill_img.offset }; - Alloc param_79 = cmd_alloc; - CmdRef param_80 = cmd_ref; - CmdImage param_81 = _2287; - Cmd_Image_write(param_79, param_80, param_81); + Alloc param_52 = cmd_alloc; + CmdRef param_53 = cmd_ref; + Tile param_54 = tile_1; + float param_55 = linewidth; + write_fill(param_52, param_53, param_54, param_55); + cmd_ref = param_53; + uint index = _1222.Load(dd * 4 + 0); + uint raw1 = _1222.Load((dd + 1u) * 4 + 0); + int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); + CmdImage _1824 = { index, offset_1 }; + Alloc param_56 = cmd_alloc; + CmdRef param_57 = cmd_ref; + CmdImage param_58 = _1824; + Cmd_Image_write(param_56, param_57, param_58); cmd_ref.offset += 12u; break; } - case 4u: + case 5u: { - uint param_82 = element_ref_ix; - bool param_83 = mem_ok; - TileRef _2316 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - Alloc param_84 = read_tile_alloc(param_82, param_83); - TileRef param_85 = _2316; - tile_1 = Tile_read(param_84, param_85); - bool _2322 = tile_1.tile.offset == 0u; - bool _2328; - if (_2322) + bool _1838 = tile_1.tile.offset == 0u; + bool _1844; + if (_1838) { - _2328 = tile_1.backdrop == 0; + _1844 = tile_1.backdrop == 0; } else { - _2328 = _2322; + _1844 = _1838; } - if (_2328) + if (_1844) { clip_zero_depth = clip_depth + 1u; } else { - Alloc param_86 = cmd_alloc; - CmdRef param_87 = cmd_ref; - uint param_88 = cmd_limit; - bool _2340 = alloc_cmd(param_86, param_87, param_88); - cmd_alloc = param_86; - cmd_ref = param_87; - cmd_limit = param_88; - if (!_2340) + Alloc param_59 = cmd_alloc; + CmdRef param_60 = cmd_ref; + uint param_61 = cmd_limit; + bool _1856 = alloc_cmd(param_59, param_60, param_61); + cmd_alloc = param_59; + cmd_ref = param_60; + cmd_limit = param_61; + if (!_1856) { break; } - Alloc param_89 = cmd_alloc; - CmdRef param_90 = cmd_ref; - Cmd_BeginClip_write(param_89, param_90); + Alloc param_62 = cmd_alloc; + CmdRef param_63 = cmd_ref; + Cmd_BeginClip_write(param_62, param_63); cmd_ref.offset += 4u; } clip_depth++; break; } - case 5u: + case 37u: { - uint param_91 = element_ref_ix; - bool param_92 = mem_ok; - TileRef _2377 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - Alloc param_93 = read_tile_alloc(param_91, param_92); - TileRef param_94 = _2377; - tile_1 = Tile_read(param_93, param_94); - Alloc _2384; - _2384.offset = _1283.Load(32); - param_95.offset = _2384.offset; - AnnotatedRef param_96 = ref; - AnnoEndClip end_clip = Annotated_EndClip_read(param_95, param_96); clip_depth--; - Alloc param_97 = cmd_alloc; - CmdRef param_98 = cmd_ref; - uint param_99 = cmd_limit; - bool _2398 = alloc_cmd(param_97, param_98, param_99); - cmd_alloc = param_97; - cmd_ref = param_98; - cmd_limit = param_99; - if (!_2398) + Alloc param_64 = cmd_alloc; + CmdRef param_65 = cmd_ref; + uint param_66 = cmd_limit; + bool _1884 = alloc_cmd(param_64, param_65, param_66); + cmd_alloc = param_64; + cmd_ref = param_65; + cmd_limit = param_66; + if (!_1884) { break; } - Alloc param_100 = cmd_alloc; - CmdRef param_101 = cmd_ref; - uint param_102 = 0u; - Tile param_103 = tile_1; - float param_104 = 0.0f; - write_fill(param_100, param_101, param_102, param_103, param_104); - cmd_ref = param_101; - CmdEndClip _2419 = { end_clip.blend }; - Alloc param_105 = cmd_alloc; - CmdRef param_106 = cmd_ref; - CmdEndClip param_107 = _2419; - Cmd_EndClip_write(param_105, param_106, param_107); + Alloc param_67 = cmd_alloc; + CmdRef param_68 = cmd_ref; + Tile param_69 = tile_1; + float param_70 = -1.0f; + write_fill(param_67, param_68, param_69, param_70); + cmd_ref = param_68; + uint blend = _1222.Load(dd * 4 + 0); + CmdEndClip _1907 = { blend }; + Alloc param_71 = cmd_alloc; + CmdRef param_72 = cmd_ref; + CmdEndClip param_73 = _1907; + Cmd_EndClip_write(param_71, param_72, param_73); cmd_ref.offset += 8u; break; } @@ -1355,14 +1060,14 @@ void comp_main() } else { - switch (tag_2.tag) + switch (drawtag) { - case 4u: + case 5u: { clip_depth++; break; } - case 5u: + case 37u: { if (clip_depth == clip_zero_depth) { @@ -1381,21 +1086,21 @@ void comp_main() break; } } - bool _2467 = (bin_tile_x + tile_x) < _1283.Load(8); - bool _2476; - if (_2467) + bool _1954 = (bin_tile_x + tile_x) < _854.Load(8); + bool _1963; + if (_1954) { - _2476 = (bin_tile_y + tile_y) < _1283.Load(12); + _1963 = (bin_tile_y + tile_y) < _854.Load(12); } else { - _2476 = _2467; + _1963 = _1954; } - if (_2476) + if (_1963) { - Alloc param_108 = cmd_alloc; - CmdRef param_109 = cmd_ref; - Cmd_End_write(param_108, param_109); + Alloc param_74 = cmd_alloc; + CmdRef param_75 = cmd_ref; + Cmd_End_write(param_74, param_75); } } diff --git a/piet-gpu/shader/gen/coarse.msl b/piet-gpu/shader/gen/coarse.msl index 1422ff1..96f1026 100644 --- a/piet-gpu/shader/gen/coarse.msl +++ b/piet-gpu/shader/gen/coarse.msl @@ -25,68 +25,6 @@ struct MallocResult bool failed; }; -struct AnnoImageRef -{ - uint offset; -}; - -struct AnnoImage -{ - float4 bbox; - float linewidth; - uint index; - int2 offset; -}; - -struct AnnoColorRef -{ - uint offset; -}; - -struct AnnoColor -{ - float4 bbox; - float linewidth; - uint rgba_color; -}; - -struct AnnoLinGradientRef -{ - uint offset; -}; - -struct AnnoLinGradient -{ - float4 bbox; - float linewidth; - uint index; - float line_x; - float line_y; - float line_c; -}; - -struct AnnoEndClipRef -{ - uint offset; -}; - -struct AnnoEndClip -{ - float4 bbox; - uint blend; -}; - -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct BinInstanceRef { uint offset; @@ -229,12 +167,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -242,6 +182,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -249,6 +191,11 @@ struct ConfigBuf Config conf; }; +struct SceneBuf +{ + uint scene[1]; +}; + constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(256u, 1u, 1u); static inline __attribute__((always_inline)) @@ -264,7 +211,7 @@ bool touch_mem(thread const Alloc& alloc, thread const uint& offset) } static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_308, constant uint& v_308BufferSize) +uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = alloc; uint param_1 = offset; @@ -272,7 +219,7 @@ uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memor { return 0u; } - uint v = v_308.memory[offset]; + uint v = v_242.memory[offset]; return v; } @@ -291,39 +238,30 @@ BinInstanceRef BinInstance_index(thread const BinInstanceRef& ref, thread const } static inline __attribute__((always_inline)) -BinInstance BinInstance_read(thread const Alloc& a, thread const BinInstanceRef& ref, device Memory& v_308, constant uint& v_308BufferSize) +BinInstance BinInstance_read(thread const Alloc& a, thread const BinInstanceRef& ref, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_308, v_308BufferSize); + uint raw0 = read_mem(param, param_1, v_242, v_242BufferSize); BinInstance s; s.element_ix = raw0; return s; } static inline __attribute__((always_inline)) -AnnotatedTag Annotated_tag(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1, v_308, v_308BufferSize); - return AnnotatedTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; -} - -static inline __attribute__((always_inline)) -Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_308, constant uint& v_308BufferSize) +Path Path_read(thread const Alloc& a, thread const PathRef& ref, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_308, v_308BufferSize); + uint raw0 = read_mem(param, param_1, v_242, v_242BufferSize); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_308, v_308BufferSize); + uint raw1 = read_mem(param_2, param_3, v_242, v_242BufferSize); Alloc param_4 = a; uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_308, v_308BufferSize); + uint raw2 = read_mem(param_4, param_5, v_242, v_242BufferSize); Path s; s.bbox = uint4(raw0 & 65535u, raw0 >> uint(16), raw1 & 65535u, raw1 >> uint(16)); s.tiles = TileRef{ raw2 }; @@ -336,24 +274,24 @@ void write_tile_alloc(thread const uint& el_ix, thread const Alloc& a) } static inline __attribute__((always_inline)) -Alloc read_tile_alloc(thread const uint& el_ix, thread const bool& mem_ok, device Memory& v_308, constant uint& v_308BufferSize) +Alloc read_tile_alloc(thread const uint& el_ix, thread const bool& mem_ok, device Memory& v_242, constant uint& v_242BufferSize) { uint param = 0u; - uint param_1 = uint(int((v_308BufferSize - 8) / 4) * 4); + uint param_1 = uint(int((v_242BufferSize - 8) / 4) * 4); bool param_2 = mem_ok; return new_alloc(param, param_1, param_2); } static inline __attribute__((always_inline)) -Tile Tile_read(thread const Alloc& a, thread const TileRef& ref, device Memory& v_308, constant uint& v_308BufferSize) +Tile Tile_read(thread const Alloc& a, thread const TileRef& ref, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_308, v_308BufferSize); + uint raw0 = read_mem(param, param_1, v_242, v_242BufferSize); Alloc param_2 = a; uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_308, v_308BufferSize); + uint raw1 = read_mem(param_2, param_3, v_242, v_242BufferSize); Tile s; s.tile = TileSegRef{ raw0 }; s.backdrop = int(raw1); @@ -361,63 +299,26 @@ Tile Tile_read(thread const Alloc& a, thread const TileRef& ref, device Memory& } static inline __attribute__((always_inline)) -AnnoColor AnnoColor_read(thread const Alloc& a, thread const AnnoColorRef& ref, device Memory& v_308, constant uint& v_308BufferSize) +MallocResult malloc(thread const uint& size, device Memory& v_242, constant uint& v_242BufferSize) { - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_308, v_308BufferSize); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_308, v_308BufferSize); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_308, v_308BufferSize); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_308, v_308BufferSize); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_308, v_308BufferSize); - Alloc param_10 = a; - uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11, v_308, v_308BufferSize); - AnnoColor s; - s.bbox = float4(as_type(raw0), as_type(raw1), as_type(raw2), as_type(raw3)); - s.linewidth = as_type(raw4); - s.rgba_color = raw5; - return s; -} - -static inline __attribute__((always_inline)) -AnnoColor Annotated_Color_read(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - Alloc param = a; - AnnoColorRef param_1 = AnnoColorRef{ ref.offset + 4u }; - return AnnoColor_read(param, param_1, v_308, v_308BufferSize); -} - -static inline __attribute__((always_inline)) -MallocResult malloc(thread const uint& size, device Memory& v_308, constant uint& v_308BufferSize) -{ - uint _314 = atomic_fetch_add_explicit((device atomic_uint*)&v_308.mem_offset, size, memory_order_relaxed); - uint offset = _314; + uint _248 = atomic_fetch_add_explicit((device atomic_uint*)&v_242.mem_offset, size, memory_order_relaxed); + uint offset = _248; MallocResult r; - r.failed = (offset + size) > uint(int((v_308BufferSize - 8) / 4) * 4); + r.failed = (offset + size) > uint(int((v_242BufferSize - 8) / 4) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _343 = atomic_fetch_max_explicit((device atomic_uint*)&v_308.mem_error, 1u, memory_order_relaxed); + uint _277 = atomic_fetch_max_explicit((device atomic_uint*)&v_242.mem_error, 1u, memory_order_relaxed); return r; } return r; } static inline __attribute__((always_inline)) -void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_308, constant uint& v_308BufferSize) +void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = alloc; uint param_1 = offset; @@ -425,42 +326,42 @@ void write_mem(thread const Alloc& alloc, thread const uint& offset, thread cons { return; } - v_308.memory[offset] = val; + v_242.memory[offset] = val; } static inline __attribute__((always_inline)) -void CmdJump_write(thread const Alloc& a, thread const CmdJumpRef& ref, thread const CmdJump& s, device Memory& v_308, constant uint& v_308BufferSize) +void CmdJump_write(thread const Alloc& a, thread const CmdJumpRef& ref, thread const CmdJump& s, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.new_ref; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Jump_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdJump& s, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_Jump_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdJump& s, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 10u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; CmdJumpRef param_4 = CmdJumpRef{ ref.offset + 4u }; CmdJump param_5 = s; - CmdJump_write(param_3, param_4, param_5, v_308, v_308BufferSize); + CmdJump_write(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd_limit, device Memory& v_308, constant uint& v_308BufferSize) +bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd_limit, device Memory& v_242, constant uint& v_242BufferSize) { if (cmd_ref.offset < cmd_limit) { return true; } uint param = 1024u; - MallocResult _1190 = malloc(param, v_308, v_308BufferSize); - MallocResult new_cmd = _1190; + MallocResult _762 = malloc(param, v_242, v_242BufferSize); + MallocResult new_cmd = _762; if (new_cmd.failed) { return false; @@ -469,7 +370,7 @@ bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd Alloc param_1 = cmd_alloc; CmdRef param_2 = cmd_ref; CmdJump param_3 = jump; - Cmd_Jump_write(param_1, param_2, param_3, v_308, v_308BufferSize); + Cmd_Jump_write(param_1, param_2, param_3, v_242, v_242BufferSize); cmd_alloc = new_cmd.alloc; cmd_ref = CmdRef{ cmd_alloc.offset }; cmd_limit = (cmd_alloc.offset + 1024u) - 60u; @@ -477,358 +378,228 @@ bool alloc_cmd(thread Alloc& cmd_alloc, thread CmdRef& cmd_ref, thread uint& cmd } static inline __attribute__((always_inline)) -uint fill_mode_from_flags(thread const uint& flags) -{ - return flags & 1u; -} - -static inline __attribute__((always_inline)) -void CmdFill_write(thread const Alloc& a, thread const CmdFillRef& ref, thread const CmdFill& s, device Memory& v_308, constant uint& v_308BufferSize) +void CmdFill_write(thread const Alloc& a, thread const CmdFillRef& ref, thread const CmdFill& s, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.tile_ref; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = uint(s.backdrop); - write_mem(param_3, param_4, param_5, v_308, v_308BufferSize); + write_mem(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Fill_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdFill& s, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_Fill_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdFill& s, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 1u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; CmdFillRef param_4 = CmdFillRef{ ref.offset + 4u }; CmdFill param_5 = s; - CmdFill_write(param_3, param_4, param_5, v_308, v_308BufferSize); + CmdFill_write(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Solid_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_Solid_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 3u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void CmdStroke_write(thread const Alloc& a, thread const CmdStrokeRef& ref, thread const CmdStroke& s, device Memory& v_308, constant uint& v_308BufferSize) +void CmdStroke_write(thread const Alloc& a, thread const CmdStrokeRef& ref, thread const CmdStroke& s, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.tile_ref; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = as_type(s.half_width); - write_mem(param_3, param_4, param_5, v_308, v_308BufferSize); + write_mem(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Stroke_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdStroke& s, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_Stroke_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdStroke& s, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 2u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; CmdStrokeRef param_4 = CmdStrokeRef{ ref.offset + 4u }; CmdStroke param_5 = s; - CmdStroke_write(param_3, param_4, param_5, v_308, v_308BufferSize); + CmdStroke_write(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void write_fill(thread const Alloc& alloc, thread CmdRef& cmd_ref, thread const uint& flags, thread const Tile& tile, thread const float& linewidth, device Memory& v_308, constant uint& v_308BufferSize) +void write_fill(thread const Alloc& alloc, thread CmdRef& cmd_ref, thread const Tile& tile, thread const float& linewidth, device Memory& v_242, constant uint& v_242BufferSize) { - uint param = flags; - if (fill_mode_from_flags(param) == 0u) + if (linewidth < 0.0) { if (tile.tile.offset != 0u) { CmdFill cmd_fill = CmdFill{ tile.tile.offset, tile.backdrop }; - Alloc param_1 = alloc; - CmdRef param_2 = cmd_ref; - CmdFill param_3 = cmd_fill; - Cmd_Fill_write(param_1, param_2, param_3, v_308, v_308BufferSize); + Alloc param = alloc; + CmdRef param_1 = cmd_ref; + CmdFill param_2 = cmd_fill; + Cmd_Fill_write(param, param_1, param_2, v_242, v_242BufferSize); cmd_ref.offset += 12u; } else { - Alloc param_4 = alloc; - CmdRef param_5 = cmd_ref; - Cmd_Solid_write(param_4, param_5, v_308, v_308BufferSize); + Alloc param_3 = alloc; + CmdRef param_4 = cmd_ref; + Cmd_Solid_write(param_3, param_4, v_242, v_242BufferSize); cmd_ref.offset += 4u; } } else { CmdStroke cmd_stroke = CmdStroke{ tile.tile.offset, 0.5 * linewidth }; - Alloc param_6 = alloc; - CmdRef param_7 = cmd_ref; - CmdStroke param_8 = cmd_stroke; - Cmd_Stroke_write(param_6, param_7, param_8, v_308, v_308BufferSize); + Alloc param_5 = alloc; + CmdRef param_6 = cmd_ref; + CmdStroke param_7 = cmd_stroke; + Cmd_Stroke_write(param_5, param_6, param_7, v_242, v_242BufferSize); cmd_ref.offset += 12u; } } static inline __attribute__((always_inline)) -void CmdColor_write(thread const Alloc& a, thread const CmdColorRef& ref, thread const CmdColor& s, device Memory& v_308, constant uint& v_308BufferSize) +void CmdColor_write(thread const Alloc& a, thread const CmdColorRef& ref, thread const CmdColor& s, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.rgba_color; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Color_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdColor& s, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_Color_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdColor& s, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 5u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; CmdColorRef param_4 = CmdColorRef{ ref.offset + 4u }; CmdColor param_5 = s; - CmdColor_write(param_3, param_4, param_5, v_308, v_308BufferSize); + CmdColor_write(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -AnnoLinGradient AnnoLinGradient_read(thread const Alloc& a, thread const AnnoLinGradientRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_308, v_308BufferSize); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_308, v_308BufferSize); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_308, v_308BufferSize); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_308, v_308BufferSize); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_308, v_308BufferSize); - Alloc param_10 = a; - uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11, v_308, v_308BufferSize); - Alloc param_12 = a; - uint param_13 = ix + 6u; - uint raw6 = read_mem(param_12, param_13, v_308, v_308BufferSize); - Alloc param_14 = a; - uint param_15 = ix + 7u; - uint raw7 = read_mem(param_14, param_15, v_308, v_308BufferSize); - Alloc param_16 = a; - uint param_17 = ix + 8u; - uint raw8 = read_mem(param_16, param_17, v_308, v_308BufferSize); - AnnoLinGradient s; - s.bbox = float4(as_type(raw0), as_type(raw1), as_type(raw2), as_type(raw3)); - s.linewidth = as_type(raw4); - s.index = raw5; - s.line_x = as_type(raw6); - s.line_y = as_type(raw7); - s.line_c = as_type(raw8); - return s; -} - -static inline __attribute__((always_inline)) -AnnoLinGradient Annotated_LinGradient_read(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - Alloc param = a; - AnnoLinGradientRef param_1 = AnnoLinGradientRef{ ref.offset + 4u }; - return AnnoLinGradient_read(param, param_1, v_308, v_308BufferSize); -} - -static inline __attribute__((always_inline)) -void CmdLinGrad_write(thread const Alloc& a, thread const CmdLinGradRef& ref, thread const CmdLinGrad& s, device Memory& v_308, constant uint& v_308BufferSize) +void CmdLinGrad_write(thread const Alloc& a, thread const CmdLinGradRef& ref, thread const CmdLinGrad& s, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.index; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = as_type(s.line_x); - write_mem(param_3, param_4, param_5, v_308, v_308BufferSize); + write_mem(param_3, param_4, param_5, v_242, v_242BufferSize); Alloc param_6 = a; uint param_7 = ix + 2u; uint param_8 = as_type(s.line_y); - write_mem(param_6, param_7, param_8, v_308, v_308BufferSize); + write_mem(param_6, param_7, param_8, v_242, v_242BufferSize); Alloc param_9 = a; uint param_10 = ix + 3u; uint param_11 = as_type(s.line_c); - write_mem(param_9, param_10, param_11, v_308, v_308BufferSize); + write_mem(param_9, param_10, param_11, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_LinGrad_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdLinGrad& s, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_LinGrad_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdLinGrad& s, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 6u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; CmdLinGradRef param_4 = CmdLinGradRef{ ref.offset + 4u }; CmdLinGrad param_5 = s; - CmdLinGrad_write(param_3, param_4, param_5, v_308, v_308BufferSize); + CmdLinGrad_write(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -AnnoImage AnnoImage_read(thread const Alloc& a, thread const AnnoImageRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_308, v_308BufferSize); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_308, v_308BufferSize); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_308, v_308BufferSize); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_308, v_308BufferSize); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_308, v_308BufferSize); - Alloc param_10 = a; - uint param_11 = ix + 5u; - uint raw5 = read_mem(param_10, param_11, v_308, v_308BufferSize); - Alloc param_12 = a; - uint param_13 = ix + 6u; - uint raw6 = read_mem(param_12, param_13, v_308, v_308BufferSize); - AnnoImage s; - s.bbox = float4(as_type(raw0), as_type(raw1), as_type(raw2), as_type(raw3)); - s.linewidth = as_type(raw4); - s.index = raw5; - s.offset = int2(int(raw6 << uint(16)) >> 16, int(raw6) >> 16); - return s; -} - -static inline __attribute__((always_inline)) -AnnoImage Annotated_Image_read(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - Alloc param = a; - AnnoImageRef param_1 = AnnoImageRef{ ref.offset + 4u }; - return AnnoImage_read(param, param_1, v_308, v_308BufferSize); -} - -static inline __attribute__((always_inline)) -void CmdImage_write(thread const Alloc& a, thread const CmdImageRef& ref, thread const CmdImage& s, device Memory& v_308, constant uint& v_308BufferSize) +void CmdImage_write(thread const Alloc& a, thread const CmdImageRef& ref, thread const CmdImage& s, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.index; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = (uint(s.offset.x) & 65535u) | (uint(s.offset.y) << uint(16)); - write_mem(param_3, param_4, param_5, v_308, v_308BufferSize); + write_mem(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_Image_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdImage& s, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_Image_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdImage& s, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 7u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; CmdImageRef param_4 = CmdImageRef{ ref.offset + 4u }; CmdImage param_5 = s; - CmdImage_write(param_3, param_4, param_5, v_308, v_308BufferSize); + CmdImage_write(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_BeginClip_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_BeginClip_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 8u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -AnnoEndClip AnnoEndClip_read(thread const Alloc& a, thread const AnnoEndClipRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_308, v_308BufferSize); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_308, v_308BufferSize); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_308, v_308BufferSize); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_308, v_308BufferSize); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_308, v_308BufferSize); - AnnoEndClip s; - s.bbox = float4(as_type(raw0), as_type(raw1), as_type(raw2), as_type(raw3)); - s.blend = raw4; - return s; -} - -static inline __attribute__((always_inline)) -AnnoEndClip Annotated_EndClip_read(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_308, constant uint& v_308BufferSize) -{ - Alloc param = a; - AnnoEndClipRef param_1 = AnnoEndClipRef{ ref.offset + 4u }; - return AnnoEndClip_read(param, param_1, v_308, v_308BufferSize); -} - -static inline __attribute__((always_inline)) -void CmdEndClip_write(thread const Alloc& a, thread const CmdEndClipRef& ref, thread const CmdEndClip& s, device Memory& v_308, constant uint& v_308BufferSize) +void CmdEndClip_write(thread const Alloc& a, thread const CmdEndClipRef& ref, thread const CmdEndClip& s, device Memory& v_242, constant uint& v_242BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.blend; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_EndClip_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdEndClip& s, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_EndClip_write(thread const Alloc& a, thread const CmdRef& ref, thread const CmdEndClip& s, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 9u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); Alloc param_3 = a; CmdEndClipRef param_4 = CmdEndClipRef{ ref.offset + 4u }; CmdEndClip param_5 = s; - CmdEndClip_write(param_3, param_4, param_5, v_308, v_308BufferSize); + CmdEndClip_write(param_3, param_4, param_5, v_242, v_242BufferSize); } static inline __attribute__((always_inline)) -void Cmd_End_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_308, constant uint& v_308BufferSize) +void Cmd_End_write(thread const Alloc& a, thread const CmdRef& ref, device Memory& v_242, constant uint& v_242BufferSize) { Alloc param = a; uint param_1 = ref.offset >> uint(2); uint param_2 = 0u; - write_mem(param, param_1, param_2, v_308, v_308BufferSize); + write_mem(param, param_1, param_2, v_242, v_242BufferSize); } -kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_308 [[buffer(0)]], const device ConfigBuf& _1283 [[buffer(1)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_242 [[buffer(0)]], const device ConfigBuf& _854 [[buffer(1)]], const device SceneBuf& _1222 [[buffer(2)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { threadgroup uint sh_bitmaps[8][256]; threadgroup Alloc sh_part_elements[256]; @@ -840,19 +611,19 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M threadgroup uint sh_tile_y0[256]; threadgroup uint sh_tile_base[256]; threadgroup uint sh_tile_count[256]; - constant uint& v_308BufferSize = spvBufferSizeConstants[0]; - uint width_in_bins = ((_1283.conf.width_in_tiles + 16u) - 1u) / 16u; + constant uint& v_242BufferSize = spvBufferSizeConstants[0]; + uint width_in_bins = ((_854.conf.width_in_tiles + 16u) - 1u) / 16u; uint bin_ix = (width_in_bins * gl_WorkGroupID.y) + gl_WorkGroupID.x; uint partition_ix = 0u; - uint n_partitions = ((_1283.conf.n_elements + 256u) - 1u) / 256u; + uint n_partitions = ((_854.conf.n_elements + 256u) - 1u) / 256u; uint th_ix = gl_LocalInvocationID.x; uint bin_tile_x = 16u * gl_WorkGroupID.x; uint bin_tile_y = 16u * gl_WorkGroupID.y; uint tile_x = gl_LocalInvocationID.x % 16u; uint tile_y = gl_LocalInvocationID.x / 16u; - uint this_tile_ix = (((bin_tile_y + tile_y) * _1283.conf.width_in_tiles) + bin_tile_x) + tile_x; + uint this_tile_ix = (((bin_tile_y + tile_y) * _854.conf.width_in_tiles) + bin_tile_x) + tile_x; Alloc param; - param.offset = _1283.conf.ptcl_alloc.offset; + param.offset = _854.conf.ptcl_alloc.offset; uint param_1 = this_tile_ix * 1024u; uint param_2 = 1024u; Alloc cmd_alloc = slice_mem(param, param_1, param_2); @@ -864,57 +635,52 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint wr_ix = 0u; uint part_start_ix = 0u; uint ready_ix = 0u; - bool mem_ok = v_308.mem_error == 0u; + uint drawmonoid_start = _854.conf.drawmonoid_alloc.offset >> uint(2); + uint drawtag_start = _854.conf.drawtag_offset >> uint(2); + uint drawdata_start = _854.conf.drawdata_offset >> uint(2); + uint drawinfo_start = _854.conf.drawinfo_alloc.offset >> uint(2); + bool mem_ok = v_242.mem_error == 0u; Alloc param_3; Alloc param_5; - uint _1562; + uint _1154; uint element_ix; - AnnotatedRef ref; Alloc param_14; - Alloc param_16; uint tile_count; - Alloc param_23; - uint _1887; - Alloc param_29; - Tile tile_1; - AnnoColor fill; - Alloc param_35; - Alloc param_52; + uint _1453; + float linewidth; CmdLinGrad cmd_lin; - Alloc param_69; - Alloc param_95; while (true) { for (uint i = 0u; i < 8u; i++) { sh_bitmaps[i][th_ix] = 0u; } - bool _1614; + bool _1206; for (;;) { if ((ready_ix == wr_ix) && (partition_ix < n_partitions)) { part_start_ix = ready_ix; uint count = 0u; - bool _1412 = th_ix < 256u; - bool _1420; - if (_1412) + bool _1003 = th_ix < 256u; + bool _1011; + if (_1003) { - _1420 = (partition_ix + th_ix) < n_partitions; + _1011 = (partition_ix + th_ix) < n_partitions; } else { - _1420 = _1412; + _1011 = _1003; } - if (_1420) + if (_1011) { - uint in_ix = (_1283.conf.bin_alloc.offset >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); - param_3.offset = _1283.conf.bin_alloc.offset; + uint in_ix = (_854.conf.bin_alloc.offset >> uint(2)) + ((((partition_ix + th_ix) * 256u) + bin_ix) * 2u); + param_3.offset = _854.conf.bin_alloc.offset; uint param_4 = in_ix; - count = read_mem(param_3, param_4, v_308, v_308BufferSize); - param_5.offset = _1283.conf.bin_alloc.offset; + count = read_mem(param_3, param_4, v_242, v_242BufferSize); + param_5.offset = _854.conf.bin_alloc.offset; uint param_6 = in_ix + 1u; - uint offset = read_mem(param_5, param_6, v_308, v_308BufferSize); + uint offset = read_mem(param_5, param_6, v_242, v_242BufferSize); uint param_7 = offset; uint param_8 = count * 4u; bool param_9 = mem_ok; @@ -958,34 +724,34 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } if (part_ix > 0u) { - _1562 = sh_part_count[part_ix - 1u]; + _1154 = sh_part_count[part_ix - 1u]; } else { - _1562 = part_start_ix; + _1154 = part_start_ix; } - ix -= _1562; + ix -= _1154; Alloc bin_alloc = sh_part_elements[part_ix]; BinInstanceRef inst_ref = BinInstanceRef{ bin_alloc.offset }; BinInstanceRef param_10 = inst_ref; uint param_11 = ix; Alloc param_12 = bin_alloc; BinInstanceRef param_13 = BinInstance_index(param_10, param_11); - BinInstance inst = BinInstance_read(param_12, param_13, v_308, v_308BufferSize); + BinInstance inst = BinInstance_read(param_12, param_13, v_242, v_242BufferSize); sh_elements[th_ix] = inst.element_ix; } threadgroup_barrier(mem_flags::mem_threadgroup); wr_ix = min((rd_ix + 256u), ready_ix); - bool _1604 = (wr_ix - rd_ix) < 256u; - if (_1604) + bool _1196 = (wr_ix - rd_ix) < 256u; + if (_1196) { - _1614 = (wr_ix < ready_ix) || (partition_ix < n_partitions); + _1206 = (wr_ix < ready_ix) || (partition_ix < n_partitions); } else { - _1614 = _1604; + _1206 = _1196; } - if (_1614) + if (_1206) { continue; } @@ -998,24 +764,21 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M if ((th_ix + rd_ix) < wr_ix) { element_ix = sh_elements[th_ix]; - ref = AnnotatedRef{ _1283.conf.anno_alloc.offset + (element_ix * 40u) }; - param_14.offset = _1283.conf.anno_alloc.offset; - AnnotatedRef param_15 = ref; - tag = Annotated_tag(param_14, param_15, v_308, v_308BufferSize).tag; + tag = _1222.scene[drawtag_start + element_ix]; } switch (tag) { - case 1u: - case 3u: - case 2u: - case 4u: + case 68u: + case 72u: + case 276u: case 5u: + case 37u: { - uint drawmonoid_base = (_1283.conf.drawmonoid_alloc.offset >> uint(2)) + (2u * element_ix); - uint path_ix = v_308.memory[drawmonoid_base]; - param_16.offset = _1283.conf.tile_alloc.offset; - PathRef param_17 = PathRef{ _1283.conf.tile_alloc.offset + (path_ix * 12u) }; - Path path = Path_read(param_16, param_17, v_308, v_308BufferSize); + uint drawmonoid_base = drawmonoid_start + (4u * element_ix); + uint path_ix = v_242.memory[drawmonoid_base]; + param_14.offset = _854.conf.tile_alloc.offset; + PathRef param_15 = PathRef{ _854.conf.tile_alloc.offset + (path_ix * 12u) }; + Path path = Path_read(param_14, param_15, v_242, v_242BufferSize); uint stride = path.bbox.z - path.bbox.x; sh_tile_stride[th_ix] = stride; int dx = int(path.bbox.x) - int(bin_tile_x); @@ -1030,13 +793,13 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M tile_count = uint(x1 - x0) * uint(y1 - y0); uint base = path.tiles.offset - (((uint(dy) * stride) + uint(dx)) * 8u); sh_tile_base[th_ix] = base; - uint param_18 = path.tiles.offset; - uint param_19 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; - bool param_20 = mem_ok; - Alloc path_alloc = new_alloc(param_18, param_19, param_20); - uint param_21 = th_ix; - Alloc param_22 = path_alloc; - write_tile_alloc(param_21, param_22); + uint param_16 = path.tiles.offset; + uint param_17 = ((path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y)) * 8u; + bool param_18 = mem_ok; + Alloc path_alloc = new_alloc(param_16, param_17, param_18); + uint param_19 = th_ix; + Alloc param_20 = path_alloc; + write_tile_alloc(param_19, param_20); break; } default: @@ -1069,67 +832,55 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M el_ix = probe_1; } } - AnnotatedRef ref_1 = AnnotatedRef{ _1283.conf.anno_alloc.offset + (sh_elements[el_ix] * 40u) }; - param_23.offset = _1283.conf.anno_alloc.offset; - AnnotatedRef param_24 = ref_1; - AnnotatedTag anno_tag = Annotated_tag(param_23, param_24, v_308, v_308BufferSize); - uint tag_1 = anno_tag.tag; + uint tag_1 = _1222.scene[drawtag_start + sh_elements[el_ix]]; if (el_ix > 0u) { - _1887 = sh_tile_count[el_ix - 1u]; + _1453 = sh_tile_count[el_ix - 1u]; } else { - _1887 = 0u; + _1453 = 0u; } - uint seq_ix = ix_1 - _1887; + uint seq_ix = ix_1 - _1453; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); bool include_tile = false; if (mem_ok) { - uint param_25 = el_ix; - bool param_26 = mem_ok; - Alloc param_27 = read_tile_alloc(param_25, param_26, v_308, v_308BufferSize); - TileRef param_28 = TileRef{ sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; - Tile tile = Tile_read(param_27, param_28, v_308, v_308BufferSize); - bool is_clip = (tag_1 == 4u) || (tag_1 == 5u); - bool _1951 = tile.tile.offset != 0u; - bool _1960; - if (!_1951) + uint param_21 = el_ix; + bool param_22 = mem_ok; + Alloc param_23 = read_tile_alloc(param_21, param_22, v_242, v_242BufferSize); + TileRef param_24 = TileRef{ sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; + Tile tile = Tile_read(param_23, param_24, v_242, v_242BufferSize); + bool is_clip = (tag_1 & 1u) != 0u; + bool is_blend = false; + bool _1516 = tile.tile.offset != 0u; + bool _1525; + if (!_1516) { - _1960 = (tile.backdrop == 0) == is_clip; + _1525 = (tile.backdrop == 0) == is_clip; } else { - _1960 = _1951; + _1525 = _1516; } - bool _1972; - if (!_1960) + bool _1532; + if (!_1525) { - bool _1971; - if (is_clip) - { - _1971 = (anno_tag.flags & 2u) != 0u; - } - else - { - _1971 = is_clip; - } - _1972 = _1971; + _1532 = is_clip && is_blend; } else { - _1972 = _1960; + _1532 = _1525; } - include_tile = _1972; + include_tile = _1532; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1992 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); + uint _1552 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); } } threadgroup_barrier(mem_flags::mem_threadgroup); @@ -1153,198 +904,172 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint element_ref_ix = (slice_ix * 32u) + uint(int(spvFindLSB(bitmap))); uint element_ix_1 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - ref = AnnotatedRef{ _1283.conf.anno_alloc.offset + (element_ix_1 * 40u) }; - param_29.offset = _1283.conf.anno_alloc.offset; - AnnotatedRef param_30 = ref; - AnnotatedTag tag_2 = Annotated_tag(param_29, param_30, v_308, v_308BufferSize); + uint drawtag = _1222.scene[drawtag_start + element_ix_1]; if (clip_zero_depth == 0u) { - switch (tag_2.tag) + uint param_25 = element_ref_ix; + bool param_26 = mem_ok; + Alloc param_27 = read_tile_alloc(param_25, param_26, v_242, v_242BufferSize); + TileRef param_28 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + Tile tile_1 = Tile_read(param_27, param_28, v_242, v_242BufferSize); + uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); + uint scene_offset = v_242.memory[drawmonoid_base_1 + 2u]; + uint info_offset = v_242.memory[drawmonoid_base_1 + 3u]; + uint dd = drawdata_start + (scene_offset >> uint(2)); + uint di = drawinfo_start + (info_offset >> uint(2)); + switch (drawtag) { - case 1u: + case 68u: { - uint param_31 = element_ref_ix; - bool param_32 = mem_ok; - Alloc param_33 = read_tile_alloc(param_31, param_32, v_308, v_308BufferSize); - TileRef param_34 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - tile_1 = Tile_read(param_33, param_34, v_308, v_308BufferSize); - param_35.offset = _1283.conf.anno_alloc.offset; - AnnotatedRef param_36 = ref; - fill = Annotated_Color_read(param_35, param_36, v_308, v_308BufferSize); - Alloc param_37 = cmd_alloc; - CmdRef param_38 = cmd_ref; - uint param_39 = cmd_limit; - bool _2105 = alloc_cmd(param_37, param_38, param_39, v_308, v_308BufferSize); - cmd_alloc = param_37; - cmd_ref = param_38; - cmd_limit = param_39; - if (!_2105) + linewidth = as_type(v_242.memory[di]); + Alloc param_29 = cmd_alloc; + CmdRef param_30 = cmd_ref; + uint param_31 = cmd_limit; + bool _1676 = alloc_cmd(param_29, param_30, param_31, v_242, v_242BufferSize); + cmd_alloc = param_29; + cmd_ref = param_30; + cmd_limit = param_31; + if (!_1676) { break; } - Alloc param_40 = cmd_alloc; - CmdRef param_41 = cmd_ref; - uint param_42 = tag_2.flags; - Tile param_43 = tile_1; - float param_44 = fill.linewidth; - write_fill(param_40, param_41, param_42, param_43, param_44, v_308, v_308BufferSize); - cmd_ref = param_41; - Alloc param_45 = cmd_alloc; - CmdRef param_46 = cmd_ref; - CmdColor param_47 = CmdColor{ fill.rgba_color }; - Cmd_Color_write(param_45, param_46, param_47, v_308, v_308BufferSize); + Alloc param_32 = cmd_alloc; + CmdRef param_33 = cmd_ref; + Tile param_34 = tile_1; + float param_35 = linewidth; + write_fill(param_32, param_33, param_34, param_35, v_242, v_242BufferSize); + cmd_ref = param_33; + uint rgba = _1222.scene[dd]; + Alloc param_36 = cmd_alloc; + CmdRef param_37 = cmd_ref; + CmdColor param_38 = CmdColor{ rgba }; + Cmd_Color_write(param_36, param_37, param_38, v_242, v_242BufferSize); cmd_ref.offset += 8u; break; } - case 2u: + case 276u: { - uint param_48 = element_ref_ix; - bool param_49 = mem_ok; - Alloc param_50 = read_tile_alloc(param_48, param_49, v_308, v_308BufferSize); - TileRef param_51 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - tile_1 = Tile_read(param_50, param_51, v_308, v_308BufferSize); - param_52.offset = _1283.conf.anno_alloc.offset; - AnnotatedRef param_53 = ref; - AnnoLinGradient lin = Annotated_LinGradient_read(param_52, param_53, v_308, v_308BufferSize); - Alloc param_54 = cmd_alloc; - CmdRef param_55 = cmd_ref; - uint param_56 = cmd_limit; - bool _2177 = alloc_cmd(param_54, param_55, param_56, v_308, v_308BufferSize); - cmd_alloc = param_54; - cmd_ref = param_55; - cmd_limit = param_56; - if (!_2177) + Alloc param_39 = cmd_alloc; + CmdRef param_40 = cmd_ref; + uint param_41 = cmd_limit; + bool _1717 = alloc_cmd(param_39, param_40, param_41, v_242, v_242BufferSize); + cmd_alloc = param_39; + cmd_ref = param_40; + cmd_limit = param_41; + if (!_1717) { break; } - Alloc param_57 = cmd_alloc; - CmdRef param_58 = cmd_ref; - uint param_59 = tag_2.flags; - Tile param_60 = tile_1; - float param_61 = fill.linewidth; - write_fill(param_57, param_58, param_59, param_60, param_61, v_308, v_308BufferSize); - cmd_ref = param_58; - cmd_lin.index = lin.index; - cmd_lin.line_x = lin.line_x; - cmd_lin.line_y = lin.line_y; - cmd_lin.line_c = lin.line_c; - Alloc param_62 = cmd_alloc; - CmdRef param_63 = cmd_ref; - CmdLinGrad param_64 = cmd_lin; - Cmd_LinGrad_write(param_62, param_63, param_64, v_308, v_308BufferSize); + linewidth = as_type(v_242.memory[di]); + Alloc param_42 = cmd_alloc; + CmdRef param_43 = cmd_ref; + Tile param_44 = tile_1; + float param_45 = linewidth; + write_fill(param_42, param_43, param_44, param_45, v_242, v_242BufferSize); + cmd_ref = param_43; + cmd_lin.index = _1222.scene[dd]; + cmd_lin.line_x = as_type(v_242.memory[di + 1u]); + cmd_lin.line_y = as_type(v_242.memory[di + 2u]); + cmd_lin.line_c = as_type(v_242.memory[di + 3u]); + Alloc param_46 = cmd_alloc; + CmdRef param_47 = cmd_ref; + CmdLinGrad param_48 = cmd_lin; + Cmd_LinGrad_write(param_46, param_47, param_48, v_242, v_242BufferSize); cmd_ref.offset += 20u; break; } - case 3u: + case 72u: { - uint param_65 = element_ref_ix; - bool param_66 = mem_ok; - Alloc param_67 = read_tile_alloc(param_65, param_66, v_308, v_308BufferSize); - TileRef param_68 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - tile_1 = Tile_read(param_67, param_68, v_308, v_308BufferSize); - param_69.offset = _1283.conf.anno_alloc.offset; - AnnotatedRef param_70 = ref; - AnnoImage fill_img = Annotated_Image_read(param_69, param_70, v_308, v_308BufferSize); - Alloc param_71 = cmd_alloc; - CmdRef param_72 = cmd_ref; - uint param_73 = cmd_limit; - bool _2261 = alloc_cmd(param_71, param_72, param_73, v_308, v_308BufferSize); - cmd_alloc = param_71; - cmd_ref = param_72; - cmd_limit = param_73; - if (!_2261) + linewidth = as_type(v_242.memory[di]); + Alloc param_49 = cmd_alloc; + CmdRef param_50 = cmd_ref; + uint param_51 = cmd_limit; + bool _1785 = alloc_cmd(param_49, param_50, param_51, v_242, v_242BufferSize); + cmd_alloc = param_49; + cmd_ref = param_50; + cmd_limit = param_51; + if (!_1785) { break; } - Alloc param_74 = cmd_alloc; - CmdRef param_75 = cmd_ref; - uint param_76 = tag_2.flags; - Tile param_77 = tile_1; - float param_78 = fill_img.linewidth; - write_fill(param_74, param_75, param_76, param_77, param_78, v_308, v_308BufferSize); - cmd_ref = param_75; - Alloc param_79 = cmd_alloc; - CmdRef param_80 = cmd_ref; - CmdImage param_81 = CmdImage{ fill_img.index, fill_img.offset }; - Cmd_Image_write(param_79, param_80, param_81, v_308, v_308BufferSize); + Alloc param_52 = cmd_alloc; + CmdRef param_53 = cmd_ref; + Tile param_54 = tile_1; + float param_55 = linewidth; + write_fill(param_52, param_53, param_54, param_55, v_242, v_242BufferSize); + cmd_ref = param_53; + uint index = _1222.scene[dd]; + uint raw1 = _1222.scene[dd + 1u]; + int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); + Alloc param_56 = cmd_alloc; + CmdRef param_57 = cmd_ref; + CmdImage param_58 = CmdImage{ index, offset_1 }; + Cmd_Image_write(param_56, param_57, param_58, v_242, v_242BufferSize); cmd_ref.offset += 12u; break; } - case 4u: + case 5u: { - uint param_82 = element_ref_ix; - bool param_83 = mem_ok; - Alloc param_84 = read_tile_alloc(param_82, param_83, v_308, v_308BufferSize); - TileRef param_85 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - tile_1 = Tile_read(param_84, param_85, v_308, v_308BufferSize); - bool _2322 = tile_1.tile.offset == 0u; - bool _2328; - if (_2322) + bool _1838 = tile_1.tile.offset == 0u; + bool _1844; + if (_1838) { - _2328 = tile_1.backdrop == 0; + _1844 = tile_1.backdrop == 0; } else { - _2328 = _2322; + _1844 = _1838; } - if (_2328) + if (_1844) { clip_zero_depth = clip_depth + 1u; } else { - Alloc param_86 = cmd_alloc; - CmdRef param_87 = cmd_ref; - uint param_88 = cmd_limit; - bool _2340 = alloc_cmd(param_86, param_87, param_88, v_308, v_308BufferSize); - cmd_alloc = param_86; - cmd_ref = param_87; - cmd_limit = param_88; - if (!_2340) + Alloc param_59 = cmd_alloc; + CmdRef param_60 = cmd_ref; + uint param_61 = cmd_limit; + bool _1856 = alloc_cmd(param_59, param_60, param_61, v_242, v_242BufferSize); + cmd_alloc = param_59; + cmd_ref = param_60; + cmd_limit = param_61; + if (!_1856) { break; } - Alloc param_89 = cmd_alloc; - CmdRef param_90 = cmd_ref; - Cmd_BeginClip_write(param_89, param_90, v_308, v_308BufferSize); + Alloc param_62 = cmd_alloc; + CmdRef param_63 = cmd_ref; + Cmd_BeginClip_write(param_62, param_63, v_242, v_242BufferSize); cmd_ref.offset += 4u; } clip_depth++; break; } - case 5u: + case 37u: { - uint param_91 = element_ref_ix; - bool param_92 = mem_ok; - Alloc param_93 = read_tile_alloc(param_91, param_92, v_308, v_308BufferSize); - TileRef param_94 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; - tile_1 = Tile_read(param_93, param_94, v_308, v_308BufferSize); - param_95.offset = _1283.conf.anno_alloc.offset; - AnnotatedRef param_96 = ref; - AnnoEndClip end_clip = Annotated_EndClip_read(param_95, param_96, v_308, v_308BufferSize); clip_depth--; - Alloc param_97 = cmd_alloc; - CmdRef param_98 = cmd_ref; - uint param_99 = cmd_limit; - bool _2398 = alloc_cmd(param_97, param_98, param_99, v_308, v_308BufferSize); - cmd_alloc = param_97; - cmd_ref = param_98; - cmd_limit = param_99; - if (!_2398) + Alloc param_64 = cmd_alloc; + CmdRef param_65 = cmd_ref; + uint param_66 = cmd_limit; + bool _1884 = alloc_cmd(param_64, param_65, param_66, v_242, v_242BufferSize); + cmd_alloc = param_64; + cmd_ref = param_65; + cmd_limit = param_66; + if (!_1884) { break; } - Alloc param_100 = cmd_alloc; - CmdRef param_101 = cmd_ref; - uint param_102 = 0u; - Tile param_103 = tile_1; - float param_104 = 0.0; - write_fill(param_100, param_101, param_102, param_103, param_104, v_308, v_308BufferSize); - cmd_ref = param_101; - Alloc param_105 = cmd_alloc; - CmdRef param_106 = cmd_ref; - CmdEndClip param_107 = CmdEndClip{ end_clip.blend }; - Cmd_EndClip_write(param_105, param_106, param_107, v_308, v_308BufferSize); + Alloc param_67 = cmd_alloc; + CmdRef param_68 = cmd_ref; + Tile param_69 = tile_1; + float param_70 = -1.0; + write_fill(param_67, param_68, param_69, param_70, v_242, v_242BufferSize); + cmd_ref = param_68; + uint blend = _1222.scene[dd]; + Alloc param_71 = cmd_alloc; + CmdRef param_72 = cmd_ref; + CmdEndClip param_73 = CmdEndClip{ blend }; + Cmd_EndClip_write(param_71, param_72, param_73, v_242, v_242BufferSize); cmd_ref.offset += 8u; break; } @@ -1352,14 +1077,14 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } else { - switch (tag_2.tag) + switch (drawtag) { - case 4u: + case 5u: { clip_depth++; break; } - case 5u: + case 37u: { if (clip_depth == clip_zero_depth) { @@ -1378,21 +1103,21 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M break; } } - bool _2467 = (bin_tile_x + tile_x) < _1283.conf.width_in_tiles; - bool _2476; - if (_2467) + bool _1954 = (bin_tile_x + tile_x) < _854.conf.width_in_tiles; + bool _1963; + if (_1954) { - _2476 = (bin_tile_y + tile_y) < _1283.conf.height_in_tiles; + _1963 = (bin_tile_y + tile_y) < _854.conf.height_in_tiles; } else { - _2476 = _2467; + _1963 = _1954; } - if (_2476) + if (_1963) { - Alloc param_108 = cmd_alloc; - CmdRef param_109 = cmd_ref; - Cmd_End_write(param_108, param_109, v_308, v_308BufferSize); + Alloc param_74 = cmd_alloc; + CmdRef param_75 = cmd_ref; + Cmd_End_write(param_74, param_75, v_242, v_242BufferSize); } } diff --git a/piet-gpu/shader/gen/coarse.spv b/piet-gpu/shader/gen/coarse.spv index 1fef2d7ff96591b86fde79fcd401ee5cac41ca05..bc272303af7cd01f07e7ef9bbf352afb980bb1d7 100644 GIT binary patch literal 51712 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
>+~Tn!Ypre)!rCl*-drnx?yKB%ZMA@(G3{ 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 diff --git a/piet-gpu/shader/gen/draw_leaf.hlsl b/piet-gpu/shader/gen/draw_leaf.hlsl index 1f2f78b..f812f52 100644 --- a/piet-gpu/shader/gen/draw_leaf.hlsl +++ b/piet-gpu/shader/gen/draw_leaf.hlsl @@ -1,133 +1,12 @@ -struct Alloc -{ - uint offset; -}; - -struct ElementRef -{ - uint offset; -}; - -struct FillColorRef -{ - uint offset; -}; - -struct FillColor -{ - uint rgba_color; -}; - -struct FillLinGradientRef -{ - uint offset; -}; - -struct FillLinGradient -{ - uint index; - float2 p0; - float2 p1; -}; - -struct FillImageRef -{ - uint offset; -}; - -struct FillImage -{ - uint index; - int2 offset; -}; - -struct ClipRef -{ - uint offset; -}; - -struct Clip -{ - float4 bbox; - uint blend; -}; - -struct ElementTag -{ - uint tag; - uint flags; -}; - struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; -struct AnnoImageRef -{ - uint offset; -}; - -struct AnnoImage -{ - float4 bbox; - float linewidth; - uint index; - int2 offset; -}; - -struct AnnoColorRef -{ - uint offset; -}; - -struct AnnoColor -{ - float4 bbox; - float linewidth; - uint rgba_color; -}; - -struct AnnoLinGradientRef -{ - uint offset; -}; - -struct AnnoLinGradient -{ - float4 bbox; - float linewidth; - uint index; - float line_x; - float line_y; - float line_c; -}; - -struct AnnoBeginClipRef -{ - uint offset; -}; - -struct AnnoBeginClip -{ - float4 bbox; - float linewidth; - uint blend; -}; - -struct AnnoEndClipRef -{ - uint offset; -}; - -struct AnnoEndClip -{ - float4 bbox; - uint blend; -}; - -struct AnnotatedRef +struct Alloc { uint offset; }; @@ -144,12 +23,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -157,18 +38,18 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -static const DrawMonoid _413 = { 0u, 0u }; -static const DrawMonoid _437 = { 1u, 0u }; -static const DrawMonoid _439 = { 1u, 1u }; +static const DrawMonoid _23 = { 0u, 0u, 0u, 0u }; -RWByteAddressBuffer _199 : register(u0, space0); -ByteAddressBuffer _223 : register(t2, space0); -ByteAddressBuffer _1020 : register(t3, space0); -ByteAddressBuffer _1054 : register(t1, space0); +ByteAddressBuffer _92 : register(t1, space0); +ByteAddressBuffer _102 : register(t2, space0); +ByteAddressBuffer _202 : register(t3, space0); +RWByteAddressBuffer _284 : register(u0, space0); static uint3 gl_WorkGroupID; static uint3 gl_LocalInvocationID; @@ -182,389 +63,44 @@ struct SPIRV_Cross_Input groupshared DrawMonoid sh_scratch[256]; -ElementTag Element_tag(ElementRef ref) -{ - uint tag_and_flags = _223.Load((ref.offset >> uint(2)) * 4 + 0); - ElementTag _378 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _378; -} - DrawMonoid map_tag(uint tag_word) { - switch (tag_word) - { - case 4u: - case 5u: - case 6u: - { - return _437; - } - case 9u: - case 10u: - { - return _439; - } - default: - { - return _413; - } - } + uint has_path = uint(tag_word != 0u); + DrawMonoid _75 = { has_path, tag_word & 1u, tag_word & 28u, (tag_word >> uint(4)) & 28u }; + return _75; } -ElementRef Element_index(ElementRef ref, uint index) -{ - ElementRef _212 = { ref.offset + (index * 36u) }; - return _212; -} - -DrawMonoid combine_tag_monoid(DrawMonoid a, DrawMonoid b) +DrawMonoid combine_draw_monoid(DrawMonoid a, DrawMonoid b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; + c.scene_offset = a.scene_offset + b.scene_offset; + c.info_offset = a.info_offset + b.info_offset; return c; } -DrawMonoid tag_monoid_identity() +DrawMonoid draw_monoid_identity() { - return _413; -} - -FillColor FillColor_read(FillColorRef ref) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = _223.Load((ix + 0u) * 4 + 0); - FillColor s; - s.rgba_color = raw0; - return s; -} - -FillColor Element_FillColor_read(ElementRef ref) -{ - FillColorRef _384 = { ref.offset + 4u }; - FillColorRef param = _384; - return FillColor_read(param); -} - -bool touch_mem(Alloc alloc, uint offset) -{ - return true; -} - -void write_mem(Alloc alloc, uint offset, uint val) -{ - Alloc param = alloc; - uint param_1 = offset; - if (!touch_mem(param, param_1)) - { - return; - } - _199.Store(offset * 4 + 8, val); -} - -void AnnoColor_write(Alloc a, AnnoColorRef ref, AnnoColor s) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = asuint(s.bbox.x); - write_mem(param, param_1, param_2); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = asuint(s.bbox.y); - write_mem(param_3, param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = asuint(s.bbox.z); - write_mem(param_6, param_7, param_8); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = asuint(s.bbox.w); - write_mem(param_9, param_10, param_11); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = asuint(s.linewidth); - write_mem(param_12, param_13, param_14); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.rgba_color; - write_mem(param_15, param_16, param_17); -} - -void Annotated_Color_write(Alloc a, AnnotatedRef ref, uint flags, AnnoColor s) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 1u; - write_mem(param, param_1, param_2); - AnnoColorRef _818 = { ref.offset + 4u }; - Alloc param_3 = a; - AnnoColorRef param_4 = _818; - AnnoColor param_5 = s; - AnnoColor_write(param_3, param_4, param_5); -} - -FillLinGradient FillLinGradient_read(FillLinGradientRef ref) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = _223.Load((ix + 0u) * 4 + 0); - uint raw1 = _223.Load((ix + 1u) * 4 + 0); - uint raw2 = _223.Load((ix + 2u) * 4 + 0); - uint raw3 = _223.Load((ix + 3u) * 4 + 0); - uint raw4 = _223.Load((ix + 4u) * 4 + 0); - FillLinGradient s; - s.index = raw0; - s.p0 = float2(asfloat(raw1), asfloat(raw2)); - s.p1 = float2(asfloat(raw3), asfloat(raw4)); - return s; -} - -FillLinGradient Element_FillLinGradient_read(ElementRef ref) -{ - FillLinGradientRef _392 = { ref.offset + 4u }; - FillLinGradientRef param = _392; - return FillLinGradient_read(param); -} - -void AnnoLinGradient_write(Alloc a, AnnoLinGradientRef ref, AnnoLinGradient s) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = asuint(s.bbox.x); - write_mem(param, param_1, param_2); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = asuint(s.bbox.y); - write_mem(param_3, param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = asuint(s.bbox.z); - write_mem(param_6, param_7, param_8); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = asuint(s.bbox.w); - write_mem(param_9, param_10, param_11); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = asuint(s.linewidth); - write_mem(param_12, param_13, param_14); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.index; - write_mem(param_15, param_16, param_17); - Alloc param_18 = a; - uint param_19 = ix + 6u; - uint param_20 = asuint(s.line_x); - write_mem(param_18, param_19, param_20); - Alloc param_21 = a; - uint param_22 = ix + 7u; - uint param_23 = asuint(s.line_y); - write_mem(param_21, param_22, param_23); - Alloc param_24 = a; - uint param_25 = ix + 8u; - uint param_26 = asuint(s.line_c); - write_mem(param_24, param_25, param_26); -} - -void Annotated_LinGradient_write(Alloc a, AnnotatedRef ref, uint flags, AnnoLinGradient s) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 2u; - write_mem(param, param_1, param_2); - AnnoLinGradientRef _839 = { ref.offset + 4u }; - Alloc param_3 = a; - AnnoLinGradientRef param_4 = _839; - AnnoLinGradient param_5 = s; - AnnoLinGradient_write(param_3, param_4, param_5); -} - -FillImage FillImage_read(FillImageRef ref) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = _223.Load((ix + 0u) * 4 + 0); - uint raw1 = _223.Load((ix + 1u) * 4 + 0); - FillImage s; - s.index = raw0; - s.offset = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - return s; -} - -FillImage Element_FillImage_read(ElementRef ref) -{ - FillImageRef _400 = { ref.offset + 4u }; - FillImageRef param = _400; - return FillImage_read(param); -} - -void AnnoImage_write(Alloc a, AnnoImageRef ref, AnnoImage s) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = asuint(s.bbox.x); - write_mem(param, param_1, param_2); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = asuint(s.bbox.y); - write_mem(param_3, param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = asuint(s.bbox.z); - write_mem(param_6, param_7, param_8); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = asuint(s.bbox.w); - write_mem(param_9, param_10, param_11); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = asuint(s.linewidth); - write_mem(param_12, param_13, param_14); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.index; - write_mem(param_15, param_16, param_17); - Alloc param_18 = a; - uint param_19 = ix + 6u; - uint param_20 = (uint(s.offset.x) & 65535u) | (uint(s.offset.y) << uint(16)); - write_mem(param_18, param_19, param_20); -} - -void Annotated_Image_write(Alloc a, AnnotatedRef ref, uint flags, AnnoImage s) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 3u; - write_mem(param, param_1, param_2); - AnnoImageRef _860 = { ref.offset + 4u }; - Alloc param_3 = a; - AnnoImageRef param_4 = _860; - AnnoImage param_5 = s; - AnnoImage_write(param_3, param_4, param_5); -} - -Clip Clip_read(ClipRef ref) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = _223.Load((ix + 0u) * 4 + 0); - uint raw1 = _223.Load((ix + 1u) * 4 + 0); - uint raw2 = _223.Load((ix + 2u) * 4 + 0); - uint raw3 = _223.Load((ix + 3u) * 4 + 0); - Clip s; - s.bbox = float4(asfloat(raw0), asfloat(raw1), asfloat(raw2), asfloat(raw3)); - s.blend = _223.Load((ix + 4u) * 4 + 0); - return s; -} - -Clip Element_BeginClip_read(ElementRef ref) -{ - ClipRef _408 = { ref.offset + 4u }; - ClipRef param = _408; - return Clip_read(param); -} - -void AnnoBeginClip_write(Alloc a, AnnoBeginClipRef ref, AnnoBeginClip s) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = asuint(s.bbox.x); - write_mem(param, param_1, param_2); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = asuint(s.bbox.y); - write_mem(param_3, param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = asuint(s.bbox.z); - write_mem(param_6, param_7, param_8); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = asuint(s.bbox.w); - write_mem(param_9, param_10, param_11); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = asuint(s.linewidth); - write_mem(param_12, param_13, param_14); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.blend; - write_mem(param_15, param_16, param_17); -} - -void Annotated_BeginClip_write(Alloc a, AnnotatedRef ref, uint flags, AnnoBeginClip s) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 4u; - write_mem(param, param_1, param_2); - AnnoBeginClipRef _881 = { ref.offset + 4u }; - Alloc param_3 = a; - AnnoBeginClipRef param_4 = _881; - AnnoBeginClip param_5 = s; - AnnoBeginClip_write(param_3, param_4, param_5); -} - -void AnnoEndClip_write(Alloc a, AnnoEndClipRef ref, AnnoEndClip s) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = asuint(s.bbox.x); - write_mem(param, param_1, param_2); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = asuint(s.bbox.y); - write_mem(param_3, param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = asuint(s.bbox.z); - write_mem(param_6, param_7, param_8); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = asuint(s.bbox.w); - write_mem(param_9, param_10, param_11); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = s.blend; - write_mem(param_12, param_13, param_14); -} - -void Annotated_EndClip_write(Alloc a, AnnotatedRef ref, uint flags, AnnoEndClip s) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 5u; - write_mem(param, param_1, param_2); - AnnoEndClipRef _902 = { ref.offset + 4u }; - Alloc param_3 = a; - AnnoEndClipRef param_4 = _902; - AnnoEndClip param_5 = s; - AnnoEndClip_write(param_3, param_4, param_5); + return _23; } void comp_main() { uint ix = gl_GlobalInvocationID.x * 8u; - ElementRef _920 = { ix * 36u }; - ElementRef ref = _920; - ElementRef param = ref; - uint tag_word = Element_tag(param).tag; - uint param_1 = tag_word; - DrawMonoid agg = map_tag(param_1); + uint drawtag_base = _92.Load(100) >> uint(2); + uint tag_word = _102.Load((drawtag_base + ix) * 4 + 0); + uint param = tag_word; + DrawMonoid agg = map_tag(param); DrawMonoid local[8]; local[0] = agg; for (uint i = 1u; i < 8u; i++) { - ElementRef param_2 = ref; - uint param_3 = i; - ElementRef param_4 = Element_index(param_2, param_3); - tag_word = Element_tag(param_4).tag; - uint param_5 = tag_word; - DrawMonoid param_6 = agg; - DrawMonoid param_7 = map_tag(param_5); - agg = combine_tag_monoid(param_6, param_7); + tag_word = _102.Load(((drawtag_base + ix) + i) * 4 + 0); + uint param_1 = tag_word; + DrawMonoid param_2 = agg; + DrawMonoid param_3 = map_tag(param_1); + agg = combine_draw_monoid(param_2, param_3); local[i] = agg; } sh_scratch[gl_LocalInvocationID.x] = agg; @@ -574,194 +110,121 @@ void comp_main() if (gl_LocalInvocationID.x >= (1u << i_1)) { DrawMonoid other = sh_scratch[gl_LocalInvocationID.x - (1u << i_1)]; - DrawMonoid param_8 = other; - DrawMonoid param_9 = agg; - agg = combine_tag_monoid(param_8, param_9); + DrawMonoid param_4 = other; + DrawMonoid param_5 = agg; + agg = combine_draw_monoid(param_4, param_5); } GroupMemoryBarrierWithGroupSync(); sh_scratch[gl_LocalInvocationID.x] = agg; } GroupMemoryBarrierWithGroupSync(); - DrawMonoid row = tag_monoid_identity(); + DrawMonoid row = draw_monoid_identity(); if (gl_WorkGroupID.x > 0u) { - DrawMonoid _1026; - _1026.path_ix = _1020.Load((gl_WorkGroupID.x - 1u) * 8 + 0); - _1026.clip_ix = _1020.Load((gl_WorkGroupID.x - 1u) * 8 + 4); - row.path_ix = _1026.path_ix; - row.clip_ix = _1026.clip_ix; + DrawMonoid _208; + _208.path_ix = _202.Load((gl_WorkGroupID.x - 1u) * 16 + 0); + _208.clip_ix = _202.Load((gl_WorkGroupID.x - 1u) * 16 + 4); + _208.scene_offset = _202.Load((gl_WorkGroupID.x - 1u) * 16 + 8); + _208.info_offset = _202.Load((gl_WorkGroupID.x - 1u) * 16 + 12); + row.path_ix = _208.path_ix; + row.clip_ix = _208.clip_ix; + row.scene_offset = _208.scene_offset; + row.info_offset = _208.info_offset; } if (gl_LocalInvocationID.x > 0u) { - DrawMonoid param_10 = row; - DrawMonoid param_11 = sh_scratch[gl_LocalInvocationID.x - 1u]; - row = combine_tag_monoid(param_10, param_11); + DrawMonoid param_6 = row; + DrawMonoid param_7 = sh_scratch[gl_LocalInvocationID.x - 1u]; + row = combine_draw_monoid(param_6, param_7); } + uint drawdata_base = _92.Load(104) >> uint(2); + uint drawinfo_base = _92.Load(68) >> uint(2); uint out_ix = gl_GlobalInvocationID.x * 8u; - uint out_base = (_1054.Load(44) >> uint(2)) + (out_ix * 2u); - uint clip_out_base = _1054.Load(48) >> uint(2); - AnnotatedRef _1075 = { _1054.Load(32) + (out_ix * 40u) }; - AnnotatedRef out_ref = _1075; + uint out_base = (_92.Load(44) >> uint(2)) + (out_ix * 4u); + uint clip_out_base = _92.Load(48) >> uint(2); float4 mat; float2 translate; - AnnoColor anno_fill; - Alloc param_18; - AnnoLinGradient anno_lin; - Alloc param_23; - AnnoImage anno_img; - Alloc param_28; - AnnoBeginClip anno_begin_clip; - Alloc param_33; - AnnoEndClip anno_end_clip; - Alloc param_38; for (uint i_2 = 0u; i_2 < 8u; i_2++) { DrawMonoid m = row; if (i_2 > 0u) { - DrawMonoid param_12 = m; - DrawMonoid param_13 = local[i_2 - 1u]; - m = combine_tag_monoid(param_12, param_13); + DrawMonoid param_8 = m; + DrawMonoid param_9 = local[i_2 - 1u]; + m = combine_draw_monoid(param_8, param_9); } - _199.Store((out_base + (i_2 * 2u)) * 4 + 8, m.path_ix); - _199.Store(((out_base + (i_2 * 2u)) + 1u) * 4 + 8, m.clip_ix); - ElementRef param_14 = ref; - uint param_15 = i_2; - ElementRef this_ref = Element_index(param_14, param_15); - ElementRef param_16 = this_ref; - tag_word = Element_tag(param_16).tag; - if ((((tag_word == 4u) || (tag_word == 5u)) || (tag_word == 6u)) || (tag_word == 9u)) + _284.Store((out_base + (i_2 * 4u)) * 4 + 8, m.path_ix); + _284.Store(((out_base + (i_2 * 4u)) + 1u) * 4 + 8, m.clip_ix); + _284.Store(((out_base + (i_2 * 4u)) + 2u) * 4 + 8, m.scene_offset); + _284.Store(((out_base + (i_2 * 4u)) + 3u) * 4 + 8, m.info_offset); + uint dd = drawdata_base + (m.scene_offset >> uint(2)); + uint di = drawinfo_base + (m.info_offset >> uint(2)); + tag_word = _102.Load(((drawtag_base + ix) + i_2) * 4 + 0); + if ((((tag_word == 68u) || (tag_word == 276u)) || (tag_word == 72u)) || (tag_word == 5u)) { - uint bbox_offset = (_1054.Load(40) >> uint(2)) + (6u * m.path_ix); - float bbox_l = float(_199.Load(bbox_offset * 4 + 8)) - 32768.0f; - float bbox_t = float(_199.Load((bbox_offset + 1u) * 4 + 8)) - 32768.0f; - float bbox_r = float(_199.Load((bbox_offset + 2u) * 4 + 8)) - 32768.0f; - float bbox_b = float(_199.Load((bbox_offset + 3u) * 4 + 8)) - 32768.0f; + uint bbox_offset = (_92.Load(40) >> uint(2)) + (6u * m.path_ix); + float bbox_l = float(_284.Load(bbox_offset * 4 + 8)) - 32768.0f; + float bbox_t = float(_284.Load((bbox_offset + 1u) * 4 + 8)) - 32768.0f; + float bbox_r = float(_284.Load((bbox_offset + 2u) * 4 + 8)) - 32768.0f; + float bbox_b = float(_284.Load((bbox_offset + 3u) * 4 + 8)) - 32768.0f; float4 bbox = float4(bbox_l, bbox_t, bbox_r, bbox_b); - float linewidth = asfloat(_199.Load((bbox_offset + 4u) * 4 + 8)); + float linewidth = asfloat(_284.Load((bbox_offset + 4u) * 4 + 8)); uint fill_mode = uint(linewidth >= 0.0f); - if ((linewidth >= 0.0f) || (tag_word == 5u)) + if ((linewidth >= 0.0f) || (tag_word == 276u)) { - uint trans_ix = _199.Load((bbox_offset + 5u) * 4 + 8); - uint t = (_1054.Load(36) >> uint(2)) + (6u * trans_ix); - mat = asfloat(uint4(_199.Load(t * 4 + 8), _199.Load((t + 1u) * 4 + 8), _199.Load((t + 2u) * 4 + 8), _199.Load((t + 3u) * 4 + 8))); - if (tag_word == 5u) + uint trans_ix = _284.Load((bbox_offset + 5u) * 4 + 8); + uint t = (_92.Load(36) >> uint(2)) + (6u * trans_ix); + mat = asfloat(uint4(_284.Load(t * 4 + 8), _284.Load((t + 1u) * 4 + 8), _284.Load((t + 2u) * 4 + 8), _284.Load((t + 3u) * 4 + 8))); + if (tag_word == 276u) { - translate = asfloat(uint2(_199.Load((t + 4u) * 4 + 8), _199.Load((t + 5u) * 4 + 8))); + translate = asfloat(uint2(_284.Load((t + 4u) * 4 + 8), _284.Load((t + 5u) * 4 + 8))); } } if (linewidth >= 0.0f) { linewidth *= sqrt(abs((mat.x * mat.w) - (mat.y * mat.z))); } - linewidth = max(linewidth, 0.0f); switch (tag_word) { - case 4u: + case 68u: + case 72u: { - ElementRef param_17 = this_ref; - FillColor fill = Element_FillColor_read(param_17); - anno_fill.bbox = bbox; - anno_fill.linewidth = linewidth; - anno_fill.rgba_color = fill.rgba_color; - Alloc _1288; - _1288.offset = _1054.Load(32); - param_18.offset = _1288.offset; - AnnotatedRef param_19 = out_ref; - uint param_20 = fill_mode; - AnnoColor param_21 = anno_fill; - Annotated_Color_write(param_18, param_19, param_20, param_21); + _284.Store(di * 4 + 8, asuint(linewidth)); break; } - case 5u: + case 276u: { - ElementRef param_22 = this_ref; - FillLinGradient lin = Element_FillLinGradient_read(param_22); - anno_lin.bbox = bbox; - anno_lin.linewidth = linewidth; - anno_lin.index = lin.index; - float2 p0 = ((mat.xy * lin.p0.x) + (mat.zw * lin.p0.y)) + translate; - float2 p1 = ((mat.xy * lin.p1.x) + (mat.zw * lin.p1.y)) + translate; + _284.Store(di * 4 + 8, asuint(linewidth)); + uint index = _102.Load(dd * 4 + 0); + float2 p0 = asfloat(uint2(_102.Load((dd + 1u) * 4 + 0), _102.Load((dd + 2u) * 4 + 0))); + float2 p1 = asfloat(uint2(_102.Load((dd + 3u) * 4 + 0), _102.Load((dd + 4u) * 4 + 0))); + p0 = ((mat.xy * p0.x) + (mat.zw * p0.y)) + translate; + p1 = ((mat.xy * p1.x) + (mat.zw * p1.y)) + translate; float2 dxy = p1 - p0; float scale = 1.0f / ((dxy.x * dxy.x) + (dxy.y * dxy.y)); float line_x = dxy.x * scale; float line_y = dxy.y * scale; - anno_lin.line_x = line_x; - anno_lin.line_y = line_y; - anno_lin.line_c = -((p0.x * line_x) + (p0.y * line_y)); - Alloc _1384; - _1384.offset = _1054.Load(32); - param_23.offset = _1384.offset; - AnnotatedRef param_24 = out_ref; - uint param_25 = fill_mode; - AnnoLinGradient param_26 = anno_lin; - Annotated_LinGradient_write(param_23, param_24, param_25, param_26); + float line_c = -((p0.x * line_x) + (p0.y * line_y)); + _284.Store((di + 1u) * 4 + 8, asuint(line_x)); + _284.Store((di + 2u) * 4 + 8, asuint(line_y)); + _284.Store((di + 3u) * 4 + 8, asuint(line_c)); break; } - case 6u: + case 5u: { - ElementRef param_27 = this_ref; - FillImage fill_img = Element_FillImage_read(param_27); - anno_img.bbox = bbox; - anno_img.linewidth = linewidth; - anno_img.index = fill_img.index; - anno_img.offset = fill_img.offset; - Alloc _1412; - _1412.offset = _1054.Load(32); - param_28.offset = _1412.offset; - AnnotatedRef param_29 = out_ref; - uint param_30 = fill_mode; - AnnoImage param_31 = anno_img; - Annotated_Image_write(param_28, param_29, param_30, param_31); - break; - } - case 9u: - { - ElementRef param_32 = this_ref; - Clip begin_clip = Element_BeginClip_read(param_32); - anno_begin_clip.bbox = bbox; - anno_begin_clip.linewidth = 0.0f; - anno_begin_clip.blend = begin_clip.blend; - uint flags = uint(begin_clip.blend != 3u) << uint(1); - Alloc _1442; - _1442.offset = _1054.Load(32); - param_33.offset = _1442.offset; - AnnotatedRef param_34 = out_ref; - uint param_35 = flags; - AnnoBeginClip param_36 = anno_begin_clip; - Annotated_BeginClip_write(param_33, param_34, param_35, param_36); break; } } } - else - { - if (tag_word == 10u) - { - ElementRef param_37 = this_ref; - Clip end_clip = Element_BeginClip_read(param_37); - anno_end_clip.bbox = float4(-1000000000.0f, -1000000000.0f, 1000000000.0f, 1000000000.0f); - anno_end_clip.blend = end_clip.blend; - uint flags_1 = uint(end_clip.blend != 3u) << uint(1); - Alloc _1480; - _1480.offset = _1054.Load(32); - param_38.offset = _1480.offset; - AnnotatedRef param_39 = out_ref; - uint param_40 = flags_1; - AnnoEndClip param_41 = anno_end_clip; - Annotated_EndClip_write(param_38, param_39, param_40, param_41); - } - } - if ((tag_word == 9u) || (tag_word == 10u)) + if ((tag_word == 5u) || (tag_word == 37u)) { uint path_ix = ~(out_ix + i_2); - if (tag_word == 9u) + if (tag_word == 5u) { path_ix = m.path_ix; } - _199.Store((clip_out_base + m.clip_ix) * 4 + 8, path_ix); + _284.Store((clip_out_base + m.clip_ix) * 4 + 8, path_ix); } - out_ref.offset += 40u; } } diff --git a/piet-gpu/shader/gen/draw_leaf.msl b/piet-gpu/shader/gen/draw_leaf.msl index 5b9ecc6..a8516ae 100644 --- a/piet-gpu/shader/gen/draw_leaf.msl +++ b/piet-gpu/shader/gen/draw_leaf.msl @@ -44,145 +44,53 @@ struct spvUnsafeArray } }; +struct DrawMonoid +{ + uint path_ix; + uint clip_ix; + uint scene_offset; + uint info_offset; +}; + struct Alloc { uint offset; }; -struct ElementRef +struct Config { - uint offset; + uint n_elements; + uint n_pathseg; + uint width_in_tiles; + uint height_in_tiles; + Alloc tile_alloc; + Alloc bin_alloc; + Alloc ptcl_alloc; + Alloc pathseg_alloc; + Alloc anno_alloc; + Alloc trans_alloc; + Alloc path_bbox_alloc; + Alloc drawmonoid_alloc; + Alloc clip_alloc; + Alloc clip_bic_alloc; + Alloc clip_stack_alloc; + Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; + uint n_trans; + uint n_path; + uint n_clip; + uint trans_offset; + uint linewidth_offset; + uint pathtag_offset; + uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; -struct FillColorRef +struct ConfigBuf { - uint offset; -}; - -struct FillColor -{ - uint rgba_color; -}; - -struct FillLinGradientRef -{ - uint offset; -}; - -struct FillLinGradient -{ - uint index; - float2 p0; - float2 p1; -}; - -struct FillImageRef -{ - uint offset; -}; - -struct FillImage -{ - uint index; - int2 offset; -}; - -struct ClipRef -{ - uint offset; -}; - -struct Clip -{ - float4 bbox; - uint blend; -}; - -struct ElementTag -{ - uint tag; - uint flags; -}; - -struct DrawMonoid -{ - uint path_ix; - uint clip_ix; -}; - -struct AnnoImageRef -{ - uint offset; -}; - -struct AnnoImage -{ - float4 bbox; - float linewidth; - uint index; - int2 offset; -}; - -struct AnnoColorRef -{ - uint offset; -}; - -struct AnnoColor -{ - float4 bbox; - float linewidth; - uint rgba_color; -}; - -struct AnnoLinGradientRef -{ - uint offset; -}; - -struct AnnoLinGradient -{ - float4 bbox; - float linewidth; - uint index; - float line_x; - float line_y; - float line_c; -}; - -struct AnnoBeginClipRef -{ - uint offset; -}; - -struct AnnoBeginClip -{ - float4 bbox; - float linewidth; - uint blend; -}; - -struct AnnoEndClipRef -{ - uint offset; -}; - -struct AnnoEndClip -{ - float4 bbox; - uint blend; -}; - -struct AnnotatedRef -{ - uint offset; -}; - -struct Memory -{ - uint mem_offset; - uint mem_error; - uint memory[1]; + Config conf; }; struct SceneBuf @@ -194,6 +102,8 @@ struct DrawMonoid_1 { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; struct ParentBuf @@ -201,442 +111,56 @@ struct ParentBuf DrawMonoid_1 parent[1]; }; -struct Alloc_1 +struct Memory { - uint offset; -}; - -struct Config -{ - uint n_elements; - uint n_pathseg; - uint width_in_tiles; - uint height_in_tiles; - Alloc_1 tile_alloc; - Alloc_1 bin_alloc; - Alloc_1 ptcl_alloc; - Alloc_1 pathseg_alloc; - Alloc_1 anno_alloc; - Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; - Alloc_1 drawmonoid_alloc; - Alloc_1 clip_alloc; - Alloc_1 clip_bic_alloc; - Alloc_1 clip_stack_alloc; - Alloc_1 clip_bbox_alloc; - uint n_trans; - uint n_path; - uint n_clip; - uint trans_offset; - uint linewidth_offset; - uint pathtag_offset; - uint pathseg_offset; -}; - -struct ConfigBuf -{ - Config conf; + uint mem_offset; + uint mem_error; + uint memory[1]; }; constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(256u, 1u, 1u); -static inline __attribute__((always_inline)) -ElementTag Element_tag(thread const ElementRef& ref, const device SceneBuf& v_223) -{ - uint tag_and_flags = v_223.scene[ref.offset >> uint(2)]; - return ElementTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; -} - static inline __attribute__((always_inline)) DrawMonoid map_tag(thread const uint& tag_word) { - switch (tag_word) - { - case 4u: - case 5u: - case 6u: - { - return DrawMonoid{ 1u, 0u }; - } - case 9u: - case 10u: - { - return DrawMonoid{ 1u, 1u }; - } - default: - { - return DrawMonoid{ 0u, 0u }; - } - } + uint has_path = uint(tag_word != 0u); + return DrawMonoid{ has_path, tag_word & 1u, tag_word & 28u, (tag_word >> uint(4)) & 28u }; } static inline __attribute__((always_inline)) -ElementRef Element_index(thread const ElementRef& ref, thread const uint& index) -{ - return ElementRef{ ref.offset + (index * 36u) }; -} - -static inline __attribute__((always_inline)) -DrawMonoid combine_tag_monoid(thread const DrawMonoid& a, thread const DrawMonoid& b) +DrawMonoid combine_draw_monoid(thread const DrawMonoid& a, thread const DrawMonoid& b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; + c.scene_offset = a.scene_offset + b.scene_offset; + c.info_offset = a.info_offset + b.info_offset; return c; } static inline __attribute__((always_inline)) -DrawMonoid tag_monoid_identity() +DrawMonoid draw_monoid_identity() { - return DrawMonoid{ 0u, 0u }; + return DrawMonoid{ 0u, 0u, 0u, 0u }; } -static inline __attribute__((always_inline)) -FillColor FillColor_read(thread const FillColorRef& ref, const device SceneBuf& v_223) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = v_223.scene[ix + 0u]; - FillColor s; - s.rgba_color = raw0; - return s; -} - -static inline __attribute__((always_inline)) -FillColor Element_FillColor_read(thread const ElementRef& ref, const device SceneBuf& v_223) -{ - FillColorRef param = FillColorRef{ ref.offset + 4u }; - return FillColor_read(param, v_223); -} - -static inline __attribute__((always_inline)) -bool touch_mem(thread const Alloc& alloc, thread const uint& offset) -{ - return true; -} - -static inline __attribute__((always_inline)) -void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_199) -{ - Alloc param = alloc; - uint param_1 = offset; - if (!touch_mem(param, param_1)) - { - return; - } - v_199.memory[offset] = val; -} - -static inline __attribute__((always_inline)) -void AnnoColor_write(thread const Alloc& a, thread const AnnoColorRef& ref, thread const AnnoColor& s, device Memory& v_199) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = as_type(s.bbox.x); - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = as_type(s.bbox.y); - write_mem(param_3, param_4, param_5, v_199); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = as_type(s.bbox.z); - write_mem(param_6, param_7, param_8, v_199); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = as_type(s.bbox.w); - write_mem(param_9, param_10, param_11, v_199); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = as_type(s.linewidth); - write_mem(param_12, param_13, param_14, v_199); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.rgba_color; - write_mem(param_15, param_16, param_17, v_199); -} - -static inline __attribute__((always_inline)) -void Annotated_Color_write(thread const Alloc& a, thread const AnnotatedRef& ref, thread const uint& flags, thread const AnnoColor& s, device Memory& v_199) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 1u; - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - AnnoColorRef param_4 = AnnoColorRef{ ref.offset + 4u }; - AnnoColor param_5 = s; - AnnoColor_write(param_3, param_4, param_5, v_199); -} - -static inline __attribute__((always_inline)) -FillLinGradient FillLinGradient_read(thread const FillLinGradientRef& ref, const device SceneBuf& v_223) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = v_223.scene[ix + 0u]; - uint raw1 = v_223.scene[ix + 1u]; - uint raw2 = v_223.scene[ix + 2u]; - uint raw3 = v_223.scene[ix + 3u]; - uint raw4 = v_223.scene[ix + 4u]; - FillLinGradient s; - s.index = raw0; - s.p0 = float2(as_type(raw1), as_type(raw2)); - s.p1 = float2(as_type(raw3), as_type(raw4)); - return s; -} - -static inline __attribute__((always_inline)) -FillLinGradient Element_FillLinGradient_read(thread const ElementRef& ref, const device SceneBuf& v_223) -{ - FillLinGradientRef param = FillLinGradientRef{ ref.offset + 4u }; - return FillLinGradient_read(param, v_223); -} - -static inline __attribute__((always_inline)) -void AnnoLinGradient_write(thread const Alloc& a, thread const AnnoLinGradientRef& ref, thread const AnnoLinGradient& s, device Memory& v_199) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = as_type(s.bbox.x); - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = as_type(s.bbox.y); - write_mem(param_3, param_4, param_5, v_199); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = as_type(s.bbox.z); - write_mem(param_6, param_7, param_8, v_199); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = as_type(s.bbox.w); - write_mem(param_9, param_10, param_11, v_199); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = as_type(s.linewidth); - write_mem(param_12, param_13, param_14, v_199); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.index; - write_mem(param_15, param_16, param_17, v_199); - Alloc param_18 = a; - uint param_19 = ix + 6u; - uint param_20 = as_type(s.line_x); - write_mem(param_18, param_19, param_20, v_199); - Alloc param_21 = a; - uint param_22 = ix + 7u; - uint param_23 = as_type(s.line_y); - write_mem(param_21, param_22, param_23, v_199); - Alloc param_24 = a; - uint param_25 = ix + 8u; - uint param_26 = as_type(s.line_c); - write_mem(param_24, param_25, param_26, v_199); -} - -static inline __attribute__((always_inline)) -void Annotated_LinGradient_write(thread const Alloc& a, thread const AnnotatedRef& ref, thread const uint& flags, thread const AnnoLinGradient& s, device Memory& v_199) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 2u; - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - AnnoLinGradientRef param_4 = AnnoLinGradientRef{ ref.offset + 4u }; - AnnoLinGradient param_5 = s; - AnnoLinGradient_write(param_3, param_4, param_5, v_199); -} - -static inline __attribute__((always_inline)) -FillImage FillImage_read(thread const FillImageRef& ref, const device SceneBuf& v_223) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = v_223.scene[ix + 0u]; - uint raw1 = v_223.scene[ix + 1u]; - FillImage s; - s.index = raw0; - s.offset = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - return s; -} - -static inline __attribute__((always_inline)) -FillImage Element_FillImage_read(thread const ElementRef& ref, const device SceneBuf& v_223) -{ - FillImageRef param = FillImageRef{ ref.offset + 4u }; - return FillImage_read(param, v_223); -} - -static inline __attribute__((always_inline)) -void AnnoImage_write(thread const Alloc& a, thread const AnnoImageRef& ref, thread const AnnoImage& s, device Memory& v_199) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = as_type(s.bbox.x); - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = as_type(s.bbox.y); - write_mem(param_3, param_4, param_5, v_199); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = as_type(s.bbox.z); - write_mem(param_6, param_7, param_8, v_199); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = as_type(s.bbox.w); - write_mem(param_9, param_10, param_11, v_199); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = as_type(s.linewidth); - write_mem(param_12, param_13, param_14, v_199); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.index; - write_mem(param_15, param_16, param_17, v_199); - Alloc param_18 = a; - uint param_19 = ix + 6u; - uint param_20 = (uint(s.offset.x) & 65535u) | (uint(s.offset.y) << uint(16)); - write_mem(param_18, param_19, param_20, v_199); -} - -static inline __attribute__((always_inline)) -void Annotated_Image_write(thread const Alloc& a, thread const AnnotatedRef& ref, thread const uint& flags, thread const AnnoImage& s, device Memory& v_199) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 3u; - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - AnnoImageRef param_4 = AnnoImageRef{ ref.offset + 4u }; - AnnoImage param_5 = s; - AnnoImage_write(param_3, param_4, param_5, v_199); -} - -static inline __attribute__((always_inline)) -Clip Clip_read(thread const ClipRef& ref, const device SceneBuf& v_223) -{ - uint ix = ref.offset >> uint(2); - uint raw0 = v_223.scene[ix + 0u]; - uint raw1 = v_223.scene[ix + 1u]; - uint raw2 = v_223.scene[ix + 2u]; - uint raw3 = v_223.scene[ix + 3u]; - Clip s; - s.bbox = float4(as_type(raw0), as_type(raw1), as_type(raw2), as_type(raw3)); - s.blend = v_223.scene[ix + 4u]; - return s; -} - -static inline __attribute__((always_inline)) -Clip Element_BeginClip_read(thread const ElementRef& ref, const device SceneBuf& v_223) -{ - ClipRef param = ClipRef{ ref.offset + 4u }; - return Clip_read(param, v_223); -} - -static inline __attribute__((always_inline)) -void AnnoBeginClip_write(thread const Alloc& a, thread const AnnoBeginClipRef& ref, thread const AnnoBeginClip& s, device Memory& v_199) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = as_type(s.bbox.x); - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = as_type(s.bbox.y); - write_mem(param_3, param_4, param_5, v_199); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = as_type(s.bbox.z); - write_mem(param_6, param_7, param_8, v_199); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = as_type(s.bbox.w); - write_mem(param_9, param_10, param_11, v_199); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = as_type(s.linewidth); - write_mem(param_12, param_13, param_14, v_199); - Alloc param_15 = a; - uint param_16 = ix + 5u; - uint param_17 = s.blend; - write_mem(param_15, param_16, param_17, v_199); -} - -static inline __attribute__((always_inline)) -void Annotated_BeginClip_write(thread const Alloc& a, thread const AnnotatedRef& ref, thread const uint& flags, thread const AnnoBeginClip& s, device Memory& v_199) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 4u; - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - AnnoBeginClipRef param_4 = AnnoBeginClipRef{ ref.offset + 4u }; - AnnoBeginClip param_5 = s; - AnnoBeginClip_write(param_3, param_4, param_5, v_199); -} - -static inline __attribute__((always_inline)) -void AnnoEndClip_write(thread const Alloc& a, thread const AnnoEndClipRef& ref, thread const AnnoEndClip& s, device Memory& v_199) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint param_2 = as_type(s.bbox.x); - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - uint param_4 = ix + 1u; - uint param_5 = as_type(s.bbox.y); - write_mem(param_3, param_4, param_5, v_199); - Alloc param_6 = a; - uint param_7 = ix + 2u; - uint param_8 = as_type(s.bbox.z); - write_mem(param_6, param_7, param_8, v_199); - Alloc param_9 = a; - uint param_10 = ix + 3u; - uint param_11 = as_type(s.bbox.w); - write_mem(param_9, param_10, param_11, v_199); - Alloc param_12 = a; - uint param_13 = ix + 4u; - uint param_14 = s.blend; - write_mem(param_12, param_13, param_14, v_199); -} - -static inline __attribute__((always_inline)) -void Annotated_EndClip_write(thread const Alloc& a, thread const AnnotatedRef& ref, thread const uint& flags, thread const AnnoEndClip& s, device Memory& v_199) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint param_2 = (flags << uint(16)) | 5u; - write_mem(param, param_1, param_2, v_199); - Alloc param_3 = a; - AnnoEndClipRef param_4 = AnnoEndClipRef{ ref.offset + 4u }; - AnnoEndClip param_5 = s; - AnnoEndClip_write(param_3, param_4, param_5, v_199); -} - -kernel void main0(device Memory& v_199 [[buffer(0)]], const device ConfigBuf& _1054 [[buffer(1)]], const device SceneBuf& v_223 [[buffer(2)]], const device ParentBuf& _1020 [[buffer(3)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]]) +kernel void main0(device Memory& _284 [[buffer(0)]], const device ConfigBuf& _92 [[buffer(1)]], const device SceneBuf& _102 [[buffer(2)]], const device ParentBuf& _202 [[buffer(3)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]]) { threadgroup DrawMonoid sh_scratch[256]; uint ix = gl_GlobalInvocationID.x * 8u; - ElementRef ref = ElementRef{ ix * 36u }; - ElementRef param = ref; - uint tag_word = Element_tag(param, v_223).tag; - uint param_1 = tag_word; - DrawMonoid agg = map_tag(param_1); + uint drawtag_base = _92.conf.drawtag_offset >> uint(2); + uint tag_word = _102.scene[drawtag_base + ix]; + uint param = tag_word; + DrawMonoid agg = map_tag(param); spvUnsafeArray local; local[0] = agg; for (uint i = 1u; i < 8u; i++) { - ElementRef param_2 = ref; - uint param_3 = i; - ElementRef param_4 = Element_index(param_2, param_3); - tag_word = Element_tag(param_4, v_223).tag; - uint param_5 = tag_word; - DrawMonoid param_6 = agg; - DrawMonoid param_7 = map_tag(param_5); - agg = combine_tag_monoid(param_6, param_7); + tag_word = _102.scene[(drawtag_base + ix) + i]; + uint param_1 = tag_word; + DrawMonoid param_2 = agg; + DrawMonoid param_3 = map_tag(param_1); + agg = combine_draw_monoid(param_2, param_3); local[i] = agg; } sh_scratch[gl_LocalInvocationID.x] = agg; @@ -646,181 +170,117 @@ kernel void main0(device Memory& v_199 [[buffer(0)]], const device ConfigBuf& _1 if (gl_LocalInvocationID.x >= (1u << i_1)) { DrawMonoid other = sh_scratch[gl_LocalInvocationID.x - (1u << i_1)]; - DrawMonoid param_8 = other; - DrawMonoid param_9 = agg; - agg = combine_tag_monoid(param_8, param_9); + DrawMonoid param_4 = other; + DrawMonoid param_5 = agg; + agg = combine_draw_monoid(param_4, param_5); } threadgroup_barrier(mem_flags::mem_threadgroup); sh_scratch[gl_LocalInvocationID.x] = agg; } threadgroup_barrier(mem_flags::mem_threadgroup); - DrawMonoid row = tag_monoid_identity(); + DrawMonoid row = draw_monoid_identity(); if (gl_WorkGroupID.x > 0u) { - uint _1023 = gl_WorkGroupID.x - 1u; - row.path_ix = _1020.parent[_1023].path_ix; - row.clip_ix = _1020.parent[_1023].clip_ix; + uint _205 = gl_WorkGroupID.x - 1u; + row.path_ix = _202.parent[_205].path_ix; + row.clip_ix = _202.parent[_205].clip_ix; + row.scene_offset = _202.parent[_205].scene_offset; + row.info_offset = _202.parent[_205].info_offset; } if (gl_LocalInvocationID.x > 0u) { - DrawMonoid param_10 = row; - DrawMonoid param_11 = sh_scratch[gl_LocalInvocationID.x - 1u]; - row = combine_tag_monoid(param_10, param_11); + DrawMonoid param_6 = row; + DrawMonoid param_7 = sh_scratch[gl_LocalInvocationID.x - 1u]; + row = combine_draw_monoid(param_6, param_7); } + uint drawdata_base = _92.conf.drawdata_offset >> uint(2); + uint drawinfo_base = _92.conf.drawinfo_alloc.offset >> uint(2); uint out_ix = gl_GlobalInvocationID.x * 8u; - uint out_base = (_1054.conf.drawmonoid_alloc.offset >> uint(2)) + (out_ix * 2u); - uint clip_out_base = _1054.conf.clip_alloc.offset >> uint(2); - AnnotatedRef out_ref = AnnotatedRef{ _1054.conf.anno_alloc.offset + (out_ix * 40u) }; + uint out_base = (_92.conf.drawmonoid_alloc.offset >> uint(2)) + (out_ix * 4u); + uint clip_out_base = _92.conf.clip_alloc.offset >> uint(2); float4 mat; float2 translate; - AnnoColor anno_fill; - Alloc param_18; - AnnoLinGradient anno_lin; - Alloc param_23; - AnnoImage anno_img; - Alloc param_28; - AnnoBeginClip anno_begin_clip; - Alloc param_33; - AnnoEndClip anno_end_clip; - Alloc param_38; for (uint i_2 = 0u; i_2 < 8u; i_2++) { DrawMonoid m = row; if (i_2 > 0u) { - DrawMonoid param_12 = m; - DrawMonoid param_13 = local[i_2 - 1u]; - m = combine_tag_monoid(param_12, param_13); + DrawMonoid param_8 = m; + DrawMonoid param_9 = local[i_2 - 1u]; + m = combine_draw_monoid(param_8, param_9); } - v_199.memory[out_base + (i_2 * 2u)] = m.path_ix; - v_199.memory[(out_base + (i_2 * 2u)) + 1u] = m.clip_ix; - ElementRef param_14 = ref; - uint param_15 = i_2; - ElementRef this_ref = Element_index(param_14, param_15); - ElementRef param_16 = this_ref; - tag_word = Element_tag(param_16, v_223).tag; - if ((((tag_word == 4u) || (tag_word == 5u)) || (tag_word == 6u)) || (tag_word == 9u)) + _284.memory[out_base + (i_2 * 4u)] = m.path_ix; + _284.memory[(out_base + (i_2 * 4u)) + 1u] = m.clip_ix; + _284.memory[(out_base + (i_2 * 4u)) + 2u] = m.scene_offset; + _284.memory[(out_base + (i_2 * 4u)) + 3u] = m.info_offset; + uint dd = drawdata_base + (m.scene_offset >> uint(2)); + uint di = drawinfo_base + (m.info_offset >> uint(2)); + tag_word = _102.scene[(drawtag_base + ix) + i_2]; + if ((((tag_word == 68u) || (tag_word == 276u)) || (tag_word == 72u)) || (tag_word == 5u)) { - uint bbox_offset = (_1054.conf.bbox_alloc.offset >> uint(2)) + (6u * m.path_ix); - float bbox_l = float(v_199.memory[bbox_offset]) - 32768.0; - float bbox_t = float(v_199.memory[bbox_offset + 1u]) - 32768.0; - float bbox_r = float(v_199.memory[bbox_offset + 2u]) - 32768.0; - float bbox_b = float(v_199.memory[bbox_offset + 3u]) - 32768.0; + uint bbox_offset = (_92.conf.path_bbox_alloc.offset >> uint(2)) + (6u * m.path_ix); + float bbox_l = float(_284.memory[bbox_offset]) - 32768.0; + float bbox_t = float(_284.memory[bbox_offset + 1u]) - 32768.0; + float bbox_r = float(_284.memory[bbox_offset + 2u]) - 32768.0; + float bbox_b = float(_284.memory[bbox_offset + 3u]) - 32768.0; float4 bbox = float4(bbox_l, bbox_t, bbox_r, bbox_b); - float linewidth = as_type(v_199.memory[bbox_offset + 4u]); + float linewidth = as_type(_284.memory[bbox_offset + 4u]); uint fill_mode = uint(linewidth >= 0.0); - if ((linewidth >= 0.0) || (tag_word == 5u)) + if ((linewidth >= 0.0) || (tag_word == 276u)) { - uint trans_ix = v_199.memory[bbox_offset + 5u]; - uint t = (_1054.conf.trans_alloc.offset >> uint(2)) + (6u * trans_ix); - mat = as_type(uint4(v_199.memory[t], v_199.memory[t + 1u], v_199.memory[t + 2u], v_199.memory[t + 3u])); - if (tag_word == 5u) + uint trans_ix = _284.memory[bbox_offset + 5u]; + uint t = (_92.conf.trans_alloc.offset >> uint(2)) + (6u * trans_ix); + mat = as_type(uint4(_284.memory[t], _284.memory[t + 1u], _284.memory[t + 2u], _284.memory[t + 3u])); + if (tag_word == 276u) { - translate = as_type(uint2(v_199.memory[t + 4u], v_199.memory[t + 5u])); + translate = as_type(uint2(_284.memory[t + 4u], _284.memory[t + 5u])); } } if (linewidth >= 0.0) { linewidth *= sqrt(abs((mat.x * mat.w) - (mat.y * mat.z))); } - linewidth = fast::max(linewidth, 0.0); switch (tag_word) { - case 4u: + case 68u: + case 72u: { - ElementRef param_17 = this_ref; - FillColor fill = Element_FillColor_read(param_17, v_223); - anno_fill.bbox = bbox; - anno_fill.linewidth = linewidth; - anno_fill.rgba_color = fill.rgba_color; - param_18.offset = _1054.conf.anno_alloc.offset; - AnnotatedRef param_19 = out_ref; - uint param_20 = fill_mode; - AnnoColor param_21 = anno_fill; - Annotated_Color_write(param_18, param_19, param_20, param_21, v_199); + _284.memory[di] = as_type(linewidth); break; } - case 5u: + case 276u: { - ElementRef param_22 = this_ref; - FillLinGradient lin = Element_FillLinGradient_read(param_22, v_223); - anno_lin.bbox = bbox; - anno_lin.linewidth = linewidth; - anno_lin.index = lin.index; - float2 p0 = ((mat.xy * lin.p0.x) + (mat.zw * lin.p0.y)) + translate; - float2 p1 = ((mat.xy * lin.p1.x) + (mat.zw * lin.p1.y)) + translate; + _284.memory[di] = as_type(linewidth); + uint index = _102.scene[dd]; + float2 p0 = as_type(uint2(_102.scene[dd + 1u], _102.scene[dd + 2u])); + float2 p1 = as_type(uint2(_102.scene[dd + 3u], _102.scene[dd + 4u])); + p0 = ((mat.xy * p0.x) + (mat.zw * p0.y)) + translate; + p1 = ((mat.xy * p1.x) + (mat.zw * p1.y)) + translate; float2 dxy = p1 - p0; float scale = 1.0 / ((dxy.x * dxy.x) + (dxy.y * dxy.y)); float line_x = dxy.x * scale; float line_y = dxy.y * scale; - anno_lin.line_x = line_x; - anno_lin.line_y = line_y; - anno_lin.line_c = -((p0.x * line_x) + (p0.y * line_y)); - param_23.offset = _1054.conf.anno_alloc.offset; - AnnotatedRef param_24 = out_ref; - uint param_25 = fill_mode; - AnnoLinGradient param_26 = anno_lin; - Annotated_LinGradient_write(param_23, param_24, param_25, param_26, v_199); + float line_c = -((p0.x * line_x) + (p0.y * line_y)); + _284.memory[di + 1u] = as_type(line_x); + _284.memory[di + 2u] = as_type(line_y); + _284.memory[di + 3u] = as_type(line_c); break; } - case 6u: + case 5u: { - ElementRef param_27 = this_ref; - FillImage fill_img = Element_FillImage_read(param_27, v_223); - anno_img.bbox = bbox; - anno_img.linewidth = linewidth; - anno_img.index = fill_img.index; - anno_img.offset = fill_img.offset; - param_28.offset = _1054.conf.anno_alloc.offset; - AnnotatedRef param_29 = out_ref; - uint param_30 = fill_mode; - AnnoImage param_31 = anno_img; - Annotated_Image_write(param_28, param_29, param_30, param_31, v_199); - break; - } - case 9u: - { - ElementRef param_32 = this_ref; - Clip begin_clip = Element_BeginClip_read(param_32, v_223); - anno_begin_clip.bbox = bbox; - anno_begin_clip.linewidth = 0.0; - anno_begin_clip.blend = begin_clip.blend; - uint flags = uint(begin_clip.blend != 3u) << uint(1); - param_33.offset = _1054.conf.anno_alloc.offset; - AnnotatedRef param_34 = out_ref; - uint param_35 = flags; - AnnoBeginClip param_36 = anno_begin_clip; - Annotated_BeginClip_write(param_33, param_34, param_35, param_36, v_199); break; } } } - else - { - if (tag_word == 10u) - { - ElementRef param_37 = this_ref; - Clip end_clip = Element_BeginClip_read(param_37, v_223); - anno_end_clip.bbox = float4(-1000000000.0, -1000000000.0, 1000000000.0, 1000000000.0); - anno_end_clip.blend = end_clip.blend; - uint flags_1 = uint(end_clip.blend != 3u) << uint(1); - param_38.offset = _1054.conf.anno_alloc.offset; - AnnotatedRef param_39 = out_ref; - uint param_40 = flags_1; - AnnoEndClip param_41 = anno_end_clip; - Annotated_EndClip_write(param_38, param_39, param_40, param_41, v_199); - } - } - if ((tag_word == 9u) || (tag_word == 10u)) + if ((tag_word == 5u) || (tag_word == 37u)) { uint path_ix = ~(out_ix + i_2); - if (tag_word == 9u) + if (tag_word == 5u) { path_ix = m.path_ix; } - v_199.memory[clip_out_base + m.clip_ix] = path_ix; + _284.memory[clip_out_base + m.clip_ix] = path_ix; } - out_ref.offset += 40u; } } diff --git a/piet-gpu/shader/gen/draw_leaf.spv b/piet-gpu/shader/gen/draw_leaf.spv index bdbdb0c69207767df589507e7428ea4f714aa521..d18b2877431a9e97c53c8343f35149e714cb73b8 100644 GIT binary patch literal 16412 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 literal 40588 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 N{`~BC$7xS({2$jDeYXGr diff --git a/piet-gpu/shader/gen/draw_reduce.dxil b/piet-gpu/shader/gen/draw_reduce.dxil index 9b1b0fd6893fc7bdecd4093fd10ad0e5e93d2257..bfafc5fde59e94065d4a62a2961b1d60f44a2e7e 100644 GIT binary patch delta 2316 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 S`^ppW3QXAO7ly&x1HS_tVr9hu diff --git a/piet-gpu/shader/gen/draw_reduce.hlsl b/piet-gpu/shader/gen/draw_reduce.hlsl index 0553c9b..7220b7e 100644 --- a/piet-gpu/shader/gen/draw_reduce.hlsl +++ b/piet-gpu/shader/gen/draw_reduce.hlsl @@ -1,22 +1,11 @@ -struct ElementRef -{ - uint offset; -}; - -struct ElementTag -{ - uint tag; - uint flags; -}; - struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; -static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); - struct Alloc { uint offset; @@ -34,12 +23,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -47,16 +38,16 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; -static const DrawMonoid _87 = { 1u, 0u }; -static const DrawMonoid _89 = { 1u, 1u }; -static const DrawMonoid _91 = { 0u, 0u }; +static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -ByteAddressBuffer _46 : register(t2, space0); -RWByteAddressBuffer _199 : register(u3, space0); -RWByteAddressBuffer _213 : register(u0, space0); -ByteAddressBuffer _219 : register(t1, space0); +ByteAddressBuffer _86 : register(t1, space0); +ByteAddressBuffer _96 : register(t2, space0); +RWByteAddressBuffer _187 : register(u3, space0); +RWByteAddressBuffer _205 : register(u0, space0); static uint3 gl_WorkGroupID; static uint3 gl_LocalInvocationID; @@ -70,68 +61,37 @@ struct SPIRV_Cross_Input groupshared DrawMonoid sh_scratch[256]; -ElementTag Element_tag(ElementRef ref) -{ - uint tag_and_flags = _46.Load((ref.offset >> uint(2)) * 4 + 0); - ElementTag _60 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _60; -} - DrawMonoid map_tag(uint tag_word) { - switch (tag_word) - { - case 4u: - case 5u: - case 6u: - { - return _87; - } - case 9u: - case 10u: - { - return _89; - } - default: - { - return _91; - } - } + uint has_path = uint(tag_word != 0u); + DrawMonoid _69 = { has_path, tag_word & 1u, tag_word & 28u, (tag_word >> uint(4)) & 28u }; + return _69; } -ElementRef Element_index(ElementRef ref, uint index) -{ - ElementRef _39 = { ref.offset + (index * 36u) }; - return _39; -} - -DrawMonoid combine_tag_monoid(DrawMonoid a, DrawMonoid b) +DrawMonoid combine_draw_monoid(DrawMonoid a, DrawMonoid b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; + c.scene_offset = a.scene_offset + b.scene_offset; + c.info_offset = a.info_offset + b.info_offset; return c; } void comp_main() { uint ix = gl_GlobalInvocationID.x * 8u; - ElementRef _107 = { ix * 36u }; - ElementRef ref = _107; - ElementRef param = ref; - uint tag_word = Element_tag(param).tag; - uint param_1 = tag_word; - DrawMonoid agg = map_tag(param_1); + uint drawtag_base = _86.Load(100) >> uint(2); + uint tag_word = _96.Load((drawtag_base + ix) * 4 + 0); + uint param = tag_word; + DrawMonoid agg = map_tag(param); for (uint i = 1u; i < 8u; i++) { - ElementRef param_2 = ref; - uint param_3 = i; - ElementRef param_4 = Element_index(param_2, param_3); - tag_word = Element_tag(param_4).tag; - uint param_5 = tag_word; - DrawMonoid param_6 = agg; - DrawMonoid param_7 = map_tag(param_5); - agg = combine_tag_monoid(param_6, param_7); + uint tag_word_1 = _96.Load(((drawtag_base + ix) + i) * 4 + 0); + uint param_1 = tag_word_1; + DrawMonoid param_2 = agg; + DrawMonoid param_3 = map_tag(param_1); + agg = combine_draw_monoid(param_2, param_3); } sh_scratch[gl_LocalInvocationID.x] = agg; for (uint i_1 = 0u; i_1 < 8u; i_1++) @@ -140,17 +100,19 @@ void comp_main() if ((gl_LocalInvocationID.x + (1u << i_1)) < 256u) { DrawMonoid other = sh_scratch[gl_LocalInvocationID.x + (1u << i_1)]; - DrawMonoid param_8 = agg; - DrawMonoid param_9 = other; - agg = combine_tag_monoid(param_8, param_9); + DrawMonoid param_4 = agg; + DrawMonoid param_5 = other; + agg = combine_draw_monoid(param_4, param_5); } GroupMemoryBarrierWithGroupSync(); sh_scratch[gl_LocalInvocationID.x] = agg; } if (gl_LocalInvocationID.x == 0u) { - _199.Store(gl_WorkGroupID.x * 8 + 0, agg.path_ix); - _199.Store(gl_WorkGroupID.x * 8 + 4, agg.clip_ix); + _187.Store(gl_WorkGroupID.x * 16 + 0, agg.path_ix); + _187.Store(gl_WorkGroupID.x * 16 + 4, agg.clip_ix); + _187.Store(gl_WorkGroupID.x * 16 + 8, agg.scene_offset); + _187.Store(gl_WorkGroupID.x * 16 + 12, agg.info_offset); } } diff --git a/piet-gpu/shader/gen/draw_reduce.msl b/piet-gpu/shader/gen/draw_reduce.msl index 064c515..8e409a8 100644 --- a/piet-gpu/shader/gen/draw_reduce.msl +++ b/piet-gpu/shader/gen/draw_reduce.msl @@ -5,48 +5,14 @@ using namespace metal; -struct ElementRef -{ - uint offset; -}; - -struct ElementTag -{ - uint tag; - uint flags; -}; - struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; -struct SceneBuf -{ - uint scene[1]; -}; - -struct DrawMonoid_1 -{ - uint path_ix; - uint clip_ix; -}; - -struct OutBuf -{ - DrawMonoid_1 outbuf[1]; -}; - -struct Memory -{ - uint mem_offset; - uint mem_error; - uint memory[1]; -}; - -constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(256u, 1u, 1u); - struct Alloc { uint offset; @@ -64,12 +30,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -77,6 +45,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -84,70 +54,66 @@ struct ConfigBuf Config conf; }; -static inline __attribute__((always_inline)) -ElementTag Element_tag(thread const ElementRef& ref, const device SceneBuf& v_46) +struct SceneBuf { - uint tag_and_flags = v_46.scene[ref.offset >> uint(2)]; - return ElementTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; -} + uint scene[1]; +}; + +struct DrawMonoid_1 +{ + uint path_ix; + uint clip_ix; + uint scene_offset; + uint info_offset; +}; + +struct OutBuf +{ + DrawMonoid_1 outbuf[1]; +}; + +struct Memory +{ + uint mem_offset; + uint mem_error; + uint memory[1]; +}; + +constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(256u, 1u, 1u); static inline __attribute__((always_inline)) DrawMonoid map_tag(thread const uint& tag_word) { - switch (tag_word) - { - case 4u: - case 5u: - case 6u: - { - return DrawMonoid{ 1u, 0u }; - } - case 9u: - case 10u: - { - return DrawMonoid{ 1u, 1u }; - } - default: - { - return DrawMonoid{ 0u, 0u }; - } - } + uint has_path = uint(tag_word != 0u); + return DrawMonoid{ has_path, tag_word & 1u, tag_word & 28u, (tag_word >> uint(4)) & 28u }; } static inline __attribute__((always_inline)) -ElementRef Element_index(thread const ElementRef& ref, thread const uint& index) -{ - return ElementRef{ ref.offset + (index * 36u) }; -} - -static inline __attribute__((always_inline)) -DrawMonoid combine_tag_monoid(thread const DrawMonoid& a, thread const DrawMonoid& b) +DrawMonoid combine_draw_monoid(thread const DrawMonoid& a, thread const DrawMonoid& b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; + c.scene_offset = a.scene_offset + b.scene_offset; + c.info_offset = a.info_offset + b.info_offset; return c; } -kernel void main0(const device SceneBuf& v_46 [[buffer(2)]], device OutBuf& _199 [[buffer(3)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]]) +kernel void main0(const device ConfigBuf& _86 [[buffer(1)]], const device SceneBuf& _96 [[buffer(2)]], device OutBuf& _187 [[buffer(3)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]]) { threadgroup DrawMonoid sh_scratch[256]; uint ix = gl_GlobalInvocationID.x * 8u; - ElementRef ref = ElementRef{ ix * 36u }; - ElementRef param = ref; - uint tag_word = Element_tag(param, v_46).tag; - uint param_1 = tag_word; - DrawMonoid agg = map_tag(param_1); + uint drawtag_base = _86.conf.drawtag_offset >> uint(2); + uint tag_word = _96.scene[drawtag_base + ix]; + uint param = tag_word; + DrawMonoid agg = map_tag(param); for (uint i = 1u; i < 8u; i++) { - ElementRef param_2 = ref; - uint param_3 = i; - ElementRef param_4 = Element_index(param_2, param_3); - tag_word = Element_tag(param_4, v_46).tag; - uint param_5 = tag_word; - DrawMonoid param_6 = agg; - DrawMonoid param_7 = map_tag(param_5); - agg = combine_tag_monoid(param_6, param_7); + uint tag_word_1 = _96.scene[(drawtag_base + ix) + i]; + uint param_1 = tag_word_1; + DrawMonoid param_2 = agg; + DrawMonoid param_3 = map_tag(param_1); + agg = combine_draw_monoid(param_2, param_3); } sh_scratch[gl_LocalInvocationID.x] = agg; for (uint i_1 = 0u; i_1 < 8u; i_1++) @@ -156,17 +122,19 @@ kernel void main0(const device SceneBuf& v_46 [[buffer(2)]], device OutBuf& _199 if ((gl_LocalInvocationID.x + (1u << i_1)) < 256u) { DrawMonoid other = sh_scratch[gl_LocalInvocationID.x + (1u << i_1)]; - DrawMonoid param_8 = agg; - DrawMonoid param_9 = other; - agg = combine_tag_monoid(param_8, param_9); + DrawMonoid param_4 = agg; + DrawMonoid param_5 = other; + agg = combine_draw_monoid(param_4, param_5); } threadgroup_barrier(mem_flags::mem_threadgroup); sh_scratch[gl_LocalInvocationID.x] = agg; } if (gl_LocalInvocationID.x == 0u) { - _199.outbuf[gl_WorkGroupID.x].path_ix = agg.path_ix; - _199.outbuf[gl_WorkGroupID.x].clip_ix = agg.clip_ix; + _187.outbuf[gl_WorkGroupID.x].path_ix = agg.path_ix; + _187.outbuf[gl_WorkGroupID.x].clip_ix = agg.clip_ix; + _187.outbuf[gl_WorkGroupID.x].scene_offset = agg.scene_offset; + _187.outbuf[gl_WorkGroupID.x].info_offset = agg.info_offset; } } diff --git a/piet-gpu/shader/gen/draw_reduce.spv b/piet-gpu/shader/gen/draw_reduce.spv index a45627d8f6604795c29314078a096e7e9edfd50e..4daf43af5dd87dfacfc4f1c5727b15274bdd4266 100644 GIT binary patch literal 7124 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 O^WF$)W8cK>+kXJO$?lT? literal 7108 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 SH|4ti>Nn@Q`yEcQ@Ay9pZ!B5> diff --git a/piet-gpu/shader/gen/draw_root.dxil b/piet-gpu/shader/gen/draw_root.dxil index a84fd4aa668225d7ed426d81a25bc91b30599fa8..873fa29da1ffca54fc149ad5b31f42a47e79f5ba 100644 GIT binary patch delta 2507 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 Mwshp(%g5+{0V8i+djJ3c diff --git a/piet-gpu/shader/gen/draw_root.hlsl b/piet-gpu/shader/gen/draw_root.hlsl index 56b513f..b4cb7e4 100644 --- a/piet-gpu/shader/gen/draw_root.hlsl +++ b/piet-gpu/shader/gen/draw_root.hlsl @@ -2,13 +2,15 @@ struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -static const DrawMonoid _18 = { 0u, 0u }; +static const DrawMonoid _18 = { 0u, 0u, 0u, 0u }; -RWByteAddressBuffer _57 : register(u0, space0); +RWByteAddressBuffer _71 : register(u0, space0); static uint3 gl_LocalInvocationID; static uint3 gl_GlobalInvocationID; @@ -20,15 +22,17 @@ struct SPIRV_Cross_Input groupshared DrawMonoid sh_scratch[256]; -DrawMonoid combine_tag_monoid(DrawMonoid a, DrawMonoid b) +DrawMonoid combine_draw_monoid(DrawMonoid a, DrawMonoid b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; + c.scene_offset = a.scene_offset + b.scene_offset; + c.info_offset = a.info_offset + b.info_offset; return c; } -DrawMonoid tag_monoid_identity() +DrawMonoid draw_monoid_identity() { return _18; } @@ -36,22 +40,30 @@ DrawMonoid tag_monoid_identity() void comp_main() { uint ix = gl_GlobalInvocationID.x * 8u; - DrawMonoid _61; - _61.path_ix = _57.Load(ix * 8 + 0); - _61.clip_ix = _57.Load(ix * 8 + 4); + DrawMonoid _75; + _75.path_ix = _71.Load(ix * 16 + 0); + _75.clip_ix = _71.Load(ix * 16 + 4); + _75.scene_offset = _71.Load(ix * 16 + 8); + _75.info_offset = _71.Load(ix * 16 + 12); DrawMonoid local[8]; - local[0].path_ix = _61.path_ix; - local[0].clip_ix = _61.clip_ix; + local[0].path_ix = _75.path_ix; + local[0].clip_ix = _75.clip_ix; + local[0].scene_offset = _75.scene_offset; + local[0].info_offset = _75.info_offset; DrawMonoid param_1; for (uint i = 1u; i < 8u; i++) { DrawMonoid param = local[i - 1u]; - DrawMonoid _88; - _88.path_ix = _57.Load((ix + i) * 8 + 0); - _88.clip_ix = _57.Load((ix + i) * 8 + 4); - param_1.path_ix = _88.path_ix; - param_1.clip_ix = _88.clip_ix; - local[i] = combine_tag_monoid(param, param_1); + DrawMonoid _106; + _106.path_ix = _71.Load((ix + i) * 16 + 0); + _106.clip_ix = _71.Load((ix + i) * 16 + 4); + _106.scene_offset = _71.Load((ix + i) * 16 + 8); + _106.info_offset = _71.Load((ix + i) * 16 + 12); + param_1.path_ix = _106.path_ix; + param_1.clip_ix = _106.clip_ix; + param_1.scene_offset = _106.scene_offset; + param_1.info_offset = _106.info_offset; + local[i] = combine_draw_monoid(param, param_1); } DrawMonoid agg = local[7]; sh_scratch[gl_LocalInvocationID.x] = agg; @@ -63,13 +75,13 @@ void comp_main() DrawMonoid other = sh_scratch[gl_LocalInvocationID.x - (1u << i_1)]; DrawMonoid param_2 = other; DrawMonoid param_3 = agg; - agg = combine_tag_monoid(param_2, param_3); + agg = combine_draw_monoid(param_2, param_3); } GroupMemoryBarrierWithGroupSync(); sh_scratch[gl_LocalInvocationID.x] = agg; } GroupMemoryBarrierWithGroupSync(); - DrawMonoid row = tag_monoid_identity(); + DrawMonoid row = draw_monoid_identity(); if (gl_LocalInvocationID.x > 0u) { row = sh_scratch[gl_LocalInvocationID.x - 1u]; @@ -78,10 +90,12 @@ void comp_main() { DrawMonoid param_4 = row; DrawMonoid param_5 = local[i_2]; - DrawMonoid m = combine_tag_monoid(param_4, param_5); - uint _177 = ix + i_2; - _57.Store(_177 * 8 + 0, m.path_ix); - _57.Store(_177 * 8 + 4, m.clip_ix); + DrawMonoid m = combine_draw_monoid(param_4, param_5); + uint _199 = ix + i_2; + _71.Store(_199 * 16 + 0, m.path_ix); + _71.Store(_199 * 16 + 4, m.clip_ix); + _71.Store(_199 * 16 + 8, m.scene_offset); + _71.Store(_199 * 16 + 12, m.info_offset); } } diff --git a/piet-gpu/shader/gen/draw_root.msl b/piet-gpu/shader/gen/draw_root.msl index 0d22e4b..9ee8cfe 100644 --- a/piet-gpu/shader/gen/draw_root.msl +++ b/piet-gpu/shader/gen/draw_root.msl @@ -48,12 +48,16 @@ struct DrawMonoid { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; struct DrawMonoid_1 { uint path_ix; uint clip_ix; + uint scene_offset; + uint info_offset; }; struct DataBuf @@ -64,35 +68,41 @@ struct DataBuf constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(256u, 1u, 1u); static inline __attribute__((always_inline)) -DrawMonoid combine_tag_monoid(thread const DrawMonoid& a, thread const DrawMonoid& b) +DrawMonoid combine_draw_monoid(thread const DrawMonoid& a, thread const DrawMonoid& b) { DrawMonoid c; c.path_ix = a.path_ix + b.path_ix; c.clip_ix = a.clip_ix + b.clip_ix; + c.scene_offset = a.scene_offset + b.scene_offset; + c.info_offset = a.info_offset + b.info_offset; return c; } static inline __attribute__((always_inline)) -DrawMonoid tag_monoid_identity() +DrawMonoid draw_monoid_identity() { - return DrawMonoid{ 0u, 0u }; + return DrawMonoid{ 0u, 0u, 0u, 0u }; } -kernel void main0(device DataBuf& _57 [[buffer(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) +kernel void main0(device DataBuf& _71 [[buffer(0)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]]) { threadgroup DrawMonoid sh_scratch[256]; uint ix = gl_GlobalInvocationID.x * 8u; spvUnsafeArray local; - local[0].path_ix = _57.data[ix].path_ix; - local[0].clip_ix = _57.data[ix].clip_ix; + local[0].path_ix = _71.data[ix].path_ix; + local[0].clip_ix = _71.data[ix].clip_ix; + local[0].scene_offset = _71.data[ix].scene_offset; + local[0].info_offset = _71.data[ix].info_offset; DrawMonoid param_1; for (uint i = 1u; i < 8u; i++) { - uint _82 = ix + i; + uint _100 = ix + i; DrawMonoid param = local[i - 1u]; - param_1.path_ix = _57.data[_82].path_ix; - param_1.clip_ix = _57.data[_82].clip_ix; - local[i] = combine_tag_monoid(param, param_1); + param_1.path_ix = _71.data[_100].path_ix; + param_1.clip_ix = _71.data[_100].clip_ix; + param_1.scene_offset = _71.data[_100].scene_offset; + param_1.info_offset = _71.data[_100].info_offset; + local[i] = combine_draw_monoid(param, param_1); } DrawMonoid agg = local[7]; sh_scratch[gl_LocalInvocationID.x] = agg; @@ -104,13 +114,13 @@ kernel void main0(device DataBuf& _57 [[buffer(0)]], uint3 gl_GlobalInvocationID DrawMonoid other = sh_scratch[gl_LocalInvocationID.x - (1u << i_1)]; DrawMonoid param_2 = other; DrawMonoid param_3 = agg; - agg = combine_tag_monoid(param_2, param_3); + agg = combine_draw_monoid(param_2, param_3); } threadgroup_barrier(mem_flags::mem_threadgroup); sh_scratch[gl_LocalInvocationID.x] = agg; } threadgroup_barrier(mem_flags::mem_threadgroup); - DrawMonoid row = tag_monoid_identity(); + DrawMonoid row = draw_monoid_identity(); if (gl_LocalInvocationID.x > 0u) { row = sh_scratch[gl_LocalInvocationID.x - 1u]; @@ -119,10 +129,12 @@ kernel void main0(device DataBuf& _57 [[buffer(0)]], uint3 gl_GlobalInvocationID { DrawMonoid param_4 = row; DrawMonoid param_5 = local[i_2]; - DrawMonoid m = combine_tag_monoid(param_4, param_5); - uint _177 = ix + i_2; - _57.data[_177].path_ix = m.path_ix; - _57.data[_177].clip_ix = m.clip_ix; + DrawMonoid m = combine_draw_monoid(param_4, param_5); + uint _199 = ix + i_2; + _71.data[_199].path_ix = m.path_ix; + _71.data[_199].clip_ix = m.clip_ix; + _71.data[_199].scene_offset = m.scene_offset; + _71.data[_199].info_offset = m.info_offset; } } diff --git a/piet-gpu/shader/gen/draw_root.spv b/piet-gpu/shader/gen/draw_root.spv index 1c11414ca510052be760fd68802677d698754e93..e6a53e55ba4055a4339c14c7a99f86a510b0d3c2 100644 GIT binary patch literal 5440 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 MPRk_$XW{?;7nRX8X#fBK diff --git a/piet-gpu/shader/gen/kernel4.hlsl b/piet-gpu/shader/gen/kernel4.hlsl index 21bd083..f17b240 100644 --- a/piet-gpu/shader/gen/kernel4.hlsl +++ b/piet-gpu/shader/gen/kernel4.hlsl @@ -125,12 +125,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -138,6 +140,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(8u, 4u, 1u); diff --git a/piet-gpu/shader/gen/kernel4.msl b/piet-gpu/shader/gen/kernel4.msl index 9a8fbd0..c1f41af 100644 --- a/piet-gpu/shader/gen/kernel4.msl +++ b/piet-gpu/shader/gen/kernel4.msl @@ -183,12 +183,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -196,6 +198,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf diff --git a/piet-gpu/shader/gen/kernel4.spv b/piet-gpu/shader/gen/kernel4.spv index 4d205ce2a8e2ea37fd4b181f1ef82b42a7b665cf..91272da225f52879a626483478c6068cdabb6a3d 100644 GIT binary patch delta 364 zcmbPmg89iw<_&4GlI#rcSQ!|&7#J7|5=%1Tlalf);uCXn@{=c5%TBI`$O-^uQ;HJH zkz^Uz7$9a)*O>{tYtPkSYKEH0IzdXHvj+t delta 150 zcmaEIl6k@j<_&4GqHGNBSQ!|&7#J9mlJYC!6LWI%lNl!0%T8uz1oW z#TO)&WH2zWF+gO5z+%ZcnFSy*cCc#U$-Q#Yj3Sd)%E>c|PCh9oEi4991=3fXnjW8@ kmR6iv!mwFi{yWd+G943sM#;&mtz9Sou$I{@V{>8!09Vi``~Uy| diff --git a/piet-gpu/shader/gen/kernel4_gray.dxil b/piet-gpu/shader/gen/kernel4_gray.dxil index 18c4b7eab4faa745a72e49be704b48803ad300d8..7e39c73a17737d0a90c545a57cec7e239b7d6afa 100644 GIT binary patch delta 9885 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 G-~R&!M{uiw`{_3W8l(eEBArQje4nr){4i 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 CKLN=A diff --git a/piet-gpu/shader/gen/kernel4_gray.hlsl b/piet-gpu/shader/gen/kernel4_gray.hlsl index 7dc2e01..de95771 100644 --- a/piet-gpu/shader/gen/kernel4_gray.hlsl +++ b/piet-gpu/shader/gen/kernel4_gray.hlsl @@ -125,12 +125,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -138,6 +140,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(8u, 4u, 1u); diff --git a/piet-gpu/shader/gen/kernel4_gray.msl b/piet-gpu/shader/gen/kernel4_gray.msl index 38506dd..5128e99 100644 --- a/piet-gpu/shader/gen/kernel4_gray.msl +++ b/piet-gpu/shader/gen/kernel4_gray.msl @@ -183,12 +183,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -196,6 +198,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf diff --git a/piet-gpu/shader/gen/kernel4_gray.spv b/piet-gpu/shader/gen/kernel4_gray.spv index 305facd37bcdecad54e3d5b664d19ddda0cca853..791b76cbe5790b68def82df39f9028af0fbc4b61 100644 GIT binary patch delta 354 zcmbPpjQPWH<_&qWlI#rcSQ!|&7#J7|5=%1Tlalf);uCXn@{=bw%T5l4$O-^uQ;HJH zkz^Uz7$9@ zRYk*Wx=61F$CHUw@Ln+g8ZJ>1gSLvD769j-4f)R0B);Vb)1TPOS( zcJZZek6piq(-~`7XFJ4?-yXeSAd8#}FQqdYiLMVfwgmajG!F8u1S;C11%f43n!l6r zQiccstHIFDkv{Xr60eaob^!z*SxD{GuJasSJQ;#8ux8XsHHqSjRKP5_dhkxp9gQ)uAdJEHnIcANnCR_%iDsvCB)S@#WwVu)zm z4^ObMQ{GT4M>I(wmUK2v+Le&_09VOiNu{AZe=N4aZb#IBX&^o#D0 zI9Ame630L)Awrtn{UjjC>~vcXs6FEFI_#dJxf_xbtI|voz@X;peYzw(ux#1qr(TXY zf{LRAMJUP?M*LGu%|!gd#F5dk$BxG_y|Ubq%OiSk*EiSo3-F+Y=j8dniQhdXW9>SX zDLbqKqE>82&9b2Fix*njPeaBmw!JI-AV;239g(0NU~S)C%?ZxQm$wIe#b!CHQ`}jb zSZh78XiU%-M4zPZJlW^V#8uC7toR=`die`qH*v| z>S%O^Y3PPPiF=jf-Lp0etDEGKo_X)(zM&7I|h*G98nsOG2U{Q3v#zZIxgB!N?O;oi3-s)yN(>rtbk za!mbvE9eQg5Xb~N7iq^8OfSLr_uhC#^^;`p_Y>4W3=x^Q&fdIq`BdnV0>LEpc})4X z5)zFjQ3n#?EBbRqCG&KL)2$Z{h?fqpsr73R~NCLtySv)yIh>W=ES6Lvwyj zEP`Xur;YWj-)(UZsZ~7Elo$Cwe_w@)z{~)Q#J6^53IlyMtcY>uZxZCicihp3fXCf9 zJWhU1Lbc>)zCNv<6MI`>QRy?Ud2m}n;7ty}uQXVN*aR)o=(VC_Bm7t`%qe#laTf zHrK)%h$1GmBoBp7u7#^w=(tOCy(i8F#`a>58wz5pXa$X<TtN6TdyHPU;G=F3&42m-!CrGS&}gtlmlXL{B{-<$XC93*SiE zoXhxkPr^`EUE1{!X>vY&vJ5NL<+eVXYdM_$M9d{oy2^;slSJu#B&l?y{8fO0pQ8Q? D17*T* delta 2185 zcmYLIe^e8965kEkWJ5ySBnCEsuowtnAuK;M{P3koK#+iA)sEF9}c}V4|9?#ycVeMc0-TBOX zX67?9M>L%pMOLvPlYgvp>$-ujv`?PGC8jXrhFnG&@5RK)rE;J*}xE60JpsCij6pF$^Fp%#jbDW+Ov!1vNcig$<`Yq z-yWL0*!StkR)Jl$vtIpHdCgl@Z*JrCiWNsMB!})mOS($G3@K53*8#+4+U~6V)rOyn zqBTVuG*PWT(7_!e)04OLpZ1MRU)(B4p?d>{ox%+qb6TNj`+D6)SSLV|vH=3K@2})y zFfp%Teqe$^L72dn4@w@z2u81?VE4bz@8eZ+m-lo(^m+X3M)mJ}fBSz2CCh6QdcQ@f z&)z#HpgrCgxO`KSjkNE7-~5aaN1G)U40e0*XIXs4Nc4qf08sJ-0AVsY42rxzdHMVB zidF!Fd6#24^-FxGldt6QXjs?pCN1JH^SnNhzaQ^LfT}@j2ja4W91Di-{LstKja{ay z4S+}!11hGHxCUcZm=0=iDtRy+-AcJ*HiEIuDy|ON=ZtFQ6k)>jYxoogosze#;1{UvWVYv`N zi;KwB^7M;C-u1JU`Zru`LRr^yCs`Wp^pbW|5>SI&k85n>s;~!&L>xf4jXO7GMWViE z)22o8chc>mHn|{MB%*7>9=DMm>95UFB?XN(qoK59)@fC=v}3Ziv8Gdiu1xT-YU7(> z=`%`3vAufbD+WM5Z!c<9u1J67FLuX%Zem|Dtq*pdF=|?hD{ztHe z?3R~qncJf=jHqxm=XvONg| zBjj{Y;i_sg=W5I%5Pr1Eb!rj6Nv5Dm^XDx)9e#xW>>dA&PxMyn57Li*9B0Qnh7BQq2HYQOC>lkZYQ8n-zDN18Cw}fI@@#3Qbtsw2=kw zO{36h{2I=!#xHmd>9s~f@MN4-V@y0hirO=MU%UsZt0RQSFeTO*t>Uudn}hWbr_hs~ zUNOkjg~awr;GqIz&R&vKq{!Baz6>~^%hOD3D$LV(pbAkALS9w8U^bv8lT&qF$0yze zdA!#b1M0A1+T==LP1uhCnkFjr1XVj4Y6pWmkb8BR!R1sOg^CKXcW&w{aHDnJ!FNzP z$ek1x$@7!LQ}wM3cml0|5B)0G)gG2uBN*f=c>&BF9FoNyDsXNg)OXv}H>S<<(Litu zUg2R%{w{5DMgg6VT#zO_Xb8&xa%I=a3zRt~ N?@^Z7d_nm{832{bOAi15 delta 158 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 delta 5645 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 diff --git a/piet-gpu/shader/gen/pathseg.hlsl b/piet-gpu/shader/gen/pathseg.hlsl index 0501f6f..578417f 100644 --- a/piet-gpu/shader/gen/pathseg.hlsl +++ b/piet-gpu/shader/gen/pathseg.hlsl @@ -62,12 +62,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -75,6 +77,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); @@ -361,7 +365,7 @@ uint round_up(float x) void comp_main() { uint ix = gl_GlobalInvocationID.x * 4u; - uint tag_word = _574.Load(((_639.Load(84) >> uint(2)) + (ix >> uint(2))) * 4 + 0); + uint tag_word = _574.Load(((_639.Load(92) >> uint(2)) + (ix >> uint(2))) * 4 + 0); uint param = tag_word; TagMonoid local_tm = reduce_tag(param); sh_tag[gl_LocalInvocationID.x] = local_tm; @@ -400,8 +404,8 @@ void comp_main() TagMonoid param_4 = sh_tag[gl_LocalInvocationID.x - 1u]; tm = combine_tag_monoid(param_3, param_4); } - uint ps_ix = (_639.Load(88) >> uint(2)) + tm.pathseg_offset; - uint lw_ix = (_639.Load(80) >> uint(2)) + tm.linewidth_ix; + uint ps_ix = (_639.Load(96) >> uint(2)) + tm.pathseg_offset; + uint lw_ix = (_639.Load(88) >> uint(2)) + tm.linewidth_ix; uint save_path_ix = tm.path_ix; uint trans_ix = tm.trans_ix; TransformSegRef _771 = { _639.Load(36) + (trans_ix * 24u) }; diff --git a/piet-gpu/shader/gen/pathseg.msl b/piet-gpu/shader/gen/pathseg.msl index 0e97d68..9f6328e 100644 --- a/piet-gpu/shader/gen/pathseg.msl +++ b/piet-gpu/shader/gen/pathseg.msl @@ -127,12 +127,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -140,6 +142,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -635,7 +639,7 @@ kernel void main0(device Memory& v_111 [[buffer(0)]], const device ConfigBuf& _6 } threadgroup_barrier(mem_flags::mem_threadgroup); uint path_ix = save_path_ix; - uint bbox_out_ix = (_639.conf.bbox_alloc.offset >> uint(2)) + (path_ix * 6u); + uint bbox_out_ix = (_639.conf.path_bbox_alloc.offset >> uint(2)) + (path_ix * 6u); Monoid row = monoid_identity(); if (gl_LocalInvocationID.x > 0u) { diff --git a/piet-gpu/shader/gen/pathseg.spv b/piet-gpu/shader/gen/pathseg.spv index a1f223c7c9a3786d8e566f32d49258779373159a..4e2e9d54995c7e17f3f02f9876384c618e18d991 100644 GIT binary patch delta 382 zcmdlnk*Q}g(*`>}Np^-BCI$vB1_p+L#FC8oq@?_c_{5x?{N%~Oe3OGAvI0Qal%m9P zBv}SF28f&>R4y|wEgzzh0Vu}`HdP2Hmlt1Bl$cix7ZaY$$S*7^0+vb6$t(b=hL|Ke zS(9IyQEaj+zr3tCP#)x-lEn1*{Is;<)Dna`iOG%p!saktl2H4xsg#1sr6iUlLXFux znSVNmH^g}$OO$~)28cbNPL_a*B_N4`tN^J?K@tNQ4HC=PtSX_&&L}(CU*2_cgFMIN mDe^LtSI9dsicfwi|5*@ZoHhds1JIic?||Vfw)w5X>2v@u#7}Q8tDeCI$vB1_p+tr2LBb#GIV`WQNJ%e3SKA!7>6snY{RtqQtyn z1~vwWm>^iJAh9Ha0WKyqIgnpiRv0J)RvVw6mR6iv0^|Z!aDYt`ncT=P&nP;1A-^=E z*yLP6@y$E}lQ=fNlTcx2l$8ifjUt;5 IDxOXU0Q=u61poj5 diff --git a/piet-gpu/shader/gen/pathtag_reduce.dxil b/piet-gpu/shader/gen/pathtag_reduce.dxil index 89fb5620c77cb05d2bbc41744f4bf2786eb88c97..ff544b84c9812c64787bdb840130b6bc35868a0e 100644 GIT binary patch delta 1220 zcmZvbe@q)?7{}l1UEAyRT8=B-t`^1>T88|X2V)e%GH5%PPSC?G6`GmcA!0RR7+DzV zmR^5Q*uoz~YDBUu$LNxZn6OODFj>+YXf_xL#AR!0X3#~9_+y5c_>VEZMH&;c`{T{? z{l3rhzMtp4_l?_SyX9zy+XMdhAyBi|EaiCp<&RB!AKc%#o8BsJzjh8y9qo9obx8++ z0My{L3V@6TFr9)Gv(R^YlHb}$0Q}d_Q zk}9r`q;c@j0+tVgydGHp4g-K^yi(s5Fkx((V|7)o8`UZk)|4Kj^d8dV0VYgHkCA%M zVHjI6?Ihcs#t^v#H+(MI?9qv6^h&AV;d|L4Jt)DOT~{hAR(nJ8D<({yWWoJt&>A&h zQ@szPsugMFlUrZ)JlK4{#k<+!bl@{%-z}s*xU+io=0cm!HB!<&cwj($Yv8s16RK&W z3tkLmpA)YsNd%QrFhX;1XWqL*v`^zL_hYn_g{Em#~|Sikdw>*m#k_0=}r;p<Dhs&%ejngur-t`Y$a}Biomq z@)?wH%JfC2%oE|0x={d%H98OyHfDp4OF?FESIsGoIAS@st3E?&)tU3-&FE%%b^#KktD#BWD2dp zX8>AI#Q_RKr*rPHiDL51QW7*#jDl_9fJxvSDJoX%`@& zZpUZVvH*|vJZnq5nv(@M#SO{yku1OfVh;Iwkn$$=4#2!*o(=g}A`6ft0{#qu56J)^ zW&V0UI5dyM)LQ<8RWcWnUgmdO!Qa9VQg{!^gF-BDi%_Io88KDRBBrF$7{b)DBi$fs z7(pzOh`Q@ELQ29%kqHN`DFehvSd>+=RL49?1Y{ML!y2Ri9$3>K$lkZ7wrn>DFA}we z&a&Z7jfi`h*6;U4%$o7!usEdHw}Txbr#oK??XE(yEGet9L!v8GR+1e$LvULjtIIGn zOJU&&qJ<;_@Q;EE7tZz#LvZq9rj=U~1G`X>(Tq4E!oKil7_iu((kvR33Y9i7_mx%Ol{8D4quZ3yUrAR-$|1|xWdtPAS Hivr*u$E9|F delta 1172 zcmYL}UrgIp6o;>4$C%&*CnoeVU^tLK7O3P#Dd{McVj5P0U`kiULN#d)jCNhSiB@c5 z5-71lSX8A|TG|e+tK`ss*2Y6BS{3?auRK(!+E^=16GI55J@8O%^rb@69(EI8vt;Xh zKc8cL$Cj)(Z#gT1k+#EgCU>$g>8-nZUhA@5kD4(6fb(8OBlYInoNjrq|Dtd7;qXt* zW7!wMNT};cF#sYkf^!A{@(fTrgC=q)Z#%55I%oh+&5lujVRSQpuyX2#`RR}3iIbBf zrYjD5@F+1Dri|{uqkwt=EZxAARy+_T(Kz@LqWQ_aCEd|Va)GO-_Piy^AXsT@>q|vN z3e_EzmxVs+B&rijt?YQybq+iyvh&SN!TZcJt?M~)hEmN$52g`WcgOwY?fGuTcUlHv zmQa@YGmmo;=e_V-_9SsWMFm7Bg1%4&x9c6Cchn*?@%MMiWG}(z+N^ z0(j^2DBkH;!nh|pf}3vh9al99Jqpy3#XuIs%bQpVWC57c1gF~9N8>Z`tfD!N6+}H_+0T~LDH;b{bbhkVu z(Vng01q}okI(?`kp_uq3D~SXa?1~aBQy;NUE4}DQywc`y^jYmhQRB}Ryno3 zG$;GRB@kYDTojS2RO3fnqSo+0i3`Sa@p6h+Maz-_Bkgn2wO$k7AJ5BPYTVEv5#zsM zfPGCmt`&Jzu5?%6I7}+0L%RZ>X3ON3SGxjFlE)~|dR`y~kifv6cN}W6JSX=Q1O`eX zSfgs3{!d`0AfVU_0*ZVsL57c22Kt7;{s&m(r7kA1nrG{!y>L^g4nz_B;wVEPRR{C1 z94(tLr`jswQC#jI#b4tvgTZEQd;p+Wi@|uGEGmXIvsgMInKW!wgeq{Zne$*MfNvXc z1n7k!-C)hodii&+r@t5N;+!L18pMeztR;0 z?a_8FX-}1EkUdUSmOV{VF&88~Kp09O2cGa#2-*uUv<)Ey+g~&@HB$5i5?|mTTBVjA z&u^iLdHB69zt`q@EO*f*@+-^+4xf4%fnVV*dogmBPFm9t0!o(7vM<(b_FN(jeF$|Y zTl@JX3l@S-!REYYvCj}YH+*be)*^&B*HN2Gx45?Oojk~*HYwz;kJ{>gw(OtV&3jnX krib{3v$lqHOZz{&`G+iO!#WSRC7b)DWtJe(zoc;d3k> uint(2)) + ix; + uint scene_ix = (_139.Load(92) >> uint(2)) + ix; uint tag_word = _151.Load(scene_ix * 4 + 0); uint param = tag_word; TagMonoid agg = reduce_tag(param); diff --git a/piet-gpu/shader/gen/pathtag_reduce.msl b/piet-gpu/shader/gen/pathtag_reduce.msl index 83a8208..91e0cca 100644 --- a/piet-gpu/shader/gen/pathtag_reduce.msl +++ b/piet-gpu/shader/gen/pathtag_reduce.msl @@ -31,12 +31,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -44,6 +46,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf diff --git a/piet-gpu/shader/gen/pathtag_reduce.spv b/piet-gpu/shader/gen/pathtag_reduce.spv index feaad0a34bd76490bf4c8661c30838dff23be8b2..f1d8679c961cc8dc0b74b6dafa1cb84cc2a7e80c 100644 GIT binary patch delta 361 zcmbPX|Hfg%Ic71}-2jNG!>SPfE(Kh)>MP$xojAn0azAL{+rR763G63aR!KMlUg$P#5Bjsap1sFNk2VhKoMAS*!XQjo+zMuWsMHurK0vM|a{p3mz#`2a7+-U delta 182 zcmaFkFvEVsIc8Bdh7JY>1}-2@O3JT@Pt3{5PiC0>oO!Z7D_BMVD3cdoQk0li%)rI~ z5fcQ96(p8qFu=uxCO>2mmK6rdfYrw5r==CAmH@dx6&zrbL?#Qe$}@^iHe{6+76Xcd x^cSb5!&Gjb&YI7%IgE>kg;|oJWAa8m;mH+z29r1N$xOb&XTd1CnU_Ca5CBZ#E3p6o diff --git a/piet-gpu/shader/gen/pathtag_root.dxil b/piet-gpu/shader/gen/pathtag_root.dxil index 77f12e6db0ec75e4d05be227c033a9793a2cc1a0..48584bd22a13f8f01c186da6383ccc3ba77385b3 100644 GIT binary patch delta 1497 zcmZ9Me@qis9Khe*wbvhB+f$%kSH)xe&I@04m5MQLQ%##gA0F5$0nE=mxV2CBU!eXZSNF~+xz32d_M1c z-+S--UfxW~Y>L6gS*+lH1A$zB$#7b+wxHqg_zh1~9&_FOxGQZ@la1T_YOfjq9>~E( z6aa|ml828UZud=Z>bI})s8syeup4y z-Uxc%0c0k5btQv7 zOFegEub_$adjJhO>3DhTr{SCd6N0C8UAy;f^M=%hbH{d^nJm9^_S=&}wWZ}j#p3H#Z=~g=GCu{Uuf)3j$2-1Qb?tb^ zr6Sdd?8<|g4X(yL`x|z;8n>anTEn?l&KTb-Pn_7^W&CdPB*6NQE~r6Yu$w}Ry2p&! zFF5QU?Zd`Gf_yA5gm3DQP9+&v0WUxG*2Zw%MEeqLj$24&bGt~eDiC>>qJh%O_Ta|2 z`uA0c10P7nl`xsS?D<1>x7q@Vzy3LZpaMPdVnjY~`I_a^x+xm? zVNLFk;42A~BupX(6`)0< ztfT}dc8|oNX1qvPvzTWl$v%{dWh+^xf(Nt`cjK#@Et!4!bDqo}hQ_SRX1o$0Su+yM zp;^*Q)*PC^I}m(6^f6IvO-4HLt3w-8Tk|`u{X?Yg!IY%e=EJ6T6Ji))Q!v<5ViXWY za>xXr<_R$)A~n{sBpx<4HOiVGxc@_sVUKdJqm82AWk4*t&&L31t+O9*&=7ExNrBXB=U z$v6)0o6u(~7#|KJN%)AgdZ$_14}uR%aGrr%XL> zFLA~>IIVG@M3o_!ykfPW;GBc14rK|oyCStYq2(;!>hw>im3bw7dPOhrxz!AeQrLM4 z7<$1;tf7z6UAW@eJU5$)^`0r#uTp{>v#jA9evBfRFCe@h_;=-fRE> delta 1493 zcmYL}e^3-v9Khf1-tPU{MdyPA8+RKdGCGS z_xs&9FP3^cH8I~|vHme|xADuD-}`*#z9>-N-*O!R0MwmMJR)98JU{gYe)+@5BdTkY zX}-929Xt1?WL6$s!c>pN%4f!BZ`_*sYJ9d=v?W<@JfhE8J8bM5G~}EaUKz&0z(IK} zx^lcH9+RCg$qa#1*}F5Fass5x5!i?A;I~QvNFk)4m5c7%5Uju2!NeI{?P>1pw<)m3 zA3msIfTY!Yl1NgwoRA{6g25C*0vA)ChVO|u7A`v6l2^e4Mnb5PeC~LExW)qF=YRDf zD9>o}n{7l1N5GB2dE0q+61j|WuLgO_t4SBaK}5x3P){Jqg4RP_l6*zbj7#u8x)*#F z7!ZX`cnG*Caw~`riUmM+2~Y(tm{}VVL}CP#0c9vzMAtEWoT6$3ASQ}jVGm$>$t}*H z1v_GxCd&jUk*6>Iw1w>)Sg0HiAIAwtv4Jz}|FMu!;m7g}@nytL~!H`MbF~xl&vl=_Gfpe5{_R=YKB=STq z)O_59DC*t9HUB?|K)zP?eKwD=cE--?>qi~%mC`oVEWM3 z2Ln5oYO;lk$9!fC)>%|Pp?0w<@2HA)s^}~`vMuyrqG4K{rSgqx=?X2ax1)}S{)Ibg zy~;nDMOS9gtL>gG4}Bv-uU55>n&~PtZLoX)^Gzz+pz0j8)75r*jgu}HTE@s>%WQ`L mRso+!kSaWq&k~RQ`5Cz_R-ZT&y{6wC9;^nQC?-rVe*Xdj6YOFD diff --git a/piet-gpu/shader/gen/tile_alloc.dxil b/piet-gpu/shader/gen/tile_alloc.dxil index fdc60a1f645c09f247843f8a74a8e61f1ac5b605..d4d0b494795d66f02dc6bf06f5d8b217406e4f49 100644 GIT binary patch delta 2197 zcmZ8j4^R_V8h@K?HXE`D3naK9hzXh)5uG(E2xZ#MpCY0-sZv0V<0cZs$^{VWp{184 zKqLsAP>>?fUVvVwwdzFh58Tx=37p~|G+xC+rM=K9+BwIwbG>RiH#fH#p?7m{=9~B4 z_viP%@Atkp^M;r9YBG#PdIR{s0kQi;2>^U{&SGT~D`r;8Sb(Q)Q zo76?fVm5hN1nTvdU<0QFc8C7ZW1zf5ZXWU zH>AYL9F)iFyHP8xY38KClSuL)pq(@(XGGjKo1F8jQIeLs&-vDz7wBcRaWK=Z0Fy2V zb6L2$nq5Sh#wQ*gV@zGW=Ay3`eC4=nzW+f{($2fnFywpDaOFzl!*_3eIC1vf(`^&C z@^I!zHu2St9ruXn(`3fT8SRLG!^Fh23#;UY-pOC&((#O`d3c0+U-tIEl<^IxU1JWxNBf8I;fmbhXSQw5qM|z`H__A02%68BH_DV6UpYN4BLv83q4urM8A(SmjZ0<{K_To_< z#uo!p)`O^qaT$o+GuI1S+Z%;>4wk=rq(ZPthu63IVW=x@$yg8{4dLwCo3>;$h~H$_ zNT5!Q7JKt>-@Z|O4yMB<*5vtJ%st8|1)K1eI^&L_?)z{bHYnhj@^G+k)F&E6oa1Zk zhDr-FS(#Hc@a;eD%yuHrvkPal`C3=J`f_Q?Nzr>JF-P%ZTd9rLkgL&@8gL}8LF-S$ zXa%y{XL&JBV`-SpgzPpowoaUyP_>@8-fGXq^Od7jrgjh+d2PjbF zuDr;Va3Vmo5ClM-flB_(gkP4?@)knDYM}*u3t3xEcH>}e%@#e2i?X=>Nu4aQlH?Bv zAac3_E+((xXrKv-oKaE3AdY5R#AIqtGz*}750YtRBIlVGoq;4z0;PIzJr?Ck8GMRM zPUFvX1eT6g;D`#&yhh^lFasoCN;Cvn=lnnM3-v%6sw<%Q ztF!t=4LV=cfI|RP=mw9zfaYru_L-2t@)kAh=Upk_{(`ciL!ST-MQU5HWM8X%e9xF4 zP&n4H>sfu6!?d`$KfUCmE?L}%n}KIVwc@uiTrSX&rmGf-QwX#V#Sd0n=}2)=nO*t{ zh#G>&D4v57d6if`2q_YR6wi-+9NCQ13Bfsv9y7v2lyEk3@M44?;qwc_N@A9@Rz#4n ztlN6UT;`X>UxfMRz2XSbFRjc^fA>1j&RBuEdC(9@}$li~HD+M~^ zWr`P0GFH#Az>WP@AwC)%5Ty_6DP#yc9CLd)dfI7G{iyT;LYhc!tYGVOLQ=xZg*! zF)@Gx{w?mxFt44+Lz$>?D8!PSqykuDE5wO|ToTA4-B){RFb?)jecXuS68CNwrPIp4x&KcL+zKENr-#b;8 zMDw`Y!$!&hktx94qw*jrKsgxqDF;2i(5&AlroTz?*Pn#c^q4n-m^E18u0=2Di6f^8 z;cqk5F@r564rg)tEP+X=p6lt#{^JC)%xcpXp z`Su^00Imm0j277qAy-p)kOH7r+i=8+w(#<`?Q@WwM}BQ@_HH3)_6QklV}t I1pYhz1F6Z+Z~y=R delta 2127 zcmY*a3s6(p89uqWoZOHAHxKYqKySn#f{#n&z33zakf#$zR^y1?b!(ltpb*yWCPG=nMT6b?Xjun#SY&r>SFO{IkIwc)aogURGv}QD z{NI27|9sy+=VbEW@|*&FzV`9`pC5YTtpA(whoP%b0Kf&W1kSy zJrcUzqHE7jy&rTz;-%>0NHx!q-{Ze*n-X+CBktv>{FO)}Mo zMZMkC9dnr*va&QFUAm`nf3plXB<62*{OgbZj42wmpBH~$_p85GoNq7O@m}0lQ#fxr zQ*WeUwHnqK;4T*K;b0vH>w~cIAvALq*yO(&h_5tO_tiC*B&Ig^c1!U$#~xNa7@wWH zd2i}Nyg;VPTl5K&`H9N6LbIt&e4{3ERr|T}^WPpn*WOUddKAOW9jV=if9H-%?e3PA zcOvZkz=Je_F%(%4Dnd=OZT`YP<{!Q%v$!C!LHThTj0t6yonH);{8?{ zLK|(+k_~jc5F`Qk#$PBhqb@HWotN+Q5Tqu*iVYxG+$^>8VMo7ty*laCJ7HJ7y< z?nM{LkJXCY)#;tL;OASQ>WQlVV=P}Om-j0kCJ{9jLjyGwCC(IAQEb4W5sv`zN8Sr} zFZxb*bowSMgtnBO2Uj1c+1I>hZ{ud{lrZ-Fw|7w8JKml0_|Iq^_f>5%MO%_?KPlQW znyFNeyJmc2ofDt_`Reh`i3;KAT!gJ@+`sRTZf{5*o3V(Og5QK1W-Yx*$k|LSQqvKDB0?vHrvpaB47? zrgoam(RF@U%a{y+CM-~}SY7{W9a=UpCKj3D$#_?QhGynH5@a~79@6jRg}~+mEEE(9 zdWAgQ2Bi{z?Y!6vXZ#=@n^qfwkKHyHj96p2ZI2Uu;`x*)chsvy{ z8MGcL5{uFA)Ix!dSPjNp*{&N-D-RW$JWGcM!oa)vg2%CG3?Om-H}R#4LBMUpOdQ6+ z&q$a8c7q5bhZ*2xXtR@!FpdD8niLNy=Tla-Bm9+3tMuw?CO#416EjtuwE}>pQ zhRU>{I=8pIHQiEG+=g;pI4)YeUs2MwfSc1S!i*!+07a#KF&$QuP$Z5FUC&v;TZC)D z=Rsi6I|p9JUVKEs)EDO)Y!Xa_OT<}0-WoQre>jf_gu@e@ppwd@F(arI9@f*HRF%2h zmT=2>ht=75%Os)sLSl{3b z{3S7Fc*iBt{I^Tp}w~AA3YWwybI?!A;(p!J}&QqW|~%4>nA~ A&Hw-a diff --git a/piet-gpu/shader/gen/tile_alloc.hlsl b/piet-gpu/shader/gen/tile_alloc.hlsl index 1c9d04b..9e370ed 100644 --- a/piet-gpu/shader/gen/tile_alloc.hlsl +++ b/piet-gpu/shader/gen/tile_alloc.hlsl @@ -9,28 +9,6 @@ struct MallocResult bool failed; }; -struct AnnoEndClipRef -{ - uint offset; -}; - -struct AnnoEndClip -{ - float4 bbox; - uint blend; -}; - -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct PathRef { uint offset; @@ -59,12 +37,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -72,12 +52,15 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); -RWByteAddressBuffer _92 : register(u0, space0); -ByteAddressBuffer _314 : register(t1, space0); +RWByteAddressBuffer _70 : register(u0, space0); +ByteAddressBuffer _181 : register(t1, space0); +ByteAddressBuffer _257 : register(t2, space0); static uint3 gl_LocalInvocationID; static uint3 gl_GlobalInvocationID; @@ -90,62 +73,15 @@ struct SPIRV_Cross_Input groupshared uint sh_tile_count[256]; groupshared MallocResult sh_tile_alloc; -bool touch_mem(Alloc alloc, uint offset) +float4 load_draw_bbox(uint draw_ix) { - return true; -} - -uint read_mem(Alloc alloc, uint offset) -{ - Alloc param = alloc; - uint param_1 = offset; - if (!touch_mem(param, param_1)) - { - return 0u; - } - uint v = _92.Load(offset * 4 + 8); - return v; -} - -AnnotatedTag Annotated_tag(Alloc a, AnnotatedRef ref) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1); - AnnotatedTag _246 = { tag_and_flags & 65535u, tag_and_flags >> uint(16) }; - return _246; -} - -AnnoEndClip AnnoEndClip_read(Alloc a, AnnoEndClipRef ref) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9); - AnnoEndClip s; - s.bbox = float4(asfloat(raw0), asfloat(raw1), asfloat(raw2), asfloat(raw3)); - s.blend = raw4; - return s; -} - -AnnoEndClip Annotated_EndClip_read(Alloc a, AnnotatedRef ref) -{ - AnnoEndClipRef _252 = { ref.offset + 4u }; - Alloc param = a; - AnnoEndClipRef param_1 = _252; - return AnnoEndClip_read(param, param_1); + uint base = (_181.Load(64) >> uint(2)) + (4u * draw_ix); + float x0 = asfloat(_70.Load(base * 4 + 8)); + float y0 = asfloat(_70.Load((base + 1u) * 4 + 8)); + float x1 = asfloat(_70.Load((base + 2u) * 4 + 8)); + float y1 = asfloat(_70.Load((base + 3u) * 4 + 8)); + float4 bbox = float4(x0, y0, x1, y1); + return bbox; } Alloc new_alloc(uint offset, uint size, bool mem_ok) @@ -157,22 +93,22 @@ Alloc new_alloc(uint offset, uint size, bool mem_ok) MallocResult malloc(uint size) { - uint _98; - _92.InterlockedAdd(0, size, _98); - uint offset = _98; - uint _105; - _92.GetDimensions(_105); - _105 = (_105 - 8) / 4; + uint _76; + _70.InterlockedAdd(0, size, _76); + uint offset = _76; + uint _83; + _70.GetDimensions(_83); + _83 = (_83 - 8) / 4; MallocResult r; - r.failed = (offset + size) > uint(int(_105) * 4); + r.failed = (offset + size) > uint(int(_83) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _127; - _92.InterlockedMax(4, 1u, _127); + uint _105; + _70.InterlockedMax(4, 1u, _105); return r; } return r; @@ -180,8 +116,13 @@ MallocResult malloc(uint size) Alloc slice_mem(Alloc a, uint offset, uint size) { - Alloc _169 = { a.offset + offset }; - return _169; + Alloc _131 = { a.offset + offset }; + return _131; +} + +bool touch_mem(Alloc alloc, uint offset) +{ + return true; } void write_mem(Alloc alloc, uint offset, uint val) @@ -192,7 +133,7 @@ void write_mem(Alloc alloc, uint offset, uint val) { return; } - _92.Store(offset * 4 + 8, val); + _70.Store(offset * 4 + 8, val); } void Path_write(Alloc a, PathRef ref, Path s) @@ -216,53 +157,35 @@ void comp_main() { uint th_ix = gl_LocalInvocationID.x; uint element_ix = gl_GlobalInvocationID.x; - PathRef _321 = { _314.Load(16) + (element_ix * 12u) }; - PathRef path_ref = _321; - AnnotatedRef _330 = { _314.Load(32) + (element_ix * 40u) }; - AnnotatedRef ref = _330; - uint tag = 0u; - if (element_ix < _314.Load(0)) + PathRef _241 = { _181.Load(16) + (element_ix * 12u) }; + PathRef path_ref = _241; + uint drawtag_base = _181.Load(100) >> uint(2); + uint drawtag = 0u; + if (element_ix < _181.Load(0)) { - Alloc _341; - _341.offset = _314.Load(32); - Alloc param; - param.offset = _341.offset; - AnnotatedRef param_1 = ref; - tag = Annotated_tag(param, param_1).tag; + drawtag = _257.Load((drawtag_base + element_ix) * 4 + 0); } int x0 = 0; int y0 = 0; int x1 = 0; int y1 = 0; - switch (tag) + if ((drawtag != 0u) && (drawtag != 37u)) { - case 1u: - case 2u: - case 3u: - case 4u: - case 5u: - { - Alloc _359; - _359.offset = _314.Load(32); - Alloc param_2; - param_2.offset = _359.offset; - AnnotatedRef param_3 = ref; - AnnoEndClip clip = Annotated_EndClip_read(param_2, param_3); - x0 = int(floor(clip.bbox.x * 0.0625f)); - y0 = int(floor(clip.bbox.y * 0.0625f)); - x1 = int(ceil(clip.bbox.z * 0.0625f)); - y1 = int(ceil(clip.bbox.w * 0.0625f)); - break; - } + uint param = element_ix; + float4 bbox = load_draw_bbox(param); + x0 = int(floor(bbox.x * 0.0625f)); + y0 = int(floor(bbox.y * 0.0625f)); + x1 = int(ceil(bbox.z * 0.0625f)); + y1 = int(ceil(bbox.w * 0.0625f)); } - x0 = clamp(x0, 0, int(_314.Load(8))); - y0 = clamp(y0, 0, int(_314.Load(12))); - x1 = clamp(x1, 0, int(_314.Load(8))); - y1 = clamp(y1, 0, int(_314.Load(12))); + x0 = clamp(x0, 0, int(_181.Load(8))); + y0 = clamp(y0, 0, int(_181.Load(12))); + x1 = clamp(x1, 0, int(_181.Load(8))); + y1 = clamp(y1, 0, int(_181.Load(12))); Path path; path.bbox = uint4(uint(x0), uint(y0), uint(x1), uint(y1)); uint tile_count = uint((x1 - x0) * (y1 - y0)); - if (tag == 5u) + if (drawtag == 37u) { tile_count = 0u; } @@ -280,59 +203,59 @@ void comp_main() } if (th_ix == 255u) { - uint param_4 = total_tile_count * 8u; - MallocResult _485 = malloc(param_4); - sh_tile_alloc = _485; + uint param_1 = total_tile_count * 8u; + MallocResult _396 = malloc(param_1); + sh_tile_alloc = _396; } GroupMemoryBarrierWithGroupSync(); MallocResult alloc_start = sh_tile_alloc; - bool _496; + bool _407; if (!alloc_start.failed) { - _496 = _92.Load(4) != 0u; + _407 = _70.Load(4) != 0u; } else { - _496 = alloc_start.failed; + _407 = alloc_start.failed; } - if (_496) + if (_407) { return; } - if (element_ix < _314.Load(0)) + if (element_ix < _181.Load(0)) { - uint _509; + uint _420; if (th_ix > 0u) { - _509 = sh_tile_count[th_ix - 1u]; + _420 = sh_tile_count[th_ix - 1u]; } else { - _509 = 0u; + _420 = 0u; } - uint tile_subix = _509; - Alloc param_5 = alloc_start.alloc; - uint param_6 = 8u * tile_subix; - uint param_7 = 8u * tile_count; - Alloc tiles_alloc = slice_mem(param_5, param_6, param_7); - TileRef _531 = { tiles_alloc.offset }; - path.tiles = _531; - Alloc _536; - _536.offset = _314.Load(16); - Alloc param_8; - param_8.offset = _536.offset; - PathRef param_9 = path_ref; - Path param_10 = path; - Path_write(param_8, param_9, param_10); + uint tile_subix = _420; + Alloc param_2 = alloc_start.alloc; + uint param_3 = 8u * tile_subix; + uint param_4 = 8u * tile_count; + Alloc tiles_alloc = slice_mem(param_2, param_3, param_4); + TileRef _442 = { tiles_alloc.offset }; + path.tiles = _442; + Alloc _448; + _448.offset = _181.Load(16); + Alloc param_5; + param_5.offset = _448.offset; + PathRef param_6 = path_ref; + Path param_7 = path; + Path_write(param_5, param_6, param_7); } uint total_count = sh_tile_count[255] * 2u; uint start_ix = alloc_start.alloc.offset >> uint(2); for (uint i_1 = th_ix; i_1 < total_count; i_1 += 256u) { - Alloc param_11 = alloc_start.alloc; - uint param_12 = start_ix + i_1; - uint param_13 = 0u; - write_mem(param_11, param_12, param_13); + Alloc param_8 = alloc_start.alloc; + uint param_9 = start_ix + i_1; + uint param_10 = 0u; + write_mem(param_8, param_9, param_10); } } diff --git a/piet-gpu/shader/gen/tile_alloc.msl b/piet-gpu/shader/gen/tile_alloc.msl index c03e830..e6f486b 100644 --- a/piet-gpu/shader/gen/tile_alloc.msl +++ b/piet-gpu/shader/gen/tile_alloc.msl @@ -18,28 +18,6 @@ struct MallocResult bool failed; }; -struct AnnoEndClipRef -{ - uint offset; -}; - -struct AnnoEndClip -{ - float4 bbox; - uint blend; -}; - -struct AnnotatedRef -{ - uint offset; -}; - -struct AnnotatedTag -{ - uint tag; - uint flags; -}; - struct PathRef { uint offset; @@ -80,12 +58,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -93,6 +73,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf @@ -100,67 +82,23 @@ struct ConfigBuf Config conf; }; +struct SceneBuf +{ + uint scene[1]; +}; + constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(256u, 1u, 1u); static inline __attribute__((always_inline)) -bool touch_mem(thread const Alloc& alloc, thread const uint& offset) +float4 load_draw_bbox(thread const uint& draw_ix, device Memory& v_70, constant uint& v_70BufferSize, const device ConfigBuf& v_181) { - return true; -} - -static inline __attribute__((always_inline)) -uint read_mem(thread const Alloc& alloc, thread const uint& offset, device Memory& v_92, constant uint& v_92BufferSize) -{ - Alloc param = alloc; - uint param_1 = offset; - if (!touch_mem(param, param_1)) - { - return 0u; - } - uint v = v_92.memory[offset]; - return v; -} - -static inline __attribute__((always_inline)) -AnnotatedTag Annotated_tag(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_92, constant uint& v_92BufferSize) -{ - Alloc param = a; - uint param_1 = ref.offset >> uint(2); - uint tag_and_flags = read_mem(param, param_1, v_92, v_92BufferSize); - return AnnotatedTag{ tag_and_flags & 65535u, tag_and_flags >> uint(16) }; -} - -static inline __attribute__((always_inline)) -AnnoEndClip AnnoEndClip_read(thread const Alloc& a, thread const AnnoEndClipRef& ref, device Memory& v_92, constant uint& v_92BufferSize) -{ - uint ix = ref.offset >> uint(2); - Alloc param = a; - uint param_1 = ix + 0u; - uint raw0 = read_mem(param, param_1, v_92, v_92BufferSize); - Alloc param_2 = a; - uint param_3 = ix + 1u; - uint raw1 = read_mem(param_2, param_3, v_92, v_92BufferSize); - Alloc param_4 = a; - uint param_5 = ix + 2u; - uint raw2 = read_mem(param_4, param_5, v_92, v_92BufferSize); - Alloc param_6 = a; - uint param_7 = ix + 3u; - uint raw3 = read_mem(param_6, param_7, v_92, v_92BufferSize); - Alloc param_8 = a; - uint param_9 = ix + 4u; - uint raw4 = read_mem(param_8, param_9, v_92, v_92BufferSize); - AnnoEndClip s; - s.bbox = float4(as_type(raw0), as_type(raw1), as_type(raw2), as_type(raw3)); - s.blend = raw4; - return s; -} - -static inline __attribute__((always_inline)) -AnnoEndClip Annotated_EndClip_read(thread const Alloc& a, thread const AnnotatedRef& ref, device Memory& v_92, constant uint& v_92BufferSize) -{ - Alloc param = a; - AnnoEndClipRef param_1 = AnnoEndClipRef{ ref.offset + 4u }; - return AnnoEndClip_read(param, param_1, v_92, v_92BufferSize); + uint base = (v_181.conf.draw_bbox_alloc.offset >> uint(2)) + (4u * draw_ix); + float x0 = as_type(v_70.memory[base]); + float y0 = as_type(v_70.memory[base + 1u]); + float x1 = as_type(v_70.memory[base + 2u]); + float y1 = as_type(v_70.memory[base + 3u]); + float4 bbox = float4(x0, y0, x1, y1); + return bbox; } static inline __attribute__((always_inline)) @@ -172,19 +110,19 @@ Alloc new_alloc(thread const uint& offset, thread const uint& size, thread const } static inline __attribute__((always_inline)) -MallocResult malloc(thread const uint& size, device Memory& v_92, constant uint& v_92BufferSize) +MallocResult malloc(thread const uint& size, device Memory& v_70, constant uint& v_70BufferSize) { - uint _98 = atomic_fetch_add_explicit((device atomic_uint*)&v_92.mem_offset, size, memory_order_relaxed); - uint offset = _98; + uint _76 = atomic_fetch_add_explicit((device atomic_uint*)&v_70.mem_offset, size, memory_order_relaxed); + uint offset = _76; MallocResult r; - r.failed = (offset + size) > uint(int((v_92BufferSize - 8) / 4) * 4); + r.failed = (offset + size) > uint(int((v_70BufferSize - 8) / 4) * 4); uint param = offset; uint param_1 = size; bool param_2 = !r.failed; r.alloc = new_alloc(param, param_1, param_2); if (r.failed) { - uint _127 = atomic_fetch_max_explicit((device atomic_uint*)&v_92.mem_error, 1u, memory_order_relaxed); + uint _105 = atomic_fetch_max_explicit((device atomic_uint*)&v_70.mem_error, 1u, memory_order_relaxed); return r; } return r; @@ -197,7 +135,13 @@ Alloc slice_mem(thread const Alloc& a, thread const uint& offset, thread const u } static inline __attribute__((always_inline)) -void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_92, constant uint& v_92BufferSize) +bool touch_mem(thread const Alloc& alloc, thread const uint& offset) +{ + return true; +} + +static inline __attribute__((always_inline)) +void write_mem(thread const Alloc& alloc, thread const uint& offset, thread const uint& val, device Memory& v_70, constant uint& v_70BufferSize) { Alloc param = alloc; uint param_1 = offset; @@ -205,75 +149,62 @@ void write_mem(thread const Alloc& alloc, thread const uint& offset, thread cons { return; } - v_92.memory[offset] = val; + v_70.memory[offset] = val; } static inline __attribute__((always_inline)) -void Path_write(thread const Alloc& a, thread const PathRef& ref, thread const Path& s, device Memory& v_92, constant uint& v_92BufferSize) +void Path_write(thread const Alloc& a, thread const PathRef& ref, thread const Path& s, device Memory& v_70, constant uint& v_70BufferSize) { uint ix = ref.offset >> uint(2); Alloc param = a; uint param_1 = ix + 0u; uint param_2 = s.bbox.x | (s.bbox.y << uint(16)); - write_mem(param, param_1, param_2, v_92, v_92BufferSize); + write_mem(param, param_1, param_2, v_70, v_70BufferSize); Alloc param_3 = a; uint param_4 = ix + 1u; uint param_5 = s.bbox.z | (s.bbox.w << uint(16)); - write_mem(param_3, param_4, param_5, v_92, v_92BufferSize); + write_mem(param_3, param_4, param_5, v_70, v_70BufferSize); Alloc param_6 = a; uint param_7 = ix + 2u; uint param_8 = s.tiles.offset; - write_mem(param_6, param_7, param_8, v_92, v_92BufferSize); + write_mem(param_6, param_7, param_8, v_70, v_70BufferSize); } -kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_92 [[buffer(0)]], const device ConfigBuf& _314 [[buffer(1)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) +kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device Memory& v_70 [[buffer(0)]], const device ConfigBuf& v_181 [[buffer(1)]], const device SceneBuf& _257 [[buffer(2)]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) { threadgroup uint sh_tile_count[256]; threadgroup MallocResult sh_tile_alloc; - constant uint& v_92BufferSize = spvBufferSizeConstants[0]; + constant uint& v_70BufferSize = spvBufferSizeConstants[0]; uint th_ix = gl_LocalInvocationID.x; uint element_ix = gl_GlobalInvocationID.x; - PathRef path_ref = PathRef{ _314.conf.tile_alloc.offset + (element_ix * 12u) }; - AnnotatedRef ref = AnnotatedRef{ _314.conf.anno_alloc.offset + (element_ix * 40u) }; - uint tag = 0u; - if (element_ix < _314.conf.n_elements) + PathRef path_ref = PathRef{ v_181.conf.tile_alloc.offset + (element_ix * 12u) }; + uint drawtag_base = v_181.conf.drawtag_offset >> uint(2); + uint drawtag = 0u; + if (element_ix < v_181.conf.n_elements) { - Alloc param; - param.offset = _314.conf.anno_alloc.offset; - AnnotatedRef param_1 = ref; - tag = Annotated_tag(param, param_1, v_92, v_92BufferSize).tag; + drawtag = _257.scene[drawtag_base + element_ix]; } int x0 = 0; int y0 = 0; int x1 = 0; int y1 = 0; - switch (tag) + if ((drawtag != 0u) && (drawtag != 37u)) { - case 1u: - case 2u: - case 3u: - case 4u: - case 5u: - { - Alloc param_2; - param_2.offset = _314.conf.anno_alloc.offset; - AnnotatedRef param_3 = ref; - AnnoEndClip clip = Annotated_EndClip_read(param_2, param_3, v_92, v_92BufferSize); - x0 = int(floor(clip.bbox.x * 0.0625)); - y0 = int(floor(clip.bbox.y * 0.0625)); - x1 = int(ceil(clip.bbox.z * 0.0625)); - y1 = int(ceil(clip.bbox.w * 0.0625)); - break; - } + uint param = element_ix; + float4 bbox = load_draw_bbox(param, v_70, v_70BufferSize, v_181); + x0 = int(floor(bbox.x * 0.0625)); + y0 = int(floor(bbox.y * 0.0625)); + x1 = int(ceil(bbox.z * 0.0625)); + y1 = int(ceil(bbox.w * 0.0625)); } - x0 = clamp(x0, 0, int(_314.conf.width_in_tiles)); - y0 = clamp(y0, 0, int(_314.conf.height_in_tiles)); - x1 = clamp(x1, 0, int(_314.conf.width_in_tiles)); - y1 = clamp(y1, 0, int(_314.conf.height_in_tiles)); + x0 = clamp(x0, 0, int(v_181.conf.width_in_tiles)); + y0 = clamp(y0, 0, int(v_181.conf.height_in_tiles)); + x1 = clamp(x1, 0, int(v_181.conf.width_in_tiles)); + y1 = clamp(y1, 0, int(v_181.conf.height_in_tiles)); Path path; path.bbox = uint4(uint(x0), uint(y0), uint(x1), uint(y1)); uint tile_count = uint((x1 - x0) * (y1 - y0)); - if (tag == 5u) + if (drawtag == 37u) { tile_count = 0u; } @@ -291,56 +222,56 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } if (th_ix == 255u) { - uint param_4 = total_tile_count * 8u; - MallocResult _485 = malloc(param_4, v_92, v_92BufferSize); - sh_tile_alloc = _485; + uint param_1 = total_tile_count * 8u; + MallocResult _396 = malloc(param_1, v_70, v_70BufferSize); + sh_tile_alloc = _396; } threadgroup_barrier(mem_flags::mem_threadgroup); MallocResult alloc_start = sh_tile_alloc; - bool _496; + bool _407; if (!alloc_start.failed) { - _496 = v_92.mem_error != 0u; + _407 = v_70.mem_error != 0u; } else { - _496 = alloc_start.failed; + _407 = alloc_start.failed; } - if (_496) + if (_407) { return; } - if (element_ix < _314.conf.n_elements) + if (element_ix < v_181.conf.n_elements) { - uint _509; + uint _420; if (th_ix > 0u) { - _509 = sh_tile_count[th_ix - 1u]; + _420 = sh_tile_count[th_ix - 1u]; } else { - _509 = 0u; + _420 = 0u; } - uint tile_subix = _509; - Alloc param_5 = alloc_start.alloc; - uint param_6 = 8u * tile_subix; - uint param_7 = 8u * tile_count; - Alloc tiles_alloc = slice_mem(param_5, param_6, param_7); + uint tile_subix = _420; + Alloc param_2 = alloc_start.alloc; + uint param_3 = 8u * tile_subix; + uint param_4 = 8u * tile_count; + Alloc tiles_alloc = slice_mem(param_2, param_3, param_4); path.tiles = TileRef{ tiles_alloc.offset }; - Alloc param_8; - param_8.offset = _314.conf.tile_alloc.offset; - PathRef param_9 = path_ref; - Path param_10 = path; - Path_write(param_8, param_9, param_10, v_92, v_92BufferSize); + Alloc param_5; + param_5.offset = v_181.conf.tile_alloc.offset; + PathRef param_6 = path_ref; + Path param_7 = path; + Path_write(param_5, param_6, param_7, v_70, v_70BufferSize); } uint total_count = sh_tile_count[255] * 2u; uint start_ix = alloc_start.alloc.offset >> uint(2); for (uint i_1 = th_ix; i_1 < total_count; i_1 += 256u) { - Alloc param_11 = alloc_start.alloc; - uint param_12 = start_ix + i_1; - uint param_13 = 0u; - write_mem(param_11, param_12, param_13, v_92, v_92BufferSize); + Alloc param_8 = alloc_start.alloc; + uint param_9 = start_ix + i_1; + uint param_10 = 0u; + write_mem(param_8, param_9, param_10, v_70, v_70BufferSize); } } diff --git a/piet-gpu/shader/gen/tile_alloc.spv b/piet-gpu/shader/gen/tile_alloc.spv index cf2f01c362340d2f459f2df30b2bcdc9fb3ae729..3ae10738a3100148fb250dd94989ada5ce5d0348 100644 GIT binary patch literal 13460 zcmbW637A}Em4o-s0fNE zq9}qZ3J9_Ukf5N5K@6avBBFx3gs3pXEY3LNI-@i1d+VO`pHiNAp1IcX|Gw}1|2hAD zZ<>y=`}Jhmm~4DDE_-oImOndYV^OkfLe`y^eG5-tIAgduIAhlA!>sU%tRt^yo$a%p ztc$V}TUoBwb!^67#CD*)`i_`^tgm(Ozp<1XA)RFITUhE_vZQa}iKT&6t4hPowY5sA zR;^b`gVmwRK(o5KV!d%my=r}+HZqu2=%Pm22l;q%%&XNJ1C-tLQts1Owrsf4%ussh zf0orNYf5G7O&yte48Q)F$KdPCw%w|3XSN-DxcU})W7|&VfiYKBmKqnxyYq1_$^)HN z86K&Tp_MluKR9f8zTcNN@Sio+#DJi zXilGJ=ckX%%zNKzw;S~$pMBjOK059RSucFeP_xA-jq+e=aHzbdWN+Q9t+_i2UoKZK z%-bCek9nOBPRD-&d{Jd(V`!~o?at&r`93brMd;3fdSz&+F$8vQtnb-H&turn1#lnn zVoK|}rsq&&ig@#gr(UYmDl04XCX4S{ zsJj;R(kgb~aE0oqJ-O~$tf>yNF{|}bv0=mKExn>rUB03@>Wp}u_^jT#_(t<|q4yIi z&U@7FMqkw&sD&eP@bX}d@?M2&OP|N#E7$9da73(a(3?Z$`f%ZhSl-XZ%D49x-?)67 z6Y#mmS2pU6>R?11?YDRJK&`qeJQ347JJ!B?YH1U5&5@hCrTH$Xm&`uepIy*e^A@{E zUu!J8;`5!^+6$?_wNEDDH$$_$ycFITi|>k9!*-wV4af5L+W9WhH&||#BdG7O&!e~Y z_56`#V8^89Gr)eg^scy1z$1Q$@MBWws{GEzCXR7 zd3@*pmNMoiJ^z0g)v4E&{SW-~fl9s7nv#4@)O?23DIMb&4|;*efn!d#0mqz-S1;yd zf_gD0JA>0X*#$m&e|Bc`bKZLQ*{8+u{0|>q< zlv8rnin+ePX`XoRv}^6Tt(WGuk80+&t#@!}_E*h&GBn>UYTj+3IR|RqL819hQQIrg z9IIMyqWKMt@vqke=p*Abgd`GCwNi^RJYOhK($Eo(3 zMBA~@T%X9hQ=y%dXx{&}U6^Rjk=oKk^Zr*mBhkF~)y_&Z?|QX!63zKlJ3rC9+tmgW z%{yIfMXq&jxwm6|;vTn-kNZ!pBgdRY%5?w9-GA;S_v2Wq-t-ndVoE{9{Oz=9im)EN1){;O2Ae6H(Qt(AxImU8rOJUd*Q#?tawNcczwm zQQiHgE}u*U_nvj8@c-tJM_cPorj2_--8NI;?gusN8PoL?TW1RA%eAy_=*D)g>}zP& zSKpV?cByW^rlPgR)R`Rww!YdV@*Q0GJg?TBR&e|3dC{+C-=_c_nvdVo>FZxBllhvr>6h^V`+?+!{+xKo7Z{x0;S_nb6(}1AOj z>u;cR-dbzlnLSf**V=usiPAQX)%wpdRpjy&6=9Z+z`w+B4SE;%;x9s!SWEiBr% z&P{8-oo#(=FXEp=>6p~acP^!KsBVAceuKrlmJ4i~=uZvJeHXkg$AVu5c6`QvH`rM2 zXXDHLMvM3lf*o(1@rU5fkNYgf_XL{p4x#6pD7{1NzvoChlCx3dGa=(*;lj7uQ1QIckQw43HS4_G46`ud4W{OO za!H~68`yUGmeSv;l>d&Yo8SE^pGO4q|0fpty@w*#?+V|>BJS_uYQ86o<33jtyT{Y< z{t<3JBgdb>k;8FDjz5F--9rxVh5y2AtNsV#{)N)#&x}Lge`9K%QE|i>%bMAr;2m)D z$DDM+t)m`&>H>Rz+8_PVwi~Q3#wGs~`692SKF_gj#h&57p5MTpU2(+T7VccFE5^GW zTrHiuSG3jH0j}myKQo1nV=GdqEz#rh?6NeUj@SxO(I|7_64&ng-{W=h7d!4gu>kmwQd_UX8W4 zbWG0obg+9i_WulUoXLxd{&=SximvbCqTOL&wQZSIHfA(tfT(Oc{td! z5jkgpBj*uCJ#)?m>x-O6g4H7DQDA;~PGg$WIyQ>fYri(BG|bP{{paD`1`=lQ}|B;tA+n$uwx4UDPXmwytfV}-)q6&c@B8R1xZ3u)-jThL(#LyN-y1MB?^$ug^p5l# zhR-r`l)!#71V0~cKb*TVWj}TvWappuLP^rFvlxjjv33?;!Wt@n_3+nu^QlXjH}?rev~mf&u<2Mx2xY> z%=Hl1cKUp$H7R|}t#24pGq*T$jeyf!tKn&`HE?sOyI0JAA=q~MV&2z+op*f^`z>Jg z;1_|N^Z2f~7_4T!SPwPlIQnY&a`W_7d}-g`1~-26>Fr?qWIf}{tz&%G)48yW{#^og z?9sn>h%x^T5PL+;_OVA?&uD)s*#5-+e>{{8rDW814J<<8+Y_&xwua}MmE z=lW{6`fUaOAXv>YUPI~Q7}Y<7sX0cmas6)oFn9rF#C2a?i>4mmch`Z{;#@`?%inR2 z+Lw=j&F%QCZw~wMF-jl%VV#d+YW73?muyUq)neX10e*ot@gDjlJl;dz#Zm8ibbWEw zKLxg}y18$l^f9--Ph)E47Dt?$!0wkjnG?tI8MvC`HO^f8ffj76RGVC$&cfB)V2d9eF1)?qx_7vSpVy_ZrhzK_y8;`=F$H<$fln=gV7 zq_n>E^jq&PN`2<*!T%+&TI6$oJ^)wu--XlQUk0n$=0VD@VDquKFXYy7KRrbGRV?nR^De5Vq}JYR#W`9yy?O(3_PF{V=QQSeKYj^z=sT%Uil{W^F)rtdLI zx%1)QZoUCNoYL5~)9)UL{c33+%9P*4+(S=bv3B1o^jN!Z!_|DJneTD1nsea1eg_=u zn9l7}==wGmbMRfTn%|tpc@nG^dA|pC&+B^{EVtj^r*!XH`tE*)@>$GB{|^hlWyJas z*cico47T5KzJCI?j=E=2{sYX|<`PHSpMvdc@SlN=9q*K%gRP_Pyt=oa1IL`$&V9NG zP2KVRf>JJip3)fN&6J+YSj%6+d*Rl%o_@#d`0b}<^y^pPv|qo5tDTL-oT{aB>Uh03 z=V1Qr&wg%?`Aoo$qED`|f13@wU4ea<_}|p*hkqCM?}Lv0Xv{XzuVcZsk9~g}*gCQA z<<^OLdUfIdD{;lqH{WZ%6Mc5VqCXSC_F)&w_#5SXuzip(qFkJC^>f>JDdCQ*TyXo` z2R;c~fTjEUWVpFsB9mu)A!fZ(FxODO^KM`C#e6IUs|7z5Y@FCnr-7}benN3}P6wOc z^X+%L-|}Z*>Yh{i>k7?#D8B7qU+D2ZIty-mb;ssd-+(zkamUH67ydUUe*5fu?QBdv zz8B6Zv>4NQaL4HQoojjc&IdbQea^dF?3^1X?)84Kd(rmR({G>LV*{9djy)u|e)M^; z@H?jHa|NvKdw4mek7r+f8K&kw5*x>LUx7LA#`#UL&ecMXb+$Bz`}0kh{c`V$jc45O z*Al-t_O^4n2j(*gb8kD&-3r`8xjSaOJt>Xfpp5qJi(brUFD%;cU0~Z!PVhcpV@;uq zb2|jKUYwz3!R`Ba@GxdP*UGwbechBJnDO=5PCgfp<64b5HrwcnJ+lU^&-GYK>En8+ zUx=yMM{#`HsYT9)JOp>$Tr`2cr4xi^bgSS77I4{{$ZZ zwqLKLbf4&dJ7#_NWAx_|uzK)!fQ=L9{L&m}nY!N}&hcfKy6Y=W*Y|L^&kQX3cxZtS zqCBj?())Pm>#u9$cNRS6 z@ZE67kj~*1aP|0xcn?_3HFZ55lUmI2d%YypQ91<$Yl1$2{uM_A0QxsP}$w z)H@}q_W`iJM_K!B$`4{{S7VPA+K0f#(`S6w_QRO#Wxt(!x!8HPpJM0Sw(U}DycYRXt(_nou)*HZT=~!=s8}9}z z#`+m>jMaT3cYN*{`zdz6*fz%cS#U3Aee3Cu{@w~s$9fxFEym>h-ho9<_nzE5>nN=s zW4#OPoGii8y>>TTpKaWm^61;=z`dApji*1oLuSM0U_M7;p3k1VY@Nfo;5di(fc42Y zP(IYgA8F%HwDG4B{tWopg2#V9yB~fZ=Ga`Pbc|nw>yPvFC9s<3Ddzgi;G;0VE8O1? zVh>>Iajw1swyi$r%Q2}%jIV;#obx`)hp`2idGtlSuYn)N{9c(wxe-${rt>0?x{rd5 z8GU#RtQPy-JYUBmkN#-;jlvgs9*3)$$N82=-EV@^Jl}$=xz}Pm-v&n>{n7SGu)fIi z9k7~tTt|7-{Vq7o^E6z|^A~x(2aY`YqwV*>`XbK{z-s1kf5@%toc<7VE`$FF?3jc9 o7;N8y{{(Cd|E}%6{wZb*+gVq?dE9sUY-hcnVQRj+#J;=!7l)Y5wg3PC literal 15692 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 GmHr2D(m@&k delta 1616 zcmZ9MeM}Q)0LJgG*W;+AwzP#paohnSwAHlo>4tcvM-5E2W&MQ#BH{*sb zEP(c?xv+NAR+QICZK$;n-O7*qCo;xhrac}Vy|M}a(uKL*rxGZOtpbZ%0K}s;#Hpo* zTNTdHL?ujqhGDnejMg0jH&@(oLpSN0m-@af`{~h9>)J=ww8iK}@BOa8u^a3;aVP|x zX1m2$xc@1yHFS;Lm@;2G+ckD8FE|6>zji{J2Z2rOCo(*z&3yJa6XD}(%@B=g$O>v_ zsS$bKSnLHb6gi?T+8B9;iLBGa0jSgbC(`sOvc-?YA_(B5yrbqb^TQEy2m4&6s~%tE zWp*9owq^nO&YWN{pFmzOriCO`^chBZUNFXqAmf}i9_=@)Is~m@40)wBB=msl-r0b@ zc`ZM2h*OUUn(E=arqYcwVS(8^(SLb5ws~P>oM@fHH5EclOIrOspp*i`8q;XAVW4jY zN%D#d?RP1p-N@csm|h)alW~N&7yL~w%?GvuJy}K@=mV!EyhtOxdRU|eB7s)k#7==N z7K+mi`JAb=q}aS#DhFVW&JEfSI4}`rRYE?ugI0)Oz-;sd@bH(|sB7#XkYEX?1^|$d zOV96_aM{q0HznhM?uJ-nA^^~b zl|R=oz1LAV(~3=-wuDTUd>=V<{X~lQu=xWlB|7#2kQpYOZp)HQlz`yLsgV2Ap*#FN zcoYT68q*G1)(mhnZihE`h5fEWmShULsr`;&^At;}w?RmM2$w^1h68f=)oGwznZJ@( zMR`TR$@p0%*g_G9zChg}wV0OHZO+!*cw_(4NTiO?+NyVJo zf$}H87fzy-*iz)pHf|%}dq6`{*gIv4-bi;>`XMSnqn+USA;X#R7&@g|TG<@N`9Z~Q zk?~CTcoH^>8HDi|X=G>J1lY?(PCU0ds z`a_Bcq+KdjM&Ohxd`htC z`Y{2sPvfPLV9Tba`r85)oWrjQ*jfK0kM05ri)QunZ+7-G(tekY*}L4ZgE*3bH>P#go>1M?7Hww#R&4|; z*#h-q@BzC|9TAni%ztVL*Mhb$*SBZsSK}M3mwIc>B7RTok66Dt0(7y%>c~}3i}k+H zNsm|GbyWZLF2$8WucS_s%)fig;Ihsb9d{Y+zM}8$)29YKfezev6YKajGldW=yr}&5 EFM-rCZ2$lO diff --git a/piet-gpu/shader/gen/transform_leaf.hlsl b/piet-gpu/shader/gen/transform_leaf.hlsl index 3528d6c..8a3b3d5 100644 --- a/piet-gpu/shader/gen/transform_leaf.hlsl +++ b/piet-gpu/shader/gen/transform_leaf.hlsl @@ -37,12 +37,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -50,6 +52,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); @@ -155,7 +159,7 @@ void TransformSeg_write(Alloc a, TransformSegRef ref, TransformSeg s) void comp_main() { uint ix = gl_GlobalInvocationID.x * 8u; - TransformRef _285 = { _278.Load(76) + (ix * 24u) }; + TransformRef _285 = { _278.Load(84) + (ix * 24u) }; TransformRef ref = _285; TransformRef param = ref; Transform agg = Transform_read(param); diff --git a/piet-gpu/shader/gen/transform_leaf.msl b/piet-gpu/shader/gen/transform_leaf.msl index 6a99fae..fe45438 100644 --- a/piet-gpu/shader/gen/transform_leaf.msl +++ b/piet-gpu/shader/gen/transform_leaf.msl @@ -100,12 +100,14 @@ struct Config Alloc_1 pathseg_alloc; Alloc_1 anno_alloc; Alloc_1 trans_alloc; - Alloc_1 bbox_alloc; + Alloc_1 path_bbox_alloc; Alloc_1 drawmonoid_alloc; Alloc_1 clip_alloc; Alloc_1 clip_bic_alloc; Alloc_1 clip_stack_alloc; Alloc_1 clip_bbox_alloc; + Alloc_1 draw_bbox_alloc; + Alloc_1 drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -113,6 +115,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf diff --git a/piet-gpu/shader/gen/transform_leaf.spv b/piet-gpu/shader/gen/transform_leaf.spv index b9a0a8311f65b5e268e9cd9fa71b41989e4693a0..b7390994c2522a13c274a0c50bf0a1c8e2e3139a 100644 GIT binary patch delta 376 zcmcbSye4(SEp|zE24O}91}+8$hJwVBjQFIa{EGO*oSgjR$?w@Gr$b}~fU+q?iRDPL z3~US#IYFpgW?ou8L?Z)GjumXG5Kt~JzN9EIuNW>S3>E{~g-|Clc_W9gtSC?htTsMB zEv-1U1jq&I;sBc@Hu)ikJfrwzMowvO37|Mge{pI$TqVpkl0Z3-OG^?l<)ol;DTyVC zP>q}QIjvc}A&wOXN-G0#3=n%jJpi%_B$j|A2C@PqmVzV(G8!b7u{o9RC<~+PWNl&B a$pOL~lM94pCN}`-9$^bc(alGNh2;R#^hwtM delta 168 zcmZ3JdLwzmEp|~h24O}91}+8$hNPtYiulBwocv^l$)DLLJF|ji1b{Mm@g+rxdBqHD z3=lCvuvkH2Nd^O4Ob9HNoRe7q5@QGJ6`stl@SNVxP`cd zq}Nhv{Tg+Yr1OuZFj<(gtd3=oMYEpZ%I8)bi_E!24Z6iJ=Zs;PxMX(~%(naE&HbL| z-skc@?|XMW=XwrZR#j>T|GUo7$uw%qx#5+c-v5k!yycVamwRuX?SGh-k3u(pud0Jp z9W@$`b`hi9q^b)j8zKnXgbU|&Kvgd#y~6-t?-)^4crxM4j}}&GwI$7HCWNP0b~50v zV!Cw(bUH*Xv6HQKp!cVpVh>z}$jLk+`FU-2P9TCG?#}1!&L-Bh1mqEix$Z*qM3XOB zkO|#V#8kkm52#^R)6W5POc*6`kiciwkY-f?WqCC-Fy4or8BO!QnFs8HI1dG13+ z&9#lqdk^kHKT6kqIA*9}sy}%BdwsR;r!ZS!5BzG{UHn(&s*RP!8*^iKrODxe$&uT( zi#-FA6BWv>{a-1vP(>{Z0MqfOdNs1I!;r4`bcySOw&(GcxDxnyst0*Bgy_Oz(1r>u zQ?}2kb5nS|We*Qn0w2+D+PiRjM88Q=1zDx_4gUTUd5}}Lhbc~R>OF=9gb&fC88Za2 zp%hFB_~MhxgJQ;USqobiHP6)Yus1Uzi!Rfm7+w*z(WhmNerr*48T$}zEEV`vqw~*; z+6%H~fU}$9E3nyu_zHAZ7ymW`Vp@QN?G`6O#W%|UFO*8a#n=27JeZcK0AEv8_wjYT zEE)A}OKLC(Y?i1Sp|7w++oT`#W^4H&fN&JqTf-=diSpX@*89GZ zi>V-l?GD62QUHp=wKi9%mD4&h(J12*79v}`+PiE+Dl%;$(nIzhIHcH0@N#B4I%nY9 zkvW=Qip-Jx#QaQMVwLfkOI%5_-`iqVVviyj_=9t9a;9#S8BP$e#KGRTqTY55(K23* zJ(}*9+&9!Sb;+#ZL~xVPuE1LQLfCv27f<}c8hOigst;qv*AceG9WD3F`$}BSrLR1u z;wrrJx5NCjK%7SMQR8XOBxuP(BtwiL8YkvVl$8H%2WuF9PmZq^GsW;I?FperK&55e z{{kGu%LFyIAt$>n1L>>nJrX7Y>R>cW@a-r)nu}Hq3YlgNsi(XfKtCMh6dGK`$bGf9BZEWp7&> zxfp5%Qp2lB%+kn3d=?3Y@}UfZFXb3%jBk!+S(yFAJWAH#VdK^;L{fj$e*nbp%8vj5 delta 1319 zcmY+Ee@qi+7{}jh-(JtIg==l~pkqBi5k`e;r(hg**B_b+1-q>pB>r()FkN6~(U3VM z>-DIlI*`tG&gsnR#td7`1_4K^ChG|f*0~K>vos7B*oYyFEoju~;dX}@FPr1>{_=q$ zWGtw(e1EN^{oBu6`zo1K?%;v<>`&zvM;Z_17kkfW$cB-HT{Fp>KhMp4mArW#ZqG4S zylXDs7_aCaSXX{2USyT`U6y4@A`2>rWJT_(o<;UX$PB&zEWa*jEl2awWq@PwbIA5~ zo(S_HtAr&9$1CnEFOD`)dl*1s=u!QK`u`rc>Nf}}E2gPzU$C#E0Me??C{D{xA16qF zafnQA(6GGE22w1#^ybqcUehjSQPWapiRMHD%TI}+CvPeAJQK5OyTnX;U@6lYE+D#| z#e$Eslp%6IBgZejZll}?l`ul74m=5W9+^_Xgk0cDymkRKcazE(w`o)@g}_S1_8{7E z5<4;$1l_qhW(XiOt}Lu0WM!Ch_qtq=BxQt&1~`)Y*FF>^6dB# zPdF0IRO=1}baSL{v5fq2naHKgY(FM_kXEC&OM+P{nU#d1EUM z^HEfoS~wIeow3XAk{2_P3ygEwn^>DFL}#;k3)VSgAJ&vpg&GW6P7hn%J zz1opSl#!A~Pwb={0_cH3Oe8xBxRBqeJk3iib<)y`WYj&qAxS>wDb;)KK~+L~?7 zzeW6oTSU!H=h@Amk(iaN743>TXRnA0+**lW!R~%XXuDBp`=)x*&^kg}cDx;Ext=G? z#VgEZM3~F}{l}nXMLf{r+Ar8&MXQ?e2K9+y4zcXGg0vXPspqQ1za#jJL0ZPD=fyre z0U3)XfzMOz1OYHV$KTFwwyqpRVKE^UI^1P5fk8A_gp1IAl@b6JVj|qJQedzA6Qp&z zjV(#pWJ#Bp> g(UD{FiO2P~vWK=3Ns3Uz6x|U&wVKAoyG&gF0=SXBO#lD@ diff --git a/piet-gpu/shader/gen/transform_reduce.hlsl b/piet-gpu/shader/gen/transform_reduce.hlsl index cce1a22..bd14f79 100644 --- a/piet-gpu/shader/gen/transform_reduce.hlsl +++ b/piet-gpu/shader/gen/transform_reduce.hlsl @@ -26,12 +26,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -39,6 +41,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; static const uint3 gl_WorkGroupSize = uint3(256u, 1u, 1u); @@ -92,7 +96,7 @@ Transform combine_monoid(Transform a, Transform b) void comp_main() { uint ix = gl_GlobalInvocationID.x * 8u; - TransformRef _168 = { _161.Load(76) + (ix * 24u) }; + TransformRef _168 = { _161.Load(84) + (ix * 24u) }; TransformRef ref = _168; TransformRef param = ref; Transform agg = Transform_read(param); diff --git a/piet-gpu/shader/gen/transform_reduce.msl b/piet-gpu/shader/gen/transform_reduce.msl index 3695563..62da531 100644 --- a/piet-gpu/shader/gen/transform_reduce.msl +++ b/piet-gpu/shader/gen/transform_reduce.msl @@ -38,12 +38,14 @@ struct Config Alloc pathseg_alloc; Alloc anno_alloc; Alloc trans_alloc; - Alloc bbox_alloc; + Alloc path_bbox_alloc; Alloc drawmonoid_alloc; Alloc clip_alloc; Alloc clip_bic_alloc; Alloc clip_stack_alloc; Alloc clip_bbox_alloc; + Alloc draw_bbox_alloc; + Alloc drawinfo_alloc; uint n_trans; uint n_path; uint n_clip; @@ -51,6 +53,8 @@ struct Config uint linewidth_offset; uint pathtag_offset; uint pathseg_offset; + uint drawtag_offset; + uint drawdata_offset; }; struct ConfigBuf diff --git a/piet-gpu/shader/gen/transform_reduce.spv b/piet-gpu/shader/gen/transform_reduce.spv index e74cb8d5a5cc7b2bdec5bdf1b18a5233d1d2830e..6aa6b941f2f2323acd46ccaf083aad3cc57cf7e0 100644 GIT binary patch delta 374 zcmdmB-{QC-j75^2VIBhm0~Zh%B$i~vCne=q#3$zD?Mkre>SrW7TXBgrzb zF+k)5p>mmdY55S13_v+nu&F{oxxDz2qQtynxR@|l3}hEVod{SgIVZCKBnB~86ew0Q z*_BnCQEYN7t30FlUj75}|oWxlWSR}8AT?~WR+(WoxGD(T38II3Z$<%H9bB*Ev-1U tgkiHhTQJM!LtH1AnI#$KO@7EHJb3}1!Q>l!GL!%CSuhH3Hs$vh1ORkzCzt>L diff --git a/piet-gpu/shader/gen/transform_root.dxil b/piet-gpu/shader/gen/transform_root.dxil index 5b4f05930600267411a9865e166d35bb5c6578ff..a33ff7f18731036eecfff1788ec93557c0699844 100644 GIT binary patch delta 984 zcmZA0ZERCj7zglk+S~57-aFc@VBg5@x|MCZmpf)!WC2Ut)RA>^(E%l6db@6>0)prV zQES%Tu5&NUHQo+7$xMlwxCN67TM$i5+On65{m^JJtroK-V=Rj=gor8Mytkj!^X+&3 z&yzgooSdAoVAR-MRvY-=g1igYG(Ba{emMSv^3F`=y6Mrrk2)4oqjuLpC-npXG?0L- z2mrx=FIVs#d-#2;E&gjY2Eh08UzYs|k#71ACmWN|5M!Zyr%FF|rBQwb$h=WVye{=K z8orBdmUj=IQX>(hkg_Hf9hX4Kl1bACKA9{>c15_-|-4ept*WXX$8 zg~H4D?KD9?!6B(|`b(ecDcWRGM>+VK~FRa7&`;P50U;2B)WF$TguYH{h zUCU2>*Co5KxBquGp1Mlf5aW(>=2O&_VXchss7k5H0 zJBRBaV3%!FB^m47?90RoesFUrdkEo} zKvUch1L`BiA=Po7usJ1gY9yp8rOg?EccP()K-iKKxP2m&?GeUlSuOR>gjBse*IG6O z9vuz%oLceYoKgC)^(40LIjl*o=-a}RT?0f_Fm2iIARe@e1_P5y)OW$M>T$>Ty0iGY z=ND~ig*1gHWr)v7ta_4?s>=FexyKI9+4=8FoP+hSA7+@6Jw16XqW1oK;U>LT+Xo=%ygj?w%TCqDr(h^)C5WAn8QXRCcf~lzVqeh`F?+S z{^UvPQ+kcPr`6V95h;9f;&(^yt?c)6N!J_%0Hi+A94L5n{ZO~=&I4CYU%SKC@9H~o z+1}%DItu|{0Sdm60U#NObxNGrDXzEL=2xo;0OGSB7uXQpew? zl%atU4M-jVhDpdlcs;@dn`3>@oB&$kSwH z?Jo?5b_O8&bQtP8mFLyWE9bS$HMq;#p`c7{fTIIG9q%Tc@Fo5dsf83DCk2?{`-=>a z<3A|+!nfi+G1!of?x{a6pkDUO68UMU_^vSLulOTUS^mi8!oJVtnt58TejW@GYzPvT zfzGcUYd>oTMm5XTa&CD|I~JzLLVMl--KOP52NK2X0%7gYSN~ZIXIMcofsc@Zux8*g z)B0e!9@ zEuqm44_!4Fv+ir7H_bAie^iBggVv14oe_KY$TiPT+Sm=#?$D?L@jB^@X92A$HEb=H zNGER*q9z7XNHZZ~e;zOYA36*J94n-+AKF?HU_`kH#K)R85%U6cD;Ff3qa;A(brEvv zG{d`8_09k}{UgqzgRiC9tk87vL$dCc#8X*`+rK2Ie~|e4RzAH=*5%9nf&EgNB&TyY zOWM4X5-;ZXWmRhTTzd;43m)V)s$<^?HO+?;fX1=%$uJ&3%of~SqT6}+#e~kJK8`> 2) + path_ix * 6; + uint bbox_out_ix = (conf.path_bbox_alloc.offset >> 2) + path_ix * 6; // Write bboxes to paths; do atomic min/max if partial Monoid row = monoid_identity(); if (gl_LocalInvocationID.x > 0) { diff --git a/piet-gpu/shader/setup.h b/piet-gpu/shader/setup.h index 0dccecb..ec17188 100644 --- a/piet-gpu/shader/setup.h +++ b/piet-gpu/shader/setup.h @@ -42,7 +42,7 @@ struct Config { // new element pipeline stuff follows // Bounding boxes of paths, stored as int (so atomics work) - Alloc bbox_alloc; + Alloc path_bbox_alloc; // Monoid for draw objects Alloc drawmonoid_alloc; @@ -54,6 +54,10 @@ struct Config { Alloc clip_stack_alloc; // Clip processing results (path_ix + bbox) Alloc clip_bbox_alloc; + // Bounding box per draw object + Alloc draw_bbox_alloc; + // Info computed in draw stage, per draw object + Alloc drawinfo_alloc; // Number of transforms in scene // This is probably not needed. @@ -63,6 +67,10 @@ struct Config { uint n_path; // Total number of BeginClip and EndClip draw objects. uint n_clip; + + // Note: one of these offsets *could* be hardcoded to zero (as was the + // original element stream), but for now retain flexibility. + // Offset (in bytes) of transform stream in scene buffer uint trans_offset; // Offset (in bytes) of linewidth stream in scene @@ -71,6 +79,10 @@ struct Config { uint pathtag_offset; // Offset (in bytes) of path segment stream in scene uint pathseg_offset; + // Offset (in bytes) of draw object tag stream in scene; see drawtag.h + uint drawtag_offset; + // Offset (in bytes) of draw payload stream in scene + uint drawdata_offset; }; #endif diff --git a/piet-gpu/shader/tile_alloc.comp b/piet-gpu/shader/tile_alloc.comp index 024f499..0fec2ce 100644 --- a/piet-gpu/shader/tile_alloc.comp +++ b/piet-gpu/shader/tile_alloc.comp @@ -17,7 +17,11 @@ layout(set = 0, binding = 1) readonly buffer ConfigBuf { Config conf; }; -#include "annotated.h" +layout(binding = 2) readonly buffer SceneBuf { + uint[] scene; +}; + +#include "drawtag.h" #include "tile.h" // scale factors useful for converting coordinates to tiles @@ -27,31 +31,39 @@ layout(set = 0, binding = 1) readonly buffer ConfigBuf { shared uint sh_tile_count[TILE_ALLOC_WG]; shared MallocResult sh_tile_alloc; +vec4 load_draw_bbox(uint draw_ix) { + uint base = (conf.draw_bbox_alloc.offset >> 2) + 4 * draw_ix; + float x0 = uintBitsToFloat(memory[base]); + float y0 = uintBitsToFloat(memory[base + 1]); + float x1 = uintBitsToFloat(memory[base + 2]); + float y1 = uintBitsToFloat(memory[base + 3]); + vec4 bbox = vec4(x0, y0, x1, y1); + return bbox; +} + void main() { uint th_ix = gl_LocalInvocationID.x; uint element_ix = gl_GlobalInvocationID.x; + // At the moment, element_ix == path_ix. The clip-intersected bounding boxes + // for elements (draw objects) are computed in the binning stage, but at some + // point we'll probably want to break that correspondence. Tiles should be + // allocated for paths, not draw objs. EndClip doesn't need an allocation. PathRef path_ref = PathRef(conf.tile_alloc.offset + element_ix * Path_size); - AnnotatedRef ref = AnnotatedRef(conf.anno_alloc.offset + element_ix * Annotated_size); + uint drawtag_base = conf.drawtag_offset >> 2; - uint tag = Annotated_Nop; + uint drawtag = Drawtag_Nop; if (element_ix < conf.n_elements) { - tag = Annotated_tag(conf.anno_alloc, ref).tag; + drawtag = scene[drawtag_base + element_ix]; } int x0 = 0, y0 = 0, x1 = 0, y1 = 0; - switch (tag) { - case Annotated_Color: - case Annotated_LinGradient: - case Annotated_Image: - case Annotated_BeginClip: - case Annotated_EndClip: - // Note: we take advantage of the fact that fills, strokes, and - // clips have compatible layout. - AnnoEndClip clip = Annotated_EndClip_read(conf.anno_alloc, ref); - x0 = int(floor(clip.bbox.x * SX)); - y0 = int(floor(clip.bbox.y * SY)); - x1 = int(ceil(clip.bbox.z * SX)); - y1 = int(ceil(clip.bbox.w * SY)); - break; + // Allocate an empty path for EndClip; at some point we'll change + // this to be per path rather than per draw object. + if (drawtag != Drawtag_Nop && drawtag != Drawtag_EndClip) { + vec4 bbox = load_draw_bbox(element_ix); + x0 = int(floor(bbox.x * SX)); + y0 = int(floor(bbox.y * SY)); + x1 = int(ceil(bbox.z * SX)); + y1 = int(ceil(bbox.w * SY)); } x0 = clamp(x0, 0, int(conf.width_in_tiles)); y0 = clamp(y0, 0, int(conf.height_in_tiles)); @@ -61,11 +73,6 @@ void main() { Path path; path.bbox = uvec4(x0, y0, x1, y1); uint tile_count = (x1 - x0) * (y1 - y0); - if (tag == Annotated_EndClip) { - // Don't actually allocate tiles for an end clip, but we do want - // the path structure (especially bbox) allocated for it. - tile_count = 0; - } sh_tile_count[th_ix] = tile_count; uint total_tile_count = tile_count; diff --git a/piet-gpu/src/encoder.rs b/piet-gpu/src/encoder.rs index c24615e..c25c260 100644 --- a/piet-gpu/src/encoder.rs +++ b/piet-gpu/src/encoder.rs @@ -30,7 +30,8 @@ pub struct Encoder { tag_stream: Vec, pathseg_stream: Vec, linewidth_stream: Vec, - drawobj_stream: Vec, + drawtag_stream: Vec, + drawdata_stream: Vec, n_path: u32, n_pathseg: u32, n_clip: u32, @@ -43,53 +44,54 @@ pub struct Encoder { pub struct GlyphEncoder { tag_stream: Vec, pathseg_stream: Vec, - drawobj_stream: Vec, + drawtag_stream: Vec, + drawdata_stream: Vec, n_path: u32, n_pathseg: u32, } -// Currently same as Element, but may change - should become packed. -const DRAWOBJ_SIZE: usize = 36; const TRANSFORM_SIZE: usize = 24; const LINEWIDTH_SIZE: usize = 4; const PATHSEG_SIZE: usize = 52; -const BBOX_SIZE: usize = 24; -const DRAWMONOID_SIZE: usize = 8; +const PATH_BBOX_SIZE: usize = 24; +const DRAWMONOID_SIZE: usize = 16; +const DRAW_BBOX_SIZE: usize = 16; +const DRAWTAG_SIZE: usize = 4; const ANNOTATED_SIZE: usize = 40; -// These are bytemuck versions of elements currently defined in the -// Element struct in piet-gpu-types; that's pretty much going away. - -const ELEMENT_FILLCOLOR: u32 = 4; -const ELEMENT_FILLLINGRADIENT: u32 = 5; -const ELEMENT_BEGINCLIP: u32 = 9; -const ELEMENT_ENDCLIP: u32 = 10; +// Tags for draw objects. See shader/drawtag.h for the authoritative source. +const DRAWTAG_FILLCOLOR: u32 = 0x44; +const DRAWTAG_FILLLINGRADIENT: u32 = 0x114; +const DRAWTAG_BEGINCLIP: u32 = 0x05; +const DRAWTAG_ENDCLIP: u32 = 0x25; #[repr(C)] #[derive(Clone, Copy, Debug, Default, Zeroable, Pod)] pub struct FillColor { - tag: u32, rgba_color: u32, - padding: [u32; 7], } #[repr(C)] #[derive(Clone, Copy, Debug, Default, Zeroable, Pod)] pub struct FillLinGradient { - tag: u32, index: u32, p0: [f32; 2], p1: [f32; 2], - padding: [u32; 3], +} + +#[allow(unused)] +#[repr(C)] +#[derive(Clone, Copy, Debug, Default, Zeroable, Pod)] +pub struct FillImage { + index: u32, + // [i16; 2] + offset: u32, } #[repr(C)] #[derive(Clone, Copy, Debug, Default, Zeroable, Pod)] pub struct Clip { - tag: u32, - bbox: [f32; 4], blend: u32, - padding: [u32; 3], } impl Encoder { @@ -99,7 +101,8 @@ impl Encoder { tag_stream: Vec::new(), pathseg_stream: Vec::new(), linewidth_stream: vec![-1.0], - drawobj_stream: Vec::new(), + drawtag_stream: Vec::new(), + drawdata_stream: Vec::new(), n_path: 0, n_pathseg: 0, n_clip: 0, @@ -130,51 +133,42 @@ impl Encoder { /// /// This should be encoded after a path. pub fn fill_color(&mut self, rgba_color: u32) { + self.drawtag_stream.push(DRAWTAG_FILLCOLOR); let element = FillColor { - tag: ELEMENT_FILLCOLOR, rgba_color, - ..Default::default() }; - self.drawobj_stream.extend(bytemuck::bytes_of(&element)); + self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } /// Encode a fill linear gradient draw object. /// /// This should be encoded after a path. pub fn fill_lin_gradient(&mut self, index: u32, p0: [f32; 2], p1: [f32; 2]) { + self.drawtag_stream.push(DRAWTAG_FILLLINGRADIENT); let element = FillLinGradient { - tag: ELEMENT_FILLLINGRADIENT, index, p0, p1, - ..Default::default() }; - self.drawobj_stream.extend(bytemuck::bytes_of(&element)); + self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } - /// Start a clip and return a save point to be filled in later. - pub fn begin_clip(&mut self, blend: Option) -> usize { - let saved = self.drawobj_stream.len(); + /// Start a clip. + pub fn begin_clip(&mut self, blend: Option) { + self.drawtag_stream.push(DRAWTAG_BEGINCLIP); let element = Clip { - tag: ELEMENT_BEGINCLIP, blend: blend.unwrap_or(Blend::default()).pack(), - ..Default::default() }; - self.drawobj_stream.extend(bytemuck::bytes_of(&element)); + self.drawdata_stream.extend(bytemuck::bytes_of(&element)); self.n_clip += 1; - saved } - pub fn end_clip(&mut self, bbox: [f32; 4], blend: Option, save_point: usize) { + pub fn end_clip(&mut self, blend: Option) { + self.drawtag_stream.push(DRAWTAG_ENDCLIP); let element = Clip { - tag: ELEMENT_ENDCLIP, - bbox, blend: blend.unwrap_or(Blend::default()).pack(), - ..Default::default() }; - self.drawobj_stream[save_point + 4..save_point + 20] - .clone_from_slice(bytemuck::bytes_of(&bbox)); - self.drawobj_stream.extend(bytemuck::bytes_of(&element)); + self.drawdata_stream.extend(bytemuck::bytes_of(&element)); // This is a dummy path, and will go away with the new clip impl. self.tag_stream.push(0x10); self.n_path += 1; @@ -187,9 +181,11 @@ impl Encoder { /// beginning of free memory. pub fn stage_config(&self) -> (Config, usize) { // Layout of scene buffer + let drawtag_offset = 0; let n_drawobj = self.n_drawobj(); let n_drawobj_padded = align_up(n_drawobj, DRAW_PART_SIZE as usize); - let trans_offset = n_drawobj_padded * DRAWOBJ_SIZE; + let drawdata_offset = drawtag_offset + n_drawobj_padded * DRAWTAG_SIZE; + let trans_offset = drawdata_offset + self.drawdata_stream.len(); let n_trans = self.transform_stream.len(); let n_trans_padded = align_up(n_trans, TRANSFORM_PART_SIZE as usize); let linewidth_offset = trans_offset + n_trans_padded * TRANSFORM_SIZE; @@ -205,9 +201,9 @@ impl Encoder { alloc += trans_alloc + n_trans_padded * TRANSFORM_SIZE; let pathseg_alloc = alloc; alloc += pathseg_alloc + self.n_pathseg as usize * PATHSEG_SIZE; - let bbox_alloc = alloc; + let path_bbox_alloc = alloc; let n_path = self.n_path as usize; - alloc += bbox_alloc + n_path * BBOX_SIZE; + alloc += path_bbox_alloc + n_path * PATH_BBOX_SIZE; let drawmonoid_alloc = alloc; alloc += n_drawobj_padded * DRAWMONOID_SIZE; let anno_alloc = alloc; @@ -226,6 +222,12 @@ impl Encoder { let clip_bbox_alloc = alloc; const CLIP_BBOX_SIZE: usize = 16; alloc += align_up(n_clip as usize, CLIP_PART_SIZE as usize) * CLIP_BBOX_SIZE; + let draw_bbox_alloc = alloc; + alloc += n_drawobj * DRAW_BBOX_SIZE; + let drawinfo_alloc = alloc; + // TODO: not optimized; it can be accumulated during encoding or summed from drawtags + const MAX_DRAWINFO_SIZE: usize = 16; + alloc += n_drawobj * MAX_DRAWINFO_SIZE; let config = Config { n_elements: n_drawobj as u32, @@ -233,12 +235,14 @@ impl Encoder { pathseg_alloc: pathseg_alloc as u32, anno_alloc: anno_alloc as u32, trans_alloc: trans_alloc as u32, - bbox_alloc: bbox_alloc as u32, + path_bbox_alloc: path_bbox_alloc as u32, drawmonoid_alloc: drawmonoid_alloc as u32, clip_alloc: clip_alloc as u32, clip_bic_alloc: clip_bic_alloc as u32, clip_stack_alloc: clip_stack_alloc as u32, clip_bbox_alloc: clip_bbox_alloc as u32, + draw_bbox_alloc: draw_bbox_alloc as u32, + drawinfo_alloc: drawinfo_alloc as u32, n_trans: n_trans as u32, n_path: self.n_path, n_clip: self.n_clip, @@ -246,15 +250,18 @@ impl Encoder { linewidth_offset: linewidth_offset as u32, pathtag_offset: pathtag_offset as u32, pathseg_offset: pathseg_offset as u32, + drawtag_offset: drawtag_offset as u32, + drawdata_offset: drawdata_offset as u32, ..Default::default() }; (config, alloc) } pub fn write_scene(&self, buf: &mut BufWrite) { - buf.extend_slice(&self.drawobj_stream); - let n_drawobj = self.drawobj_stream.len() / DRAWOBJ_SIZE; - buf.fill_zero(padding(n_drawobj, DRAW_PART_SIZE as usize) * DRAWOBJ_SIZE); + buf.extend_slice(&self.drawtag_stream); + let n_drawobj = self.drawtag_stream.len(); + buf.fill_zero(padding(n_drawobj, DRAW_PART_SIZE as usize) * DRAWTAG_SIZE); + buf.extend_slice(&self.drawdata_stream); buf.extend_slice(&self.transform_stream); let n_trans = self.transform_stream.len(); buf.fill_zero(padding(n_trans, TRANSFORM_PART_SIZE as usize) * TRANSFORM_SIZE); @@ -265,9 +272,9 @@ impl Encoder { buf.extend_slice(&self.pathseg_stream); } - /// The number of elements in the draw object stream. + /// The number of draw objects in the draw object stream. pub(crate) fn n_drawobj(&self) -> usize { - self.drawobj_stream.len() / DRAWOBJ_SIZE + self.drawtag_stream.len() } /// The number of paths. @@ -296,7 +303,8 @@ impl Encoder { pub(crate) fn encode_glyph(&mut self, glyph: &GlyphEncoder) { self.tag_stream.extend(&glyph.tag_stream); self.pathseg_stream.extend(&glyph.pathseg_stream); - self.drawobj_stream.extend(&glyph.drawobj_stream); + self.drawtag_stream.extend(&glyph.drawtag_stream); + self.drawdata_stream.extend(&glyph.drawdata_stream); self.n_path += glyph.n_path; self.n_pathseg += glyph.n_pathseg; } @@ -325,15 +333,14 @@ impl GlyphEncoder { /// /// This should be encoded after a path. pub(crate) fn fill_color(&mut self, rgba_color: u32) { + self.drawtag_stream.push(DRAWTAG_FILLCOLOR); let element = FillColor { - tag: ELEMENT_FILLCOLOR, rgba_color, - ..Default::default() }; - self.drawobj_stream.extend(bytemuck::bytes_of(&element)); + self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } pub(crate) fn is_color(&self) -> bool { - !self.drawobj_stream.is_empty() + !self.drawtag_stream.is_empty() } } diff --git a/piet-gpu/src/lib.rs b/piet-gpu/src/lib.rs index bd26d45..5c5c78a 100644 --- a/piet-gpu/src/lib.rs +++ b/piet-gpu/src/lib.rs @@ -92,7 +92,7 @@ pub struct Renderer { clip_binding: ClipBinding, tile_pipeline: Pipeline, - tile_ds: DescriptorSet, + tile_ds: Vec, path_pipeline: Pipeline, path_ds: DescriptorSet, @@ -105,7 +105,7 @@ pub struct Renderer { bin_ds: DescriptorSet, coarse_pipeline: Pipeline, - coarse_ds: DescriptorSet, + coarse_ds: Vec, k4_pipeline: Pipeline, k4_ds: DescriptorSet, @@ -176,10 +176,8 @@ impl Renderer { }; let image_dev = session.create_image2d(width as u32, height as u32, image_format)?; - // Note: this must be updated when the config struct size changes. const CONFIG_BUFFER_SIZE: u64 = std::mem::size_of::() as u64; let config_buf = session.create_buffer(CONFIG_BUFFER_SIZE, dev).unwrap(); - // TODO: separate staging buffer (if needed) let config_bufs = (0..n_bufs) .map(|_| { session @@ -197,7 +195,7 @@ impl Renderer { let element_stage = ElementStage::new(session, &element_code); let element_bindings = scene_bufs .iter() - .map(|scene_buf| { + .map(|scene_buf| element_stage.bind( session, &element_code, @@ -205,7 +203,7 @@ impl Renderer { scene_buf, &memory_buf_dev, ) - }) + ) .collect(); let clip_code = ClipCode::new(session); @@ -214,8 +212,15 @@ impl Renderer { let tile_alloc_code = include_shader!(session, "../shader/gen/tile_alloc"); let tile_pipeline = session .create_compute_pipeline(tile_alloc_code, &[BindType::Buffer, BindType::BufReadOnly])?; - let tile_ds = session - .create_simple_descriptor_set(&tile_pipeline, &[&memory_buf_dev, &config_buf])?; + let tile_ds = scene_bufs + .iter() + .map(|scene_buf| { + session.create_simple_descriptor_set( + &tile_pipeline, + &[&memory_buf_dev, &config_buf, scene_buf], + ) + }) + .collect::, _>>()?; let path_alloc_code = include_shader!(session, "../shader/gen/path_coarse"); let path_pipeline = session @@ -243,10 +248,23 @@ impl Renderer { session.create_simple_descriptor_set(&bin_pipeline, &[&memory_buf_dev, &config_buf])?; let coarse_code = include_shader!(session, "../shader/gen/coarse"); - let coarse_pipeline = session - .create_compute_pipeline(coarse_code, &[BindType::Buffer, BindType::BufReadOnly])?; - let coarse_ds = session - .create_simple_descriptor_set(&coarse_pipeline, &[&memory_buf_dev, &config_buf])?; + let coarse_pipeline = session.create_compute_pipeline( + coarse_code, + &[ + BindType::Buffer, + BindType::BufReadOnly, + BindType::BufReadOnly, + ], + )?; + let coarse_ds = scene_bufs + .iter() + .map(|scene_buf| { + session.create_simple_descriptor_set( + &coarse_pipeline, + &[&memory_buf_dev, &config_buf, scene_buf], + ) + }) + .collect::, _>>()?; let bg_image = Self::make_test_bg_image(&session); @@ -430,7 +448,7 @@ impl Renderer { cmd_buf.begin_debug_label("Tile allocation"); cmd_buf.dispatch( &self.tile_pipeline, - &self.tile_ds, + &self.tile_ds[buf_ix], (((self.n_paths + 255) / 256) as u32, 1, 1), (256, 1, 1), ); @@ -462,7 +480,7 @@ impl Renderer { cmd_buf.begin_debug_label("Coarse raster"); cmd_buf.dispatch( &self.coarse_pipeline, - &self.coarse_ds, + &self.coarse_ds[buf_ix], ( (self.width as u32 + 255) / 256, (self.height as u32 + 255) / 256, diff --git a/piet-gpu/src/render_ctx.rs b/piet-gpu/src/render_ctx.rs index 1fe1ce9..e9a24fa 100644 --- a/piet-gpu/src/render_ctx.rs +++ b/piet-gpu/src/render_ctx.rs @@ -64,9 +64,6 @@ struct State { } struct ClipElement { - /// Byte offset of BeginClip element in element vec, for bbox fixup. - save_point: usize, - bbox: Option, blend: Option, } @@ -199,8 +196,6 @@ impl RenderContext for PietGpuRenderContext { fn stroke(&mut self, shape: impl Shape, brush: &impl IntoBrush, width: f64) { self.encode_linewidth(width.abs() as f32); let brush = brush.make_brush(self, || shape.bounding_box()).into_owned(); - // Note: the bbox contribution of stroke becomes more complicated with miter joins. - self.accumulate_bbox(|| shape.bounding_box() + Insets::uniform(width * 0.5)); let path = shape.path_elements(TOLERANCE); self.encode_path(path, false); self.encode_brush(&brush); @@ -217,9 +212,6 @@ impl RenderContext for PietGpuRenderContext { fn fill(&mut self, shape: impl Shape, brush: &impl IntoBrush) { let brush = brush.make_brush(self, || shape.bounding_box()).into_owned(); - // Note: we might get a good speedup from using an approximate bounding box. - // Perhaps that should be added to kurbo. - self.accumulate_bbox(|| shape.bounding_box()); let path = shape.path_elements(TOLERANCE); self.encode_linewidth(-1.0); self.encode_path(path, true); @@ -232,13 +224,11 @@ impl RenderContext for PietGpuRenderContext { self.encode_linewidth(-1.0); let path = shape.path_elements(TOLERANCE); self.encode_path(path, true); - let save_point = self.new_encoder.begin_clip(None); + self.new_encoder.begin_clip(None); if self.clip_stack.len() >= MAX_BLEND_STACK { panic!("Maximum clip/blend stack size {} exceeded", MAX_BLEND_STACK); } self.clip_stack.push(ClipElement { - bbox: None, - save_point, blend: None, }); if let Some(tos) = self.state_stack.last_mut() { @@ -340,16 +330,13 @@ impl PietGpuRenderContext { self.encode_linewidth(-1.0); let path = shape.path_elements(TOLERANCE); self.encode_path(path, true); - let save_point = self.new_encoder.begin_clip(Some(blend)); + self.new_encoder.begin_clip(Some(blend)); if self.clip_stack.len() >= MAX_BLEND_STACK { panic!("Maximum clip/blend stack size {} exceeded", MAX_BLEND_STACK); } self.clip_stack.push(ClipElement { - bbox: None, - save_point, blend: Some(blend), }); - self.accumulate_bbox(|| shape.bounding_box()); if let Some(tos) = self.state_stack.last_mut() { tos.n_clip += 1; } @@ -406,37 +393,7 @@ impl PietGpuRenderContext { fn pop_clip(&mut self) { let tos = self.clip_stack.pop().unwrap(); - let bbox = tos.bbox.unwrap_or_default(); - let bbox_f32_4 = rect_to_f32_4(bbox); - self.new_encoder.end_clip(bbox_f32_4, tos.blend, tos.save_point); - if let Some(bbox) = tos.bbox { - self.union_bbox(bbox); - } - } - - /// Accumulate a bbox. - /// - /// The bbox is given lazily as a closure, relative to the current transform. - /// It's lazy because we don't need to compute it unless we're inside a clip. - fn accumulate_bbox(&mut self, f: impl FnOnce() -> Rect) { - if !self.clip_stack.is_empty() { - let bbox = f(); - let bbox = self.cur_transform.transform_rect_bbox(bbox); - self.union_bbox(bbox); - } - } - - /// Accumulate an absolute bbox. - /// - /// The bbox is given already transformed into surface coordinates. - fn union_bbox(&mut self, bbox: Rect) { - if let Some(tos) = self.clip_stack.last_mut() { - tos.bbox = if let Some(old_bbox) = tos.bbox { - Some(old_bbox.union(bbox)) - } else { - Some(bbox) - }; - } + self.new_encoder.end_clip(tos.blend); } pub(crate) fn encode_glyph(&mut self, glyph: &GlyphEncoder) { diff --git a/piet-gpu/src/stages.rs b/piet-gpu/src/stages.rs index e155c50..52b8bf1 100644 --- a/piet-gpu/src/stages.rs +++ b/piet-gpu/src/stages.rs @@ -47,12 +47,14 @@ pub struct Config { pub pathseg_alloc: u32, pub anno_alloc: u32, pub trans_alloc: u32, - pub bbox_alloc: u32, + pub path_bbox_alloc: u32, pub drawmonoid_alloc: u32, pub clip_alloc: u32, pub clip_bic_alloc: u32, pub clip_stack_alloc: u32, pub clip_bbox_alloc: u32, + pub draw_bbox_alloc: u32, + pub drawinfo_alloc: u32, pub n_trans: u32, pub n_path: u32, pub n_clip: u32, @@ -60,6 +62,8 @@ pub struct Config { pub linewidth_offset: u32, pub pathtag_offset: u32, pub pathseg_offset: u32, + pub drawtag_offset: u32, + pub drawdata_offset: u32, } // The "element" stage combines a number of stages for parts of the pipeline. diff --git a/piet-gpu/src/stages/draw.rs b/piet-gpu/src/stages/draw.rs index 5328a84..21312a4 100644 --- a/piet-gpu/src/stages/draw.rs +++ b/piet-gpu/src/stages/draw.rs @@ -28,6 +28,8 @@ use piet_gpu_hal::{ pub struct DrawMonoid { pub path_ix: u32, pub clip_ix: u32, + pub scene_offset: u32, + pub info_offset: u32, } const DRAW_WG: u64 = 256; @@ -93,7 +95,7 @@ impl DrawStage { pub unsafe fn new(session: &Session, code: &DrawCode) -> DrawStage { // We're limited to DRAW_PART_SIZE^2 // Also note: size here allows padding - let root_buf_size = DRAW_PART_SIZE * 8; + let root_buf_size = DRAW_PART_SIZE * 16; let root_buf = session .create_buffer(root_buf_size, BufferUsage::STORAGE) .unwrap(); diff --git a/tests/src/clip.rs b/tests/src/clip.rs index cfd8a35..4a38949 100644 --- a/tests/src/clip.rs +++ b/tests/src/clip.rs @@ -163,8 +163,7 @@ impl ClipData { let clip_bbox_alloc = clip_stack_alloc + 20 * n_clip; stages::Config { clip_alloc: clip_alloc as u32, - // TODO: this wants to be renamed to path_bbox_alloc - bbox_alloc: path_bbox_alloc as u32, + path_bbox_alloc: path_bbox_alloc as u32, drawmonoid_alloc: drawmonoid_alloc as u32, clip_bic_alloc: clip_bic_alloc as u32, clip_stack_alloc: clip_stack_alloc as u32, @@ -194,7 +193,7 @@ impl ClipData { let clip_range = clip_bbox_start..(clip_bbox_start + n_clip * 16); let clip_result = bytemuck::cast_slice::(&buf[clip_range]); let draw_start = 8 + n_clip * 4 + n_path * 24; - let draw_range = draw_start..(draw_start + n_clip * 8); + let draw_range = draw_start..(draw_start + n_clip * 16); let draw_result = bytemuck::cast_slice::(&buf[draw_range]); let mut bbox_stack = Vec::new(); let mut parent_stack = Vec::new(); diff --git a/tests/src/draw.rs b/tests/src/draw.rs index 7b264d4..692f943 100644 --- a/tests/src/draw.rs +++ b/tests/src/draw.rs @@ -17,20 +17,23 @@ //! Tests for the piet-gpu draw object stage. use piet_gpu_hal::{BufWrite, BufferUsage}; -use rand::Rng; +use rand::{Rng, seq::SliceRandom}; use crate::{Config, Runner, TestResult}; use piet_gpu::stages::{self, DrawCode, DrawMonoid, DrawStage}; -const ELEMENT_SIZE: usize = 36; +const DRAWTAG_SIZE: usize = 4; const ANNOTATED_SIZE: usize = 40; -const ELEMENT_FILLCOLOR: u32 = 4; -const ELEMENT_FILLLINGRADIENT: u32 = 5; -const ELEMENT_FILLIMAGE: u32 = 6; -const ELEMENT_BEGINCLIP: u32 = 9; -const ELEMENT_ENDCLIP: u32 = 10; +// Tags for draw objects. See shader/drawtag.h for the authoritative source. +const DRAWTAG_FILLCOLOR: u32 = 4; +const DRAWTAG_FILLLINGRADIENT: u32 = 20; +const DRAWTAG_FILLIMAGE: u32 = 8; +const DRAWTAG_BEGINCLIP: u32 = 5; +const DRAWTAG_ENDCLIP: u32 = 37; + +const TAGS: &[u32] = &[DRAWTAG_FILLCOLOR, DRAWTAG_FILLLINGRADIENT, DRAWTAG_FILLIMAGE, DRAWTAG_BEGINCLIP, DRAWTAG_ENDCLIP]; struct DrawTestData { tags: Vec, @@ -47,7 +50,7 @@ pub unsafe fn draw_test(runner: &mut Runner, config: &Config) -> TestResult { .session .create_buffer_init(std::slice::from_ref(&stage_config), BufferUsage::STORAGE) .unwrap(); - let scene_size = n_tag * ELEMENT_SIZE as u64; + let scene_size = n_tag * DRAWTAG_SIZE as u64; let scene_buf = runner .session .create_buffer_with(scene_size, |b| data.fill_scene(b), BufferUsage::STORAGE) @@ -92,7 +95,7 @@ pub unsafe fn draw_test(runner: &mut Runner, config: &Config) -> TestResult { impl DrawTestData { fn new(n: u64) -> DrawTestData { let mut rng = rand::thread_rng(); - let tags = (0..n).map(|_| rng.gen_range(0, 12)).collect(); + let tags = (0..n).map(|_| *TAGS.choose(&mut rng).unwrap()).collect(); DrawTestData { tags } } @@ -101,13 +104,14 @@ impl DrawTestData { // Layout of memory let drawmonoid_alloc = 0; - let anno_alloc = drawmonoid_alloc + 8 * n_tags; + let anno_alloc = drawmonoid_alloc + 16 * n_tags; let clip_alloc = anno_alloc + ANNOTATED_SIZE * n_tags; let stage_config = stages::Config { n_elements: n_tags as u32, anno_alloc: anno_alloc as u32, drawmonoid_alloc: drawmonoid_alloc as u32, clip_alloc: clip_alloc as u32, + drawtag_offset: 0, ..Default::default() }; stage_config @@ -116,37 +120,35 @@ impl DrawTestData { fn memory_size(&self) -> u64 { // Note: this overallocates the clip buf a bit - only needed for the // total number of begin_clip and end_clip tags. - (8 + self.tags.len() * (8 + 4 + ANNOTATED_SIZE)) as u64 + (8 + self.tags.len() * (16 + 4 + ANNOTATED_SIZE)) as u64 } fn fill_scene(&self, buf: &mut BufWrite) { - let mut element = [0u32; ELEMENT_SIZE / 4]; - for tag in &self.tags { - element[0] = *tag; - buf.push(element); - } + buf.extend_slice(&self.tags); } fn verify(&self, buf: &[u8]) -> Option { - let size = self.tags.len() * 8; + let size = self.tags.len() * 16; let actual = bytemuck::cast_slice::(&buf[8..8 + size]); let mut expected = DrawMonoid::default(); for (i, (tag, actual)) in self.tags.iter().zip(actual).enumerate() { // Verify exclusive prefix sum. let (path_ix, clip_ix) = Self::reduce_tag(*tag); if *actual != expected { + println!("{:?} {:?}", actual, expected); return Some(format!("draw mismatch at {}", i)); } expected.path_ix += path_ix; expected.clip_ix += clip_ix; + expected.scene_offset += tag & 28; } None } fn reduce_tag(tag: u32) -> (u32, u32) { match tag { - ELEMENT_FILLCOLOR | ELEMENT_FILLLINGRADIENT | ELEMENT_FILLIMAGE => (1, 0), - ELEMENT_BEGINCLIP | ELEMENT_ENDCLIP => (1, 1), + DRAWTAG_FILLCOLOR | DRAWTAG_FILLLINGRADIENT | DRAWTAG_FILLIMAGE => (1, 0), + DRAWTAG_BEGINCLIP | DRAWTAG_ENDCLIP => (1, 1), // TODO: ENDCLIP will become (0, 1) _ => (0, 0), } diff --git a/tests/src/path.rs b/tests/src/path.rs index 6f1f61a..bf72c68 100644 --- a/tests/src/path.rs +++ b/tests/src/path.rs @@ -207,11 +207,11 @@ impl PathData { // Layout of memory let trans_alloc = 0; let pathseg_alloc = trans_alloc + n_trans * 24; - let bbox_alloc = pathseg_alloc + self.n_pathseg * PATHSEG_SIZE; + let path_bbox_alloc = pathseg_alloc + self.n_pathseg * PATHSEG_SIZE; let stage_config = stages::Config { pathseg_alloc, trans_alloc, - bbox_alloc, + path_bbox_alloc, n_trans, n_path: self.n_path, pathtag_offset, From 7134be23295727c5debc4a982c40aafb58a8a3a5 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Wed, 16 Mar 2022 14:40:58 -0700 Subject: [PATCH 2/3] Fix missing blend/clip logic We always do BeginClip/EndClip if it's a solid tile and the blend mode is not default. Also fix missing entry in pipeline layout (affects Vulkan but not Metal). --- piet-gpu/shader/build.ninja | 2 +- piet-gpu/shader/coarse.comp | 13 ++- piet-gpu/shader/gen/backdrop.dxil | Bin 4584 -> 4576 bytes piet-gpu/shader/gen/backdrop_lg.dxil | Bin 4584 -> 4580 bytes piet-gpu/shader/gen/bbox_clear.dxil | Bin 3168 -> 3160 bytes piet-gpu/shader/gen/binning.dxil | Bin 6336 -> 6336 bytes piet-gpu/shader/gen/clip_leaf.dxil | Bin 7232 -> 7228 bytes piet-gpu/shader/gen/clip_reduce.dxil | Bin 4632 -> 4624 bytes piet-gpu/shader/gen/coarse.dxil | Bin 10460 -> 10568 bytes piet-gpu/shader/gen/coarse.hlsl | 129 ++++++++++++---------- piet-gpu/shader/gen/coarse.msl | 109 +++++++++--------- piet-gpu/shader/gen/coarse.spv | Bin 51712 -> 52356 bytes piet-gpu/shader/gen/draw_leaf.dxil | Bin 6068 -> 6072 bytes piet-gpu/shader/gen/draw_reduce.dxil | Bin 4264 -> 4256 bytes piet-gpu/shader/gen/draw_root.dxil | Bin 4468 -> 4468 bytes piet-gpu/shader/gen/kernel4.dxil | Bin 14232 -> 14236 bytes piet-gpu/shader/gen/kernel4_gray.dxil | Bin 14136 -> 14140 bytes piet-gpu/shader/gen/path_coarse.dxil | Bin 7068 -> 7064 bytes piet-gpu/shader/gen/pathseg.dxil | Bin 9604 -> 9596 bytes piet-gpu/shader/gen/pathtag_reduce.dxil | Bin 4640 -> 4644 bytes piet-gpu/shader/gen/pathtag_root.dxil | Bin 4720 -> 4716 bytes piet-gpu/shader/gen/tile_alloc.dxil | Bin 5148 -> 5132 bytes piet-gpu/shader/gen/tile_alloc.hlsl | 34 +++--- piet-gpu/shader/gen/tile_alloc.msl | 24 ++-- piet-gpu/shader/gen/tile_alloc.spv | Bin 13460 -> 13360 bytes piet-gpu/shader/gen/transform_leaf.dxil | Bin 5664 -> 5664 bytes piet-gpu/shader/gen/transform_reduce.dxil | Bin 4700 -> 4700 bytes piet-gpu/shader/gen/transform_root.dxil | Bin 4828 -> 4824 bytes piet-gpu/src/blend.rs | 5 +- piet-gpu/src/encoder.rs | 14 +-- piet-gpu/src/lib.rs | 15 ++- piet-gpu/src/render_ctx.rs | 8 +- piet-gpu/src/test_scenes.rs | 7 +- tests/src/draw.rs | 10 +- 34 files changed, 194 insertions(+), 176 deletions(-) diff --git a/piet-gpu/shader/build.ninja b/piet-gpu/shader/build.ninja index 785e016..60e5582 100644 --- a/piet-gpu/shader/build.ninja +++ b/piet-gpu/shader/build.ninja @@ -48,7 +48,7 @@ build gen/backdrop_lg.hlsl: hlsl gen/backdrop_lg.spv build gen/backdrop_lg.dxil: dxil gen/backdrop_lg.hlsl build gen/backdrop_lg.msl: msl gen/backdrop_lg.spv -build gen/coarse.spv: glsl coarse.comp | drawtag.h bins.h ptcl.h setup.h mem.h +build gen/coarse.spv: glsl coarse.comp | drawtag.h bins.h ptcl.h blend.h setup.h mem.h build gen/coarse.hlsl: hlsl gen/coarse.spv build gen/coarse.dxil: dxil gen/coarse.hlsl build gen/coarse.msl: msl gen/coarse.spv diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 961fc99..aec2936 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -31,6 +31,7 @@ layout(binding = 2) readonly buffer SceneBuf { #include "bins.h" #include "tile.h" #include "ptcl.h" +#include "blend.h" #define LG_N_PART_READ (7 + LG_WG_FACTOR) #define N_PART_READ (1 << LG_N_PART_READ) @@ -278,7 +279,8 @@ void main() { el_ix = probe; } } - uint tag = scene[drawtag_start + sh_elements[el_ix]]; + uint element_ix = sh_elements[el_ix]; + uint tag = scene[drawtag_start + element_ix]; uint seq_ix = ix - (el_ix > 0 ? sh_tile_count[el_ix - 1] : 0); uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + seq_ix % width; @@ -294,7 +296,14 @@ void main() { // below will suppress the drawing of inner elements. // For blends, include the tile if // (blend_mode, composition_mode) != (Normal, SrcOver) - bool is_blend = false; // TODO + bool is_blend = false; + if (is_clip) { + uint drawmonoid_base = drawmonoid_start + 4 * element_ix; + uint scene_offset = memory[drawmonoid_base + 2]; + uint dd = drawdata_start + (scene_offset >> 2); + uint blend = scene[dd]; + is_blend = (blend != BlendComp_default); + } include_tile = tile.tile.offset != 0 || (tile.backdrop == 0) == is_clip || (is_clip && is_blend); } diff --git a/piet-gpu/shader/gen/backdrop.dxil b/piet-gpu/shader/gen/backdrop.dxil index df2be88d04c2feced45175e7cabf1f0b1f17135d..0fb9622eda673c439b74f7538c649b770edef248 100644 GIT binary patch delta 1380 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 diff --git a/piet-gpu/shader/gen/bbox_clear.dxil b/piet-gpu/shader/gen/bbox_clear.dxil index 6b3efaf964d637770d12e7b2912c744cad574b29..6655b7f9ca1149d804b413fba4d5c3313c10bf74 100644 GIT binary patch delta 504 zcmaDLaYI7VCBn&B=E&6MEpL;Ho~>TKGQqc_nUR5kA!4IsJe#H7uCU7@9}jcBn4d1E zcFv)|CBoC^1S@F&1YjRRg8~p431N)((eEmWG_hfVqqdESVV?DkT^g>?TJtJJ+jm9Ny?C z!NZkYEX{UAL5*Xwb3&7Wg0zrRWJh8GM}qSOAAwbAO%rsa#U4d+Bqbb#Ecy!CUG8GkR!1n@rHxIwW+xpE4XHC(aOmw%hk(FNzE$>Zd$-4 zIj=i*=AD>Zvu{sn$Z%?Vo+N%OE!;xQT-D&!goiuNENq=P^`zz`Xf7%S6V>E!_6?C4Cc8uXH#vH7H1E z+*8hoHcd)kP~c!=kubU4!3YvHkykOfoZ-a4W6r}UdB%vv$snl#q@q{C=V)@T8jFME zged|JtP{fo4t6*)12x#BZ!lzRFO+#c1ul|tz|?ViY3%naaFNUlmW}0X^PbB&y1E!7 ZT>u%_FID0HVd25=wHI|78-TF^0sweqsy+Y! delta 444 zcmca1@jyb-CBn&>0Szz$`3V~(evAkcXB>(Pmza#A$#*iHh!kbD$EkHd`APsS_2w5rnoVj5aYNi$uP?p zY+a=U1B3nKj~u?C!Yzz94HP&H9cRcf3AZTToFKsM%;W6LAkCEC6ksXb(sFZyfPk}r zv#_h+2E_?x0_Ry6gjpCBE{aWiX6CqI7U!V_J_2p2hbQnJW^3AEkn0>6$*?taawvt6P*>B;q)Fh%ij@kH&})vG5bzM^kI=9LadrUnHGjr+$m{4ruNCu0DciYiNh;}TI9gQN=}z5G%+J_izIj$5k2 zMEs=+d@rQNUbi)ciS$dA_&r$I_*||sKv1wp!USmG!Od*6cK2&oPwm@CLW3vkQ1*X;+ahX zX{u1dt!){wy&zcW6njA}jvYFaK(6MhT*cBGu0vb6<8FFa&jP16(>boaU5WJepWWyA z{hsG}pWpku@A`B6InvVF;*z3!w?2Q$@9B+keEFa~aC&WAI*H;&bHVg;<~M#gcw6;w zn5oFVwusjAZ2z+Fyv1i;jZm#6fXzp{ypslK*rY-Xfbg*4_Z)_J`mjN(d-?Da1C*#x zlnx`nRV2m%6t=K-F$s8KgIF``0Twp2w&htGkYS4oeF{PPu;KSaVE+##AwPzB1Z=iw zmZ($pOXEb9o^E04vme1Fyb22T5+7g0BRyU;EfGq?|7--I3lMn%q1|yne2B~4P5|&z z_8rf!^ca~!tjwlFf@CUs$S3M2!JMnpB)1X-ZywK;z`2X5=!FT3`mHV!K^!Dif;W>1 zLXe80hKt!*GtCYU@+TM?O-1SVEq<4UZ>ZfjG33pl?iGyOoLy}{+P2HtF`U^p%#SOH zVh-lM_DAH_UPSj$cl|1_I7KSGu3kw+kJ#vD;)7UhJ7y;6fXjdd0aot*@Wb(DB1B?- zYTAS}07L>Weoo?tOT;}pFYMw@GEa1gDer?bf^)8MnaVQhh=QV+I#Hk^f!@}3Jc0r?;8NDb& zQLI`tR1LMtDz#R2)KG+?qApQ04#qB0*yzYO<;YZHF*v_FYTwJ*=4hzK8@V6K^t&M* zO%gOzFj-8%KJ5Sw%6zO=AoBl`on3wSL zVSnDzrvE!S<`h1{)Qhui--1XVh~U@za z=}r|D1dtwQM=#}}UFP@|QH9b`16P53@%eK_o9$Pwmt?_Y4%@yWx51F@zwA9ji})}w zXn}Kp6xO2^)?78%+Q>vmqHQ9vDc{=4NnBm)hCl5g5?HnDN%DWwCz6l|w)MsC-#vqW z;SNBov;{xkE$-BY>2>|E`iZ#fox9eHpPme|DkSilgqMMAvU4vk(OU0vnXP)c))Hf= z!t-`Z^2TFsfO>wV-)-Qt8EtNRT?pO*=c^ZjRSTt0U*I*#GNB|SnypMCjRwg-@a0aA zq_9u&ZEKY8mv`W9B9~hrG1^t-EAdIDs_zG@gU+1~$lr+ge6~e;c`Dfv1#}szq_h>%8)u!TjTi>t0GK-W8oCvP#yUKo2;FwBF@47pqm*XYhUEXDdk=f%-7s(VAgk@%(n9Ohg>>fz9a zfaPOL^4KF`&Rl$phzN6TBIcriTlrY!^4~%VNVm``rLiHEEvA7M+xQQE50^oBnG}`kFGO8+|e%%jK`!H+nVhv!m{_^sNoCvaD-c zzBe4GgJMg+)7^H5mz*b*_hnF+2tFaSJaXvjZfz^{pJ@QlC6{A*j4Z)5hqB?`crNNd5}T9X#F0mPIP%0}az001c}!m6$fSxRr~ZLs dmz;qce3!I+Ud+91Ubk4zWz-3S?4Kh1{0|^9yNdt- delta 2206 zcmZ8ieNYo;8h4vW=hjc?DaB6R|5NWEwfHF#mI!gc#6)|VMYbiam z2@q2ZHO%4{p1sA=k+!sk)1f%$9|<6bbJ~LE&EOqggXPrg^m<^=n|8F*+m%3XZvV+X z&+qqq{od!@gp47h+EQIq4F2yKQeQ=J)mIlzS6=^paLciKhi*Zop-U0eE^$c_=GJ$i z{%_nzH^%-Lg|#G-KoYfyM;T@SM-6J;#sWNQFq2;ZXxRt_VkHtXim-;`Fl>$*p!gja zWtR=_MjZ~MQELO%Vj=+=wTMTD%`3^Nc}V)dkWZ+z99HiJK*2$*ZMhS?iQpy=nocN!vV5dc~U0Jd{Rtjwi?*}qVv%t%wxw?i;Ake@L=ijPgvdsDhp-T(coi6aXzL;?~PtoY-)gR zPZ(}?z5SW}tUY;Fzw3;C)g)1KI_2H>FXtBy=LPys^_|e**?l~(2)hbsYg^M;#7z@T z#CjvzrWhmqG!ejCTkHNx^|*=lus4j|Ah9eI4AbNkAE!UN>+F_f+Zp}c9&(__`@pdy ztKigs?&oKcy@9zaGaW;BPFydO`PbLKp8INJZGFR`vV-*vP1`*ESkgPkcHWt_pPQ|| zGuy*_Q0#rM^*&be{HfT-C-0XO6lBg^qL6?@SxW-&yl~1YxF$zD#S|_RFLfp1JEWE_ z&;!=h!Hpk(b3e(iDtu-&!h3(lZo)26ap54O42*)RUm(F! zU!QiffygH%+X#036wn%HN7uk(h=q-lR=koNO7rftb}%z6T2%}7RZ6SJgYpk?Opil9 z!OZLSgJZ-SeHu@#G|kxo4IJgn%50q^b(SvUotje0!HPXHjJ%(@S;V=OI+ruckfw-D*cE|@wSdw6&!jU2ZzDV`rVAG()PY4U?fe3$bPJkxm@5&%* z7WYYs8+mHWO7i&24Dwoq2v%4McgC~;4OZb^+ZZzuV5qaUotTS_|Y`i-6{8 z+jcx*rK!Y!JLBk={8?})rpy+MTUb+<%8UcZjAJ1t^O0L4`8837vhv>F0c~X4mW?ap zmwsEE1OFh7uQN5!YeN^vBdk&i1DXPDy@bq;S{)_>$Zh0eRSFlBSW)0`iV~Msx5Izx zB2omk-09lK?BR4IRv10v?|2En>kC7Iw1xF_VmlS3+j?NbvbawzTb@cbjEoB^q)3`% z7l3A@eLGN5jwvy-!>oOwHXbU&O|;516#ogZk8KJ0XsM9V<#XG{;q`F7VWz!o#X%& zb(+(wvt8ZVCr<4?qadAT3a)bM3ZvV%pgXXb&^V_R&k8Cx$F#ba#3B1iYAD{gq{!BN z{hJv7l7Rim`@?XQ^U*{NJh>#Gb#Pjnus6!NoqRw^L^)R`>>I;A{WF!V7Z9L~TkfDH2_05e zRhZwqwvP*F2y{q9dhA!Zpnya~NbYHTiU?l=rBWt*4H$x*^VV8I%*i>MC++DMC74!_H&Ubg+}f46ru)gr zab`RMgnhlN=~MhUbbPuU4Dk89=gCwyMl_?a@pJ>z%ZxMPO6RJR)+EeSE7gk$KQwmR zJbQRgn;zlLX>(nMJpB_xnkYR#r{5u56Q6IpIc<5j*!1-CdZ@E{wI^-$BYmb1UEYv+ z^sTQ-0%_LHerqTDhb6Ic9QU64p580*&w0ViLf=rQCweoasg>P-8|c;~30KPIY2+n1 zIiJ*wz7AvDW*rIjar<@pv>4o-CRt^q01mfhlpoFzhB&$oYO^69#+9a6VOYa+13JTV z2M=j_WL1T8$eXkt6-ZFT-caVFid(lO-tu0RUhflg?6U-kM;JRQ#z+;@r zs|piMNkIl1#_SYgM_!-=+HMhjcuaI2Q3@foCXpE^5eVMfs1VL4i&4ANg`CnRkvz~P xl82v>3qH`=bYd9 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 K6v`|y{rnph%ldWz diff --git a/piet-gpu/shader/gen/clip_reduce.dxil b/piet-gpu/shader/gen/clip_reduce.dxil index 0ccaac9931c3cd4794fa780051ce12667dfc0386..0dff71b61fa0aa0d74bdb368fd1693463e98304f 100644 GIT binary patch delta 1212 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 MgWHNY>fgWr0leT2-2eap delta 5495 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 diff --git a/piet-gpu/shader/gen/coarse.hlsl b/piet-gpu/shader/gen/coarse.hlsl index db1e496..57b400e 100644 --- a/piet-gpu/shader/gen/coarse.hlsl +++ b/piet-gpu/shader/gen/coarse.hlsl @@ -615,7 +615,7 @@ void comp_main() uint element_ix; Alloc param_14; uint tile_count; - uint _1453; + uint _1455; float linewidth; CmdLinGrad cmd_lin; while (true) @@ -809,16 +809,17 @@ void comp_main() el_ix = probe_1; } } - uint tag_1 = _1222.Load((drawtag_start + sh_elements[el_ix]) * 4 + 0); + uint element_ix_1 = sh_elements[el_ix]; + uint tag_1 = _1222.Load((drawtag_start + element_ix_1) * 4 + 0); if (el_ix > 0u) { - _1453 = sh_tile_count[el_ix - 1u]; + _1455 = sh_tile_count[el_ix - 1u]; } else { - _1453 = 0u; + _1455 = 0u; } - uint seq_ix = ix_1 - _1453; + uint seq_ix = ix_1 - _1455; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); @@ -827,39 +828,47 @@ void comp_main() { uint param_21 = el_ix; bool param_22 = mem_ok; - TileRef _1505 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; + TileRef _1507 = { sh_tile_base[el_ix] + (((sh_tile_stride[el_ix] * y) + x) * 8u) }; Alloc param_23 = read_tile_alloc(param_21, param_22); - TileRef param_24 = _1505; + TileRef param_24 = _1507; Tile tile = Tile_read(param_23, param_24); bool is_clip = (tag_1 & 1u) != 0u; bool is_blend = false; - bool _1516 = tile.tile.offset != 0u; - bool _1525; - if (!_1516) + if (is_clip) { - _1525 = (tile.backdrop == 0) == is_clip; + uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); + uint scene_offset = _242.Load((drawmonoid_base_1 + 2u) * 4 + 8); + uint dd = drawdata_start + (scene_offset >> uint(2)); + uint blend = _1222.Load(dd * 4 + 0); + is_blend = blend != 3u; + } + bool _1542 = tile.tile.offset != 0u; + bool _1551; + if (!_1542) + { + _1551 = (tile.backdrop == 0) == is_clip; } else { - _1525 = _1516; + _1551 = _1542; } - bool _1532; - if (!_1525) + bool _1558; + if (!_1551) { - _1532 = is_clip && is_blend; + _1558 = is_clip && is_blend; } else { - _1532 = _1525; + _1558 = _1551; } - include_tile = _1532; + include_tile = _1558; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1552; - InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1552); + uint _1578; + InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1578); } } GroupMemoryBarrierWithGroupSync(); @@ -881,21 +890,21 @@ void comp_main() } } uint element_ref_ix = (slice_ix * 32u) + uint(int(firstbitlow(bitmap))); - uint element_ix_1 = sh_elements[element_ref_ix]; + uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1222.Load((drawtag_start + element_ix_1) * 4 + 0); + uint drawtag = _1222.Load((drawtag_start + element_ix_2) * 4 + 0); if (clip_zero_depth == 0u) { uint param_25 = element_ref_ix; bool param_26 = mem_ok; - TileRef _1629 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + TileRef _1655 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; Alloc param_27 = read_tile_alloc(param_25, param_26); - TileRef param_28 = _1629; + TileRef param_28 = _1655; Tile tile_1 = Tile_read(param_27, param_28); - uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); - uint scene_offset = _242.Load((drawmonoid_base_1 + 2u) * 4 + 8); - uint info_offset = _242.Load((drawmonoid_base_1 + 3u) * 4 + 8); - uint dd = drawdata_start + (scene_offset >> uint(2)); + uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); + uint scene_offset_1 = _242.Load((drawmonoid_base_2 + 2u) * 4 + 8); + uint info_offset = _242.Load((drawmonoid_base_2 + 3u) * 4 + 8); + uint dd_1 = drawdata_start + (scene_offset_1 >> uint(2)); uint di = drawinfo_start + (info_offset >> uint(2)); switch (drawtag) { @@ -905,11 +914,11 @@ void comp_main() Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1676 = alloc_cmd(param_29, param_30, param_31); + bool _1702 = alloc_cmd(param_29, param_30, param_31); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1676) + if (!_1702) { break; } @@ -919,11 +928,11 @@ void comp_main() float param_35 = linewidth; write_fill(param_32, param_33, param_34, param_35); cmd_ref = param_33; - uint rgba = _1222.Load(dd * 4 + 0); - CmdColor _1699 = { rgba }; + uint rgba = _1222.Load(dd_1 * 4 + 0); + CmdColor _1725 = { rgba }; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; - CmdColor param_38 = _1699; + CmdColor param_38 = _1725; Cmd_Color_write(param_36, param_37, param_38); cmd_ref.offset += 8u; break; @@ -933,11 +942,11 @@ void comp_main() Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1717 = alloc_cmd(param_39, param_40, param_41); + bool _1743 = alloc_cmd(param_39, param_40, param_41); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1717) + if (!_1743) { break; } @@ -948,7 +957,7 @@ void comp_main() float param_45 = linewidth; write_fill(param_42, param_43, param_44, param_45); cmd_ref = param_43; - cmd_lin.index = _1222.Load(dd * 4 + 0); + cmd_lin.index = _1222.Load(dd_1 * 4 + 0); cmd_lin.line_x = asfloat(_242.Load((di + 1u) * 4 + 8)); cmd_lin.line_y = asfloat(_242.Load((di + 2u) * 4 + 8)); cmd_lin.line_c = asfloat(_242.Load((di + 3u) * 4 + 8)); @@ -965,11 +974,11 @@ void comp_main() Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1785 = alloc_cmd(param_49, param_50, param_51); + bool _1811 = alloc_cmd(param_49, param_50, param_51); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1785) + if (!_1811) { break; } @@ -979,30 +988,30 @@ void comp_main() float param_55 = linewidth; write_fill(param_52, param_53, param_54, param_55); cmd_ref = param_53; - uint index = _1222.Load(dd * 4 + 0); - uint raw1 = _1222.Load((dd + 1u) * 4 + 0); + uint index = _1222.Load(dd_1 * 4 + 0); + uint raw1 = _1222.Load((dd_1 + 1u) * 4 + 0); int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - CmdImage _1824 = { index, offset_1 }; + CmdImage _1850 = { index, offset_1 }; Alloc param_56 = cmd_alloc; CmdRef param_57 = cmd_ref; - CmdImage param_58 = _1824; + CmdImage param_58 = _1850; Cmd_Image_write(param_56, param_57, param_58); cmd_ref.offset += 12u; break; } case 5u: { - bool _1838 = tile_1.tile.offset == 0u; - bool _1844; - if (_1838) + bool _1864 = tile_1.tile.offset == 0u; + bool _1870; + if (_1864) { - _1844 = tile_1.backdrop == 0; + _1870 = tile_1.backdrop == 0; } else { - _1844 = _1838; + _1870 = _1864; } - if (_1844) + if (_1870) { clip_zero_depth = clip_depth + 1u; } @@ -1011,11 +1020,11 @@ void comp_main() Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _1856 = alloc_cmd(param_59, param_60, param_61); + bool _1882 = alloc_cmd(param_59, param_60, param_61); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_1856) + if (!_1882) { break; } @@ -1033,11 +1042,11 @@ void comp_main() Alloc param_64 = cmd_alloc; CmdRef param_65 = cmd_ref; uint param_66 = cmd_limit; - bool _1884 = alloc_cmd(param_64, param_65, param_66); + bool _1910 = alloc_cmd(param_64, param_65, param_66); cmd_alloc = param_64; cmd_ref = param_65; cmd_limit = param_66; - if (!_1884) + if (!_1910) { break; } @@ -1047,11 +1056,11 @@ void comp_main() float param_70 = -1.0f; write_fill(param_67, param_68, param_69, param_70); cmd_ref = param_68; - uint blend = _1222.Load(dd * 4 + 0); - CmdEndClip _1907 = { blend }; + uint blend_1 = _1222.Load(dd_1 * 4 + 0); + CmdEndClip _1933 = { blend_1 }; Alloc param_71 = cmd_alloc; CmdRef param_72 = cmd_ref; - CmdEndClip param_73 = _1907; + CmdEndClip param_73 = _1933; Cmd_EndClip_write(param_71, param_72, param_73); cmd_ref.offset += 8u; break; @@ -1086,17 +1095,17 @@ void comp_main() break; } } - bool _1954 = (bin_tile_x + tile_x) < _854.Load(8); - bool _1963; - if (_1954) + bool _1980 = (bin_tile_x + tile_x) < _854.Load(8); + bool _1989; + if (_1980) { - _1963 = (bin_tile_y + tile_y) < _854.Load(12); + _1989 = (bin_tile_y + tile_y) < _854.Load(12); } else { - _1963 = _1954; + _1989 = _1980; } - if (_1963) + if (_1989) { Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.msl b/piet-gpu/shader/gen/coarse.msl index 96f1026..29174f3 100644 --- a/piet-gpu/shader/gen/coarse.msl +++ b/piet-gpu/shader/gen/coarse.msl @@ -646,7 +646,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M uint element_ix; Alloc param_14; uint tile_count; - uint _1453; + uint _1455; float linewidth; CmdLinGrad cmd_lin; while (true) @@ -832,16 +832,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M el_ix = probe_1; } } - uint tag_1 = _1222.scene[drawtag_start + sh_elements[el_ix]]; + uint element_ix_1 = sh_elements[el_ix]; + uint tag_1 = _1222.scene[drawtag_start + element_ix_1]; if (el_ix > 0u) { - _1453 = sh_tile_count[el_ix - 1u]; + _1455 = sh_tile_count[el_ix - 1u]; } else { - _1453 = 0u; + _1455 = 0u; } - uint seq_ix = ix_1 - _1453; + uint seq_ix = ix_1 - _1455; uint width = sh_tile_width[el_ix]; uint x = sh_tile_x0[el_ix] + (seq_ix % width); uint y = sh_tile_y0[el_ix] + (seq_ix / width); @@ -855,32 +856,40 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Tile tile = Tile_read(param_23, param_24, v_242, v_242BufferSize); bool is_clip = (tag_1 & 1u) != 0u; bool is_blend = false; - bool _1516 = tile.tile.offset != 0u; - bool _1525; - if (!_1516) + if (is_clip) { - _1525 = (tile.backdrop == 0) == is_clip; + uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); + uint scene_offset = v_242.memory[drawmonoid_base_1 + 2u]; + uint dd = drawdata_start + (scene_offset >> uint(2)); + uint blend = _1222.scene[dd]; + is_blend = blend != 3u; + } + bool _1542 = tile.tile.offset != 0u; + bool _1551; + if (!_1542) + { + _1551 = (tile.backdrop == 0) == is_clip; } else { - _1525 = _1516; + _1551 = _1542; } - bool _1532; - if (!_1525) + bool _1558; + if (!_1551) { - _1532 = is_clip && is_blend; + _1558 = is_clip && is_blend; } else { - _1532 = _1525; + _1558 = _1551; } - include_tile = _1532; + include_tile = _1558; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1552 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); + uint _1578 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); } } threadgroup_barrier(mem_flags::mem_threadgroup); @@ -902,9 +911,9 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } } uint element_ref_ix = (slice_ix * 32u) + uint(int(spvFindLSB(bitmap))); - uint element_ix_1 = sh_elements[element_ref_ix]; + uint element_ix_2 = sh_elements[element_ref_ix]; bitmap &= (bitmap - 1u); - uint drawtag = _1222.scene[drawtag_start + element_ix_1]; + uint drawtag = _1222.scene[drawtag_start + element_ix_2]; if (clip_zero_depth == 0u) { uint param_25 = element_ref_ix; @@ -912,10 +921,10 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_27 = read_tile_alloc(param_25, param_26, v_242, v_242BufferSize); TileRef param_28 = TileRef{ sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; Tile tile_1 = Tile_read(param_27, param_28, v_242, v_242BufferSize); - uint drawmonoid_base_1 = drawmonoid_start + (4u * element_ix_1); - uint scene_offset = v_242.memory[drawmonoid_base_1 + 2u]; - uint info_offset = v_242.memory[drawmonoid_base_1 + 3u]; - uint dd = drawdata_start + (scene_offset >> uint(2)); + uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); + uint scene_offset_1 = v_242.memory[drawmonoid_base_2 + 2u]; + uint info_offset = v_242.memory[drawmonoid_base_2 + 3u]; + uint dd_1 = drawdata_start + (scene_offset_1 >> uint(2)); uint di = drawinfo_start + (info_offset >> uint(2)); switch (drawtag) { @@ -925,11 +934,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1676 = alloc_cmd(param_29, param_30, param_31, v_242, v_242BufferSize); + bool _1702 = alloc_cmd(param_29, param_30, param_31, v_242, v_242BufferSize); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1676) + if (!_1702) { break; } @@ -939,7 +948,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_35 = linewidth; write_fill(param_32, param_33, param_34, param_35, v_242, v_242BufferSize); cmd_ref = param_33; - uint rgba = _1222.scene[dd]; + uint rgba = _1222.scene[dd_1]; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; CmdColor param_38 = CmdColor{ rgba }; @@ -952,11 +961,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1717 = alloc_cmd(param_39, param_40, param_41, v_242, v_242BufferSize); + bool _1743 = alloc_cmd(param_39, param_40, param_41, v_242, v_242BufferSize); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1717) + if (!_1743) { break; } @@ -967,7 +976,7 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_45 = linewidth; write_fill(param_42, param_43, param_44, param_45, v_242, v_242BufferSize); cmd_ref = param_43; - cmd_lin.index = _1222.scene[dd]; + cmd_lin.index = _1222.scene[dd_1]; cmd_lin.line_x = as_type(v_242.memory[di + 1u]); cmd_lin.line_y = as_type(v_242.memory[di + 2u]); cmd_lin.line_c = as_type(v_242.memory[di + 3u]); @@ -984,11 +993,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1785 = alloc_cmd(param_49, param_50, param_51, v_242, v_242BufferSize); + bool _1811 = alloc_cmd(param_49, param_50, param_51, v_242, v_242BufferSize); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1785) + if (!_1811) { break; } @@ -998,8 +1007,8 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_55 = linewidth; write_fill(param_52, param_53, param_54, param_55, v_242, v_242BufferSize); cmd_ref = param_53; - uint index = _1222.scene[dd]; - uint raw1 = _1222.scene[dd + 1u]; + uint index = _1222.scene[dd_1]; + uint raw1 = _1222.scene[dd_1 + 1u]; int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); Alloc param_56 = cmd_alloc; CmdRef param_57 = cmd_ref; @@ -1010,17 +1019,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } case 5u: { - bool _1838 = tile_1.tile.offset == 0u; - bool _1844; - if (_1838) + bool _1864 = tile_1.tile.offset == 0u; + bool _1870; + if (_1864) { - _1844 = tile_1.backdrop == 0; + _1870 = tile_1.backdrop == 0; } else { - _1844 = _1838; + _1870 = _1864; } - if (_1844) + if (_1870) { clip_zero_depth = clip_depth + 1u; } @@ -1029,11 +1038,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _1856 = alloc_cmd(param_59, param_60, param_61, v_242, v_242BufferSize); + bool _1882 = alloc_cmd(param_59, param_60, param_61, v_242, v_242BufferSize); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_1856) + if (!_1882) { break; } @@ -1051,11 +1060,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_64 = cmd_alloc; CmdRef param_65 = cmd_ref; uint param_66 = cmd_limit; - bool _1884 = alloc_cmd(param_64, param_65, param_66, v_242, v_242BufferSize); + bool _1910 = alloc_cmd(param_64, param_65, param_66, v_242, v_242BufferSize); cmd_alloc = param_64; cmd_ref = param_65; cmd_limit = param_66; - if (!_1884) + if (!_1910) { break; } @@ -1065,10 +1074,10 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M float param_70 = -1.0; write_fill(param_67, param_68, param_69, param_70, v_242, v_242BufferSize); cmd_ref = param_68; - uint blend = _1222.scene[dd]; + uint blend_1 = _1222.scene[dd_1]; Alloc param_71 = cmd_alloc; CmdRef param_72 = cmd_ref; - CmdEndClip param_73 = CmdEndClip{ blend }; + CmdEndClip param_73 = CmdEndClip{ blend_1 }; Cmd_EndClip_write(param_71, param_72, param_73, v_242, v_242BufferSize); cmd_ref.offset += 8u; break; @@ -1103,17 +1112,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M break; } } - bool _1954 = (bin_tile_x + tile_x) < _854.conf.width_in_tiles; - bool _1963; - if (_1954) + bool _1980 = (bin_tile_x + tile_x) < _854.conf.width_in_tiles; + bool _1989; + if (_1980) { - _1963 = (bin_tile_y + tile_y) < _854.conf.height_in_tiles; + _1989 = (bin_tile_y + tile_y) < _854.conf.height_in_tiles; } else { - _1963 = _1954; + _1989 = _1980; } - if (_1963) + if (_1989) { Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.spv b/piet-gpu/shader/gen/coarse.spv index bc272303af7cd01f07e7ef9bbf352afb980bb1d7..d246506f188134063483dd02d569b3f612a658a5 100644 GIT binary patch delta 12777 zcmZXa3A|NR*~T|;??qHBLLkjjGn|KG%Jia~|BB@BCPIJwVW=Ywh>!a}Lwb>2=Zt zz54d*xlZq*=uxa#tWZ2Tw{M@p2eucNwHHO_*v@gC-BX5lO)ZM{qE|5+ZOVv4z-`5K z;K`j6o3^&%4)~E>qo*8NG<@%YGps)DVeqs%?kE=34jw$H&+kyCbdBvSYG(`{wBOUP z2_q(r7+3dcEB@NT7q{?N;a!u5j~d%Gf%xsk8x1~kY-jgqLZEaMZ?)I%U3Xyl9;V5o zI=efEj~_E;a_5wWxmWQK`e>ZJluy7JYq-@ry!7Fd$99eCZ1}eoUukILMoc~&kM?2{ zc-^7C0F5}CqK)jDGH%3##uUEWQPj3vcR;yMeQb3p+lm9xMo$`XWR|lNUSE*<^xKLt z@amEr+QO%{@M+8Oj^b#z@yCttt}R@*Z#fE3 zc|GmLMc}br-JPFpb6asKT6Lb6x9}?)yj-@oH?%m+Y2i1u@S9us?eIy5j2w}TxwpkW zzlA?g=jCUI>(Lg6$6NTK7XDldf1!oH)WTnB;fvv;%5kHIvve$CTk-D}hfi8~!M#{r z(!MSHb1l4I3;$9J|1!L+23)hnVeJ+^7~a)Ay0dZnwiO$|IZB&n$v1=NZt{Y*ZyCR1 z3*WhSvC48+v~TU=4K^!Bwz!RM;S*Z;q!vDSgggLH7mRqqgPeOzA2c0 z^#ZE@p5WsYis|=l%;@30iek~cy@zbsURsm2Y>%70b-BuKY~j}Fs@*zW<<{!(KEzv8 z;V;6i+_BSdTKv8uIKW~ahke{{ca>YetK9ls z<<{;BFYCp-A`}+xDyMKS$1UJhyTv=)HL-Yy+grTDy+Dh1_`srMUn{~;9IW1Pu(x_w z`SccU)vnsD*i~-T4u6SwR_^eD?Ql2IsvWMsRXf}juxf{!(5fA7 zZ`BSj4QSbpV8Hnm-U+vC$F9FsJ6wOOcDTJ&J6wOOcDVjl?Ite^XKdMygEO{lhmVI_ zw!;l*)ebkHRXbdNNx1%2?Qs3A+6`VdZdA*592{WT4tIcMJKPCdwZomTRXg0?s$Jz) z?QrXfRlCkhDuoFx+jRkMLd$meQEwCDp^__ov)MsQs3%rKR&;lQR61oLGTz?CE zxD$A6-YvV%T)#Yx`m+mf?axw`uK-`##tlWkBiG3(DXs*o@5Hl}kJa+nt^&_xT=>;+ zeWnx7vDbk0QQrmSU9?|=7m(w%hP_-i_*x7aP2~H6Jb|wVA6MbO0Xy;QNwfliZUC!& z0RDjSbHTno<|4Gsq1{URu;^LGiF;Ff*$8w(bH?*8%to7f~Ki_J+@ZTck6Z6(A2nZWH}ul6>Y0enYP%YZw<)h)XVK7ghkpS!{8j`tl? z9^1X(>iDkv5Z0h+h|_$qdiecdCldYu*ubYZSM5QtKI+-~hrq_s=0xtP&F${L+-X~g zWo_C5S|UFJRu6v^T+RF#+{~vmGd~X2M?IOJ02@b}nSCfw1DEwDf=_!k5_oc+#4w*D z?5X)J*q5h9{VAH78!FDE{s49j4ekSkT$}O!2sWNJA135OIQlDMd#0UQ`wYNA8WZqY zaCKAu2fhPMJwE>nRuBIZxH{%J_?z5U>hXELw)uqqrPqH_bG=>!KTmt1;`I{P2dS*z z%V7P~Gwv0z`W-A?{QeAgR@(OB@^|FQ{sLC_@_lxCrky7S$zq5`*J3vu{|5dJy-wQn z@##!G(|-*-o3^ky`Pac}-kjH=x!!+=t9z3f<5jSl_zn6`dvb>xQ0IRj=-_7mlirt` zt^OuW&CM2P68{2UU#W3#!!M&{W!?dQt4C3&XJy_6J5Jk9CCT0bC?@FpV6_Zb0#=(y zpcKjv;O{WO_0Y6u?1x}&Ug3N6^4LBG-&&dMQh5Daga?{S_-_P7gC_ZZ;11Mg(2wZV z67*BBS|-L0F00_$;@88HPcz0R=yGhOTG5j~irKebaJAkXsO*)Rg)-Yjbr;&y=5JP+5fwJZ3<+8aTG``(A%m;0{10!__*7hCmbvpOq+O}G?alMSO^ z2~GXl=HXiztdEnb~>u~*fIb#i9q#@R4EOroG@g@FP&QjRF3|I4mr%C--q!#}*!TP5* ztPNLNi}nx~NmqQ8KTFK7(I9@7QcRF_zy=Qg8n{|52gB74sN7QP!mHJCJ-B}A9#)^D z)(1aLZ~XOk>lJCNZo^J+wItpdtmeC$iFX0}GO@OA($q{W_R4cX>Y2!{Lm~BK z3hgaJ?(*+SuPpv3wk(tzS zU?1hwGx-wiIBmu}x?_DFsUQh@Joso@2Alv^o7khaJD^XR_~ zKcAj6T>OH5F#QGe-bwl;?k~aS$|_#$PGuQ2#_?C+i)q$5zn{JYtmb4dqL=II$F|GB zvzoWyrC_p`XuRX zO+Bk2*G5;|!JirKe-6W);M91Hal8wx%^fU;5_gXNjbli(ckMPPXj`BUEio^k^^P=_S^ zEm+;jnOL5LzXR*9&BXE~{5{w>+Dt6ZXQe-YpQ3rl|47eF8mC;t(=Phe{ zcqR|tCu~=*-k!}rHO+4M^WZGhb6|Pq{USIE^#WL~&3oWwaPEPZz;bQg1Ahja$7_0p zUd}yG){nZL8(r}?{>-4|9(Wa;dq7+KUIS~(@p&D**xmEo z8CXH54EQ_PN}DtI23XA}wb3eMsC1T5Fqjjac@#K3N) zbw!@?(-V9vKE`vL_QpA2{o5c0t=6A*H1+I#2UyJ?fg1yf0nRv+%Jr+>bmuoGXwE*^ zT-BVN72)r=|L%jvEa6IEjakB#!D=S)7LsSRRsm;(39t#dmXSv%VY+1tUgKlwWglckZU7cu`ak?wEXJOPiN~Pq-tr5v)W-0{)t<4NfVI{4-=88CV*EN-?IEg_v)vr5b}R?gLpcm>3%L4& z_{g^etLc+CTfvQ!F z`5s_j-bdPYr>S`#iJgMq0)GeW@vnXh{9QEl#Qq*w&C7FU#2Ho(WWaox`hBp8oUQ{* z;tjnQy)P%C&z`h>Xij9$+UqmcDLt@Wyk9l^0E;OcrH7u`#vg*Sjr)S-jcw#R6>xTO zKd@XIlPL}W=K*eiuspTyN1j28odF%FLlPbcR(EnHmM7ssVEwh3Se}FjgN>uj#PU4A z{TNKr`qKP_o_nydHX4T06uokB^%$sUVxz!WiIHG=Ce{hgN{j}}{SLwB@G;=|^p4S1 zKZm{t9RkTY%vBtUrk(@b1y=J5gdE_*;2G!D%Jr*mp<9`lhl8(TMG|u?yj08=nHm+V zSAGGTm;l|)0Qo*`JY20hUQK^*{fXeL)C90xn~xKd!A!pKb;~4(LJ}PT&Y_tCmgms? z6zrKXpyRYB;gMkVoEdo%P6g|qGb68mg7lP5gBU1>MxH}+6xgKRPsh;v@_tf3nx^KN z5m#4EJrkP_&PtSEd3|E;{|S&Bn&ZK8jk{qx37j{`6TxyPc{2TRw7emn0`?8j;KtBb zpIrT^O+8mH*H(JAUj63yO1M7iPVy>xUmoIq8fViK4LrNn zZ)X28%syeS){8W``>%nkRi~*|ou<>RuAA#8-@3Vu_VO*7d@K5wi?-T{dk-kDW9&8L z%jR7VSIf^*+SD??-!%QhZ_po~8`yyrxZE4z`l!ce4!8@S@VW5A8e{gW54s6KCk^>^ za~{}W+FZ|D=zY1K+HR()xtwAzZ~;N(x75yKKneNJPdX|u7m#0#rZCz&wTY+KvQ$RV&`l5cof_$AA8jQ nubF~I-%B0`r+hpHmgimf3GjvZJVLL{2`0h9c_YrgWZVA(PRoJ0^ULA+Y8##_|8@lG4@h*z}~Ri`I%!jYVlL=r;9N>nu{x3N)= z>rE07B%(@H#k;MdTIF8#Xca~4wkYvv>;C_H?=M#N{$=j@ePfI{#+Y->Io3LR<*duv zW?a-Zux*7+`WHo?Vx?lm;*LcF2MpP_t+=+mD5i8CU$hr}i<`icyC!vXPb=#DC-76c z$4oh)khc~0z){ulgWyx^xL@&DZPJjz>pY2MO859Kg!R$Cflur_sk5gxd&uDO<*=sq z&n^5_c=zOv?Y$h&*TPKem$ zpXgW?Lp)X7Ep9Jng2#9Fc71xO`W9y+tL8bYg`eBtWoJ)wA{Vt7T++fXZQ+-<@T=e_ z9Y4A=*X4#5{hSs)ug*)hM>B!jS_~Go@Wn0s{ucgV3xBwUKia|{gCAG+jOk$MSj4`? z%Pj`4wD8wj_`5Cqy%xT-h4N3d`488};MyDa&d z@a!Tdv{B1=4}Ue@kp9KN%L#UEG1$F@@7colYvBjf?%iVB^5_<6R|`MBg?G2`aV@+T zo-*LHrnKl!UY>7UOj}-1+}gqyE`EH=@3-|?y!h~;E3f?36}U_rvV>dV8d&t>Yl8}Z z1HJ})L-cFliGTGXsQn?}F$#(q_ifGSj<%v$ym-;D9okE4shZs|v%jT*w5pK1O-ri~(j{VT$w-v!!7+8Q~FamA?4j)jPz1N`9k{gM=%TeW)+A6oy zRyk#MIlg@hx87Fmt+nAysVpqE5!hR7!(9W5ZMaji*oHeLi*2~Q#kR`Fws4E=r}~o9 zv7Df&SJ@c6ghMNBxCxwH;g`UzveDaHWy7_%$cAfgkqv*5_=QzA0s~rQ!|koI;X1U+ zhU;)ng?GWNve9dAkqy`0A{$-`tg;a}z$zQ=0IO`c+t4Z-Zo*dC@Ck6MY`Fd`vf=u( z$ToRdIN-HU1%(5wvef}r*>HQSY`FGT*>D3`Wy4L_A{%bP7TE?b8wb@Y8v}c*Y`Ev& zDjRMTLhuKvghcbxUu z-b$ps^*CI6>#@Alz$LOE$G|1BAcxyqki&IoK@QiU1v&gIxb-+(d+Twy_6r+)@wgG^ zY+f#+gziBiT-M@x3eqgvaPH5~BEJEAP2Yw*Ha8+uJ_8%a%mH6VQ$8HYyU6B(A7R|< zO?}4BL#}R59;kc{hL_8N&qr_uEyg#4O=basR>aW)u(GA#r8u|^?B^qrS9dGz4%!FB z3UwSm3z6yP%x1!iz{=id?C_#&%=C5y$Iw(};9{_Hv-NHw{}AT}Hi*HZGpVXhoA~)L z*zrl=POy_zzUSsR_tvE_1MUKwaW2E%;5BQrdk1YJGNd=NpVBhoXW;6Hd*SQXp6VS` ziehyi*jV99ztz|KU6-rVKtboe{44%K;|mk(oVE1`QD{0zNg)WzTL!L!(2%P!+H;N58| zV)QIndHDZ;tIPSn@V7Wg%472!Sb6v#z^=ww&DDDztc~*3V)O#UYd53z_QXMDOkYCs zBJFM#FAM!gxM`_7l=<($-2Mbs?)-hOan53&Y1FwE`(pPBcoe-h>a_8}NqI7Pt-Uy` ze)=D6=KB|v2u}|sE1kRwRwjOf-m7i3v8=rbf3mh{@}TmsAX&Wp4XjKr z^O~3PEx2+^$lvMxxHXjjA5EECL+k;(u}@L_1MDAFSTwKcM$x^2(RCmt+nw`=#_| zs>2V#CK3J-*fpHnOzLB>Hp)#ZKJ1g!zr-{X)n5Nz3s0Up$35X@H@K%O!Tt@_$c#Us z_hZJ&|3g#e7_no#rS##;Ly&UN23O`^4hGdoS?t@v+Lzf;{SheaM|+4_(iJQ6Wyx2k zlfLxI;$#3=!|;{B)l;=HT-i~?kIgFZ`k`vX=qLsv&`^cj)0^n3;HT*gpgw~?12&1b zx$bnuXZh0BB;By;UDmA7C+)SXPF{D&YKYHZvN^7+!Ah6;?{lfvrC*QcNB#Ouy*<9l`sVu_WC=mM z=Hhi|4%Cr2K|c>RSdP;MU}a9gy|WS6kABo`NK>XCar|rycH%Rx@(? z%YZL{l_l^Hurf=cfj0yDF|fK#Y03;NcIKIo^7!4Ngy=YeEy300-wN*XZ$Ymvc3Xqh zW%=dNZ3C{Z(ondvtkM_3Nw!qEElr`>ip|z*CRZ-cGTJB54q%hdjbcZzGLK+vb^@Es zDy;KJqV5c)SQh)!(3QpMEE%$57rsrWzgv~X@vdNHdH&fAd`(}TK6IJU*AS}6ps%+KIvoC1?eS9w zm$CQ;l9{BEy>cY{2%7TP90i_^O;+n@xOU1j?werc)rXN|;AW&Q4NEC4usZ#YrI$xH9=yyi@rxb=3i~%7hy3HK7aqsz zGk5}6osP%R%cGkFzO%9lC&3N=K=W`+1}ih!OsbrMz=0}tI+0#koSqE6r{eS!xPjwz z8dzD?>8WtXsnh3FdS&r>8rV}rW&T<*1K{W5Vql>{J_7z7`ZdV(bo%|^)9Kmf#ToQN z=u3Lfns#w~CU|PU+KZ=eSz5OIq49f&&Z3#eOnSNIKJv64<~;DVP2IU*`LO1L-w(jglU?1R12ss%^T7r(pn>HHcmY^@bq1Cv;D3Sjqt3wc zJWc)(Y*24=7t;IrsNiQA6|-pyT_~}43Kv+eJc(Tl&PrSamM5_vfwK~qfaU7^Q{gi3 zD4K~~N-tM;i2M2qh)b^Wa(ekN>K@y?_;2v5^aj(ZgSAP}E1UAHhFl$8aW!9V(;UKU z!1f|bVd7NAaR%SgKgYETTW$N7xaFtaebCIK^8JV2O4VN{m?&n=GTVL98}(nWIiqDaRFGFEznP@o&H`Z8q*xU}Zj?Wx0O~&vL8J*x!NGon9Q;DAG?u6dL>`9Q+<^@I3Cz zwTXjgz}4W-!j(Uz=r1*~6vzD6(i zkXlt=2j5u?ZoDvXpa!|3Z`KRWUy-~?%XRx3SlJu2SiS`|e6GD*yXrBU4$oTr9qc;h zy8i>5HB%S6x7~0mvuN*t5!UD8?w4!q`ur1|^?4U8SLgb?56=3$2bL$u2jCR3rC@oA z*oPJztC$WQs6hgL1Xk|C8d#oyAA_}5XJB~({tK)hbq1EFi2WPkl5SLt~Z*$}+ zI0L{I9E0i9!P+F~N=#G>vPoBi zE2|cl)!}ihK4S-g)#=x_Q1a;3>d*Qse27A0wu8ZI(Wd*L$qYs!TN|$YL2TsffR$+z zN9)4%lQHXom1WHOU}cUu6hHpwgU`X&@pYj}v-6#p!Z`gr*p-kwU<0r=I`BUYZ3xyz zxi+4XjltO)zEhK{^OSr6oW0@uHTiZ19s%OWU3FWZ!J@k}5EonX<@VIxmSxxmxw`z8Gt^z9aM|x8U_U+$ zpe(kfeUaul5}S}e_-+R_K=lXT?U5;u^Bus-Ou$6r$38!s?&z*Dkl8!HAfD)*>HV0< zj^LeW!)PWV&Wv^e&tYY=W%M#quAK6HXv&;n&tiQY zoi_P_>u|WT>Ud?^d)B`J&fJdx%QN?*z|Far^>^6{66l-YY=fi0@@#`+z-|K_9!XQ5 zfZqZu&o+=J;IUxs)frgch{s{+faoaOK%Q;zZLmSz2BYcyxDAwd(v-PU;_5a~p2Wt2 zvl3lkc@jIJgk&4|mi~mMa$f?S2+l3B8!R`;ar9$oxdV;|dk56HKD5;)L3*0<%wFD@ zJ%?oiq;z{>pd^t&W78LUjbdtoX#E8zbmkgMZ>jx0`r zWCczJ%MCJ(UPr0>r-C2BnGUp5pY48Hz3zVp$!WA4jMKr&s(+qNhZ`+*U#?yC;<^3h z2Q-ht4D^}mOz?2zZiutMem*Yx7s$)HpdG=PD2C8~m)_kWkAv@ltL615(b*@+`QYl| zzW}bRn)C&GBdBI=_SI!{Ipym$m(^arc9XAL+vvje%Gr#XM>@HP7s8e0Ws^E(Nv+nj z55EY0Gd8z!Uv)VyhHIldHkW|Au?hbX{KUqXBkF@LMWB(2ytBLvtTT14>lO5VTvv6M z)0DZcVyE^9PUTnBR;z8b)0If4R>EEdpAOGduZC-*JWr(8)F#yim)9b>hPJRdsq4U6 zD>s)L=#z`O>uJi2EzU%51fN>TU=Dm{C4;$eZIma2dG72ZF!IRw_hFpfgb~VRNzDiA zK)I7o0`_@2xfyJNE{ygj=LBw{&jhqtKvU)f7WD6E1htghhA^e%RtDXXAr226DE6I0;G4hyc-=$~NX#lp-e!E~e3XrfteP(y%Cv zk|@PL7>+}6<>Ua7EZb}t6|CuG2Fb!iB^yji0;xw=llJ9-y7Y2b-UVHZz*qn5*ohvxaZ%Gsy;Y*2us{r=FaT?qKThxwU!?+IDUaUQ;sE@9!){e-LS#5cjAWd~pyMdLh8QpR(VjLF04*cCUi<0+U8* zarm7q#@klSIkN+MbIq>SD61S;6K_u@UYJ8XlLc7tvQzs(JB|AK3~agW5S^C-3NW#` zZ)@SrL*7JPI>KI{!Mx9-@yU_!p+EUVGwzuWC$1g*-$ES#R{21vV%}p{$m(M`Uwwm0Nt^RT zTbFDoGH%`{uB*RKe>AZf*AUhsFp0+9cr*fOvtg#$giL{1B?6P~T5y=a_XC_kVB4t%V1CGuRUe;lPKa57#P5(?GCA<{Ay6nrR z+Z;YG)}d$=!`0K}5tkRrduXnY0p$vFi3Mj)(tdy{qO^#zf_@C`XbE9hN099i5+f71 zkH3YUWqF`_4zxTlGJrr}B!9t~c@2A;v46fGp*k*@!H3RJ_-RkRQ)vOzY{a*@%cNYy>`ZS(Ew+W4wQTf}_`%_HB-xQRj8!e0 z6sc>=tkS?IITsYt(^574e;`@JM^m-)aLv;=PdG{JcE+xsrtMlz7wR%MEV+_}wLlsF zax0xe5oAPs=f%Z%H?dyyJ9{&}iz*Kadn3q2qZGEfK5?eUx z|7PQYsa>akz8P5C1S@@US;->tSWL|p74Kn14mW#ZvSy_sGQOO*YN@~PYEin3g@?&d_3+xWHYX2MK2iWq);UzOaH~u{YS4Wj z@Hr#@9cFvYET1<8Mh$Nik5YF{Df0mBPS4qI)08IF=hUj=4G;Ee4i9Hu5n9xK-Pc8! z#FxY5JeutJWv*GJH%?U@e^x=~3Lnbz(D_rHRj-E76T;^sU()6yw%G9|@k1!7-2*PF zQf*$1q2E{gP^XebzQ(hu9W-{ z-d@$5_x!E24RB$Sr0!G>LEY$WakOXCm(z7iI;Jrp%yS0!DXE2C6S<`fnAFr+G@*;m6V&_9OarUO!*;w<2s2--W3!vF~~9%Xk->;u0BI&<^fv zezkLG=G%qZ0&nZ!`GxK+SKQ>F$t`0ms_-n~Gty-?oaLf+*(<~3D`T8PG@EGTLYXQE F{1>|^dZGXT delta 1962 zcmZ8he^gWF8UAkW&E+P!7cL2b3rX~ns0}}=7ZyQUYVRfChrlrH0U9lxH<@SBib%J$ zN1c+J5Ro#nlQot(+igj!J#nLs2s+u^X#!yj3@zGtPNbIO&N!aU<95)_o&I6l-9YHs zdjGiRd%hp<`@G-tyx-+5<6H7Awi+||#s`UbJe+?5tGaifeEsF2tD&STx4HL+y-OC` zj^@Xi0PsKxK7;{CVIXcN#S=^7e2qD>Scn5~Y3vsE6(p-*p4OcD1u=Kc|5v%cKsy*L z9Sq>|AdrPhNOv7*cpIX-QNf+>|B0g2sY1X4L(9szc}Ai_=mj6CFym%3P$BGs4_BD0 zSH}E;uUcWYh+_?!@#ZG1qkjDKoXTK^n<^xa=jsa7Ijd!2WW#%5&{B4H5_x zs=z;Gy66G#XB9a=NBKSKii$r}{LFNryz=)&ob@>VQPcGK=I+h^yn3LKH5E?%AguWA zSc(5_CG}c-x#RBqWPEn%^kRHA`988Ezq~qc;=;u5o|*_>m?(<2oxndjJLhfLoOSQX ztKRPJ#${-11m`7?(NAQ((s+}5A;xI~(E&~((3Iu%JG$<9^kv5312l$S*B!-lS6l@{ z)CPdLIZp=fo9A>R(E%4EZl-#BZmtcF_1yADv-Hj{TpIeeW@r<_N{v3yCPQ^&uR!?s@;x+F#yA0qz*D-$sJ5L+OjRKz z)ICV&QR9z%nN#xqBi0N@QlNhcQ57`05A+jQFki64dLHG6c`5{|3yDFOJfgZ0_$D}N zZs>EwB7h}v@<(xLN9YjNec3LH^TR>f?eN&5r1CRzgvXq+BV;?{u{?v9P&Je5FulMb z%m6^MBSwi^Pp|w=Z8W0Az{B?00}>W9QU3?(a2y~}utWB`?Svh68&EzeB>Pi@O?Hv+ zKq&>@YmlH*1oVs$E$u5q3@9qzurT6zdVHz}c9xz*sJU{w-WmqV7r3fOTKtk=)+O@( zRA&vyc{P)92q|-&Z2Gr(Gx8;Kngp+%frltsv>2pT(NP80kTOuwmmn?Q^;pB>8djN- zuSpPPp0scJ6Dtj9I~^jp5nKVfE(cy2b4I_NqV*=SG2<&xLS558;a21Of~rY*|5)-3 zyL4*TGO~6fw1lcHwOZiXYO4hqLuN%QZP=R%Usr?1#qg`3MFi<0y27eQtg^aHB%CHT zQM>cDdFSUbv94BM?ly?SIaqYyfV6RJ~e zE^S-vQTAq+9^CfEhvabOJBYIr|BI$YZ~9;1C;RjfFi65iH_i_S@8M!3j(!$^!7gIm(`BMUSU#+us7|11gG~Dm<`@pn)F1l1mR^@~#Ol$UV?*_O z0_fq?ofCHoHzL;Pp-$;tC@s`K>W`eN3#9g2k;7}I{35#UT=w{%Me!2$b!%}3u4L>- zmQ%^k`ZCfvxB4NqA@^KEZ?Z11J{2RUcP++~{-@O6sXANVwL$EDvHAO^>zg->-XWI0 z)x?N8x{=K5jEt1$)_(w*8i{E0%+JT%j;%co7}y|)5*6=E(z)o wE6DlUdb~h<1|r3IyMOABw98)%t6!Y(?~=^TyE}OC{hpVLO}@8D0IT1B0ioS~F8}}l diff --git a/piet-gpu/shader/gen/draw_reduce.dxil b/piet-gpu/shader/gen/draw_reduce.dxil index bfafc5fde59e94065d4a62a2961b1d60f44a2e7e..4df0ec51bdaf0e94f98038ec143b59dbf32c351f 100644 GIT binary patch delta 862 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 MPRk_$XW{?;7nRX8X#fBK delta 10117 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 CKLN=A delta 9885 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 G-~R&!iA)sEF9}c}V4|9?#ycVeMc0-TBOX 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 D17*T* diff --git a/piet-gpu/shader/gen/pathseg.dxil b/piet-gpu/shader/gen/pathseg.dxil index 7ce4684b8acb5f9f24e0a5ea3ce7ad9e2f305a72..61307126085e84b143b3d7ca3aa21481ee768937 100644 GIT binary patch delta 5201 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 Pv=JR~t*1X0+W!6x9duC? delta 5157 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 delta 1220 zcmZvbe@q)?7{}l1UEAyRT8=B-t`^1>T88|X2V)e%GH5%PPSC?G6`GmcA!0RR7+DzV zmR^5Q*uoz~YDBUu$LNxZn6OODFj>+YXf_xL#AR!0X3#~9_+y5c_>VEZMH&;c`{T{? z{l3rhzMtp4_l?_SyX9zy+XMdhAyBi|EaiCp<&RB!AKc%#o8BsJzjh8y9qo9obx8++ z0My{L3V@6TFr9)Gv(R^YlHb}$0Q}d_Q zk}9r`q;c@j0+tVgydGHp4g-K^yi(s5Fkx((V|7)o8`UZk)|4Kj^d8dV0VYgHkCA%M zVHjI6?Ihcs#t^v#H+(MI?9qv6^h&AV;d|L4Jt)DOT~{hAR(nJ8D<({yWWoJt&>A&h zQ@szPsugMFlUrZ)JlK4{#k<+!bl@{%-z}s*xU+io=0cm!HB!<&cwj($Yv8s16RK&W z3tkLmpA)YsNd%QrFhX;1XWqL*v`^zL_hYn_g{Em#~|Sikdw>*m#k_0=}r;p<Dhs&%ejngur-t`Y$a}Biomq z@)?wH%JfC2%oE|0x={d%H98OyHfDp4OF?FESIsGoIAS@st3E?&)tU3-&FE%%b^#KktD#BWD2dp zX8>AI#Q_RKr*rPHiDL51QW7*#jDl_9fJxvSDJoX%`@& zZpUZVvH*|vJZnq5nv(@M#SO{yku1OfVh;Iwkn$$=4#2!*o(=g}A`6ft0{#qu56J)^ zW&V0UI5dyM)LQ<8RWcWnUgmdO!Qa9VQg{!^gF-BDi%_Io88KDRBBrF$7{b)DBi$fs z7(pzOh`Q@ELQ29%kqHN`DFehvSd>+=RL49?1Y{ML!y2Ri9$3>K$lkZ7wrn>DFA}we z&a&Z7jfi`h*6;U4%$o7!usEdHw}Txbr#oK??XE(yEGet9L!v8GR+1e$LvULjtIIGn zOJU&&qJ<;_@Q;EE7tZz#LvZq9rj=U~1G`X>(Tq4E!oKil7_iu((kvR33Y9i7_mx%Ol{8D4quZ3yUrAR-$|1|xWdtPAS Hivr*u$E9|F diff --git a/piet-gpu/shader/gen/pathtag_root.dxil b/piet-gpu/shader/gen/pathtag_root.dxil index 48584bd22a13f8f01c186da6383ccc3ba77385b3..77f12e6db0ec75e4d05be227c033a9793a2cc1a0 100644 GIT binary patch delta 1493 zcmYL}e^3-v9Khf1-tPU{MdyPA8+RKdGCGS z_xs&9FP3^cH8I~|vHme|xADuD-}`*#z9>-N-*O!R0MwmMJR)98JU{gYe)+@5BdTkY zX}-929Xt1?WL6$s!c>pN%4f!BZ`_*sYJ9d=v?W<@JfhE8J8bM5G~}EaUKz&0z(IK} zx^lcH9+RCg$qa#1*}F5Fass5x5!i?A;I~QvNFk)4m5c7%5Uju2!NeI{?P>1pw<)m3 zA3msIfTY!Yl1NgwoRA{6g25C*0vA)ChVO|u7A`v6l2^e4Mnb5PeC~LExW)qF=YRDf zD9>o}n{7l1N5GB2dE0q+61j|WuLgO_t4SBaK}5x3P){Jqg4RP_l6*zbj7#u8x)*#F z7!ZX`cnG*Caw~`riUmM+2~Y(tm{}VVL}CP#0c9vzMAtEWoT6$3ASQ}jVGm$>$t}*H z1v_GxCd&jUk*6>Iw1w>)Sg0HiAIAwtv4Jz}|FMu!;m7g}@nytL~!H`MbF~xl&vl=_Gfpe5{_R=YKB=STq z)O_59DC*t9HUB?|K)zP?eKwD=cE--?>qi~%mC`oVEWM3 z2Ln5oYO;lk$9!fC)>%|Pp?0w<@2HA)s^}~`vMuyrqG4K{rSgqx=?X2ax1)}S{)Ibg zy~;nDMOS9gtL>gG4}Bv-uU55>n&~PtZLoX)^Gzz+pz0j8)75r*jgu}HTE@s>%WQ`L mRso+!kSaWq&k~RQ`5Cz_R-ZT&y{6wC9;^nQC?-rVe*Xdj6YOFD delta 1497 zcmZ9Me@qis9Khe*wbvhB+f$%kSH)xe&I@04m5MQLQ%##gA0F5$0nE=mxV2CBU!eXZSNF~+xz32d_M1c z-+S--UfxW~Y>L6gS*+lH1A$zB$#7b+wxHqg_zh1~9&_FOxGQZ@la1T_YOfjq9>~E( z6aa|ml828UZud=Z>bI})s8syeup4y z-Uxc%0c0k5btQv7 zOFegEub_$adjJhO>3DhTr{SCd6N0C8UAy;f^M=%hbH{d^nJm9^_S=&}wWZ}j#p3H#Z=~g=GCu{Uuf)3j$2-1Qb?tb^ zr6Sdd?8<|g4X(yL`x|z;8n>anTEn?l&KTb-Pn_7^W&CdPB*6NQE~r6Yu$w}Ry2p&! zFF5QU?Zd`Gf_yA5gm3DQP9+&v0WUxG*2Zw%MEeqLj$24&bGt~eDiC>>qJh%O_Ta|2 z`uA0c10P7nl`xsS?D<1>x7q@Vzy3LZpaMPdVnjY~`I_a^x+xm? zVNLFk;42A~BupX(6`)0< ztfT}dc8|oNX1qvPvzTWl$v%{dWh+^xf(Nt`cjK#@Et!4!bDqo}hQ_SRX1o$0Su+yM zp;^*Q)*PC^I}m(6^f6IvO-4HLt3w-8Tk|`u{X?Yg!IY%e=EJ6T6Ji))Q!v<5ViXWY za>xXr<_R$)A~n{sBpx<4HOiVGxc@_sVUKdJqm82AWk4*t&&L31t+O9*&=7ExNrBXB=U z$v6)0o6u(~7#|KJN%)AgdZ$_14}uR%aGrr%XL> zFLA~>IIVG@M3o_!ykfPW;GBc14rK|oyCStYq2(;!>hw>im3bw7dPOhrxz!AeQrLM4 z7<$1;tf7z6UAW@eJU5$)^`0r#uTp{>v#jA9evBfRFCe@h_;=-fRE> diff --git a/piet-gpu/shader/gen/tile_alloc.dxil b/piet-gpu/shader/gen/tile_alloc.dxil index d4d0b494795d66f02dc6bf06f5d8b217406e4f49..7759910ca527b4ff12fbe9ba3ee03fdb6a428ca7 100644 GIT binary patch delta 1523 zcmYLJe@qis9Dnzt*K2#i6<4{^B3GeUU8h%c3c4S?!kA9n8dsGff0T+04KTzXQRmj{ zQA-)bp;WBXZHLa;L|Ej9PLjE_1q>>4z}SS17+{*Jx=@MghH_P^tm%R7=em|f0 z`F`HZJ7sD#Y4Zwgxp`-PYkb;K;|LeFWki0|_d@^xqC@)xL6t>9cb67@7tNVIzxz}3 zSInU9gzwSnp_3ow6|OC)PyyfqGVn7DfV2l9kQA{FF>cF^+%^yZjC4iuaX5{-ei~P{ z0tK#vgc?+^22MfrPE4!?`zZi6G+WTz<|itpM~C&%nYdd}hiEY3_u1#UDGCG9;26khkA)l1zc8H7$`Rcyhkz=V`PC255Sy)w=|Wj*6lh;2cZ=#2rFQFCDmOr zW+e+RRhrsV;p~L%Rl5(~{%K-l^7hR2i5ctFq1YX2{n?Arj$>Zp3PHEGadw4FR*6Sk zydAscpHd-~F=pRZ8q;A}G-7G~M79uy&op0^(Hh~`rm3D_&+xUo?3J@U!{4q~WCPHZ zhB@J8S0buiB)TydEi_AxB#9G!&TaKNY>PC_?PNR=G4gT-a8|-2`YH8`l;4Q`#VHBSit6kM5KYrTn)f zb&V7)MxkW6oAE_;jhU!*&Sya~5`ZM8>OC&(b-iaWT5bcxN;vT)1ys#;{?IqevRU;-6Bad#y+vf#ihjZV&{`NkqR8Fkr}Sk&Z=JTjl8#{_ zfe@%Qp~;|Bl{)ZFUj$f5B3MHon)JY2K@alxGt<0$!a1@S44EN|9kL_kIHCc|1AfL1 zG01jllNIvMI<)EzKYx_Zkq!<-A<<9fcTVNcX{7X$QqF-9UzA-ZkNP*_|-se_UOy#%87_lx@LX8y`An; z`hx>?oCkI}sw3v8*f5Sc;x@dUbdO8u#e7KwXLt%~r~H$t5myVeh@ZlWvgJ%@+nSIN z*mYT5D+4SOvQO)43>h|eM*afIk}a99GWM~_Yuw8XU@;{RgS2iX;@80}u>`nVSf?+J zb4{nlrabyL+{R5dW0|6*1c4VGg{T#Djg8`*aM`n4(x13ccYr}T=#8}UkI9`-|igM2@yA<9bTLb6DBGOen`ni2-SHE#+^I=rV^(VorKpN}M5@*n5a zwV25GpzpNtz5!Pm%&`ULhpm&Y%rE(zu`D;7Po#*dBG0QrLv@@P?W9$mGj*#fX5-5m zLSuD;`Dmx9q4PnVldpdaQF}GP{y8gWa;;bwF{&9%av++>hH?2u$XUEU2h!kn_N|!! zi-_-QU)7Ph>FVzOqVCtWbRSylD4EAhkaQ_?!|sflqlX}i_-%kKSRp>(x*@0_ZH4v& VvDX)R*P^8twngeW@elrg`~wV|=~n;% delta 1582 zcmZ8heM}Q)7=N$5Ua#%79EDa^-ac36;Lp=pq<6%4!#o2qHAS)8aZ?JbHWY?j! zfeJj>5HXZtdhA+$1>>ggkR=MR75Cap_Ez=&1P@>%BA%%N2Mv*+G=exL@|%n;HS}~# zS?l2aKW@!;BY&6fnlBaRxs!BP>T`yq9}Ho(+6R_;i@;T$on3Flkpx#BQ-D!wWPh;c z$pnQJU=|ay-}HXhwe#1sUFW8{n#%D?O{8^rwZCu6yRCh4ykcUZ`eAtH;nle_aA|5@ z@y8o45F>eCpD7&4yR=Hb-HqLN<$U9#p>0j)8k@>Z(`@ak)&1W7b#j;#FxY9%n4prwOA0-pB}Yif zJl8lA5psH7Hm+696J{$1gcaX3sF#>ukzI}nzY54Wofo51#g7fAWQ%1sCTd&@hdV+L zt2^=Mf<*k1SDC_XZGYT1xOxfuu5m-|qh;((j}6p}&&9x*a1xrKY-0GW!1)_;1a~Mf z?Q3yoiAE9*v-?TpD}cV_3Mq)Cm9#CXz?a`w%TC0Fq=jP!5*fwXZSgl(qr;9G?O&Pz zP%2W0Emn3=2c*bE5O%6qzpLnUBnS<_dx&`pteep?RQEuO zBc2bl+l*Akc9M>FA}p(g>lwNy8bT7voeJmvJ0R;@_D2o6 zrVvONkOpkseXqkY1gOQNCB@hnowkp za=%wv^@EblaPyBz&A%r#+vPj@1y~`Bs;2TPce4AdAu)im@5f$bH+q$tWF&f3qbjV) WcCIm&!Itx~_tN3B-~Rx;>;D=6 diff --git a/piet-gpu/shader/gen/tile_alloc.hlsl b/piet-gpu/shader/gen/tile_alloc.hlsl index 9e370ed..73e0a8e 100644 --- a/piet-gpu/shader/gen/tile_alloc.hlsl +++ b/piet-gpu/shader/gen/tile_alloc.hlsl @@ -185,10 +185,6 @@ void comp_main() Path path; path.bbox = uint4(uint(x0), uint(y0), uint(x1), uint(y1)); uint tile_count = uint((x1 - x0) * (y1 - y0)); - if (drawtag == 37u) - { - tile_count = 0u; - } sh_tile_count[th_ix] = tile_count; uint total_tile_count = tile_count; for (uint i = 0u; i < 8u; i++) @@ -204,46 +200,46 @@ void comp_main() if (th_ix == 255u) { uint param_1 = total_tile_count * 8u; - MallocResult _396 = malloc(param_1); - sh_tile_alloc = _396; + MallocResult _392 = malloc(param_1); + sh_tile_alloc = _392; } GroupMemoryBarrierWithGroupSync(); MallocResult alloc_start = sh_tile_alloc; - bool _407; + bool _403; if (!alloc_start.failed) { - _407 = _70.Load(4) != 0u; + _403 = _70.Load(4) != 0u; } else { - _407 = alloc_start.failed; + _403 = alloc_start.failed; } - if (_407) + if (_403) { return; } if (element_ix < _181.Load(0)) { - uint _420; + uint _416; if (th_ix > 0u) { - _420 = sh_tile_count[th_ix - 1u]; + _416 = sh_tile_count[th_ix - 1u]; } else { - _420 = 0u; + _416 = 0u; } - uint tile_subix = _420; + uint tile_subix = _416; Alloc param_2 = alloc_start.alloc; uint param_3 = 8u * tile_subix; uint param_4 = 8u * tile_count; Alloc tiles_alloc = slice_mem(param_2, param_3, param_4); - TileRef _442 = { tiles_alloc.offset }; - path.tiles = _442; - Alloc _448; - _448.offset = _181.Load(16); + TileRef _438 = { tiles_alloc.offset }; + path.tiles = _438; + Alloc _444; + _444.offset = _181.Load(16); Alloc param_5; - param_5.offset = _448.offset; + param_5.offset = _444.offset; PathRef param_6 = path_ref; Path param_7 = path; Path_write(param_5, param_6, param_7); diff --git a/piet-gpu/shader/gen/tile_alloc.msl b/piet-gpu/shader/gen/tile_alloc.msl index e6f486b..961be50 100644 --- a/piet-gpu/shader/gen/tile_alloc.msl +++ b/piet-gpu/shader/gen/tile_alloc.msl @@ -204,10 +204,6 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Path path; path.bbox = uint4(uint(x0), uint(y0), uint(x1), uint(y1)); uint tile_count = uint((x1 - x0) * (y1 - y0)); - if (drawtag == 37u) - { - tile_count = 0u; - } sh_tile_count[th_ix] = tile_count; uint total_tile_count = tile_count; for (uint i = 0u; i < 8u; i++) @@ -223,36 +219,36 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M if (th_ix == 255u) { uint param_1 = total_tile_count * 8u; - MallocResult _396 = malloc(param_1, v_70, v_70BufferSize); - sh_tile_alloc = _396; + MallocResult _392 = malloc(param_1, v_70, v_70BufferSize); + sh_tile_alloc = _392; } threadgroup_barrier(mem_flags::mem_threadgroup); MallocResult alloc_start = sh_tile_alloc; - bool _407; + bool _403; if (!alloc_start.failed) { - _407 = v_70.mem_error != 0u; + _403 = v_70.mem_error != 0u; } else { - _407 = alloc_start.failed; + _403 = alloc_start.failed; } - if (_407) + if (_403) { return; } if (element_ix < v_181.conf.n_elements) { - uint _420; + uint _416; if (th_ix > 0u) { - _420 = sh_tile_count[th_ix - 1u]; + _416 = sh_tile_count[th_ix - 1u]; } else { - _420 = 0u; + _416 = 0u; } - uint tile_subix = _420; + uint tile_subix = _416; Alloc param_2 = alloc_start.alloc; uint param_3 = 8u * tile_subix; uint param_4 = 8u * tile_count; diff --git a/piet-gpu/shader/gen/tile_alloc.spv b/piet-gpu/shader/gen/tile_alloc.spv index 3ae10738a3100148fb250dd94989ada5ce5d0348..dbc02a8e5b33b11e2aa77b3e30bc20d732eaf669 100644 GIT binary patch delta 3176 zcmZ9NS!`8R6o&Whz;F?hrcfU6foL=k@WsT3MleAiOf)h)7zC}?Qc_ zfF6v9qJR^Vg;Ej00YOkvP;nMz5ECDK^T9a=zwh>Jd*CGduK)kn+H38-*FNViZ{0F; zaCOx={X-~(Vi*v9>KJhypP zMXe1Fz?<9J+FME;<>t9%B5T7cv~p|Pj8ezE>8Yr|f6xxL)nR%&UVH@mm`ezeM3O4hb|bvTIDyN{Z1_>>$q;Yc4( zFCA3ZQy#Rix^SZB*E2h6#!bP;;e@kT%hlL^P_+^8sn{C0`b8O^mTCH%(lzzktg7j=+3wYY{oi<8Reasrhhw_W-+%nerH-Yq<-i=R5Oer|8eXI_>{D9 z$jPLX#hc4{c2gU>Kt#tzy36CcXRR6EA7n*VQVhH1hzZ+N5O4( z+o8|T(^Mpn{0!ddv8d5k3*ORxg4vbD=Rn~>_mNk zu%kIxAB*d2XQ)|R9E;rw&KH{t?=99_s{?K=^(6_#TtFG(M4j>I=Yc(XeKGlMVD-pv z2Yc*`vOM#_YR1KusM&_NSZzG1|3Q4tajxGHxu-Y~-$P)v ziIX6%&>Q|Rf{t|=e*~=NE+51CxJ&g%8EWoQY~suCFH0AnU7tLTvW&42)yz+T)#3{o zXKH`rt6)qDwwhZq-mF%B66<4SW0o`2tStUF6e?IPJL~%J6y#?njpuT^tQCc{Ygj|_ zH1Y~Ye5Y4}4OO?+vsfQ%>3fEuW-W2-<#S-~#HMV2&%@Q+pLy1Teaxe84dayp9~%=% zVxkwoCR#!wU&9ySYQCTG#=ivj#_NmoUIwe%+tpaP_rk)~pxFPuc<5`rY&s2!iPnKl zV4_u6dGu`ntHm3;5j>Nj9%D9vCop2nt6*c)-GKiDo55bTvDB|jEMm7H=&*1XRxa+w zT1dPVYr;mZh;w?t=V6UEPQP*MvHC37AOCA$wXxv1&~5NU$0T|(8prEkMJH{?zQMSJ zk$o5{+!(LWPVAeEZOk+2RaxS0>|2>{GI?y_+i*3XxS)67JM6!cU9p0Ju5KjSyWn3k z-!8CR-x#z#U>D}R-B`INQibn5@C8_sSN^K?dk^BJ)w+l#?ECiLi?ojskL81kqpyD- z!qxnkSa2^`%~SAbKLS^J3C4WW&Ht7-3=bb!jlR)0x^k>qgdb1*w16|5pX9Mr{7(B0xnb= e7j_(+U)YauwJD5vs%m|wT3rKvic&2UX;BpQBB0Y098)w?`jHm+EiuP&=E4$SxOJ)tb6hLln+bx-q(qw>`?_n=Ivn_4%i zq~_9n@Vdsvruy3Emb$4eMCMW}T1!LYgxcn5;~S$~vHUHH}`crI;&w=}iXHP+TQO`F_N!49-iJ+-cH1?8z7jlC4>dsX($rHZugh&&Z( ze_KPZx#eXC+I~5vxnk%Tyc|n9fygVc-Jxm&;A62BaP@OCJ}%Sr*A-iU{=^dxE! zinAxn8Np|R51~6_F4&Bf3^U5-Wt#qVV6KU|9q}8Am3^xEZbvo4VDj(99)OQ2*7P}4 zsL$ff=^M>Z`#p6l;dAMrk?;}3{DBre?NH`;!?oZ&*x*;foii-uhNn8fc!rH)pb6y$ z#e}QCPSEES%Eeyah+_MRRfXSJY9g$G;bSS+f-O@UnXUsnYh||GNnkab(k;rbVVKLg z;=SlklG9GpHmP_zJ=uO`+D#NSoIazf>Xgx)OV0Av|xQ)TwgOo&BevB z*fenGGrR%*?^=bFZbWb~9ka3mrh}cRkHapV^-W;UT3;l;8LS?B2H10+ndP|!tY%!? zftsgWDz=b;|2wK%3GQ6|ZEzQeq6%P(GR_6$#<+l2>S<`Bz?ooo9|aa}moP5k1fnz4 zOmH>U1m0;Rm<6_=X!|*Ewb=}>@Tj8!4nY*-_n%plCx`h+h=7 z8vK66?gjV3s_XY_re>kBfcC#m()st}bB=TUI?0EnLM|PJ^8tvWr(lJ?&=11Z7iat- zu$sFpVtw4D`oj!0cPaLI&c{C=d>%IP+T4$zsV^m_C;gWmg($|CAQEYR< z9UAW<7V-qv$3l#GoS|kR;=fZ_39H4?KLtL(oMF6cIjdYy+;~!T;c4UrjCjMJ0UN6B zQqN(1TuR@w3^kV$NBZZ%cE~dKhkXIA=Jw392<&4XeJ?VW+6g9-M533#CW@DGFMhWH^feGVjlY{f({p6jg^bnU|mSO7Hh&9I>b4zfltL6 zZ=8PPmSgp~U=RGSgVlzBqtG|tLv>tC0fTV7308E{I_z7F;f(l7$c?duHelZ_R-RH_ zct^w-#Vk90BUsHRmfr+l&v1FmlN)C#r=x8F|D5?YgXQ`LqrD3r&T!sVtlaH)!}p#Y zbQZwmPBg$=~hhF!Cr5ohp0rpIM{2v_sx<$~M5YHrzc{0LmSIB>^V7CL^~ zALG!uDLaKvz-lwHL_5H0vGAv0+uTLk!Ey`#3~NVf{Y&q{e$MdG|3&84mU7uaUqVb0 z$-e?ydA!tLgN;%51(fe(nB2w0G4~s=#RmTtZ0`7Xdio0djb}!jlzBaQ`nh@EBg^aaSS7lRju=}?rLj4 It@h}D0Fw`|H~;_u diff --git a/piet-gpu/shader/gen/transform_leaf.dxil b/piet-gpu/shader/gen/transform_leaf.dxil index 0c1e37624dfc3d26fcfb6bec6f7c42bcf6883e72..f9f31e6ea1417ccaabda3cd5ad47c1b5642a4e85 100644 GIT binary patch delta 1610 zcmZ9MeM}Q)0LJgG*W;)KTiQZtQSSH>OEIm=hnwP+9yKu8nptL1bO#7BKdUp$O(J(y z3ac(_KjX0?*Qz>VW$AfSWEvc@G?)T6SNqXU{-pOt+7{<5~@@#~Q(ek-bn zV2XNbV`+&yLhbhIhrBY0hjv8*KbHbEUx8i<0a$!aUZoc4!xGSSS(KAru7Kg29@$W) z!E6S!4W|5>!ZMWCNo|-VA1&j@y%WpFV8)+-j$SInzplbut`mur*}5Hzn*$`E)x?Qp z{k84R(S-__{1U@%xEQS~1U|m~Hy1Qa51;S(vGmu64VL#FTGHatbDp~$fg@MhGvY7^ zI>~m5u?XK2UTf?ayZXR%<#fl`wcOz40RQ<3=}sv7qUrP(Or)2qF+nt@Cbv_&N({&c zh9VDup~zuv!3NDKMpLVf15l^w8PfbYve}2kA_(B5Jfo&luZJV1%k1+|UFG;Z53~CS zSC$FboY}#kjX>TgqJ<=7^eIMhRxrkiAj7OS9_=$JFAG}Z81hPMOzZ+x-7^6_uQl7k zK~6OyXv+JqHKlHx2@lNViT=yevB&3X;zVm5RS!a_Dai$27bvB`@TN4{r0?sQMwWQQ z`S#ls;y18&=B8IhSwlHO+ztLNliGkXpexg01-;;ugcoU~I|&x401a?~H?b37tC`|- zgI;GUEh#dslF9&>qjQ4R2M$bxTNIGj<)Gyv7%&;U0X*U*Hd-}y5J)sfP<;SM$fRdK zny9j(pA;^|0o_%x+DHI0Sd>#ae?Oyy9O_(@E-D8tvzh0DcBNNQQ9@?R#@Crs$D?ex zp_*pP-7(qoZ0&-;fVw`lcI7dA=&|vh`FD%BQV`b0P zO!oi^XIQW)lE0c?33 z{LL|x5}OM=S%z%{d(fyj$byNIygcXtW(XJE%W39z&;8O3ROjb3RbMM`U=* zz?ZilyKFXE!6{}mw4V?Yb28sl^5rF?e_DC-@~k=PoH1h-@#gH5eUtrfKO(PXIeJ41 z2*fWH%WVrtu>&uO;AfB3b)t!YMYRWS6OgF8B4GSpygvf0Y^A8W9|TURz#j-UT{k9R z)=9iX1GW}6*WC~>?+o51V0+y!Ji78IESl{hGRhgIqE;e$VPA?&8>{)sZt#_1i#_#n zw4#=nD25@SIJ>%?sTkSEH~Sa=n>2K?7y_de=<{X=S2+MnGW@WxRM{WG`e81#mp{q! z8HoBn)G#1_we?Ry?FHjD!Uq|FUWC+1Mf^55I}JSaCBg#G&KW0KDWb~h`3Ch4bhk)a z8d;00jRyY29uQ}2icNKC|A}E83Ki&PU5Z3-3wuGavIr-;sU}mlb6xcmEqQ5nlYH4& zYV#| zu#B}TnS}A|Wz{7gi`;>1{$^)ACGEHAn7xbjJBh=~@usx)nil1-wqO(cw{inm&gQA& z!F%jJRb*7wBHxJxTr28doaE0;T7|E-obRqNiTFLSKV*HXNU(|>QfXE`DN6E&O}afv z9Sup}?UrBa_eg5hOZj(?>0i_yqvO6sJ1-@5_9UeSJ%$e4brEa%H8c4TEWD-s_b)X( BF)RQ8 delta 1694 zcmZ9NYfuwc7>0K@%d(ISBqW4DY}tTvNg|T~2BZadLqNeBRTyK%HUcW85-EbkDKl&? z1WIwt5Ts~F1?z=Uw1Hp&Wja|dl0mG{QinPgMbRp)EkpgGGo4O%1^nUuI?wl>dFPz( zJ?CtTvPCJ<>9wiA8(*hLiSjR4>hFonJ+Y6i(rvsW{Wez?s)XPI!(Vy_y|2B=vQ6^+nS;HQ255V@J2d_|L7r zdDLjkoCjS5b`Z+ALY_ZG2cM&BNr=KFI-}u}y(*+gm1hTV6q%6bo(gHBL+T|f0n|*w z-pv=0{ca>2K>)MCK1p^j568(N#|uAsmFR7|sq{Eqs0Fgk89rb(fh6TotW$RAIg_xB z6($L9)nZK)=<9XQ6;L=Ts1+44z~c1aVNpz4l^b%_%++n>#XP8Q?DgYdFUt^2pwWQEmX4iR6dpLHI+&wbM$coM9N{S zsd7xhc{!y<7CH;C+5Az7XQUz4ek^(~9vaSnAu+i}P&g$WpI2Yx&E{{FdPYub?8g$x zVn)6Lq=>Qk&H>*2d=NbIh&KZW4?6p0EAk+}rUa{H(-6I2D{1ywtDi3Mi&uN!kp9@} z$P`3Y86jklM`uv9(!z(A4urKj<-YC;XLGJkyzGh)>@aNLojapTPiuhcC)UQTu+u!VdMHey!OcdX=&8>)XHbKeCATq6b%22H0gZ9uZTki85acTH zg<*<9d%-r3^4#q(YE2dPX{VTWf`T%RYNLwD%ZYcVsO7vM4 zBVJe(?Tex|h7lK+?0ho3<%w=0tz?jwOCT=HOOPF@^D2>*2QjOU;`O6ZKzd-AY?#Fj zydPLxRl#CahoO)+&hnZ{*&|l2<^9BB+Sju35U^uU3vZIeoQtwy7Tvtt4BB$?@KDEf zCbG{>mGvQqW-^gnH~+t38AHAB4Hy}o+R(z$MMScFkv zoufmzE|1hPGsq0{`!(~F@4u<-Iwo#actk)JP%qc%GSe6=374~&xoHud;V~>0W$Wr# zbv`_n#kxFQdpe{a#3M8;wioF#*E48{NOEiznIfh#*4FGj!l}EP!CddOd7XZm3Of?3 zJV*$VWlagap3|Zm(p;#ij^OsDj}J1zwV?>HXQ{UDOQg!Yswdd!L-*{;#o6aL6k zv;@r7*%f^aimRo9u3`JK>n}0AVRHI1daX-wZ9t*%o`WniHev_U9Met+X8%Y31NhfJ ALjV8( diff --git a/piet-gpu/shader/gen/transform_reduce.dxil b/piet-gpu/shader/gen/transform_reduce.dxil index fc3a311f97ad90657935d6f92e7e0be1a2fb9238..978dd98aca8a278bde85fc024c77ca5695bdfcda 100644 GIT binary patch delta 1313 zcmY+Ee@qi+7{}jh-(Jt!!nL+~(6JsrR0tKW9RhLKU4KYAD6ZQoLBbyg1;YX}ZpLJD zWW64hRR_}9ZgV=5&N+g{EI4tdYO>xyVU2FkHA}vs16#GkEKqc0!Kdc;n>hKP*j;R#%pJs&!wz zcmA%tPy!j|FHe|M95N7xqQ*oNSA^J}ERfsCsVg1J<~W z;n=D*5Ke{ggpIP>f&PefXRx^)W4dRA{QF}hISG-*a-(AyPfoaggq_%+3VM(@oW-5P z2fm2a;al1`*0~0@PEnmBLw?fS_p`f+VD{}urx&N1lH-Z#`2lFvnXA@aHpgPa6&H(; z$$--G!_|`B8(+G1*D$Hvk-eYTSLYXpJND-ndyi|#w(+H=xx~$17v`=dZVtd5Ip(U5 z%@tc>Rf8AHDlWx}tn%}hWm%H&k_sYO;d`oT-wD1fV68y&(N%zB@XwGPy*v@(gH{Pk z5{}p0Sza7%qgoh1V(3AAW$S;BFX}6Wloiudc6;D_-v&sl`Xe|kJ9d~L0mdORxk1D7 z?KY5N(Umu!3G$j=F^ia1GD{>U;$L%A3_W=(q37ACReMUzw0l=Ft>G-98(J>-Bug2> z4>EFm((5+LjZkqTl|tzQG%oQ1c+EjB;Bi)KUnnRI~-rCQ0nTWB?52 z>X=c0(73X&k&u;R&gQaQkRWA*i3T{7F06IUs<>B)I*hHUMyi!KfIOQ#;0c8znQGmB zzixqSUoInmQYL&UGuwwr|4ysXJ0`Dk&O1hoj~y|E`is1zp*BHV1|t5hUV6q0C5C+b z0pX92eOeys-}*XfcxQ^Xpce$&E`88I#m5vCY`+Y4Evl9fbVS8(VR>UW4)ak|m|7?p zD4ny*?vWQVk+Y0*)w@`aDoAIuc}vy>gHO`H$2E^|r5;B%gMEwLsTbf7H@n`EN0gJ2 z4p4JjUKGL@S+^_VpgL)o1|GZSm5u6nHhPRc$fQ~93{p5>aH>9!-K?xQr{RYXb%T_u zrIa3Uk{q_1+(?j{$hb<&NQLcrtyISrVz=CaeCx6FrTxp+wn4CuzjtUJIv?669eZ@0 z)HHqtW?eVq+uSyn^A`swCK8g35(WEmb)ECJh)Hf4YqmS@i8v)Oigx=;&VNMwjax>| zPUnejpo5r~Y!dC-M&~&Zm$*$5pMq`vP-weRX#3Vy($GClTk1dXcU{jD=HeCRGA_*J z|NdjpvNq=La=j_o-$kpM^9Juo`Q^J6UP^+ zUV;FakK^xT@3XEOL18f=6*_#%W&$HVC_ghK;Scr*m*Ghq1^3zE7Y!6!+XFlQy zZnmevt)h;$Rfc9Xt)fqPZp8t@pL99YkM_sa-s- Zf0jSAl}J*A8m8#J*wOVgF5Y6|`WK>fx;_8^ delta 1371 zcmZ9MeQXnD0LI_DdwaW<>$q;$a9s<%bsucfjTXoF5ax9yb)uU^>e!}#+*p~5ZiJv& z&@Ab->q_}@MM_fn!*r9G2{U%i7-k^$*s%N54riE%2FO4|CL$qoB$#+tHlp4iZ|?Uz z_db{RdEdKhxz}>(Z8ha~@V~2{PNq?t`$uvFUk3oe|~0ac@v^bP}n{luuM(vt~if3&blt1W3pGa)?1vQq(n z4b!bNpfe$InVoF61HC`(6ua*VM2_bZ$EU8R3juij8yx*;!iN17ZSoEp7l zyU;T@HCd_LGVqlm3suy!05B*1R69IfVoA{U9G-(KfsdzpkXJ&8E-VIZsK7GY-f-&N z6y9jr%>$OeNA(-`EZ!c{Z6qP`>>jIj#F$^i;usueHZQ2TZ=m4vX} zfjCGCKvB5b;R>~LT1O@tWn98yWSduehiytlrY%N#$liSi6k7;h&P+$=4SXjuPxH%> zd6J)8m~BX`Ha>lkD{J+8+ssPrVI%{;-|r@88^)NC1Odw&>^&>$?bHx$6SdgGnE}at zT|L{7%o<4qHwv8!tgSDEE!1%F#4oIow_Kz8FlJ&MVO!eK3eSSC%;jAE@*^s)!cYEo zke?BV(?|hoJk6N|Em?$Qh%rRt#GHw;iofk(4a4uw_0?mh7#^iPA@mTawoLe+heP-_ zLCvkt&F;uR`s#ZRg^7SV7|jxVRpp2C(3&A3)2t!&ly^NCfJ2-Dq?JEIV_HE^cz$=1 zF7Pq?h282zBEDq$B~HPs9=nBvY_g3e$$WeQ$E$?lXI+(WmxvFk#TP=N8QTH#hW&IE zjQK?Kep3`Md#3%amn5_my(?qS>|+#*F3Nc8fqy#X7LUo8=Q-X%*TGnztN3zia#x4z zRSC1#UX`)h>usArrDAjN`_>An_LEZWW^1T(tD7~pk8uC$|0s98L8Bi@X~j@XmwJe6JSj3P(h~@J5$XFg$9AlE+uF>-WTWnAHnTU_@dIeD4PeT<+0pW&6@`IceXDBQ!|=&Tsrx&eM4(!P24dXr=E@+sYM}@ H`j`F#T7JoB diff --git a/piet-gpu/shader/gen/transform_root.dxil b/piet-gpu/shader/gen/transform_root.dxil index a33ff7f18731036eecfff1788ec93557c0699844..5b4f05930600267411a9865e166d35bb5c6578ff 100644 GIT binary patch delta 942 zcmZ9~Z%i9y90%~{Y446}xq~Y(XsyUWsg@N+TQ{6znT0ltYSF_Kg4uM}RTtvi;$$XH zx|AM&R!tX*2Zo3*s&k7>T+Xo=%ygj?w%TCqDr(h^)C5WAn8QXRCcf~lzVqeh`F?+S z{^UvPQ+kcPr`6V95h;9f;&(^yt?c)6N!J_%0Hi+A94L5n{ZO~=&I4CYU%SKC@9H~o z+1}%DItu|{0Sdm60U#NObxNGrDXzEL=2xo;0OGSB7uXQpew? zl%atU4M-jVhDpdlcs;@dn`3>@oB&$kSwH z?Jo?5b_O8&bQtP8mFLyWE9bS$HMq;#p`c7{fTIIG9q%Tc@Fo5dsf83DCk2?{`-=>a z<3A|+!nfi+G1!of?x{a6pkDUO68UMU_^vSLulOTUS^mi8!oJVtnt58TejW@GYzPvT zfzGcUYd>oTMm5XTa&CD|I~JzLLVMl--KOP52NK2X0%7gYSN~ZIXIMcofsc@Zux8*g z)B0e!9@ zEuqm44_!4Fv+ir7H_bAie^iBggVv14oe_KY$TiPT+Sm=#?$D?L@jB^@X92A$HEb=H zNGER*q9z7XNHZZ~e;zOYA36*J94n-+AKF?HU_`kH#K)R85%U6cD;Ff3qa;A(brEvv zG{d`8_09k}{UgqzgRiC9tk87vL$dCc#8X*`+rK2Ie~|e4RzAH=*5%9nf&EgNB&TyY zOWM4X5-;ZXWmRhTTzd;43m)V)s$<^?HO+?;fX1=%$uJ&3%of~SqT6}+#e~kJK8`^(E%l6db@6>0)prV zQES%Tu5&NUHQo+7$xMlwxCN67TM$i5+On65{m^JJtroK-V=Rj=gor8Mytkj!^X+&3 z&yzgooSdAoVAR-MRvY-=g1igYG(Ba{emMSv^3F`=y6Mrrk2)4oqjuLpC-npXG?0L- z2mrx=FIVs#d-#2;E&gjY2Eh08UzYs|k#71ACmWN|5M!Zyr%FF|rBQwb$h=WVye{=K z8orBdmUj=IQX>(hkg_Hf9hX4Kl1bACKA9{>c15_-|-4ept*WXX$8 zg~H4D?KD9?!6B(|`b(ecDcWRGM>+VK~FRa7&`;P50U;2B)WF$TguYH{h zUCU2>*Co5KxBquGp1Mlf5aW(>=2O&_VXchss7k5H0 zJBRBaV3%!FB^m47?90RoesFUrdkEo} zKvUch1L`BiA=Po7usJ1gY9yp8rOg?EccP()K-iKKxP2m&?GeUlSuOR>gjBse*IG6O z9vuz%oLceYoKgC)^(40LIjl*o=-a}RT?0f_Fm2iIARe@e1_P5y)OW$M>T$>Ty0iGY z=ND~ig*1gHWr)v7ta_4?s>=FexyKI9+4=8FoP+hSA7+@6Jw16XqW1oK;U>L Self { - Self { mode, composition_mode } + Self { + mode, + composition_mode, + } } pub(crate) fn pack(&self) -> u32 { diff --git a/piet-gpu/src/encoder.rs b/piet-gpu/src/encoder.rs index c25c260..62c59c4 100644 --- a/piet-gpu/src/encoder.rs +++ b/piet-gpu/src/encoder.rs @@ -134,9 +134,7 @@ impl Encoder { /// This should be encoded after a path. pub fn fill_color(&mut self, rgba_color: u32) { self.drawtag_stream.push(DRAWTAG_FILLCOLOR); - let element = FillColor { - rgba_color, - }; + let element = FillColor { rgba_color }; self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } @@ -145,11 +143,7 @@ impl Encoder { /// This should be encoded after a path. pub fn fill_lin_gradient(&mut self, index: u32, p0: [f32; 2], p1: [f32; 2]) { self.drawtag_stream.push(DRAWTAG_FILLLINGRADIENT); - let element = FillLinGradient { - index, - p0, - p1, - }; + let element = FillLinGradient { index, p0, p1 }; self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } @@ -334,9 +328,7 @@ impl GlyphEncoder { /// This should be encoded after a path. pub(crate) fn fill_color(&mut self, rgba_color: u32) { self.drawtag_stream.push(DRAWTAG_FILLCOLOR); - let element = FillColor { - rgba_color, - }; + let element = FillColor { rgba_color }; self.drawdata_stream.extend(bytemuck::bytes_of(&element)); } diff --git a/piet-gpu/src/lib.rs b/piet-gpu/src/lib.rs index 5c5c78a..e12f824 100644 --- a/piet-gpu/src/lib.rs +++ b/piet-gpu/src/lib.rs @@ -195,7 +195,7 @@ impl Renderer { let element_stage = ElementStage::new(session, &element_code); let element_bindings = scene_bufs .iter() - .map(|scene_buf| + .map(|scene_buf| { element_stage.bind( session, &element_code, @@ -203,15 +203,21 @@ impl Renderer { scene_buf, &memory_buf_dev, ) - ) + }) .collect(); let clip_code = ClipCode::new(session); let clip_binding = ClipBinding::new(session, &clip_code, &config_buf, &memory_buf_dev); let tile_alloc_code = include_shader!(session, "../shader/gen/tile_alloc"); - let tile_pipeline = session - .create_compute_pipeline(tile_alloc_code, &[BindType::Buffer, BindType::BufReadOnly])?; + let tile_pipeline = session.create_compute_pipeline( + tile_alloc_code, + &[ + BindType::Buffer, + BindType::BufReadOnly, + BindType::BufReadOnly, + ], + )?; let tile_ds = scene_bufs .iter() .map(|scene_buf| { @@ -265,7 +271,6 @@ impl Renderer { ) }) .collect::, _>>()?; - let bg_image = Self::make_test_bg_image(&session); const GRADIENT_BUF_SIZE: usize = diff --git a/piet-gpu/src/render_ctx.rs b/piet-gpu/src/render_ctx.rs index e9a24fa..024dd2b 100644 --- a/piet-gpu/src/render_ctx.rs +++ b/piet-gpu/src/render_ctx.rs @@ -228,9 +228,7 @@ impl RenderContext for PietGpuRenderContext { if self.clip_stack.len() >= MAX_BLEND_STACK { panic!("Maximum clip/blend stack size {} exceeded", MAX_BLEND_STACK); } - self.clip_stack.push(ClipElement { - blend: None, - }); + self.clip_stack.push(ClipElement { blend: None }); if let Some(tos) = self.state_stack.last_mut() { tos.n_clip += 1; } @@ -334,9 +332,7 @@ impl PietGpuRenderContext { if self.clip_stack.len() >= MAX_BLEND_STACK { panic!("Maximum clip/blend stack size {} exceeded", MAX_BLEND_STACK); } - self.clip_stack.push(ClipElement { - blend: Some(blend), - }); + self.clip_stack.push(ClipElement { blend: Some(blend) }); if let Some(tos) = self.state_stack.last_mut() { tos.n_clip += 1; } diff --git a/piet-gpu/src/test_scenes.rs b/piet-gpu/src/test_scenes.rs index 118b727..ee5839d 100644 --- a/piet-gpu/src/test_scenes.rs +++ b/piet-gpu/src/test_scenes.rs @@ -2,7 +2,7 @@ use rand::{Rng, RngCore}; -use crate::{PietGpuRenderContext, Blend, BlendMode, CompositionMode}; +use crate::{Blend, BlendMode, CompositionMode, PietGpuRenderContext}; use piet::kurbo::{Affine, BezPath, Circle, Line, Point, Rect, Shape}; use piet::{ Color, FixedGradient, FixedLinearGradient, GradientStop, Text, TextAttribute, TextLayoutBuilder, @@ -13,10 +13,7 @@ use crate::{PicoSvg, RenderContext, Vec2}; const N_CIRCLES: usize = 0; pub fn render_blend_test(rc: &mut PietGpuRenderContext, i: usize, blend: Blend) { - rc.fill( - Rect::new(400., 400., 800., 800.), - &Color::rgb8(0, 0, 200), - ); + rc.fill(Rect::new(400., 400., 800., 800.), &Color::rgb8(0, 0, 200)); rc.save().unwrap(); rc.blend(Rect::new(0., 0., 1000., 1000.), blend); rc.transform(Affine::translate(Vec2::new(600., 600.)) * Affine::rotate(0.01 * i as f64)); diff --git a/tests/src/draw.rs b/tests/src/draw.rs index 692f943..4372da4 100644 --- a/tests/src/draw.rs +++ b/tests/src/draw.rs @@ -17,7 +17,7 @@ //! Tests for the piet-gpu draw object stage. use piet_gpu_hal::{BufWrite, BufferUsage}; -use rand::{Rng, seq::SliceRandom}; +use rand::{seq::SliceRandom, Rng}; use crate::{Config, Runner, TestResult}; @@ -33,7 +33,13 @@ const DRAWTAG_FILLIMAGE: u32 = 8; const DRAWTAG_BEGINCLIP: u32 = 5; const DRAWTAG_ENDCLIP: u32 = 37; -const TAGS: &[u32] = &[DRAWTAG_FILLCOLOR, DRAWTAG_FILLLINGRADIENT, DRAWTAG_FILLIMAGE, DRAWTAG_BEGINCLIP, DRAWTAG_ENDCLIP]; +const TAGS: &[u32] = &[ + DRAWTAG_FILLCOLOR, + DRAWTAG_FILLLINGRADIENT, + DRAWTAG_FILLIMAGE, + DRAWTAG_BEGINCLIP, + DRAWTAG_ENDCLIP, +]; struct DrawTestData { tags: Vec, From 05dc88b70ffd7fd8d4437b487014cd8f540c9013 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Wed, 30 Mar 2022 07:27:29 -0700 Subject: [PATCH 3/3] Fix is_clip nit Not necessary to test is_clip when is_blend is set. Also recompiles shaders on Windows machine. --- piet-gpu/shader/coarse.comp | 2 +- piet-gpu/shader/gen/coarse.dxil | Bin 10568 -> 10544 bytes piet-gpu/shader/gen/coarse.hlsl | 75 ++++++++++++++------------------ piet-gpu/shader/gen/coarse.msl | 57 ++++++++++-------------- piet-gpu/shader/gen/coarse.spv | Bin 52356 -> 52244 bytes 5 files changed, 58 insertions(+), 76 deletions(-) diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index aec2936..454371c 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -305,7 +305,7 @@ void main() { is_blend = (blend != BlendComp_default); } include_tile = tile.tile.offset != 0 || (tile.backdrop == 0) == is_clip - || (is_clip && is_blend); + || is_blend; } if (include_tile) { uint el_slice = el_ix / 32; diff --git a/piet-gpu/shader/gen/coarse.dxil b/piet-gpu/shader/gen/coarse.dxil index 5770e6fcc85280788366ecbb78c09d791310e625..12e88dde300ffb33e17ea6c31c7c14b60812b006 100644 GIT binary patch delta 3829 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 delta 3860 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 LVlOo5_uqd3f3?N> diff --git a/piet-gpu/shader/gen/coarse.hlsl b/piet-gpu/shader/gen/coarse.hlsl index 57b400e..a702df5 100644 --- a/piet-gpu/shader/gen/coarse.hlsl +++ b/piet-gpu/shader/gen/coarse.hlsl @@ -852,23 +852,14 @@ void comp_main() { _1551 = _1542; } - bool _1558; - if (!_1551) - { - _1558 = is_clip && is_blend; - } - else - { - _1558 = _1551; - } - include_tile = _1558; + include_tile = _1551 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1578; - InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1578); + uint _1573; + InterlockedOr(sh_bitmaps[el_slice][(y * 16u) + x], el_mask, _1573); } } GroupMemoryBarrierWithGroupSync(); @@ -897,9 +888,9 @@ void comp_main() { uint param_25 = element_ref_ix; bool param_26 = mem_ok; - TileRef _1655 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; + TileRef _1650 = { sh_tile_base[element_ref_ix] + (((sh_tile_stride[element_ref_ix] * tile_y) + tile_x) * 8u) }; Alloc param_27 = read_tile_alloc(param_25, param_26); - TileRef param_28 = _1655; + TileRef param_28 = _1650; Tile tile_1 = Tile_read(param_27, param_28); uint drawmonoid_base_2 = drawmonoid_start + (4u * element_ix_2); uint scene_offset_1 = _242.Load((drawmonoid_base_2 + 2u) * 4 + 8); @@ -914,11 +905,11 @@ void comp_main() Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1702 = alloc_cmd(param_29, param_30, param_31); + bool _1697 = alloc_cmd(param_29, param_30, param_31); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1702) + if (!_1697) { break; } @@ -929,10 +920,10 @@ void comp_main() write_fill(param_32, param_33, param_34, param_35); cmd_ref = param_33; uint rgba = _1222.Load(dd_1 * 4 + 0); - CmdColor _1725 = { rgba }; + CmdColor _1720 = { rgba }; Alloc param_36 = cmd_alloc; CmdRef param_37 = cmd_ref; - CmdColor param_38 = _1725; + CmdColor param_38 = _1720; Cmd_Color_write(param_36, param_37, param_38); cmd_ref.offset += 8u; break; @@ -942,11 +933,11 @@ void comp_main() Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1743 = alloc_cmd(param_39, param_40, param_41); + bool _1738 = alloc_cmd(param_39, param_40, param_41); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1743) + if (!_1738) { break; } @@ -974,11 +965,11 @@ void comp_main() Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1811 = alloc_cmd(param_49, param_50, param_51); + bool _1806 = alloc_cmd(param_49, param_50, param_51); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1811) + if (!_1806) { break; } @@ -991,27 +982,27 @@ void comp_main() uint index = _1222.Load(dd_1 * 4 + 0); uint raw1 = _1222.Load((dd_1 + 1u) * 4 + 0); int2 offset_1 = int2(int(raw1 << uint(16)) >> 16, int(raw1) >> 16); - CmdImage _1850 = { index, offset_1 }; + CmdImage _1845 = { index, offset_1 }; Alloc param_56 = cmd_alloc; CmdRef param_57 = cmd_ref; - CmdImage param_58 = _1850; + CmdImage param_58 = _1845; Cmd_Image_write(param_56, param_57, param_58); cmd_ref.offset += 12u; break; } case 5u: { - bool _1864 = tile_1.tile.offset == 0u; - bool _1870; - if (_1864) + bool _1859 = tile_1.tile.offset == 0u; + bool _1865; + if (_1859) { - _1870 = tile_1.backdrop == 0; + _1865 = tile_1.backdrop == 0; } else { - _1870 = _1864; + _1865 = _1859; } - if (_1870) + if (_1865) { clip_zero_depth = clip_depth + 1u; } @@ -1020,11 +1011,11 @@ void comp_main() Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _1882 = alloc_cmd(param_59, param_60, param_61); + bool _1877 = alloc_cmd(param_59, param_60, param_61); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_1882) + if (!_1877) { break; } @@ -1042,11 +1033,11 @@ void comp_main() Alloc param_64 = cmd_alloc; CmdRef param_65 = cmd_ref; uint param_66 = cmd_limit; - bool _1910 = alloc_cmd(param_64, param_65, param_66); + bool _1905 = alloc_cmd(param_64, param_65, param_66); cmd_alloc = param_64; cmd_ref = param_65; cmd_limit = param_66; - if (!_1910) + if (!_1905) { break; } @@ -1057,10 +1048,10 @@ void comp_main() write_fill(param_67, param_68, param_69, param_70); cmd_ref = param_68; uint blend_1 = _1222.Load(dd_1 * 4 + 0); - CmdEndClip _1933 = { blend_1 }; + CmdEndClip _1928 = { blend_1 }; Alloc param_71 = cmd_alloc; CmdRef param_72 = cmd_ref; - CmdEndClip param_73 = _1933; + CmdEndClip param_73 = _1928; Cmd_EndClip_write(param_71, param_72, param_73); cmd_ref.offset += 8u; break; @@ -1095,17 +1086,17 @@ void comp_main() break; } } - bool _1980 = (bin_tile_x + tile_x) < _854.Load(8); - bool _1989; - if (_1980) + bool _1975 = (bin_tile_x + tile_x) < _854.Load(8); + bool _1984; + if (_1975) { - _1989 = (bin_tile_y + tile_y) < _854.Load(12); + _1984 = (bin_tile_y + tile_y) < _854.Load(12); } else { - _1989 = _1980; + _1984 = _1975; } - if (_1989) + if (_1984) { Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.msl b/piet-gpu/shader/gen/coarse.msl index 29174f3..4226352 100644 --- a/piet-gpu/shader/gen/coarse.msl +++ b/piet-gpu/shader/gen/coarse.msl @@ -874,22 +874,13 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M { _1551 = _1542; } - bool _1558; - if (!_1551) - { - _1558 = is_clip && is_blend; - } - else - { - _1558 = _1551; - } - include_tile = _1558; + include_tile = _1551 || is_blend; } if (include_tile) { uint el_slice = el_ix / 32u; uint el_mask = 1u << (el_ix & 31u); - uint _1578 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); + uint _1573 = atomic_fetch_or_explicit((threadgroup atomic_uint*)&sh_bitmaps[el_slice][(y * 16u) + x], el_mask, memory_order_relaxed); } } threadgroup_barrier(mem_flags::mem_threadgroup); @@ -934,11 +925,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_29 = cmd_alloc; CmdRef param_30 = cmd_ref; uint param_31 = cmd_limit; - bool _1702 = alloc_cmd(param_29, param_30, param_31, v_242, v_242BufferSize); + bool _1697 = alloc_cmd(param_29, param_30, param_31, v_242, v_242BufferSize); cmd_alloc = param_29; cmd_ref = param_30; cmd_limit = param_31; - if (!_1702) + if (!_1697) { break; } @@ -961,11 +952,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_39 = cmd_alloc; CmdRef param_40 = cmd_ref; uint param_41 = cmd_limit; - bool _1743 = alloc_cmd(param_39, param_40, param_41, v_242, v_242BufferSize); + bool _1738 = alloc_cmd(param_39, param_40, param_41, v_242, v_242BufferSize); cmd_alloc = param_39; cmd_ref = param_40; cmd_limit = param_41; - if (!_1743) + if (!_1738) { break; } @@ -993,11 +984,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_49 = cmd_alloc; CmdRef param_50 = cmd_ref; uint param_51 = cmd_limit; - bool _1811 = alloc_cmd(param_49, param_50, param_51, v_242, v_242BufferSize); + bool _1806 = alloc_cmd(param_49, param_50, param_51, v_242, v_242BufferSize); cmd_alloc = param_49; cmd_ref = param_50; cmd_limit = param_51; - if (!_1811) + if (!_1806) { break; } @@ -1019,17 +1010,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M } case 5u: { - bool _1864 = tile_1.tile.offset == 0u; - bool _1870; - if (_1864) + bool _1859 = tile_1.tile.offset == 0u; + bool _1865; + if (_1859) { - _1870 = tile_1.backdrop == 0; + _1865 = tile_1.backdrop == 0; } else { - _1870 = _1864; + _1865 = _1859; } - if (_1870) + if (_1865) { clip_zero_depth = clip_depth + 1u; } @@ -1038,11 +1029,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_59 = cmd_alloc; CmdRef param_60 = cmd_ref; uint param_61 = cmd_limit; - bool _1882 = alloc_cmd(param_59, param_60, param_61, v_242, v_242BufferSize); + bool _1877 = alloc_cmd(param_59, param_60, param_61, v_242, v_242BufferSize); cmd_alloc = param_59; cmd_ref = param_60; cmd_limit = param_61; - if (!_1882) + if (!_1877) { break; } @@ -1060,11 +1051,11 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M Alloc param_64 = cmd_alloc; CmdRef param_65 = cmd_ref; uint param_66 = cmd_limit; - bool _1910 = alloc_cmd(param_64, param_65, param_66, v_242, v_242BufferSize); + bool _1905 = alloc_cmd(param_64, param_65, param_66, v_242, v_242BufferSize); cmd_alloc = param_64; cmd_ref = param_65; cmd_limit = param_66; - if (!_1910) + if (!_1905) { break; } @@ -1112,17 +1103,17 @@ kernel void main0(constant uint* spvBufferSizeConstants [[buffer(25)]], device M break; } } - bool _1980 = (bin_tile_x + tile_x) < _854.conf.width_in_tiles; - bool _1989; - if (_1980) + bool _1975 = (bin_tile_x + tile_x) < _854.conf.width_in_tiles; + bool _1984; + if (_1975) { - _1989 = (bin_tile_y + tile_y) < _854.conf.height_in_tiles; + _1984 = (bin_tile_y + tile_y) < _854.conf.height_in_tiles; } else { - _1989 = _1980; + _1984 = _1975; } - if (_1989) + if (_1984) { Alloc param_74 = cmd_alloc; CmdRef param_75 = cmd_ref; diff --git a/piet-gpu/shader/gen/coarse.spv b/piet-gpu/shader/gen/coarse.spv index d246506f188134063483dd02d569b3f612a658a5..b85fd8cd546262ba315eca88fc6be6357bb82392 100644 GIT binary patch delta 10019 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