shaders-with-invariance.html (9409B)
1 <!-- 2 Copyright (c) 2019 The Khronos Group Inc. 3 Use of this source code is governed by an MIT-style license that can be 4 found in the LICENSE.txt file. 5 --> 6 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <meta charset="utf-8"> 11 <title>WebGL GLSL Conformance Tests</title> 12 <link rel="stylesheet" href="../../../resources/js-test-style.css"/> 13 <link rel="stylesheet" href="../../../resources/glsl-feature-tests.css"/> 14 <script src="../../../js/js-test-pre.js"></script> 15 <script src="../../../js/webgl-test-utils.js"></script> 16 <script src="../../../js/glsl-conformance-test.js"></script> 17 </head> 18 <body> 19 <div id="description"></div> 20 <div id="console"></div> 21 <script id="vertexShaderVariant" type="text/something-not-javascript"> 22 varying vec4 v_varying; 23 24 void main() 25 { 26 gl_PointSize = 1.0; 27 gl_Position = v_varying; 28 } 29 </script> 30 <script id="vertexShaderInvariant" type="text/something-not-javascript"> 31 invariant varying vec4 v_varying; 32 33 void main() 34 { 35 gl_Position = v_varying; 36 } 37 </script> 38 <script id="vertexShaderSeparateInvariant" type="text/something-not-javascript"> 39 varying vec4 v_varying; 40 invariant v_varying; 41 42 void main() 43 { 44 gl_Position = v_varying; 45 } 46 </script> 47 <script id="vertexShaderSeparateInvariantWrongOrder" type="text/something-not-javascript"> 48 invariant v_varying; 49 varying vec4 v_varying; 50 51 void main() 52 { 53 gl_Position = v_varying; 54 } 55 </script> 56 <script id="vertexShaderGlobalInvariant" type="text/something-not-javascript"> 57 #pragma STDGL invariant(all) 58 varying vec4 v_varying; 59 60 void main() 61 { 62 gl_Position = v_varying; 63 } 64 </script> 65 <script id="vertexShaderInvariantGlPosition" type="text/something-not-javascript"> 66 invariant gl_Position; 67 68 void main() 69 { 70 gl_Position = vec4(0, 0, 0, 0); 71 } 72 </script> 73 <script id="vertexShaderInvariantGlPointSize" type="text/something-not-javascript"> 74 invariant gl_PointSize; 75 76 void main() 77 { 78 gl_PointSize = 1.0; 79 gl_Position = vec4(0, 0, 0, 0); 80 } 81 </script> 82 <script id="fragmentShaderVariant" type="text/something-not-javascript"> 83 precision mediump float; 84 85 varying vec4 v_varying; 86 87 void main() 88 { 89 gl_FragColor = v_varying; 90 } 91 </script> 92 <script id="fragmentShaderInvariant" type="text/something-not-javascript"> 93 precision mediump float; 94 95 invariant varying vec4 v_varying; 96 97 void main() 98 { 99 gl_FragColor = v_varying; 100 } 101 </script> 102 <script id="fragmentShaderSeparateInvariant" type="text/something-not-javascript"> 103 precision mediump float; 104 105 varying vec4 v_varying; 106 invariant v_varying; 107 108 void main() 109 { 110 gl_FragColor = v_varying; 111 } 112 </script> 113 <script id="fragmentShaderSeparateInvariantWrongOrder" type="text/something-not-javascript"> 114 precision mediump float; 115 116 invariant v_varying; 117 varying vec4 v_varying; 118 119 void main() 120 { 121 gl_FragColor = v_varying; 122 } 123 </script> 124 <script id="fragmentShaderGlobalInvariant" type="text/something-not-javascript"> 125 #pragma STDGL invariant(all) 126 precision mediump float; 127 128 varying vec4 v_varying; 129 130 void main() 131 { 132 gl_FragColor = v_varying; 133 } 134 </script> 135 <script id="fragmentShaderInvariantGlFragCoord" type="text/something-not-javascript"> 136 invariant gl_FragCoord; 137 138 void main() 139 { 140 gl_FragColor = gl_FragCoord; 141 } 142 </script> 143 <script id="fragmentShaderVariantGlFragCoord" type="text/something-not-javascript"> 144 void main() 145 { 146 gl_FragColor = gl_FragCoord; 147 } 148 </script> 149 <script id="fragmentShaderInvariantGlPointCoord" type="text/something-not-javascript"> 150 invariant gl_PointCoord; 151 152 void main() 153 { 154 gl_FragColor = vec4(gl_PointCoord, 0.0, 0.0); 155 } 156 </script> 157 <script id="fragmentShaderVariantGlPointCoord" type="text/something-not-javascript"> 158 void main() 159 { 160 gl_FragColor = vec4(gl_PointCoord, 0.0, 0.0); 161 } 162 </script> 163 <script id="fragmentShaderInvariantGlFrontFacing" type="text/something-not-javascript"> 164 invariant gl_FrontFacing; 165 166 void main() 167 { 168 gl_FragColor = gl_FrontFacing ? vec4(1, 1, 1, 1) : vec4(0, 0, 0, 1); 169 } 170 </script> 171 <script id="fragmentShaderVariantGlFrontFacing" type="text/something-not-javascript"> 172 void main() 173 { 174 gl_FragColor = gl_FrontFacing ? vec4(1, 1, 1, 1) : vec4(0, 0, 0, 1); 175 } 176 </script> 177 <script> 178 // GLSL 1.0.17 4.3.5 179 "use strict"; 180 // See GLSL ES spec 1.0.17 section 4.6.4 "Invariance and linkage". 181 var cases = [ 182 { 183 vShaderId: "vertexShaderVariant", 184 vShaderSuccess: true, 185 fShaderId: "fragmentShaderInvariant", 186 fShaderSuccess: true, 187 linkSuccess: false, 188 passMsg: "vertex shader with variant varying and fragment shader with invariant varying must fail", 189 }, 190 { 191 vShaderId: "vertexShaderInvariant", 192 vShaderSuccess: true, 193 fShaderId: "fragmentShaderVariant", 194 fShaderSuccess: true, 195 linkSuccess: false, 196 passMsg: "vertex shader with invariant varying and fragment shader with variant varying must fail", 197 }, 198 { 199 vShaderId: "vertexShaderGlobalInvariant", 200 vShaderSuccess: true, 201 fShaderId: "fragmentShaderVariant", 202 fShaderSuccess: true, 203 linkSuccess: false, 204 passMsg: "vertex shader with invariant (global setting) varying and fragment shader with variant varying must fail", 205 }, 206 { 207 vShaderId: "vertexShaderGlobalInvariant", 208 vShaderSuccess: true, 209 fShaderId: "fragmentShaderInvariant", 210 fShaderSuccess: true, 211 linkSuccess: true, 212 passMsg: "vertex shader with invariant (global setting) varying and fragment shader with invariant varying must succeed", 213 }, 214 { 215 vShaderId: "vertexShaderSeparateInvariant", 216 vShaderSuccess: true, 217 fShaderId: "fragmentShaderInvariant", 218 fShaderSuccess: true, 219 linkSuccess: true, 220 passMsg: "vertex shader with invariant (separately set) varying and fragment shader with invariant varying must succeed", 221 }, 222 { 223 vShaderId: "vertexShaderInvariant", 224 vShaderSuccess: true, 225 fShaderId: "fragmentShaderSeparateInvariant", 226 fShaderSuccess: true, 227 linkSuccess: true, 228 passMsg: "vertex shader with invariant varying and fragment shader with invariant (separately set) varying must succeed", 229 }, 230 { 231 vShaderId: "vertexShaderSeparateInvariantWrongOrder", 232 vShaderSuccess: false, 233 fShaderId: "fragmentShaderInvariant", 234 fShaderSuccess: true, 235 linkSuccess: false, 236 passMsg: "vertex shader with invariant (separately set in wrong order) varying must fail", 237 }, 238 { 239 vShaderId: "vertexShaderInvariant", 240 vShaderSuccess: true, 241 fShaderId: "fragmentShaderSeparateInvariantWrongOrder", 242 fShaderSuccess: false, 243 linkSuccess: false, 244 passMsg: "fragment shader with invariant (separately set in wrong order) varying must fail", 245 }, 246 { 247 vShaderId: "vertexShaderInvariantGlPosition", 248 vShaderSuccess: true, 249 fShaderId: "fragmentShaderInvariantGlFragCoord", 250 fShaderSuccess: true, 251 linkSuccess: true, 252 passMsg: "vertex shader with invariant gl_Position and fragment shader with invariant gl_FragCoord must succeed", 253 }, 254 { 255 vShaderId: "vertexShaderVariant", 256 vShaderSuccess: true, 257 fShaderId: "fragmentShaderInvariantGlFragCoord", 258 fShaderSuccess: true, 259 linkSuccess: false, 260 passMsg: "vertex shader with variant gl_Position and fragment shader with invariant gl_FragCoord must fail", 261 }, 262 { 263 vShaderId: "vertexShaderInvariantGlPosition", 264 vShaderSuccess: true, 265 fShaderId: "fragmentShaderVariantGlFragCoord", 266 fShaderSuccess: true, 267 linkSuccess: true, 268 passMsg: "vertex shader with invariant gl_Position and fragment shader with variant gl_FragCoord must succeed", 269 }, 270 { 271 vShaderId: "vertexShaderInvariantGlPointSize", 272 vShaderSuccess: true, 273 fShaderId: "fragmentShaderInvariantGlPointCoord", 274 fShaderSuccess: true, 275 linkSuccess: true, 276 passMsg: "vertex shader with invariant gl_PointSize and fragment shader with invariant gl_PointCoord must succeed", 277 }, 278 { 279 vShaderId: "vertexShaderVariant", 280 vShaderSuccess: true, 281 fShaderId: "fragmentShaderInvariantGlPointCoord", 282 fShaderSuccess: true, 283 linkSuccess: false, 284 passMsg: "vertex shader with variant gl_PointSize and fragment shader with invariant gl_PointCoord must fail", 285 }, 286 { 287 vShaderId: "vertexShaderInvariantGlPointSize", 288 vShaderSuccess: true, 289 fShaderId: "fragmentShaderVariantGlPointCoord", 290 fShaderSuccess: true, 291 linkSuccess: true, 292 passMsg: "vertex shader with invariant gl_PointSize and fragment shader with variant gl_PointCoord must succeed", 293 }, 294 { 295 vShaderId: "vertexShaderVariant", 296 vShaderSuccess: true, 297 fShaderId: "fragmentShaderVariantGlFrontFacing", 298 fShaderSuccess: true, 299 linkSuccess: true, 300 passMsg: "fragment shader with variant gl_FrontFacing must succeed compilation", 301 }, 302 { 303 vShaderId: "vertexShaderVariant", 304 vShaderSuccess: true, 305 fShaderId: "fragmentShaderInvariantGlFrontFacing", 306 fShaderSuccess: false, 307 linkSuccess: false, 308 passMsg: "fragment shader with invariant gl_FrontFacing must fail compilation", 309 }, 310 { 311 vShaderId: "vertexShaderVariant", 312 vShaderSuccess: true, 313 fShaderId: "fragmentShaderGlobalInvariant", 314 fShaderSuccess: true, 315 linkSuccess: true, 316 passMsg: "vertex shader with variant varying and fragment shader with invariant (global setting) varying must succeed", 317 }, 318 { 319 vShaderId: "vertexShaderInvariant", 320 vShaderSuccess: true, 321 fShaderId: "fragmentShaderGlobalInvariant", 322 fShaderSuccess: true, 323 linkSuccess: false, 324 passMsg: "vertex shader with invariant varying and fragment shader with invariant (global setting) varying must fail", 325 } 326 ]; 327 328 GLSLConformanceTester.runTests(cases); 329 var successfullyParsed = true; 330 </script> 331 </body> 332 </html>