xref: /aosp_15_r20/external/angle/third_party/glslang/src/Test/spv.460.subgroupEXT.mesh (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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
12layout(local_size_x = 32, local_size_y=1, local_size_z=1) in;
13
14layout(max_vertices=MAX_VER) out;
15layout(max_primitives=MAX_PRIM) out;
16layout(triangles) out;
17
18// test use of builtins in mesh shaders:
19
20void 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
66void 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
81void 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
100void 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
109void 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
118void 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
145void 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
158void quad_works(vec4 f4)
159{
160  subgroupQuadBroadcast(f4, 0);
161  subgroupQuadSwapHorizontal(f4);
162  subgroupQuadSwapVertical(f4);
163  subgroupQuadSwapDiagonal(f4);
164}
165