From: Steinar H. Gunderson Date: Sat, 16 Sep 2017 13:38:11 +0000 (+0200) Subject: Add some parallel slicing code (not really a win). X-Git-Url: https://git.sesse.net/?p=narabu;a=commitdiff_plain;h=755cd83d9f558a3a08d1c63d9944738f41a852c7 Add some parallel slicing code (not really a win). --- diff --git a/decoder.shader b/decoder.shader index 752a6a9..77ae286 100644 --- a/decoder.shader +++ b/decoder.shader @@ -1,9 +1,11 @@ -#version 430 +#version 440 #extension GL_ARB_shader_clock : enable +#define PARALLEL_SLICES 1 + #define ENABLE_TIMING 0 -layout(local_size_x = 8, local_size_y = 8) in; +layout(local_size_x = 64*PARALLEL_SLICES) in; layout(r8ui) uniform restrict readonly uimage2D cum2sym_tex; layout(rg16ui) uniform restrict readonly uimage2D dsyms_tex; layout(r8) uniform restrict writeonly image2D out_tex; @@ -154,7 +156,7 @@ void idct_1d(inout float y0, inout float y1, inout float y2, inout float y3, ino y7 = p6_0 - p6_7; } -shared float temp[64 * 8]; +shared float temp[64 * 8 * PARALLEL_SLICES]; void pick_timer(inout uvec2 start, inout uvec2 t) { @@ -185,17 +187,22 @@ void main() } uvec2 start = clock2x32ARB(); #else - uvec2 start; + uvec2 start = uvec2(0, 0); + local_timing[0] = start; #endif + 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 thread_num = gl_LocalInvocationID.y * 8 + gl_LocalInvocationID.x; + const uint slice_num = local_z; + const uint thread_num = local_y * 8 + local_x; - const uint block_row = gl_WorkGroupID.y; + const uint block_row = gl_WorkGroupID.y * PARALLEL_SLICES + slice_num; //const uint coeff_num = ff_zigzag_direct[thread_num]; const uint coeff_num = thread_num; const uint stream_num = coeff_num * num_blocks + block_row; - //const uint stream_num = block_row * num_blocks + coeff_num; // HACK const uint model_num = min((coeff_num % 8) + (coeff_num / 8), 7); const uint sign_bias = sign_bias_per_model[model_num]; @@ -244,7 +251,7 @@ void main() last_k = k; } - temp[subblock_idx * 64 + coeff_num] = k * q; + temp[slice_num * 64 * 8 + subblock_idx * 64 + coeff_num] = k * q; //temp[subblock_idx * 64 + 8 * y + x] = (2 * k * w * 4) / 32; // 100% matching unquant } @@ -256,14 +263,14 @@ void main() pick_timer(start, local_timing[3]); // Horizontal DCT one row (so 64 rows). - idct_1d(temp[thread_num * 8 + 0], - temp[thread_num * 8 + 1], - temp[thread_num * 8 + 2], - temp[thread_num * 8 + 3], - temp[thread_num * 8 + 4], - temp[thread_num * 8 + 5], - temp[thread_num * 8 + 6], - temp[thread_num * 8 + 7]); + idct_1d(temp[slice_num * 64 * 8 + thread_num * 8 + 0], + temp[slice_num * 64 * 8 + thread_num * 8 + 1], + temp[slice_num * 64 * 8 + thread_num * 8 + 2], + temp[slice_num * 64 * 8 + thread_num * 8 + 3], + temp[slice_num * 64 * 8 + thread_num * 8 + 4], + temp[slice_num * 64 * 8 + thread_num * 8 + 5], + temp[slice_num * 64 * 8 + thread_num * 8 + 6], + temp[slice_num * 64 * 8 + thread_num * 8 + 7]); pick_timer(start, local_timing[4]); @@ -273,7 +280,7 @@ void main() pick_timer(start, local_timing[5]); // Vertical DCT one row (so 64 columns). - uint row_offset = gl_LocalInvocationID.y * 64 + gl_LocalInvocationID.x; + uint row_offset = local_z * 64 * 8 + local_y * 64 + local_x; idct_1d(temp[row_offset + 0 * 8], temp[row_offset + 1 * 8], temp[row_offset + 2 * 8], @@ -286,7 +293,7 @@ void main() pick_timer(start, local_timing[6]); uint y = block_row * 16 + block_y * 8; - uint x = block_x * 64 + gl_LocalInvocationID.y * 8 + gl_LocalInvocationID.x; + uint x = block_x * 64 + local_y * 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)); }