Merge pull request #3031 from rg3igalia/sub-group-size-arb-flat-fix
[platform/upstream/glslang.git] / Test / spv.460.subgroupEXT.mesh
1 #version 460
2
3 #define MAX_VER  81
4 #define MAX_PRIM 32
5
6 #define BARRIER() \
7     memoryBarrierShared(); \
8     barrier();
9
10 #extension GL_EXT_mesh_shader : enable
11
12 layout(local_size_x = 32, local_size_y=1, local_size_z=1) in;
13
14 layout(max_vertices=MAX_VER) out;
15 layout(max_primitives=MAX_PRIM) out;
16 layout(triangles) out;
17
18 // test use of builtins in mesh shaders:
19
20 void main()
21 {
22     uint iid = gl_LocalInvocationID.x;
23     uint gid = gl_WorkGroupID.x;
24     uint vertexCount = MAX_VER; // vertexCount <= max_vertices
25     uint primitiveCount = MAX_PRIM; // primitiveCount <= max_primtives
26     SetMeshOutputsEXT(vertexCount, primitiveCount);
27
28     gl_MeshVerticesEXT[iid].gl_Position = vec4(1.0);
29     gl_MeshVerticesEXT[iid].gl_PointSize = 2.0;
30     gl_MeshVerticesEXT[iid].gl_ClipDistance[3] = 3.0;
31     gl_MeshVerticesEXT[iid].gl_CullDistance[2] = 4.0;
32
33     BARRIER();
34
35     gl_MeshVerticesEXT[iid+1].gl_Position = gl_MeshVerticesEXT[iid].gl_Position;
36     gl_MeshVerticesEXT[iid+1].gl_PointSize = gl_MeshVerticesEXT[iid].gl_PointSize;
37     gl_MeshVerticesEXT[iid+1].gl_ClipDistance[3] = gl_MeshVerticesEXT[iid].gl_ClipDistance[3];
38     gl_MeshVerticesEXT[iid+1].gl_CullDistance[2] = gl_MeshVerticesEXT[iid].gl_CullDistance[2];
39
40     BARRIER();
41
42     gl_MeshPrimitivesEXT[iid].gl_PrimitiveID = 6;
43     gl_MeshPrimitivesEXT[iid].gl_Layer = 7;
44     gl_MeshPrimitivesEXT[iid].gl_ViewportIndex = 8;
45     gl_MeshPrimitivesEXT[iid].gl_CullPrimitiveEXT = false;
46
47     BARRIER();
48
49     gl_MeshPrimitivesEXT[iid+1].gl_PrimitiveID = gl_MeshPrimitivesEXT[iid].gl_PrimitiveID;
50     gl_MeshPrimitivesEXT[iid+1].gl_Layer = gl_MeshPrimitivesEXT[iid].gl_Layer;
51     gl_MeshPrimitivesEXT[iid+1].gl_ViewportIndex = gl_MeshPrimitivesEXT[iid].gl_ViewportIndex;
52     gl_MeshPrimitivesEXT[iid+1].gl_CullPrimitiveEXT = false;
53
54     BARRIER();
55
56     // check bound limits
57     gl_PrimitiveTriangleIndicesEXT[0] = uvec3(1, 1, 1); // range is between [0, vertexCount-1]
58     gl_PrimitiveTriangleIndicesEXT[primitiveCount - 1] = uvec3(2, 2, 2); // array size is primitiveCount*3 for triangle
59     gl_PrimitiveTriangleIndicesEXT[gid] = gl_PrimitiveTriangleIndicesEXT[gid-1];
60
61
62     BARRIER();
63 }
64
65 #extension GL_KHR_shader_subgroup_basic: enable
66 void basic_works (void)
67 {
68   gl_SubgroupSize;
69   gl_SubgroupInvocationID;
70   subgroupBarrier();
71   subgroupMemoryBarrier();
72   subgroupMemoryBarrierBuffer();
73   subgroupMemoryBarrierImage();
74   subgroupElect();
75   gl_NumSubgroups;                  // allowed in mesh
76   gl_SubgroupID;                    // allowed in mesh
77   subgroupMemoryBarrierShared();    // allowed in mesh
78 }
79
80 #extension GL_KHR_shader_subgroup_ballot: enable
81 void ballot_works(vec4 f4) {
82   gl_SubgroupEqMask;
83   gl_SubgroupGeMask;
84   gl_SubgroupGtMask;
85   gl_SubgroupLeMask;
86   gl_SubgroupLtMask;
87   subgroupBroadcast(f4, 0);
88   subgroupBroadcastFirst(f4);
89   uvec4 ballot = subgroupBallot(false);
90   subgroupInverseBallot(uvec4(0x1));
91   subgroupBallotBitExtract(ballot, 0);
92   subgroupBallotBitCount(ballot);
93   subgroupBallotInclusiveBitCount(ballot);
94   subgroupBallotExclusiveBitCount(ballot);
95   subgroupBallotFindLSB(ballot);
96   subgroupBallotFindMSB(ballot);
97 }
98
99 #extension GL_KHR_shader_subgroup_vote: enable
100 void vote_works(vec4 f4)
101 {
102   subgroupAll(true);
103   subgroupAny(false);
104   subgroupAllEqual(f4);
105 }
106
107 #extension GL_KHR_shader_subgroup_shuffle: enable
108 #extension GL_KHR_shader_subgroup_shuffle_relative: enable
109 void shuffle_works(vec4 f4)
110 {
111   subgroupShuffle(f4, 0);
112   subgroupShuffleXor(f4, 0x1);
113   subgroupShuffleUp(f4, 1);
114   subgroupShuffleDown(f4, 1);
115 }
116
117 #extension GL_KHR_shader_subgroup_arithmetic: enable
118 void arith_works(vec4 f4)
119 {
120   uvec4 ballot;
121   subgroupAdd(f4);
122   subgroupMul(f4);
123   subgroupMin(f4);
124   subgroupMax(f4);
125   subgroupAnd(ballot);
126   subgroupOr(ballot);
127   subgroupXor(ballot);
128   subgroupInclusiveAdd(f4);
129   subgroupInclusiveMul(f4);
130   subgroupInclusiveMin(f4);
131   subgroupInclusiveMax(f4);
132   subgroupInclusiveAnd(ballot);
133   subgroupInclusiveOr(ballot);
134   subgroupInclusiveXor(ballot);
135   subgroupExclusiveAdd(f4);
136   subgroupExclusiveMul(f4);
137   subgroupExclusiveMin(f4);
138   subgroupExclusiveMax(f4);
139   subgroupExclusiveAnd(ballot);
140   subgroupExclusiveOr(ballot);
141   subgroupExclusiveXor(ballot);
142 }
143
144 #extension GL_KHR_shader_subgroup_clustered: enable
145 void clustered_works(vec4 f4)
146 {
147   uvec4 ballot = uvec4(0x55,0,0,0);
148   subgroupClusteredAdd(f4, 2);
149   subgroupClusteredMul(f4, 2);
150   subgroupClusteredMin(f4, 2);
151   subgroupClusteredMax(f4, 2);
152   subgroupClusteredAnd(ballot, 2);
153   subgroupClusteredOr(ballot, 2);
154   subgroupClusteredXor(ballot, 2);
155 }
156
157 #extension GL_KHR_shader_subgroup_quad: enable
158 void quad_works(vec4 f4)
159 {
160   subgroupQuadBroadcast(f4, 0);
161   subgroupQuadSwapHorizontal(f4);
162   subgroupQuadSwapVertical(f4);
163   subgroupQuadSwapDiagonal(f4);
164 }