]> zoso.dev Git - libnemo.git/commitdiff
Apply non-branching logic to original WebGL pow shader.
authorChris Duncan <chris@zoso.dev>
Thu, 9 Jan 2025 16:08:29 +0000 (08:08 -0800)
committerChris Duncan <chris@zoso.dev>
Thu, 9 Jan 2025 16:08:29 +0000 (08:08 -0800)
src/lib/nano-pow/shaders/gl-fragment.ts

index c88974fa43bd9bf364d805b267d51d6c1d275869..2179e165faf46452c713c6f3a6d56d5a1eae4b94 100644 (file)
@@ -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;