1#version 450
2#extension GL_KHR_shader_subgroup_basic : require
3#extension GL_KHR_shader_subgroup_shuffle : require
4#extension GL_KHR_shader_subgroup_shuffle_relative : require
5#extension GL_KHR_shader_subgroup_quad : require
6layout(local_size_x = 1) in;
7
8layout(std430, binding = 0) buffer SSBO
9{
10	float FragColor;
11};
12
13// Reduced test for functionality exposed on iOS.
14
15void main()
16{
17	// basic
18	FragColor = float(gl_NumSubgroups);
19	FragColor = float(gl_SubgroupID);
20	FragColor = float(gl_SubgroupSize);
21	FragColor = float(gl_SubgroupInvocationID);
22	subgroupBarrier();
23	subgroupMemoryBarrier();
24	subgroupMemoryBarrierBuffer();
25	subgroupMemoryBarrierShared();
26	subgroupMemoryBarrierImage();
27
28	// shuffle
29	uint shuffled = subgroupShuffle(10u, 8u);
30	bool shuffled_bool = subgroupShuffle(true, 9u);
31	uint shuffled_xor = subgroupShuffleXor(30u, 8u);
32	bool shuffled_xor_bool = subgroupShuffleXor(false, 9u);
33
34	// shuffle relative 
35	uint shuffled_up = subgroupShuffleUp(20u, 4u);
36	bool shuffled_up_bool = subgroupShuffleUp(true, 4u);
37	uint shuffled_down = subgroupShuffleDown(20u, 4u);
38	bool shuffled_down_bool = subgroupShuffleDown(false, 4u);
39
40	// quad
41	vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0));
42	bvec4 swap_horiz_bool = subgroupQuadSwapHorizontal(bvec4(true));
43	vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0));
44	bvec4 swap_vertical_bool = subgroupQuadSwapVertical(bvec4(true));
45	vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0));
46	bvec4 swap_diagonal_bool = subgroupQuadSwapDiagonal(bvec4(true));
47	vec4 quad_broadcast = subgroupQuadBroadcast(vec4(20.0), 3u);
48	bvec4 quad_broadcast_bool = subgroupQuadBroadcast(bvec4(true), 3u);
49}
50