xref: /aosp_15_r20/external/angle/third_party/glslang/src/Test/rayQuery-allOps.comp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1#version 460
2#extension GL_EXT_ray_query : enable
3#extension GL_EXT_ray_flags_primitive_culling : enable
4#extension GL_EXT_ray_tracing_position_fetch : enable
5
6layout(primitive_culling);
7struct Ray
8{
9    vec3 pos;
10    float tmin;
11    vec3 dir;
12    float tmax;
13};
14
15layout(std430, set = 0, binding = 0) buffer Log
16{
17    uint x;
18    uint y;
19};
20
21layout(binding = 1, set = 0) uniform accelerationStructureEXT rtas;
22layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
23
24void doSomething()
25{
26    x = 0;
27    y = 0;
28}
29
30Ray makeRayDesc()
31{
32    Ray ray;
33    ray.pos= vec3(0,0,0);
34    ray.dir = vec3(1,0,0);
35    ray.tmin = 0.0f;
36    ray.tmax = 9999.0;
37    return ray;
38}
39
40void main()
41{
42    Ray ray = makeRayDesc();
43    rayQueryEXT rayQuery;
44    rayQueryInitializeEXT(rayQuery, rtas, gl_RayFlagsNoneEXT, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax);
45
46    mat4x3 _mat4x3;
47    mat3x4 _mat3x4;
48
49    while (rayQueryProceedEXT(rayQuery))
50    {
51        uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false);
52        switch(candidateType)
53        {
54            case gl_RayQueryCandidateIntersectionTriangleEXT:
55
56                rayQueryTerminateEXT(rayQuery);
57                _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
58                _mat3x4 = transpose(_mat4x3);
59                rayQueryConfirmIntersectionEXT(rayQuery);
60
61                if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
62                {
63                    doSomething();
64                }
65
66                if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0)
67                {
68                    doSomething();
69                }
70
71                if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
72                {
73                    doSomething();
74                }
75
76                if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
77                {
78                    doSomething();
79                }
80
81                if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0)
82                {
83                    doSomething();
84                }
85
86                if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
87                {
88                    doSomething();
89                }
90
91                if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
92                {
93                    doSomething();
94                }
95
96                if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
97                {
98                    doSomething();
99                }
100
101                if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0)
102                {
103                    doSomething();
104                }
105                break;
106
107            case gl_RayQueryCandidateIntersectionAABBEXT:
108            {
109                _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
110                _mat3x4 = transpose(_mat4x3);
111                if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery))
112                {
113                    doSomething();
114                }
115
116                float t = 0.5;
117                rayQueryGenerateIntersectionEXT(rayQuery, t);
118                rayQueryTerminateEXT(rayQuery);
119                break;
120            }
121        }
122    }
123
124    if(_mat3x4[0][0] == _mat4x3[0][0])
125    {
126        doSomething();
127    }
128
129    uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);
130
131    switch(committedStatus)
132    {
133        case gl_RayQueryCommittedIntersectionNoneEXT :
134            _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false);
135            _mat3x4 = transpose(_mat4x3);
136            break;
137
138        case gl_RayQueryCommittedIntersectionTriangleEXT :
139            _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
140            _mat3x4 = transpose(_mat4x3);
141
142            if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
143            {
144                doSomething();
145            }
146
147            if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0)
148            {
149                doSomething();
150            }
151            {
152                vec3 positions[3];
153                rayQueryGetIntersectionTriangleVertexPositionsEXT(rayQuery, true, positions);
154                if (positions[0].x < 0 && positions[2].y > 0)
155                {
156                    doSomething();
157                }
158            }
159            break;
160
161        case gl_RayQueryCommittedIntersectionGeneratedEXT :
162
163            if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0)
164            {
165                doSomething();
166            }
167
168            if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
169            {
170                doSomething();
171            }
172
173            if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
174            {
175                doSomething();
176            }
177
178            if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0)
179            {
180                doSomething();
181            }
182
183            if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
184            {
185                doSomething();
186            }
187
188            if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
189            {
190                doSomething();
191            }
192
193            if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
194            {
195                doSomething();
196            }
197            break;
198    }
199
200    if (_mat3x4[0][0] == _mat4x3[0][0])
201    {
202        doSomething();
203    }
204
205    if (rayQueryGetRayFlagsEXT(rayQuery) > gl_RayFlagsSkipTrianglesEXT)
206    {
207        doSomething();
208    }
209
210    if (rayQueryGetRayTMinEXT(rayQuery) > 0.0)
211    {
212        doSomething();
213    }
214
215    vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery);
216    vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery);
217
218    if (o.x == d.z)
219    {
220        doSomething();
221    }
222}
223