From: Chris Duncan Date: Thu, 9 Jan 2025 16:08:29 +0000 (-0800) Subject: Apply non-branching logic to original WebGL pow shader. X-Git-Url: https://zoso.dev/?a=commitdiff_plain;h=55e76167a47cf696dfc06eef7f5beea2a82ce528;p=libnemo.git Apply non-branching logic to original WebGL pow shader. --- 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;