From 0eebede08aa92c6ef363c2c6d3bff9af1a3d6fe2 Mon Sep 17 00:00:00 2001 From: Martino Fontana <40663462+SuperSamus@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:35:42 +0200 Subject: [PATCH] automata: Use built-in bitCount --- Assets/Compute Shaders/automata.acompute | 53 ++++++++++-------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/Assets/Compute Shaders/automata.acompute b/Assets/Compute Shaders/automata.acompute index db513c2..554339f 100644 --- a/Assets/Compute Shaders/automata.acompute +++ b/Assets/Compute Shaders/automata.acompute @@ -75,17 +75,6 @@ uint64_t encode_tile_to_uint(ivec2 uv) { return tile_bits; } -uint sum_uint_bits(uint64_t i) { - uint sum = 0; - - while (i != 0) { - sum += uint(i & 1); - i >>= 1; - } - - return sum; -} - [numthreads(8, 8, 1)] void Automaton() { @@ -134,29 +123,29 @@ void Automaton() { uint64_t lower_left_quadrant_bits = encode_tile_to_uint(uv + ivec2(0, 7)); uint64_t lower_right_quadrant_bits = encode_tile_to_uint(uv + ivec2(7, 7)); - uint neighbor_count1 = 0; - neighbor_count1 += sum_uint_bits(upper_left_quadrant_bits & upper_left_mask); - neighbor_count1 += sum_uint_bits(upper_right_quadrant_bits & upper_right_mask); - neighbor_count1 += sum_uint_bits(lower_left_quadrant_bits & lower_left_mask); - neighbor_count1 += sum_uint_bits(lower_right_quadrant_bits & lower_right_mask); + uint64_t neighbor_count1 = 0; + neighbor_count1 += bitCount(upper_left_quadrant_bits & upper_left_mask); + neighbor_count1 += bitCount(upper_right_quadrant_bits & upper_right_mask); + neighbor_count1 += bitCount(lower_left_quadrant_bits & lower_left_mask); + neighbor_count1 += bitCount(lower_right_quadrant_bits & lower_right_mask); - uint neighbor_count2 = 0; - neighbor_count2 += sum_uint_bits(upper_left_quadrant_bits & upper_left_mask2); - neighbor_count2 += sum_uint_bits(upper_right_quadrant_bits & upper_right_mask2); - neighbor_count2 += sum_uint_bits(lower_left_quadrant_bits & lower_left_mask2); - neighbor_count2 += sum_uint_bits(lower_right_quadrant_bits & lower_right_mask2); + uint64_t neighbor_count2 = 0; + neighbor_count2 += bitCount(upper_left_quadrant_bits & upper_left_mask2); + neighbor_count2 += bitCount(upper_right_quadrant_bits & upper_right_mask2); + neighbor_count2 += bitCount(lower_left_quadrant_bits & lower_left_mask2); + neighbor_count2 += bitCount(lower_right_quadrant_bits & lower_right_mask2); - uint neighbor_count3 = 0; - neighbor_count3 += sum_uint_bits(upper_left_quadrant_bits & upper_left_mask3); - neighbor_count3 += sum_uint_bits(upper_right_quadrant_bits & upper_right_mask3); - neighbor_count3 += sum_uint_bits(lower_left_quadrant_bits & lower_left_mask3); - neighbor_count3 += sum_uint_bits(lower_right_quadrant_bits & lower_right_mask3); + uint64_t neighbor_count3 = 0; + neighbor_count3 += bitCount(upper_left_quadrant_bits & upper_left_mask3); + neighbor_count3 += bitCount(upper_right_quadrant_bits & upper_right_mask3); + neighbor_count3 += bitCount(lower_left_quadrant_bits & lower_left_mask3); + neighbor_count3 += bitCount(lower_right_quadrant_bits & lower_right_mask3); - uint neighbor_count4 = 0; - neighbor_count4 += sum_uint_bits(upper_left_quadrant_bits & upper_left_mask4); - neighbor_count4 += sum_uint_bits(upper_right_quadrant_bits & upper_right_mask4); - neighbor_count4 += sum_uint_bits(lower_left_quadrant_bits & lower_left_mask4); - neighbor_count4 += sum_uint_bits(lower_right_quadrant_bits & lower_right_mask4); + int64_t neighbor_count4 = 0; + neighbor_count4 += bitCount(upper_left_quadrant_bits & upper_left_mask4); + neighbor_count4 += bitCount(upper_right_quadrant_bits & upper_right_mask4); + neighbor_count4 += bitCount(lower_left_quadrant_bits & lower_left_mask4); + neighbor_count4 += bitCount(lower_right_quadrant_bits & lower_right_mask4); // for (int x = -1; x <= 1; ++x) { @@ -217,4 +206,4 @@ void Blit() { float automata = imageLoad(_AutomatonFrom, ((uv + _Offset * _Zoom) / _Zoom) % 1024).r; imageStore(_RenderTarget, uv, vec4(automata, automata, automata, 1.0)); -} \ No newline at end of file +}