From 55e76167a47cf696dfc06eef7f5beea2a82ce528 Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Thu, 9 Jan 2025 08:08:29 -0800 Subject: [PATCH] Apply non-branching logic to original WebGL pow shader. --- src/lib/nano-pow/shaders/gl-fragment.ts | 31 +++++++++++-------------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/lib/nano-pow/shaders/gl-fragment.ts b/src/lib/nano-pow/shaders/gl-fragment.ts index c88974f..2179e16 100644 --- a/src/lib/nano-pow/shaders/gl-fragment.ts +++ b/src/lib/nano-pow/shaders/gl-fragment.ts @@ -72,6 +72,7 @@ const uint SIGMA82[192] = uint[192]( // G mixing function void G (uint ix, uint iy, uint a, uint b, uint c, uint d) { + bool carry; uint o0; uint o1; uint xor0; @@ -80,18 +81,16 @@ void G (uint ix, uint iy, uint a, uint b, uint c, uint d) { // a = a + b; o0 = v[a] + v[b]; o1 = v[a+1u] + v[b+1u]; - if (v[a] > 0xFFFFFFFFu - v[b]) { - o1 = o1 + 1u; - } + carry = o0 < v[a]; + o1 = o1 + uint(mix(0.0, 1.0, float(carry))); v[a] = o0; v[a+1u] = o1; // a = a + m[sigma[r][2*i+0]]; o0 = v[a] + m[ix]; o1 = v[a+1u] + m[ix+1u]; - if (v[a] > 0xFFFFFFFFu - m[ix]) { - o1 = o1 + 1u; - } + carry = o0 < v[a]; + o1 = o1 + uint(mix(0.0, 1.0, float(carry))); v[a] = o0; v[a+1u] = o1; @@ -104,9 +103,8 @@ void G (uint ix, uint iy, uint a, uint b, uint c, uint d) { // c = c + d; o0 = v[c] + v[d]; o1 = v[c+1u] + v[d+1u]; - if (v[c] > 0xFFFFFFFFu - v[d]) { - o1 = o1 + 1u; - } + carry = o0 < v[c]; + o1 = o1 + uint(mix(0.0, 1.0, float(carry))); v[c] = o0; v[c+1u] = o1; @@ -119,18 +117,16 @@ void G (uint ix, uint iy, uint a, uint b, uint c, uint d) { // a = a + b; o0 = v[a] + v[b]; o1 = v[a+1u] + v[b+1u]; - if (v[a] > 0xFFFFFFFFu - v[b]) { - o1 = o1 + 1u; - } + carry = o0 < v[a]; + o1 = o1 + uint(mix(0.0, 1.0, float(carry))); v[a] = o0; v[a+1u] = o1; // a = a + m[sigma[r][2*i+1]]; o0 = v[a] + m[iy]; o1 = v[a+1u] + m[iy+1u]; - if (v[a] > 0xFFFFFFFFu - m[iy]) { - o1 = o1 + 1u; - } + carry = o0 < v[a]; + o1 = o1 + uint(mix(0.0, 1.0, float(carry))); v[a] = o0; v[a+1u] = o1; @@ -143,9 +139,8 @@ void G (uint ix, uint iy, uint a, uint b, uint c, uint d) { // c = c + d; o0 = v[c] + v[d]; o1 = v[c+1u] + v[d+1u]; - if (v[c] > 0xFFFFFFFFu - v[d]) { - o1 = o1 + 1u; - } + carry = o0 < v[c]; + o1 = o1 + uint(mix(0.0, 1.0, float(carry))); v[c] = o0; v[c+1u] = o1; -- 2.34.1