]> git.sesse.net Git - narabu/blobdiff - rans.shader
Update a boring comment.
[narabu] / rans.shader
index b77d2407adab28496e783a1953d76f043f312b51..925543ef7dfa284d0fddbce411a61444438dbc9f 100644 (file)
@@ -3,7 +3,7 @@
 
 layout(local_size_x = 1) in;
 
-const uint prob_bits = 13;  // Note!
+const uint prob_bits = 12;
 const uint prob_scale = 1 << prob_bits;
 const uint RANS_BYTE_L = (1u << 23);
 const uint BLOCKS_PER_STREAM = 320;
@@ -97,13 +97,15 @@ void encode_coeff(int signed_k, uint sign_bias, inout RansEncoder enc)
        uint k = abs(signed_k);
 
        if (k >= ESCAPE_LIMIT) {
-               // ... boring stuff here
-               RansEncPut(enc.rans, enc.rans_offset, k, 1, prob_bits - 1);
+               // Put the coefficient as a 1/(2^12) symbol _before_
+               // the 255 coefficient, since the decoder will read the
+               // 255 coefficient first.
+               RansEncPut(enc.rans, enc.rans_offset, k, 1, prob_bits);
                k = ESCAPE_LIMIT;
        }
 
-       uvec2 sym = ransdist[enc.lut_base + (k + NUM_SYMS - 1) & (NUM_SYMS - 1)];
-       RansEncPut(enc.rans, enc.rans_offset, sym.x, sym.y, prob_bits);
+       uvec2 sym = ransdist[enc.lut_base + ((k - 1) & (NUM_SYMS - 1))];
+       RansEncPut(enc.rans, enc.rans_offset, sym.x, sym.y, prob_bits + 1);
        
        if (signed_k < 0) {
                enc.rans += sign_bias;
@@ -125,7 +127,7 @@ void encode_9_7(uint streamgroup_num, uint coeff_row, layout(r16ui) restrict rea
        uint sign_bias1 = ransdist[enc1.lut_base + 255].x + ransdist[enc1.lut_base + 255].y;
        uint sign_bias2 = ransdist[enc2.lut_base + 255].x + ransdist[enc2.lut_base + 255].y;
 
-       for (uint subblock_idx = BLOCKS_PER_STREAM; subblock_idx --> 0; ) {
+       for (uint subblock_idx = 0; subblock_idx < BLOCKS_PER_STREAM; ++subblock_idx) {
                // TODO: Use SSBOs instead of a texture?
                uint x = (streamgroup_num * BLOCKS_PER_STREAM + subblock_idx) % 160;
                uint y = (streamgroup_num * BLOCKS_PER_STREAM + subblock_idx) / 160;