From 95aad3e6c713c7ef4f51657c734d51528fd1b912 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Tue, 2 Nov 2021 12:59:38 -0700 Subject: [PATCH] Put memory barrier reliably before flag write --- piet-gpu/shader/elements.comp | 7 +++++-- piet-gpu/shader/elements.spv | Bin 80952 -> 81040 bytes 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/piet-gpu/shader/elements.comp b/piet-gpu/shader/elements.comp index bca2e2f..e4bbfec 100644 --- a/piet-gpu/shader/elements.comp +++ b/piet-gpu/shader/elements.comp @@ -220,14 +220,16 @@ void main() { // Publish aggregate for this partition if (gl_LocalInvocationID.x == WG_SIZE - 1) { - // Note: with memory model, we'd want to generate the atomic store version of this. State_write(state_aggregate_ref(part_ix), agg); + if (part_ix == 0) { + State_write(state_prefix_ref(part_ix), agg); + } } + // Write flag with release semantics; this is done portably with a barrier. memoryBarrierBuffer(); if (gl_LocalInvocationID.x == WG_SIZE - 1) { uint flag = FLAG_AGGREGATE_READY; if (part_ix == 0) { - State_write(state_prefix_ref(part_ix), agg); flag = FLAG_PREFIX_READY; } state[state_flag_index(part_ix)] = flag; @@ -239,6 +241,7 @@ void main() { State their_agg; uint their_ix = 0; while (true) { + // Read flag with acquire semantics. if (gl_LocalInvocationID.x == WG_SIZE - 1) { sh_flag = state[state_flag_index(look_back_ix)]; } diff --git a/piet-gpu/shader/elements.spv b/piet-gpu/shader/elements.spv index 4daf42de496b7080dd6ac3383d5140f99fc11baa..60517b0e293c1da39bd83df9a416781c86c22633 100644 GIT binary patch delta 20165 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 vyS8%t@IBA-zTf-p@BQX7T>fU;SKnw`b?{0X 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 F{{vU?F(Uu~