X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=decoder.shader;h=616c3e2dfd0896e5cd035bacc42ec0720c5174a1;hb=daf421e32981645e551621551c6b82697ad078de;hp=09027915633af93b69a883039836bdecc16f8df2;hpb=0d22d7fb73e0c14431a15c7bb0522d0691452a31;p=narabu diff --git a/decoder.shader b/decoder.shader index 0902791..616c3e2 100644 --- a/decoder.shader +++ b/decoder.shader @@ -10,11 +10,13 @@ layout(r8ui) uniform restrict readonly uimage2D cum2sym_tex; layout(rg16ui) uniform restrict readonly uimage2D dsyms_tex; layout(r8) uniform restrict writeonly image2D out_tex; layout(r16i) uniform restrict writeonly iimage2D coeff_tex; +uniform int num_blocks; const uint prob_bits = 12; const uint prob_scale = 1 << prob_bits; const uint NUM_SYMS = 256; const uint ESCAPE_LIMIT = NUM_SYMS - 1; +const uint BLOCKS_PER_STREAM = 320; // These need to be folded into quant_matrix. const float dc_scalefac = 8.0; @@ -160,8 +162,8 @@ void idct_1d(inout float y0, inout float y1, inout float y2, inout float y3, ino y0 = p6_0 + p6_7; y1 = p6_1 + p6_6; y2 = p6_2 + p6_5; - y3 = p6_3 - p4_4; - y4 = p6_3 + p4_4; + y3 = p6_3 + p4_4; + y4 = p6_3 - p4_4; y5 = p6_2 - p6_5; y6 = p6_1 - p6_6; y7 = p6_0 - p6_7; @@ -202,11 +204,12 @@ void main() local_timing[0] = start; #endif + const uint blocks_per_row = (imageSize(out_tex).x + 7) / 8; + const uint local_x = gl_LocalInvocationID.x % 8; const uint local_y = (gl_LocalInvocationID.x / 8) % 8; const uint local_z = gl_LocalInvocationID.x / 64; - const uint num_blocks = 720 / 16; // FIXME: make a uniform const uint slice_num = local_z; const uint thread_num = local_y * 8 + local_x; @@ -224,15 +227,11 @@ void main() float q = (coeff_num == 0) ? 1.0 : (quant_matrix[coeff_num] * quant_scalefac / 128.0 / sqrt(2.0)); // FIXME: fold q *= (1.0 / 255.0); //int w = (coeff_num == 0) ? 32 : int(quant_matrix[coeff_num]); - int last_k = 0; + int last_k = 128; pick_timer(start, local_timing[0]); - for (uint block_idx = 40; block_idx --> 0; ) { - uint block_x = block_idx % 20; - uint block_y = block_idx / 20; - if (block_x == 19) last_k = 0; - + for (uint block_idx = BLOCKS_PER_STREAM / 8; block_idx --> 0; ) { pick_timer(start, local_timing[1]); // rANS decode one coefficient across eight blocks (so 64x8 coefficients). @@ -309,8 +308,12 @@ void main() pick_timer(start, local_timing[6]); - uint y = block_row * 16 + block_y * 8; - uint x = block_x * 64 + local_y * 8 + local_x; + uint global_block_idx = (block_row * 40 + block_idx) * 8 + local_y; + uint block_x = global_block_idx % blocks_per_row; + uint block_y = global_block_idx / blocks_per_row; + + uint y = block_y * 8; + uint x = block_x * 8 + local_x; for (uint yl = 0; yl < 8; ++yl) { imageStore(out_tex, ivec2(x, yl + y), vec4(temp[row_offset + yl * 8], 0.0, 0.0, 1.0)); }