From d836d21d12afcacac3765f0848cf4356eba3caea Mon Sep 17 00:00:00 2001 From: "bhmerchant@gmail.com" Date: Sun, 9 Aug 2020 16:13:50 -0700 Subject: [PATCH] Clean up bits of right edge tracking logic left over from sort-middle. --- piet-gpu/shader/binning.comp | 47 ++-------------------------------- piet-gpu/shader/binning.spv | Bin 10484 -> 10296 bytes piet-gpu/shader/elements.comp | 43 ++++++++++--------------------- piet-gpu/shader/elements.spv | Bin 54140 -> 52964 bytes piet-gpu/src/lib.rs | 4 +-- 5 files changed, 18 insertions(+), 76 deletions(-) diff --git a/piet-gpu/shader/binning.comp b/piet-gpu/shader/binning.comp index 0ddeb7e..1413927 100644 --- a/piet-gpu/shader/binning.comp +++ b/piet-gpu/shader/binning.comp @@ -15,24 +15,18 @@ layout(set = 0, binding = 0) buffer AnnotatedBuf { uint[] annotated; }; -// This is for scanning forward for right_edge data. -layout(set = 0, binding = 1) buffer StateBuf { - uint[] state; -}; - -layout(set = 0, binding = 2) buffer AllocBuf { +layout(set = 0, binding = 1) buffer AllocBuf { uint n_elements; // paths // Will be incremented atomically to claim tiles uint tile_ix; uint alloc; }; -layout(set = 0, binding = 3) buffer BinsBuf { +layout(set = 0, binding = 2) buffer BinsBuf { uint[] bins; }; #include "annotated.h" -#include "state.h" #include "bins.h" // scale factors useful for converting coordinates to bins @@ -52,12 +46,6 @@ shared uint sh_chunk_start[N_TILE]; shared float sh_right_edge[N_TILE]; -#define StateBuf_stride (8 + 2 * State_size) - -uint state_right_edge_index(uint partition_ix) { - return 2 + partition_ix * (StateBuf_stride / 4); -} - void main() { uint chunk_n = 0; uint my_n_elements = n_elements; @@ -103,37 +91,6 @@ void main() { break; } - /* - // If the last element in this partition is a fill edge, then we need to do a - // look-forward to find the right edge of its corresponding fill. That data is - // recorded in aggregates computed in the element processing pass. - if (gl_LocalInvocationID.x == N_TILE - 1 && tag == Annotated_FillLine) { - uint aggregate_ix = (my_partition + 1) * ELEMENT_BINNING_RATIO; - // This is sequential but the expectation is that the amount of - // look-forward is small (performance may degrade in the case - // of massively complex paths). - do { - my_right_edge = uintBitsToFloat(state[state_right_edge_index(aggregate_ix)]); - aggregate_ix++; - } while (isinf(my_right_edge)); - } - - // Now propagate right_edge backward, from fill to segment. - for (uint i = 0; i < LG_N_TILE; i++) { - // Note: we could try to cut down on write bandwidth here if the value hasn't - // changed, but not sure it's worth the complexity to track. - sh_right_edge[gl_LocalInvocationID.x] = my_right_edge; - barrier(); - if (gl_LocalInvocationID.x + (1 << i) < N_TILE && isinf(my_right_edge)) { - my_right_edge = sh_right_edge[gl_LocalInvocationID.x + (1 << i)]; - } - barrier(); - } - if (crosses_edge) { - x1 = int(ceil(my_right_edge * SX)); - } - */ - // At this point, we run an iterator over the coverage area, // trying to keep divergence low. // Right now, it's just a bbox, but we'll get finer with diff --git a/piet-gpu/shader/binning.spv b/piet-gpu/shader/binning.spv index 0d30dfc18cb022403c89ba1238e2fbad0e8be950..1b31cd17a5bdb50ed09482b91dd94393ae59e5c3 100644 GIT binary patch delta 94 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 Renderer { &[n_paths as u32, 0, bin_alloc_start as u32], )?; let bin_code = include_bytes!("../shader/binning.spv"); - let bin_pipeline = device.create_simple_compute_pipeline(bin_code, 4, 0)?; + let bin_pipeline = device.create_simple_compute_pipeline(bin_code, 3, 0)?; let bin_ds = device.create_descriptor_set( &bin_pipeline, - &[&anno_buf, &state_buf, &bin_alloc_buf_dev, &bin_buf], + &[&anno_buf, &bin_alloc_buf_dev, &bin_buf], &[], )?;