Merge pull request #3031 from rg3igalia/sub-group-size-arb-flat-fix
[platform/upstream/glslang.git] / Test / vk.relaxed.stagelink.0.1.frag
1 #version 460\r
2 uniform sampler2D sTDNoiseMap;\r
3 uniform sampler1D sTDSineLookup;\r
4 uniform sampler2D sTDWhite2D;\r
5 uniform sampler3D sTDWhite3D;\r
6 uniform sampler2DArray sTDWhite2DArray;\r
7 uniform samplerCube sTDWhiteCube;\r
8 uniform int uTDInstanceIDOffset;\r
9 uniform int uTDNumInstances;\r
10 uniform float uTDAlphaTestVal;\r
11 #define TD_NUM_COLOR_BUFFERS 1\r
12 #define TD_NUM_LIGHTS 0\r
13 #define TD_NUM_SHADOWED_LIGHTS 0\r
14 #define TD_NUM_ENV_LIGHTS 0\r
15 #define TD_LIGHTS_ARRAY_SIZE 1\r
16 #define TD_ENV_LIGHTS_ARRAY_SIZE 1\r
17 #define TD_NUM_CAMERAS 1\r
18 struct TDLight\r
19 {\r
20         vec4 position;\r
21         vec3 direction;\r
22         vec3 diffuse;\r
23         vec4 nearFar;\r
24         vec4 lightSize;\r
25         vec4 misc;\r
26         vec4 coneLookupScaleBias;\r
27         vec4 attenScaleBiasRoll;\r
28         mat4 shadowMapMatrix;\r
29         mat4 shadowMapCamMatrix;\r
30         vec4 shadowMapRes;\r
31         mat4 projMapMatrix;\r
32 };\r
33 struct TDEnvLight\r
34 {\r
35         vec3 color;\r
36         mat3 rotate;\r
37 };\r
38 layout(std140) uniform TDLightBlock\r
39 {\r
40         TDLight uTDLights[TD_LIGHTS_ARRAY_SIZE];\r
41 };\r
42 layout(std140) uniform TDEnvLightBlock\r
43 {\r
44         TDEnvLight      uTDEnvLights[TD_ENV_LIGHTS_ARRAY_SIZE];\r
45 };\r
46 layout(std430) readonly restrict buffer TDEnvLightBuffer\r
47 {\r
48         vec3 shCoeffs[9];\r
49 } uTDEnvLightBuffers[TD_ENV_LIGHTS_ARRAY_SIZE];\r
50 struct TDPhongResult\r
51 {\r
52         vec3 diffuse;\r
53         vec3 specular;\r
54         vec3 specular2;\r
55         float shadowStrength;\r
56 };\r
57 struct TDPBRResult\r
58 {\r
59         vec3 diffuse;\r
60         vec3 specular;\r
61         float shadowStrength;\r
62 };\r
63 struct TDMatrix\r
64 {\r
65         mat4 world;\r
66         mat4 worldInverse;\r
67         mat4 worldCam;\r
68         mat4 worldCamInverse;\r
69         mat4 cam;\r
70         mat4 camInverse;\r
71         mat4 camProj;\r
72         mat4 camProjInverse;\r
73         mat4 proj;\r
74         mat4 projInverse;\r
75         mat4 worldCamProj;\r
76         mat4 worldCamProjInverse;\r
77         mat4 quadReproject;\r
78         mat3 worldForNormals;\r
79         mat3 camForNormals;\r
80         mat3 worldCamForNormals;\r
81 };\r
82 layout(std140) uniform TDMatricesBlock {\r
83         TDMatrix uTDMats[TD_NUM_CAMERAS];\r
84 };\r
85 struct TDCameraInfo\r
86 {\r
87         vec4 nearFar;\r
88         vec4 fog;\r
89         vec4 fogColor;\r
90         int renderTOPCameraIndex;\r
91 };\r
92 layout(std140) uniform TDCameraInfoBlock {\r
93         TDCameraInfo uTDCamInfos[TD_NUM_CAMERAS];\r
94 };\r
95 struct TDGeneral\r
96 {\r
97         vec4 ambientColor;\r
98         vec4 nearFar;\r
99         vec4 viewport;\r
100         vec4 viewportRes;\r
101         vec4 fog;\r
102         vec4 fogColor;\r
103 };\r
104 layout(std140) uniform TDGeneralBlock {\r
105         TDGeneral uTDGeneral;\r
106 };\r
107 \r
108 layout(binding = 15) uniform samplerBuffer sTDInstanceT;\r
109 layout(binding = 16) uniform samplerBuffer sTDInstanceTexCoord;\r
110 layout(binding = 17) uniform samplerBuffer sTDInstanceColor;\r
111 vec4 TDDither(vec4 color);\r
112 vec3 TDHSVToRGB(vec3 c);\r
113 vec3 TDRGBToHSV(vec3 c);\r
114 #define PI 3.14159265\r
115 \r
116 vec4 TDColor(vec4 color) { return color; }\r
117 void TDCheckOrderIndTrans() {\r
118 }\r
119 void TDCheckDiscard() {\r
120         TDCheckOrderIndTrans();\r
121 }\r
122 vec4 TDDither(vec4 color)\r
123 {\r
124    float d = texture(sTDNoiseMap, \r
125                 gl_FragCoord.xy / 256.0).r;\r
126    d -= 0.5;\r
127    d /= 256.0;\r
128    return vec4(color.rgb + d, color.a);\r
129 }\r
130 bool TDFrontFacing(vec3 pos, vec3 normal)\r
131 {\r
132         return gl_FrontFacing;\r
133 }\r
134 float TDAttenuateLight(int index, float lightDist)\r
135 {\r
136         return 1.0;\r
137 }\r
138 void TDAlphaTest(float alpha) {\r
139 }\r
140 float TDHardShadow(int lightIndex, vec3 worldSpacePos)\r
141 { return 0.0; }\r
142 float TDSoftShadow(int lightIndex, vec3 worldSpacePos, int samples, int steps)\r
143 { return 0.0; }\r
144 float TDSoftShadow(int lightIndex, vec3 worldSpacePos)\r
145 { return 0.0; }\r
146 float TDShadow(int lightIndex, vec3 worldSpacePos)\r
147 { return 0.0; }\r
148 vec3 TDEquirectangularToCubeMap(vec2 mapCoord);\r
149 vec2 TDCubeMapToEquirectangular(vec3 envMapCoord);\r
150 vec2 TDCubeMapToEquirectangular(vec3 envMapCoord, out float mipMapBias);\r
151 vec2 TDTexGenSphere(vec3 envMapCoord);\r
152 float iTDRadicalInverse_VdC(uint bits) \r
153 {\r
154         bits = (bits << 16u) | (bits >> 16u);\r
155     bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\r
156     bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\r
157     bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\r
158     bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\r
159     return float(bits) * 2.3283064365386963e-10; // / 0x100000000\r
160 }\r
161 vec2 iTDHammersley(uint i, uint N) \r
162 {\r
163     return vec2(float(i) / float(N), iTDRadicalInverse_VdC(i));\r
164 }\r
165 vec3 iTDImportanceSampleGGX(vec2 Xi, float roughness2, vec3 N)\r
166 {       \r
167         float a = roughness2;\r
168         float phi = 2 * 3.14159265 * Xi.x;\r
169         float cosTheta = sqrt( (1 - Xi.y) / (1 + (a*a - 1) * Xi.y) );\r
170         float sinTheta = sqrt( 1 - cosTheta * cosTheta );\r
171         \r
172         vec3 H;\r
173         H.x = sinTheta * cos(phi);\r
174         H.y = sinTheta * sin(phi);\r
175         H.z = cosTheta;\r
176         \r
177         vec3 upVector = abs(N.z) < 0.999 ? vec3(0, 0, 1) : vec3(1, 0, 0);\r
178         vec3 tangentX = normalize(cross(upVector, N));\r
179         vec3 tangentY = cross(N, tangentX);\r
180         \r
181         // Tangent to world space\r
182         vec3 worldResult = tangentX * H.x + tangentY * H.y + N * H.z;\r
183         return worldResult;\r
184 }\r
185 float iTDDistributionGGX(vec3 normal, vec3 half_vector, float roughness2)\r
186 {\r
187         const float Epsilon = 0.000001;\r
188 \r
189     float NdotH = clamp(dot(normal, half_vector), Epsilon, 1.0);\r
190     \r
191     float alpha2 = roughness2 * roughness2;\r
192     \r
193     float denom = NdotH * NdotH * (alpha2 - 1.0) + 1.0;\r
194         denom = max(1e-8, denom);\r
195     return alpha2 / (PI * denom * denom);\r
196 }\r
197 vec3 iTDCalcF(vec3 F0, float VdotH) {\r
198     return F0 + (vec3(1.0) - F0) * pow(2.0, (-5.55473*VdotH - 6.98316) * VdotH);\r
199 }\r
200 \r
201 float iTDCalcG(float NdotL, float NdotV, float k) {\r
202     float Gl = 1.0 / (NdotL * (1.0 - k) + k);\r
203     float Gv = 1.0 / (NdotV * (1.0 - k) + k);\r
204     return Gl * Gv;\r
205 }\r
206 // 0 - All options\r
207 TDPBRResult TDLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)\r
208 {\r
209         TDPBRResult res;\r
210         return res;\r
211 }\r
212 // 0 - All options\r
213 void TDLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,inout float shadowStrengthOut,int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)\r
214 {\r
215         TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness);  diffuseContrib = res.diffuse;\r
216         specularContrib = res.specular;\r
217         shadowStrengthOut = res.shadowStrength;\r
218 }\r
219 // 0 - All options\r
220 void TDLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 diffuseColor,vec3 specularColor,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float roughness)\r
221 {\r
222         TDPBRResult res = TDLightingPBR(index,diffuseColor,specularColor,worldSpacePos,normal,shadowStrength,shadowColor,camVector,roughness);  diffuseContrib = res.diffuse;\r
223         specularContrib = res.specular;\r
224 }\r
225 // 0 - All options\r
226 TDPBRResult TDEnvLightingPBR(int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)\r
227 {\r
228         TDPBRResult res;\r
229         return res;\r
230 }\r
231 // 0 - All options\r
232 void TDEnvLightingPBR(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 diffuseColor,vec3 specularColor,vec3 normal,vec3 camVector,float roughness,float ambientOcclusion)\r
233 {\r
234         TDPBRResult res = TDEnvLightingPBR(index, diffuseColor, specularColor,                                                                          normal, camVector, roughness, ambientOcclusion);\r
235         diffuseContrib = res.diffuse;\r
236         specularContrib = res.specular;\r
237 }\r
238 // 0 - All options\r
239 TDPhongResult TDLighting(int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)\r
240 {\r
241         TDPhongResult res;\r
242         switch (index)\r
243         {\r
244                 default:\r
245                         res.diffuse = vec3(0.0);\r
246                         res.specular = vec3(0.0);\r
247                         res.specular2 = vec3(0.0);\r
248                         res.shadowStrength = 0.0;\r
249                         break;\r
250         }\r
251                 return res;\r
252 }\r
253 // 0 - Legacy\r
254 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,inout float shadowStrengthOut,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)\r
255 {\r
256         TDPhongResult res;\r
257         switch (index)\r
258         {\r
259                 default:\r
260                         res.diffuse = vec3(0.0);\r
261                         res.specular = vec3(0.0);\r
262                         res.specular2 = vec3(0.0);\r
263                         res.shadowStrength = 0.0;\r
264                         break;\r
265         }\r
266         diffuseContrib = res.diffuse;\r
267         specularContrib = res.specular;\r
268         specularContrib2 = res.specular2;\r
269         shadowStrengthOut = res.shadowStrength;\r
270 }\r
271 // 0 - Legacy\r
272 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess,float shininess2)\r
273 {\r
274         TDPhongResult res;\r
275         switch (index)\r
276         {\r
277                 default:\r
278                         res.diffuse = vec3(0.0);\r
279                         res.specular = vec3(0.0);\r
280                         res.specular2 = vec3(0.0);\r
281                         res.shadowStrength = 0.0;\r
282                         break;\r
283         }\r
284         diffuseContrib = res.diffuse;\r
285         specularContrib = res.specular;\r
286         specularContrib2 = res.specular2;\r
287 }\r
288 // 1 - Without specular2\r
289 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor,vec3 camVector,float shininess)\r
290 {\r
291         TDPhongResult res;\r
292         switch (index)\r
293         {\r
294                 default:\r
295                         res.diffuse = vec3(0.0);\r
296                         res.specular = vec3(0.0);\r
297                         res.specular2 = vec3(0.0);\r
298                         res.shadowStrength = 0.0;\r
299                         break;\r
300         }\r
301         diffuseContrib = res.diffuse;\r
302         specularContrib = res.specular;\r
303 }\r
304 // 2 - Without shadows\r
305 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,inout vec3 specularContrib2,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess,float shininess2)\r
306 {\r
307         TDPhongResult res;\r
308         switch (index)\r
309         {\r
310                 default:\r
311                         res.diffuse = vec3(0.0);\r
312                         res.specular = vec3(0.0);\r
313                         res.specular2 = vec3(0.0);\r
314                         res.shadowStrength = 0.0;\r
315                         break;\r
316         }\r
317         diffuseContrib = res.diffuse;\r
318         specularContrib = res.specular;\r
319         specularContrib2 = res.specular2;\r
320 }\r
321 // 3 - diffuse and specular only\r
322 void TDLighting(inout vec3 diffuseContrib,inout vec3 specularContrib,int index,vec3 worldSpacePos,vec3 normal,vec3 camVector,float shininess)\r
323 {\r
324         TDPhongResult res;\r
325         switch (index)\r
326         {\r
327                 default:\r
328                         res.diffuse = vec3(0.0);\r
329                         res.specular = vec3(0.0);\r
330                         res.specular2 = vec3(0.0);\r
331                         res.shadowStrength = 0.0;\r
332                         break;\r
333         }\r
334         diffuseContrib = res.diffuse;\r
335         specularContrib = res.specular;\r
336 }\r
337 // 4 - Diffuse only\r
338 void TDLighting(inout vec3 diffuseContrib,int index, vec3 worldSpacePos, vec3 normal)\r
339 {\r
340         TDPhongResult res;\r
341         switch (index)\r
342         {\r
343                 default:\r
344                         res.diffuse = vec3(0.0);\r
345                         res.specular = vec3(0.0);\r
346                         res.specular2 = vec3(0.0);\r
347                         res.shadowStrength = 0.0;\r
348                         break;\r
349         }\r
350         diffuseContrib = res.diffuse;\r
351 }\r
352 // 5 - diffuse only with shadows\r
353 void TDLighting(inout vec3 diffuseContrib,int index,vec3 worldSpacePos,vec3 normal,float shadowStrength,vec3 shadowColor)\r
354 {\r
355         TDPhongResult res;\r
356         switch (index)\r
357         {\r
358                 default:\r
359                         res.diffuse = vec3(0.0);\r
360                         res.specular = vec3(0.0);\r
361                         res.specular2 = vec3(0.0);\r
362                         res.shadowStrength = 0.0;\r
363                         break;\r
364         }\r
365         diffuseContrib = res.diffuse;\r
366 }\r
367 vec4 TDProjMap(int index, vec3 worldSpacePos, vec4 defaultColor) {\r
368         switch (index)\r
369         {\r
370                 default: return defaultColor;\r
371         }\r
372 }\r
373 vec4 TDFog(vec4 color, vec3 lightingSpacePosition, int cameraIndex) {\r
374         switch (cameraIndex) {\r
375                         default:\r
376                 case 0:\r
377                 {\r
378         return color;\r
379                 }\r
380         }\r
381 }\r
382 vec4 TDFog(vec4 color, vec3 lightingSpacePosition)\r
383 {\r
384         return TDFog(color, lightingSpacePosition, 0);\r
385 }\r
386 vec3 TDInstanceTexCoord(int index, vec3 t) {\r
387         vec3 v;\r
388         int coord = index;\r
389         vec4 samp = texelFetch(sTDInstanceTexCoord, coord);\r
390         v[0] = t.s;\r
391         v[1] = t.t;\r
392         v[2] = samp[0];\r
393     t.stp = v.stp;\r
394         return t;\r
395 }\r
396 bool TDInstanceActive(int index) {\r
397         index -= uTDInstanceIDOffset;\r
398         float v;\r
399         int coord = index;\r
400         vec4 samp = texelFetch(sTDInstanceT, coord);\r
401         v = samp[0];\r
402         return v != 0.0;\r
403 }\r
404 vec3 iTDInstanceTranslate(int index, out bool instanceActive) {\r
405         int origIndex = index;\r
406         index -= uTDInstanceIDOffset;\r
407         vec3 v;\r
408         int coord = index;\r
409         vec4 samp = texelFetch(sTDInstanceT, coord);\r
410         v[0] = samp[1];\r
411         v[1] = samp[2];\r
412         v[2] = samp[3];\r
413         instanceActive = samp[0] != 0.0;\r
414         return v;\r
415 }\r
416 vec3 TDInstanceTranslate(int index) {\r
417         index -= uTDInstanceIDOffset;\r
418         vec3 v;\r
419         int coord = index;\r
420         vec4 samp = texelFetch(sTDInstanceT, coord);\r
421         v[0] = samp[1];\r
422         v[1] = samp[2];\r
423         v[2] = samp[3];\r
424         return v;\r
425 }\r
426 mat3 TDInstanceRotateMat(int index) {\r
427         index -= uTDInstanceIDOffset;\r
428         vec3 v = vec3(0.0, 0.0, 0.0);\r
429         mat3 m = mat3(1.0);\r
430 {\r
431         mat3 r;\r
432 }\r
433         return m;\r
434 }\r
435 vec3 TDInstanceScale(int index) {\r
436         index -= uTDInstanceIDOffset;\r
437         vec3 v = vec3(1.0, 1.0, 1.0);\r
438         return v;\r
439 }\r
440 vec3 TDInstancePivot(int index) {\r
441         index -= uTDInstanceIDOffset;\r
442         vec3 v = vec3(0.0, 0.0, 0.0);\r
443         return v;\r
444 }\r
445 vec3 TDInstanceRotTo(int index) {\r
446         index -= uTDInstanceIDOffset;\r
447         vec3 v = vec3(0.0, 0.0, 1.0);\r
448         return v;\r
449 }\r
450 vec3 TDInstanceRotUp(int index) {\r
451         index -= uTDInstanceIDOffset;\r
452         vec3 v = vec3(0.0, 1.0, 0.0);\r
453         return v;\r
454 }\r
455 mat4 TDInstanceMat(int id) {\r
456         bool instanceActive = true;\r
457         vec3 t = iTDInstanceTranslate(id, instanceActive);\r
458         if (!instanceActive)\r
459         {\r
460                 return mat4(0.0);\r
461         }\r
462         mat4 m = mat4(1.0);\r
463         {\r
464                 vec3 tt = t;\r
465                 m[3][0] += m[0][0]*tt.x;\r
466                 m[3][1] += m[0][1]*tt.x;\r
467                 m[3][2] += m[0][2]*tt.x;\r
468                 m[3][3] += m[0][3]*tt.x;\r
469                 m[3][0] += m[1][0]*tt.y;\r
470                 m[3][1] += m[1][1]*tt.y;\r
471                 m[3][2] += m[1][2]*tt.y;\r
472                 m[3][3] += m[1][3]*tt.y;\r
473                 m[3][0] += m[2][0]*tt.z;\r
474                 m[3][1] += m[2][1]*tt.z;\r
475                 m[3][2] += m[2][2]*tt.z;\r
476                 m[3][3] += m[2][3]*tt.z;\r
477         }\r
478         return m;\r
479 }\r
480 mat3 TDInstanceMat3(int id) {\r
481         mat3 m = mat3(1.0);\r
482         return m;\r
483 }\r
484 mat3 TDInstanceMat3ForNorm(int id) {\r
485         mat3 m = TDInstanceMat3(id);\r
486         return m;\r
487 }\r
488 vec4 TDInstanceColor(int index, vec4 curColor) {\r
489         index -= uTDInstanceIDOffset;\r
490         vec4 v;\r
491         int coord = index;\r
492         vec4 samp = texelFetch(sTDInstanceColor, coord);\r
493         v[0] = samp[0];\r
494         v[1] = samp[1];\r
495         v[2] = samp[2];\r
496         v[3] = 1.0;\r
497         curColor[0] = v[0];\r
498 ;\r
499         curColor[1] = v[1];\r
500 ;\r
501         curColor[2] = v[2];\r
502 ;\r
503         return curColor;\r
504 }\r