John Kessenich | 66011cb | 2018-03-06 16:12:04 -0700 | [diff] [blame] | 1 | #version 450
|
| 2 |
|
| 3 | #extension GL_KHR_shader_subgroup_shuffle: enable
|
| 4 |
|
| 5 | layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
| 6 |
|
| 7 | layout(binding = 0) buffer Buffers
|
| 8 | {
|
| 9 | vec4 f4;
|
| 10 | ivec4 i4;
|
| 11 | uvec4 u4;
|
| 12 | dvec4 d4;
|
| 13 | } data[4];
|
| 14 |
|
| 15 | void main()
|
| 16 | {
|
| 17 | uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
|
| 18 |
|
| 19 | data[invocation].f4.x = subgroupShuffle(data[0].f4.x, invocation);
|
| 20 | data[invocation].f4.xy = subgroupShuffle(data[1].f4.xy, invocation);
|
| 21 | data[invocation].f4.xyz = subgroupShuffle(data[2].f4.xyz, invocation);
|
| 22 | data[invocation].f4 = subgroupShuffle(data[3].f4, invocation);
|
| 23 |
|
| 24 | data[invocation].i4.x = subgroupShuffle(data[0].i4.x, invocation);
|
| 25 | data[invocation].i4.xy = subgroupShuffle(data[1].i4.xy, invocation);
|
| 26 | data[invocation].i4.xyz = subgroupShuffle(data[2].i4.xyz, invocation);
|
| 27 | data[invocation].i4 = subgroupShuffle(data[3].i4, invocation);
|
| 28 |
|
| 29 | data[invocation].u4.x = subgroupShuffle(data[0].u4.x, invocation);
|
| 30 | data[invocation].u4.xy = subgroupShuffle(data[1].u4.xy, invocation);
|
| 31 | data[invocation].u4.xyz = subgroupShuffle(data[2].u4.xyz, invocation);
|
| 32 | data[invocation].u4 = subgroupShuffle(data[3].u4, invocation);
|
| 33 |
|
| 34 | data[invocation].d4.x = subgroupShuffle(data[0].d4.x, invocation);
|
| 35 | data[invocation].d4.xy = subgroupShuffle(data[1].d4.xy, invocation);
|
| 36 | data[invocation].d4.xyz = subgroupShuffle(data[2].d4.xyz, invocation);
|
| 37 | data[invocation].d4 = subgroupShuffle(data[3].d4, invocation);
|
| 38 |
|
| 39 | data[invocation].i4.x = int(subgroupShuffle(data[0].i4.x < 0, invocation));
|
| 40 | data[invocation].i4.xy = ivec2(subgroupShuffle(lessThan(data[1].i4.xy, ivec2(0)), invocation));
|
| 41 | data[invocation].i4.xyz = ivec3(subgroupShuffle(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
|
| 42 | data[invocation].i4 = ivec4(subgroupShuffle(lessThan(data[1].i4, ivec4(0)), invocation));
|
| 43 |
|
| 44 | data[invocation].f4.x = subgroupShuffleXor(data[0].f4.x, invocation);
|
| 45 | data[invocation].f4.xy = subgroupShuffleXor(data[1].f4.xy, invocation);
|
| 46 | data[invocation].f4.xyz = subgroupShuffleXor(data[2].f4.xyz, invocation);
|
| 47 | data[invocation].f4 = subgroupShuffleXor(data[3].f4, invocation);
|
| 48 |
|
| 49 | data[invocation].i4.x = subgroupShuffleXor(data[0].i4.x, invocation);
|
| 50 | data[invocation].i4.xy = subgroupShuffleXor(data[1].i4.xy, invocation);
|
| 51 | data[invocation].i4.xyz = subgroupShuffleXor(data[2].i4.xyz, invocation);
|
| 52 | data[invocation].i4 = subgroupShuffleXor(data[3].i4, invocation);
|
| 53 |
|
| 54 | data[invocation].u4.x = subgroupShuffleXor(data[0].u4.x, invocation);
|
| 55 | data[invocation].u4.xy = subgroupShuffleXor(data[1].u4.xy, invocation);
|
| 56 | data[invocation].u4.xyz = subgroupShuffleXor(data[2].u4.xyz, invocation);
|
| 57 | data[invocation].u4 = subgroupShuffleXor(data[3].u4, invocation);
|
| 58 |
|
| 59 | data[invocation].d4.x = subgroupShuffleXor(data[0].d4.x, invocation);
|
| 60 | data[invocation].d4.xy = subgroupShuffleXor(data[1].d4.xy, invocation);
|
| 61 | data[invocation].d4.xyz = subgroupShuffleXor(data[2].d4.xyz, invocation);
|
| 62 | data[invocation].d4 = subgroupShuffleXor(data[3].d4, invocation);
|
| 63 |
|
| 64 | data[invocation].i4.x = int(subgroupShuffleXor(data[0].i4.x < 0, invocation));
|
| 65 | data[invocation].i4.xy = ivec2(subgroupShuffleXor(lessThan(data[1].i4.xy, ivec2(0)), invocation));
|
| 66 | data[invocation].i4.xyz = ivec3(subgroupShuffleXor(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
|
| 67 | data[invocation].i4 = ivec4(subgroupShuffleXor(lessThan(data[1].i4, ivec4(0)), invocation));
|
| 68 | }
|