1#version 450
2#extension GL_KHR_shader_subgroup_basic : require
3#extension GL_KHR_shader_subgroup_ballot : require
4#extension GL_KHR_shader_subgroup_vote : require
5#extension GL_KHR_shader_subgroup_shuffle : require
6#extension GL_KHR_shader_subgroup_shuffle_relative : require
7#extension GL_KHR_shader_subgroup_arithmetic : require
8#extension GL_KHR_shader_subgroup_clustered : require
9#extension GL_KHR_shader_subgroup_quad : require
10layout(local_size_x = 1) in;
11
12layout(std430, binding = 0) buffer SSBO
13{
14	float FragColor;
15};
16
17void main()
18{
19	// basic
20	//FragColor = float(gl_NumSubgroups);
21	//FragColor = float(gl_SubgroupID);
22	FragColor = float(gl_SubgroupSize);
23	FragColor = float(gl_SubgroupInvocationID);
24	subgroupBarrier();
25	subgroupMemoryBarrier();
26	subgroupMemoryBarrierBuffer();
27	subgroupMemoryBarrierShared();
28	subgroupMemoryBarrierImage();
29	bool elected = subgroupElect();
30
31	// ballot
32	FragColor = float(gl_SubgroupEqMask);
33	FragColor = float(gl_SubgroupGeMask);
34	FragColor = float(gl_SubgroupGtMask);
35	FragColor = float(gl_SubgroupLeMask);
36	FragColor = float(gl_SubgroupLtMask);
37	vec4 broadcasted = subgroupBroadcast(vec4(10.0), 8u);
38	vec3 first = subgroupBroadcastFirst(vec3(20.0));
39	uvec4 ballot_value = subgroupBallot(true);
40	//bool inverse_ballot_value = subgroupInverseBallot(ballot_value);
41	//bool bit_extracted = subgroupBallotBitExtract(uvec4(10u), 8u);
42	uint bit_count = subgroupBallotBitCount(ballot_value);
43	//uint inclusive_bit_count = subgroupBallotInclusiveBitCount(ballot_value);
44	//uint exclusive_bit_count = subgroupBallotExclusiveBitCount(ballot_value);
45	//uint lsb = subgroupBallotFindLSB(ballot_value);
46	//uint msb = subgroupBallotFindMSB(ballot_value);
47
48	// shuffle
49	//uint shuffled = subgroupShuffle(10u, 8u);
50	//uint shuffled_xor = subgroupShuffleXor(30u, 8u);
51
52	// shuffle relative
53	//uint shuffled_up = subgroupShuffleUp(20u, 4u);
54	//uint shuffled_down = subgroupShuffleDown(20u, 4u);
55
56	// vote
57	bool has_all = subgroupAll(true);
58	bool has_any = subgroupAny(true);
59	bool has_equal = subgroupAllEqual(true);
60
61	// arithmetic
62	vec4 added = subgroupAdd(vec4(20.0));
63	ivec4 iadded = subgroupAdd(ivec4(20));
64	vec4 multiplied = subgroupMul(vec4(20.0));
65	ivec4 imultiplied = subgroupMul(ivec4(20));
66	vec4 lo = subgroupMin(vec4(20.0));
67	vec4 hi = subgroupMax(vec4(20.0));
68	ivec4 slo = subgroupMin(ivec4(20));
69	ivec4 shi = subgroupMax(ivec4(20));
70	uvec4 ulo = subgroupMin(uvec4(20));
71	uvec4 uhi = subgroupMax(uvec4(20));
72	uvec4 anded = subgroupAnd(ballot_value);
73	uvec4 ored = subgroupOr(ballot_value);
74	uvec4 xored = subgroupXor(ballot_value);
75
76	added = subgroupInclusiveAdd(added);
77	iadded = subgroupInclusiveAdd(iadded);
78	multiplied = subgroupInclusiveMul(multiplied);
79	imultiplied = subgroupInclusiveMul(imultiplied);
80#if 0
81	lo = subgroupInclusiveMin(lo);
82	hi = subgroupInclusiveMax(hi);
83	slo = subgroupInclusiveMin(slo);
84	shi = subgroupInclusiveMax(shi);
85	ulo = subgroupInclusiveMin(ulo);
86	uhi = subgroupInclusiveMax(uhi);
87	anded = subgroupInclusiveAnd(anded);
88	ored = subgroupInclusiveOr(ored);
89	xored = subgroupInclusiveXor(ored);
90	added = subgroupExclusiveAdd(lo);
91#endif
92
93	added = subgroupExclusiveAdd(multiplied);
94	multiplied = subgroupExclusiveMul(multiplied);
95	iadded = subgroupExclusiveAdd(imultiplied);
96	imultiplied = subgroupExclusiveMul(imultiplied);
97#if 0
98	lo = subgroupExclusiveMin(lo);
99	hi = subgroupExclusiveMax(hi);
100	ulo = subgroupExclusiveMin(ulo);
101	uhi = subgroupExclusiveMax(uhi);
102	slo = subgroupExclusiveMin(slo);
103	shi = subgroupExclusiveMax(shi);
104	anded = subgroupExclusiveAnd(anded);
105	ored = subgroupExclusiveOr(ored);
106	xored = subgroupExclusiveXor(ored);
107#endif
108
109#if 0
110	// clustered
111	added = subgroupClusteredAdd(added, 4u);
112	multiplied = subgroupClusteredMul(multiplied, 4u);
113	iadded = subgroupClusteredAdd(iadded, 4u);
114	imultiplied = subgroupClusteredMul(imultiplied, 4u);
115	lo = subgroupClusteredMin(lo, 4u);
116	hi = subgroupClusteredMax(hi, 4u);
117	ulo = subgroupClusteredMin(ulo, 4u);
118	uhi = subgroupClusteredMax(uhi, 4u);
119	slo = subgroupClusteredMin(slo, 4u);
120	shi = subgroupClusteredMax(shi, 4u);
121	anded = subgroupClusteredAnd(anded, 4u);
122	ored = subgroupClusteredOr(ored, 4u);
123	xored = subgroupClusteredXor(xored, 4u);
124#endif
125
126	// quad
127	vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0));
128	vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0));
129	vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0));
130	vec4 quad_broadcast = subgroupQuadBroadcast(vec4(20.0), 3u);
131}
132