From 3b4a72deb9abc5665cb725bb43fa330b062f4581 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 20 Apr 2021 10:14:04 +0200 Subject: [PATCH 1/3] elements.comp: remove redundant assignment The assignment was made redundant by eb86456f31b792a128c4a554fec134451432f854. Signed-off-by: Elias Naur --- piet-gpu/shader/elements.comp | 1 - piet-gpu/shader/elements.spv | Bin 71120 -> 71052 bytes 2 files changed, 1 deletion(-) diff --git a/piet-gpu/shader/elements.comp b/piet-gpu/shader/elements.comp index 56ad6e2..5b5f54b 100644 --- a/piet-gpu/shader/elements.comp +++ b/piet-gpu/shader/elements.comp @@ -392,7 +392,6 @@ void main() { vec2 lw = get_linewidth(st); anno_begin_clip.linewidth = st.linewidth * sqrt(abs(st.mat.x * st.mat.w - st.mat.y * st.mat.z)); } else { - anno_begin_clip.bbox = begin_clip.bbox; anno_fill.linewidth = 0.0; } out_ref = AnnotatedRef(conf.anno_alloc.offset + (st.path_count - 1) * Annotated_size); diff --git a/piet-gpu/shader/elements.spv b/piet-gpu/shader/elements.spv index 6bd53b3ec06e76cc0bb53bf1053246fa7bb70323..6a50c7e080c3c495c0aa6674214366c135dbc4ac 100644 GIT binary patch delta 1783 zcmZ9M%S%;Z6vg-TKGbX12nh=Z5!ECsFba|$WV3>xhKYvh};39rt?SaMoJ;`}W@7UiW-`M-%&wCNlA&S;b~COIwMR zAIp^0G+juWZEt98*kWc$OW2hO{MrQGTfmccQ@m;GruxRsE!&kMm*ZB!nw0g2?KPFb zvjR0?uP5-K0-m%F;%%)BTX!^XYaQ<{Y2RF{Z*6Lhs*M%wOIV_;@IATx+s>( z-d?mVGxNLllxlyqPMp&Fm-sZj=ZTe;m}Rm}s~U>~hNF4eQZ4Jzo8dTTJHv5)LY(0^ z-&16{;W)2SoWVFhDc+yQRn-`g$9v2+=4Rvq8<>&vQE_JEd{~_MI42>qaZa4sIA?z< zdt}Ydg;Q(PYnPTz*3%d>TVZkQ3ftRf#Ja;nLDiI#(!2H4$zINVD!j3yqUE%dQ+jqu zWr$~l(dH||?npZ;j=oymbVS-YaWWEHr^#N>-t)rfR9>bxyiQs7t6WdGwyiR_D5Xcw z`Y6jKVKjc;*JW`$tBKA4XWjCs%2i>qQw1;K#OVII@Jdx9hOcm9#}(^K+X6c%fgmPJ zuv&dXnw#Aa9?+Y@BxQ4NSQ=CXw}lo*DX|`2tM)f&^&R28dZUw-?+A^fG%D>~VKk0H z8|$_9o;W%~>lVK+jK+TcO7J@QJ6C%K(iR>LrcZewP5A$a26NUulrpHtt$QSlmT%o- zarAuao`{o?m|OQ$7@aN{F5Inqp0nBPnu zTCr80DlLg6N26wKiT1=^GYebDuFb6Vd!y?YL0mobW=8D}*A&W)+#_#^$0F;z%!Bqp%T;h~qHR5y#;(!ieMW z;R5r-akyH3gmL(s@OTbZRYM}@A2HkMY2*kdppnC~!f531v@rTOOhUAA7(d!L%=}2^ zB#q`3Gc|>u>h`1L=nD#eu=} zy3Xp#^Wq2nSkxLy-|VQ`eL>8S{$6E3`irvR>XhM-&kYO1Z`K}qd~QUTjQF;yAH$k^ zNj5wyTdNTqSJq=HHY-X}3o(aqIjl*JYEPDx3f? zK30EI_68-v$7ulLJ1yVssHHsdaB?(6Sc7h!bhA6MCp1!+q)aAeR^IJOIHPf!Mv^U3 z+ynVm`Gq(};0A4AhkOrZAJGU;E$$>-+%{#qI3WPZ4oTRk;77vnXn9unv1~XJa4x}d z9hT*q^Tg}tQ!!6GHmlpD*Ux8SCiT01K9>!b+s_xm@VWhbDNIIuuAi@D!?Oky2fKbw zdHsANW=g;7=Udrue6FAGgtY}Zd7Auv8v_#~U%vjQ#~xIrq=vd>W~ zvu83$&cu)DlRed`ud?dYnOt$diGycJ2?_Y!kKvk7YMHY95C^|iF*CwHWit<+^4x7W z*MwQw2mLy{Uw*xmcMgAvAi!zxTQ-Y26wDUnto{)P?>hBYHe7C}{t3hLAiA4pdNjz7 zk52tmu7EiB^_B{HuMUK3RZw>BO4)HriwTLx=b9Im4aeseUMS3~<(da3jvN#&mdz`N zLcC_ht9>UDMr9)#PM&?R>t2cMImLKSqU=bzv$wXUOjeDS=Jr}H4Cmf6eC3(Z-l60F E0W-}N{r~^~ From d9d518b248402c7c98b7cc5ae014615b580e1fa3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 12 Apr 2021 14:41:03 +0200 Subject: [PATCH 2/3] avoid non-uniform barrier control flow when exhausting memory The compute shaders have a check for the succesful completion of their preceding stage. However, consider a shader execution path like the following: void main() if (mem_error != NO_ERROR) { return; } ... malloc(...); ... barrier(); ... } and shader execution that fails to allocate memory, thereby setting mem_error to ERR_MALLOC_FAILED in malloc before reaching the barrier. If another shader execution then begins execution, its mem_eror check will make it return early and not reach the barrier. All GPU APIs require (dynamically) uniform control flow for barriers, and the above case may lead to GPU hangs in practice. Fix this issue by replacing the early exits with careful checks that don't interrupt barrier control flow. Unfortunately, it's harder to prove the soundness of the new checks, so this change also clears dynamic memory ranges in MEM_DEBUG mode when memory is exhausted. The result is that accessing memory after exhaustion triggers an error. Signed-off-by: Elias Naur --- piet-gpu/shader/backdrop.comp | 9 +++------ piet-gpu/shader/backdrop.spv | Bin 11680 -> 11824 bytes piet-gpu/shader/binning.comp | 8 ++------ piet-gpu/shader/binning.spv | Bin 15756 -> 15988 bytes piet-gpu/shader/coarse.comp | 31 ++++++++++++++----------------- piet-gpu/shader/coarse.spv | Bin 56952 -> 57588 bytes piet-gpu/shader/elements.comp | 4 ---- piet-gpu/shader/elements.spv | Bin 71052 -> 70948 bytes piet-gpu/shader/kernel4.comp | 11 ++++------- piet-gpu/shader/kernel4.spv | Bin 36004 -> 36080 bytes piet-gpu/shader/kernel4_idx.spv | Bin 36108 -> 36184 bytes piet-gpu/shader/mem.h | 19 ++++++++++++------- piet-gpu/shader/path_coarse.comp | 9 +++------ piet-gpu/shader/path_coarse.spv | Bin 42804 -> 43040 bytes piet-gpu/shader/tile_alloc.comp | 6 +----- piet-gpu/shader/tile_alloc.spv | Bin 14704 -> 14764 bytes 16 files changed, 39 insertions(+), 58 deletions(-) diff --git a/piet-gpu/shader/backdrop.comp b/piet-gpu/shader/backdrop.comp index b640d14..12ae5b1 100644 --- a/piet-gpu/shader/backdrop.comp +++ b/piet-gpu/shader/backdrop.comp @@ -35,16 +35,13 @@ shared Alloc sh_row_alloc[BACKDROP_WG]; shared uint sh_row_width[BACKDROP_WG]; void main() { - if (mem_error != NO_ERROR) { - return; - } - uint th_ix = gl_LocalInvocationID.x; 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 (element_ix < conf.n_elements) { AnnotatedTag tag = Annotated_tag(conf.anno_alloc, ref); switch (tag.tag) { @@ -67,7 +64,7 @@ void main() { // 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); + 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; } } @@ -95,7 +92,7 @@ void main() { } } uint width = sh_row_width[el_ix]; - if (width > 0) { + if (width > 0 && mem_ok) { // Process one row sequentially // Read backdrop value per tile and prefix sum it Alloc tiles_alloc = sh_row_alloc[el_ix]; diff --git a/piet-gpu/shader/backdrop.spv b/piet-gpu/shader/backdrop.spv index 26aeb4c052b79c9b0757e2c832a45712534e4db5..4b5ffdddaeb949f5a3f376ec0571653e9471436a 100644 GIT binary patch literal 11824 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

AXY0`$khO^S zrm@zh&A9wrcsKPSK8GXGyZH&*lOqu4Ux1E&T?EeiwXus=6OaDA9&S$SaI8FPe*@S# z^qEH<{ks@!{~V()`u9e#KKpkG+Qb zpY^#edH4pw+MGiiXVShdM0}1!?5q7c3bBr((UD^)*}t8B^ESh^4I}22N8ZKYrHIe5 zNbJ{f2_J)Af;h+V=s3@pf@8mYw^|w3ep%x2E;r!jIUR{QN5R_Tx48+{<{2|)HhK$U zE%wSe;M1& literal 11680 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 literal 15756 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 diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 76d7fc6..731da97 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -56,7 +56,7 @@ void write_tile_alloc(uint el_ix, Alloc a) { sh_tile_alloc[el_ix] = a; } -Alloc read_tile_alloc(uint el_ix) { +Alloc read_tile_alloc(uint el_ix, bool mem_ok) { return sh_tile_alloc[el_ix]; } #else @@ -64,9 +64,9 @@ void write_tile_alloc(uint el_ix, Alloc a) { // No-op } -Alloc read_tile_alloc(uint el_ix) { +Alloc read_tile_alloc(uint el_ix, bool mem_ok) { // All memory. - return new_alloc(0, memory.length()*4); + return new_alloc(0, memory.length()*4, mem_ok); } #endif @@ -109,10 +109,6 @@ void write_fill(Alloc alloc, inout CmdRef cmd_ref, uint flags, Tile tile, float } void main() { - if (mem_error != NO_ERROR) { - return; - } - // Could use either linear or 2d layouts for both dispatch and // invocations within the workgroup. We'll use variables to abstract. uint width_in_bins = (conf.width_in_tiles + N_TILE_X - 1)/N_TILE_X; @@ -158,6 +154,7 @@ void main() { uint num_begin_slots = 0; uint begin_slot = 0; + bool mem_ok = mem_error == NO_ERROR; while (true) { for (uint i = 0; i < N_SLICE; i++) { sh_bitmaps[i][th_ix] = 0; @@ -172,7 +169,7 @@ void main() { uint in_ix = (conf.bin_alloc.offset >> 2) + ((partition_ix + th_ix) * N_TILE + bin_ix) * 2; count = read_mem(conf.bin_alloc, in_ix); uint offset = read_mem(conf.bin_alloc, in_ix + 1); - sh_part_elements[th_ix] = new_alloc(offset, count*BinInstance_size); + sh_part_elements[th_ix] = new_alloc(offset, count*BinInstance_size, mem_ok); } // prefix sum of counts for (uint i = 0; i < LG_N_PART_READ; i++) { @@ -196,7 +193,7 @@ void main() { } // use binary search to find element to read uint ix = rd_ix + th_ix; - if (ix >= wr_ix && ix < ready_ix) { + if (ix >= wr_ix && ix < ready_ix && mem_ok) { uint part_ix = 0; for (uint i = 0; i < LG_N_PART_READ; i++) { uint probe = part_ix + ((N_PART_READ / 2) >> i); @@ -253,7 +250,7 @@ void main() { // base relative to bin uint base = path.tiles.offset - uint(dy * stride + dx) * Tile_size; sh_tile_base[th_ix] = base; - Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size); + Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size, mem_ok); write_tile_alloc(th_ix, path_alloc); break; default: @@ -288,11 +285,11 @@ void main() { 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; + bool include_tile = false; if (tag == Annotated_BeginClip || tag == Annotated_EndClip) { include_tile = true; - } else { - Tile tile = Tile_read(read_tile_alloc(el_ix), TileRef(sh_tile_base[el_ix] + (sh_tile_stride[el_ix] * y + x) * Tile_size)); + } else 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)); // Include the path in the tile if // - the tile contains at least a segment (tile offset non-zero) // - the tile is completely covered (backdrop non-zero) @@ -311,7 +308,7 @@ void main() { // through the non-segment elements. uint slice_ix = 0; uint bitmap = sh_bitmaps[0][th_ix]; - while (true) { + while (mem_ok) { if (bitmap == 0) { slice_ix++; if (slice_ix == N_SLICE) { @@ -337,7 +334,7 @@ void main() { if (clip_zero_depth == 0) { switch (tag.tag) { case Annotated_Color: - Tile tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + 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); if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { @@ -348,7 +345,7 @@ void main() { cmd_ref.offset += 4 + CmdColor_size; break; case Annotated_Image: - tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + 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); if (!alloc_cmd(cmd_alloc, cmd_ref, cmd_limit)) { @@ -359,7 +356,7 @@ void main() { cmd_ref.offset += 4 + CmdImage_size; break; case Annotated_BeginClip: - tile = Tile_read(read_tile_alloc(element_ref_ix), TileRef(sh_tile_base[element_ref_ix] + 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)); if (tile.tile.offset == 0 && tile.backdrop == 0) { clip_zero_depth = clip_depth + 1; diff --git a/piet-gpu/shader/coarse.spv b/piet-gpu/shader/coarse.spv index 7d0b629ab65764bf26e6147c0dd8e4de7547947f..5570675da63893e21c5db0bbe1ee5128bd9c62b0 100644 GIT binary patch literal 57588 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 delta 19365 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 diff --git a/piet-gpu/shader/kernel4.comp b/piet-gpu/shader/kernel4.comp index 1d706a6..ea05228 100644 --- a/piet-gpu/shader/kernel4.comp +++ b/piet-gpu/shader/kernel4.comp @@ -85,10 +85,6 @@ vec4[CHUNK] fillImage(uvec2 xy, CmdImage cmd_img) { } void main() { - if (mem_error != NO_ERROR) { - return; - } - uint tile_ix = gl_WorkGroupID.y * conf.width_in_tiles + gl_WorkGroupID.x; Alloc cmd_alloc = slice_mem(conf.ptcl_alloc, tile_ix * PTCL_INITIAL_ALLOC, PTCL_INITIAL_ALLOC); CmdRef cmd_ref = CmdRef(cmd_alloc.offset); @@ -118,7 +114,8 @@ void main() { float area[CHUNK]; uint clip_depth = 0; - while (true) { + bool mem_ok = mem_error == NO_ERROR; + while (mem_ok) { uint tag = Cmd_tag(cmd_alloc, cmd_ref).tag; if (tag == Cmd_End) { break; @@ -131,7 +128,7 @@ void main() { for (uint k = 0; k < CHUNK; k++) df[k] = 1e9; TileSegRef tile_seg_ref = TileSegRef(stroke.tile_ref); do { - TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size), tile_seg_ref); + TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size, mem_ok), tile_seg_ref); vec2 line_vec = seg.vector; for (uint k = 0; k < CHUNK; k++) { vec2 dpos = xy + vec2(0.5, 0.5) - seg.origin; @@ -152,7 +149,7 @@ void main() { tile_seg_ref = TileSegRef(fill.tile_ref); // Calculate coverage based on backdrop + coverage of each line segment do { - TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size), tile_seg_ref); + TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size, mem_ok), tile_seg_ref); for (uint k = 0; k < CHUNK; k++) { vec2 my_xy = xy + vec2(chunk_offset(k)); vec2 start = seg.origin - my_xy; diff --git a/piet-gpu/shader/kernel4.spv b/piet-gpu/shader/kernel4.spv index bd14134b21b0bb358a17105629fa1d408172943f..077640e7152e374d479a96b8a0dfdd281f26c3b5 100644 GIT binary patch literal 36080 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 literal 36004 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 diff --git a/piet-gpu/shader/kernel4_idx.spv b/piet-gpu/shader/kernel4_idx.spv index 044367882eb8de8ba9f3a26973cf1a9891acd28a..e2aa98470ca022c5342c835515296d578fddd675 100644 GIT binary patch literal 36184 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

  • etd?^}z7oY)#ulgTnqb?ye|@%D8|?d! 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 memory.length() * 4) { - r.failed = true; + r.failed = offset + size > memory.length() * 4; + r.alloc = new_alloc(offset, size, !r.failed); + if (r.failed) { atomicMax(mem_error, ERR_MALLOC_FAILED); return r; } @@ -119,8 +122,10 @@ Alloc slice_mem(Alloc a, uint offset, uint size) { // but never written. return Alloc(0, 0); } + return Alloc(a.offset + offset, size); +#else + return Alloc(a.offset + offset); #endif - return new_alloc(a.offset + offset, size); } // alloc_write writes alloc to memory at offset bytes. diff --git a/piet-gpu/shader/path_coarse.comp b/piet-gpu/shader/path_coarse.comp index 51264bf..147c8a5 100644 --- a/piet-gpu/shader/path_coarse.comp +++ b/piet-gpu/shader/path_coarse.comp @@ -87,10 +87,6 @@ SubdivResult estimate_subdiv(vec2 p0, vec2 p1, vec2 p2, float sqrt_tol) { } void main() { - if (mem_error != NO_ERROR) { - return; - } - uint element_ix = gl_GlobalInvocationID.x; PathSegRef ref = PathSegRef(conf.pathseg_alloc.offset + element_ix * PathSeg_size); @@ -98,6 +94,7 @@ void main() { if (element_ix < conf.n_pathseg) { tag = PathSeg_tag(conf.pathseg_alloc, ref); } + bool mem_ok = mem_error == NO_ERROR; switch (tag.tag) { case PathSeg_Cubic: PathCubic cubic = PathSeg_Cubic_read(conf.pathseg_alloc, ref); @@ -135,7 +132,7 @@ void main() { bool is_stroke = fill_mode_from_flags(tag.flags) == MODE_STROKE; uint path_ix = cubic.path_ix; Path path = Path_read(conf.tile_alloc, PathRef(conf.tile_alloc.offset + path_ix * Path_size)); - Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size); + Alloc path_alloc = new_alloc(path.tiles.offset, (path.bbox.z - path.bbox.x) * (path.bbox.w - path.bbox.y) * Tile_size, mem_ok); ivec4 bbox = ivec4(path.bbox); vec2 p0 = cubic.p0; qp0 = cubic.p0; @@ -195,7 +192,7 @@ void main() { uint n_tile_alloc = uint((x1 - x0) * (y1 - y0)); // Consider using subgroups to aggregate atomic add. MallocResult tile_alloc = malloc(n_tile_alloc * TileSeg_size); - if (tile_alloc.failed) { + if (tile_alloc.failed || !mem_ok) { return; } uint tile_offset = tile_alloc.alloc.offset; diff --git a/piet-gpu/shader/path_coarse.spv b/piet-gpu/shader/path_coarse.spv index b4cd985aaeeea5b51864b9168b1465fec8216d4d..08d61a4c18edb959915940955b08ce509c202f96 100644 GIT binary patch literal 43040 zcmai-2Y_8w*|jgsBvk3WhTeOZPJmEC?+6T&WD)|COh_gnbV3QBg7n^{iHI~2kq!n# z1e9K-NEJkS6ZoI!-m{XO^YeY*)y-aOz3+bayUW?<+%uD;ZQ3QKYc!^5%-EQ|@kZZ9 z^D}#6T9ig(rbgdpJz(H216Ll?J7ncG*IHGFSsHCkKYeD!rw?^IWkl!jks4;iJR7>& z?38{KeJySLZ(8d6A?@@!U|`399d;NnaEp$?qegX%={>Z&tD}4P$gYkd!$)@w?j1g^ zOTXz0zu_YXcaI%XI`qM#>|Z`3eQes@-7}cl4CQ`$h7KLm)!RUsj@%oKkzI#$bn3V4 z*wxnO|ASUrA6t84=Ba$!8$W`N8Gabq*tVTHV7y%;I(iP0_ic`IyJn!ByT**|riWI) zj^9tyL~Sl=&c)Eq;oV(BY~QCb7ktFzL|T2!i8iIr85;}0dwa$XKA?l1mmSkPdhFod zl{Pi`mBy~t%)ZrbKK#<3xy}!tGVYlg{osd;9^TvaKgMAq@UiW})Mczi;8S9?H5P@B z>+HsN#>P_M(OsQG{>QM`jkyGM8FNYal$bL#mV*x+-re0XqK9=JI=W{>$I$N1VPjk( zOwAa}>Z91?eH$xK@7URUK>x9Wh7aDkYbdli*Xn+z#P8Es1wPpq>`qnlGm0G^?i!6+ zZ3=haj#_;R_bM2*hP)NiJvfRSI);x&>)VX!wb47ebL1FBKJoQZV+DH-Vn?|n2s0(8 z4rlTIU*KxRC#TLZn+tE;K3rF%+UTq>X|fhW(fc&k0^4Ypu3^oYF$Xn2<-Du|ul#oH z9M&4Anx9?-+sT`Ick(Mqj{}|lLdG^L8Ma<@!{@-&_ zh9=Xt#zsZ#jVH%$Z)^tMl}pdba7=PPQ|4l(#sIiJ9m7Ws=^CFQRjsC6Zq0tSz_*om zdt*y*vkA3(eQRpxCVk2MOzEq=F%Yhgy7|cc3>wrkdC#ah@4e*I+VitCc7)sR|DGCp zuXc*_vOVoG=R1H~x%X-840eR&K2h^i=DRDr@@wWR_tP_a_%QDPjzP_Q$8m`FjGm%- z4ISFiHDnn3K7L+DBfG};Qqgju#@^Ib{Ep^1mFb^y)>W6nlx&;Bn_69I+|bpVW$0=v zO>L>B!_&n1*n|EuAA5pZ^U>DW3!L+1A9M0L9@;Z{L^VO?ukL5c{Pb;fz)N54o+;{n zMs)VVTYk+oHEwrjFH=IqIU3%x%J%>J`j(zkud`#yxCVh+w-4esL5?l^cX#|*Qy ze#+45+;3~R89fV~pW$K-7x95&4i_=EzJ`nD*>By9IoJbus-OmM2DVL)?W?$>#8upb z#Z_FkOY>aS-}z4;UJRY1Mvd+n-!ZClbmyR+?oKYx-mYPzJG+-{rQXcz5d8G*!xPNm zKiFp654JmOa=X5bBf-0j9W-S4xblA9-qbNQ?|H7Ney(9BV+wbVcQ(f|W8*k**O=bn zta(?*m}bDKCdafL=h66OUXBr0^D;r)jMb-cEO^YpqkB7gdtAb1yA!BeYuw&A1w3UR zwl{tO->z#!&*($Vt#6YfwVqq5=b-40!RMK-(WAXw@$S>~cP!}580L98+>iKtYJEND zuBCQSMpXQ|8o$2A@2c^8YW$HJe{?F|)_4*=j$$6KPGxClwl}8XP%Y=O4UYfhHSJro zPhaCRw)`ir>5ppmS!;aumjC24Xs()lo*JL8Enmja $`4S;|=hTPGj_GyaR6D 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 literal 42804 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 diff --git a/piet-gpu/shader/tile_alloc.comp b/piet-gpu/shader/tile_alloc.comp index 3a6e4ee..973ec14 100644 --- a/piet-gpu/shader/tile_alloc.comp +++ b/piet-gpu/shader/tile_alloc.comp @@ -28,10 +28,6 @@ shared uint sh_tile_count[TILE_ALLOC_WG]; shared MallocResult sh_tile_alloc; void main() { - if (mem_error != NO_ERROR) { - return; - } - uint th_ix = gl_LocalInvocationID.x; uint element_ix = gl_GlobalInvocationID.x; PathRef path_ref = PathRef(conf.tile_alloc.offset + element_ix * Path_size); @@ -86,7 +82,7 @@ void main() { } barrier(); MallocResult alloc_start = sh_tile_alloc; - if (alloc_start.failed) { + if (alloc_start.failed || mem_error != NO_ERROR) { return; } diff --git a/piet-gpu/shader/tile_alloc.spv b/piet-gpu/shader/tile_alloc.spv index 6d375bdedf491f0d7a1768645f350d5623638233..4a39f9681edd50628c16a2a020454641fdf51f1f 100644 GIT binary patch literal 14764 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 LSAXi`JHh_}jAI{$ From 4b59525e1f7a0d0bb42538af4803faf6dde97f69 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 19 Apr 2021 18:56:57 +0200 Subject: [PATCH 3/3] use mediump precision for kernel4 colors and areas Improves kernel4 performance for a Gio scene from ~22ms to ~15ms. Updates #83 Signed-off-by: Elias Naur --- piet-gpu/shader/kernel4.comp | 55 ++++++++++++++++---------------- piet-gpu/shader/kernel4.spv | Bin 36080 -> 37584 bytes piet-gpu/shader/kernel4_idx.spv | Bin 36184 -> 37688 bytes 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/piet-gpu/shader/kernel4.comp b/piet-gpu/shader/kernel4.comp index ea05228..c613b72 100644 --- a/piet-gpu/shader/kernel4.comp +++ b/piet-gpu/shader/kernel4.comp @@ -22,45 +22,45 @@ #define CHUNK_DY (TILE_HEIGHT_PX / CHUNK_Y) layout(local_size_x = CHUNK_DX, local_size_y = CHUNK_DY) in; -layout(set = 0, binding = 1) readonly buffer ConfigBuf { +layout(set = 0, binding = 1) restrict readonly buffer ConfigBuf { Config conf; }; -layout(rgba8, set = 0, binding = 2) uniform writeonly image2D image; +layout(rgba8, set = 0, binding = 2) uniform restrict writeonly image2D image; #ifdef ENABLE_IMAGE_INDICES -layout(rgba8, set = 0, binding = 3) uniform readonly image2D images[]; +layout(rgba8, set = 0, binding = 3) uniform restrict readonly image2D images[]; #else -layout(rgba8, set = 0, binding = 3) uniform readonly image2D images[1]; +layout(rgba8, set = 0, binding = 3) uniform restrict readonly image2D images[1]; #endif #include "ptcl.h" #include "tile.h" -vec3 tosRGB(vec3 rgb) { +mediump vec3 tosRGB(mediump vec3 rgb) { bvec3 cutoff = greaterThanEqual(rgb, vec3(0.0031308)); - vec3 below = vec3(12.92)*rgb; - vec3 above = vec3(1.055)*pow(rgb, vec3(0.41666)) - vec3(0.055); + mediump vec3 below = vec3(12.92)*rgb; + mediump vec3 above = vec3(1.055)*pow(rgb, vec3(0.41666)) - vec3(0.055); return mix(below, above, cutoff); } -vec3 fromsRGB(vec3 srgb) { +mediump vec3 fromsRGB(mediump vec3 srgb) { // Formula from EXT_sRGB. bvec3 cutoff = greaterThanEqual(srgb, vec3(0.04045)); - vec3 below = srgb/vec3(12.92); - vec3 above = pow((srgb + vec3(0.055))/vec3(1.055), vec3(2.4)); + mediump vec3 below = srgb/vec3(12.92); + mediump vec3 above = pow((srgb + vec3(0.055))/vec3(1.055), vec3(2.4)); return mix(below, above, cutoff); } // unpacksRGB unpacks a color in the sRGB color space to a vec4 in the linear color // space. -vec4 unpacksRGB(uint srgba) { - vec4 color = unpackUnorm4x8(srgba).wzyx; +mediump vec4 unpacksRGB(uint srgba) { + mediump vec4 color = unpackUnorm4x8(srgba).wzyx; return vec4(fromsRGB(color.rgb), color.a); } // packsRGB packs a color in the linear color space into its 8-bit sRGB equivalent. -uint packsRGB(vec4 rgba) { +uint packsRGB(mediump vec4 rgba) { rgba = vec4(tosRGB(rgba.rgb), rgba.a); return packUnorm4x8(rgba.wzyx); } @@ -69,14 +69,15 @@ uvec2 chunk_offset(uint i) { return uvec2(i % CHUNK_X * CHUNK_DX, i / CHUNK_X * CHUNK_DY); } -vec4[CHUNK] fillImage(uvec2 xy, CmdImage cmd_img) { - vec4 rgba[CHUNK]; +mediump vec4[CHUNK] fillImage(uvec2 xy, CmdImage cmd_img) { + mediump vec4 rgba[CHUNK]; for (uint i = 0; i < CHUNK; i++) { ivec2 uv = ivec2(xy + chunk_offset(i)) + cmd_img.offset; + mediump vec4 fg_rgba; #ifdef ENABLE_IMAGE_INDICES - vec4 fg_rgba = imageLoad(images[cmd_img.index], uv); + fg_rgba = imageLoad(images[cmd_img.index], uv); #else - vec4 fg_rgba = imageLoad(images[0], uv); + fg_rgba = imageLoad(images[0], uv); #endif fg_rgba.rgb = fromsRGB(fg_rgba.rgb); rgba[i] = fg_rgba; @@ -95,7 +96,7 @@ void main() { uvec2 xy_uint = uvec2(gl_LocalInvocationID.x + TILE_WIDTH_PX * gl_WorkGroupID.x, gl_LocalInvocationID.y + TILE_HEIGHT_PX * gl_WorkGroupID.y); vec2 xy = vec2(xy_uint); - vec4 rgba[CHUNK]; + mediump vec4 rgba[CHUNK]; for (uint i = 0; i < CHUNK; i++) { rgba[i] = vec4(0.0); // TODO: remove this debug image support when the actual image method is plumbed. @@ -112,7 +113,7 @@ void main() { #endif } - float area[CHUNK]; + mediump float area[CHUNK]; uint clip_depth = 0; bool mem_ok = mem_error == NO_ERROR; while (mem_ok) { @@ -124,7 +125,7 @@ void main() { case Cmd_Stroke: // Calculate distance field from all the line segments in this tile. CmdStroke stroke = Cmd_Stroke_read(cmd_alloc, cmd_ref); - float df[CHUNK]; + mediump float df[CHUNK]; for (uint k = 0; k < CHUNK; k++) df[k] = 1e9; TileSegRef tile_seg_ref = TileSegRef(stroke.tile_ref); do { @@ -190,18 +191,18 @@ void main() { break; case Cmd_Color: CmdColor color = Cmd_Color_read(cmd_alloc, cmd_ref); - vec4 fg = unpacksRGB(color.rgba_color); + mediump vec4 fg = unpacksRGB(color.rgba_color); for (uint k = 0; k < CHUNK; k++) { - vec4 fg_k = fg * area[k]; + mediump vec4 fg_k = fg * area[k]; rgba[k] = rgba[k] * (1.0 - fg_k.a) + fg_k; } cmd_ref.offset += 4 + CmdColor_size; break; case Cmd_Image: CmdImage fill_img = Cmd_Image_read(cmd_alloc, cmd_ref); - vec4 img[CHUNK] = fillImage(xy_uint, fill_img); + mediump vec4 img[CHUNK] = fillImage(xy_uint, fill_img); for (uint k = 0; k < CHUNK; k++) { - vec4 fg_k = img[k] * area[k]; + mediump vec4 fg_k = img[k] * area[k]; rgba[k] = rgba[k] * (1.0 - fg_k.a) + fg_k; } cmd_ref.offset += 4 + CmdImage_size; @@ -212,7 +213,7 @@ void main() { for (uint k = 0; k < CHUNK; k++) { uvec2 offset = chunk_offset(k); uint srgb = packsRGB(vec4(rgba[k])); - float alpha = clamp(abs(area[k]), 0.0, 1.0); + mediump float alpha = clamp(abs(area[k]), 0.0, 1.0); write_mem(scratch_alloc, base_ix + 0 + CLIP_STATE_SIZE * (offset.x + offset.y * TILE_WIDTH_PX), srgb); write_mem(scratch_alloc, base_ix + 1 + CLIP_STATE_SIZE * (offset.x + offset.y * TILE_WIDTH_PX), floatBitsToUint(alpha)); rgba[k] = vec4(0.0); @@ -228,8 +229,8 @@ void main() { uvec2 offset = chunk_offset(k); uint srgb = read_mem(scratch_alloc, base_ix + 0 + CLIP_STATE_SIZE * (offset.x + offset.y * TILE_WIDTH_PX)); uint alpha = read_mem(scratch_alloc, base_ix + 1 + CLIP_STATE_SIZE * (offset.x + offset.y * TILE_WIDTH_PX)); - vec4 bg = unpacksRGB(srgb); - vec4 fg = rgba[k] * area[k] * uintBitsToFloat(alpha); + mediump vec4 bg = unpacksRGB(srgb); + mediump vec4 fg = rgba[k] * area[k] * uintBitsToFloat(alpha); rgba[k] = bg * (1.0 - fg.a) + fg; } cmd_ref.offset += 4; diff --git a/piet-gpu/shader/kernel4.spv b/piet-gpu/shader/kernel4.spv index 077640e7152e374d479a96b8a0dfdd281f26c3b5..3e8849421bbf8d7eff0607ce84765fa4ab90e61c 100644 GIT binary patch delta 1522 zcmYk++baZN9LDi6W3`2=yZgPFHReg>kc4hg|HSwpA;~ z pZrZ9(ydgSTfup?DEc}>$CpY<7SLRTCWE{SRZ{S0NMZ0r2_Do0GdfP#1-HPha2wnKcfwt;8}8Aq{I9+jK_A=?55R-)5IhWf;1PHf_R22f?8gv{ z!#>y#Pr%Ev`eQBiSmLL-u0>gKZ(~>x-hp@F5WEkEh1J}g-z1BgYV&G^`-9YOG8W>4 z=iw#z7%opXo^`-(xEt;fP89AYf^B#oK7hmU5gdU};8XYvR?gA6fFIyT_!)kIU*R|S z9sYnnb?b#2L+}NE!*YtTy=FKKPKPt#Ot=`HN)h|7HSzD5K`;vk;01UQUV>NPRd@|v pPuQ$YydgTO-&WF+DEu?+PImmWqKTo}$ZPlpzJ>3Fqe0u#0NMYzrUKZS0lhPV^la?JO0T`1V9{ZChA6AnFA|?SDvvnfFa4BaF3IG5A