From 2c185c3718d8b830cfbd54d8e21673d2c99b796f Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Sat, 30 May 2020 21:12:55 -0700 Subject: [PATCH] Simplify ringbuf We don't really need a ring buffer, as we only read what we're actually going to process. --- piet-gpu/shader/coarse.comp | 21 ++++++++------------- piet-gpu/shader/coarse.spv | Bin 49012 -> 48612 bytes 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/piet-gpu/shader/coarse.comp b/piet-gpu/shader/coarse.comp index 78c758b..3656f77 100644 --- a/piet-gpu/shader/coarse.comp +++ b/piet-gpu/shader/coarse.comp @@ -28,13 +28,11 @@ layout(set = 0, binding = 3) buffer PtclBuf { #include "bins.h" #include "ptcl.h" -#define N_RINGBUF 512 - #define LG_N_PART_READ 8 #define N_PART_READ (1 << LG_N_PART_READ) -shared uint sh_elements[N_RINGBUF]; -shared float sh_right_edge[N_RINGBUF]; +shared uint sh_elements[N_TILE]; +shared float sh_right_edge[N_TILE]; // Number of elements in the partition; prefix sum. shared uint sh_part_count[N_PART_READ]; @@ -178,16 +176,14 @@ void main() { ix -= part_ix > 0 ? sh_part_count[part_ix - 1] : part_start_ix; BinInstanceRef inst_ref = BinInstanceRef(sh_part_elements[part_ix]); BinInstance inst = BinInstance_read(BinInstance_index(inst_ref, ix)); - uint wr_el_ix = (rd_ix + th_ix) % N_RINGBUF; - sh_elements[wr_el_ix] = inst.element_ix; - sh_right_edge[wr_el_ix] = inst.right_edge; + sh_elements[th_ix] = inst.element_ix; + sh_right_edge[th_ix] = inst.right_edge; } barrier(); wr_ix = min(rd_ix + N_TILE, ready_ix); } while (wr_ix - rd_ix < N_TILE && (wr_ix < ready_ix || partition_ix < n_partitions)); - // We've done the merge and filled the buffer. // Read one element, compute coverage. @@ -195,9 +191,8 @@ void main() { AnnotatedRef ref; float right_edge = 0.0; if (th_ix + rd_ix < wr_ix) { - uint rd_el_ix = (rd_ix + th_ix) % N_RINGBUF; - uint element_ix = sh_elements[rd_el_ix]; - right_edge = sh_right_edge[rd_el_ix]; + uint element_ix = sh_elements[th_ix]; + right_edge = sh_right_edge[th_ix]; ref = AnnotatedRef(element_ix * Annotated_size); tag = Annotated_tag(ref); } @@ -355,7 +350,7 @@ void main() { } } uint out_offset = seg_alloc + Segment_size * ix + SegChunk_size; - uint rd_el_ix = (rd_ix + slice_ix * 32 + bit_ix) % N_RINGBUF; + uint rd_el_ix = slice_ix * 32 + bit_ix; uint element_ix = sh_elements[rd_el_ix]; ref = AnnotatedRef(element_ix * Annotated_size); AnnoFillLineSeg line = Annotated_FillLine_read(ref); @@ -407,7 +402,7 @@ void main() { } } uint element_ref_ix = slice_ix * 32 + findLSB(nonseg_bitmap); - uint element_ix = sh_elements[(rd_ix + element_ref_ix) % N_RINGBUF]; + uint element_ix = sh_elements[element_ref_ix]; // Bits up to and including the lsb uint bd_mask = (nonseg_bitmap - 1) ^ nonseg_bitmap; diff --git a/piet-gpu/shader/coarse.spv b/piet-gpu/shader/coarse.spv index 252ff10d8b2b61be2b6d1649e52ed678ea539a04..5a43f4abf13e1d65d900a91bcbeda31a384f3e65 100644 GIT binary patch literal 48612 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%0Ar-qVlu2fV%bEZGul9*$Lib1=`XsgtKZTT#@^ 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 P%WYu$QFp9z$NK*Ok!Hg$ literal 49012 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 laAV}(t-b}WmY6>V+eSSxe*#u_UL4D