]> git.sesse.net Git - narabu/commitdiff
Add some parallel slicing code (not really a win).
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 16 Sep 2017 13:38:11 +0000 (15:38 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 16 Sep 2017 13:58:08 +0000 (15:58 +0200)
decoder.shader

index 752a6a951d8b15fecfb3ae22a611e8207459e71e..77ae2869f08c54cf3a4fafbc6d101e6dba62a408 100644 (file)
@@ -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));
                }