shader-with-reserved-words.html (5067B)
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 - Reserved Words</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 </head> 17 <body> 18 <div id="description"></div> 19 <div id="console"></div> 20 <script id="vertexShader0" type="text/something-not-javascript"> 21 struct $replaceMe { 22 vec4 $replaceMe; 23 }; 24 struct Foo { 25 $replaceMe $replaceMe; 26 }; 27 attribute vec4 position; 28 void main() 29 { 30 Foo f; 31 f.$replaceMe.$replaceMe = position; 32 gl_Position = f.$replaceMe.$replaceMe; 33 } 34 </script> 35 <script id="fragmentShader0" type="text/something-not-javascript"> 36 precision mediump float; 37 vec4 $replaceMe() { 38 return vec4(0,1,0,1); 39 } 40 void main() 41 { 42 gl_FragColor = $replaceMe(); 43 } 44 </script> 45 <script id="vertexShader1" type="text/something-not-javascript"> 46 attribute vec4 $replaceMe; 47 void main() 48 { 49 gl_Position = $replaceMe; 50 } 51 </script> 52 <script id="fragmentShader1" type="text/something-not-javascript"> 53 precision mediump float; 54 vec4 foo(vec4 $replaceMe) { 55 return $replaceMe; 56 } 57 void main() 58 { 59 gl_FragColor = foo(vec4(1,0,1,1)); 60 } 61 </script> 62 <script id="vertexShader2" type="text/something-not-javascript"> 63 varying vec4 $replaceMe; 64 attribute vec4 position; 65 void main() 66 { 67 gl_Position = position; 68 $replaceMe = position; 69 } 70 </script> 71 <script id="fragmentShader2" type="text/something-not-javascript"> 72 precision mediump float; 73 varying vec4 $replaceMe; 74 void main() 75 { 76 gl_FragColor = $replaceMe; 77 } 78 </script> 79 <script id="vertexShader3" type="text/something-not-javascript"> 80 attribute vec4 position; 81 void main() 82 { 83 gl_Position = position; 84 } 85 </script> 86 <script id="fragmentShader3" type="text/something-not-javascript"> 87 precision mediump float; 88 uniform vec4 $replaceMe; 89 void main() 90 { 91 gl_FragColor = $replaceMe; 92 } 93 </script> 94 <script> 95 "use strict"; 96 var GLSL_1_0_17_words = [ 97 "attribute", 98 "const", 99 "uniform", 100 "varying", 101 "break", 102 "continue", 103 "do", 104 "for", 105 "while", 106 "if", 107 "else", 108 "in", 109 "out", 110 "inout", 111 "float", 112 "int", 113 "void", 114 "bool", 115 "true", 116 "false", 117 "lowp", 118 "mediump", 119 "highp", 120 "precision", 121 "invariant", 122 "discard", 123 "return", 124 "mat2", 125 "mat3", 126 "mat4", 127 "vec2", 128 "vec3", 129 "vec4", 130 "ivec2", 131 "ivec3", 132 "ivec4", 133 "bvec2", 134 "bvec3", 135 "bvec4", 136 "sampler2D", 137 "samplerCube", 138 "struct" 139 ] 140 141 var GLSL_1_0_17_FutureWords = [ 142 "asm", 143 "class", 144 "union", 145 "enum", 146 "typedef", 147 "template", 148 "this", 149 "packed", 150 "goto", 151 "switch", 152 "default", 153 "inline", 154 "noinline", 155 "volatile", 156 "public", 157 "static", 158 "extern", 159 "external", 160 "interface", 161 "flat", 162 "long", 163 "short", 164 "double", 165 "half", 166 "fixed", 167 "unsigned", 168 "superp", 169 "input", 170 "output", 171 "hvec2", 172 "hvec3", 173 "hvec4", 174 "dvec2", 175 "dvec3", 176 "dvec4", 177 "fvec2", 178 "fvec3", 179 "fvec4", 180 "sampler1D", 181 "sampler3D", 182 "sampler1DShadow", 183 "sampler2DShadow", 184 "sampler2DRect", 185 "sampler3DRect", 186 "sampler2DRectShadow", 187 "sizeof", 188 "cast", 189 "namespace", 190 "using", 191 "__foo", // something that has 2 underscores 192 "foo__bar", // something that has 2 underscores 193 "gl_foo", // something that starts with gl_ 194 "webgl_foo" // something that starts with webgl_ 195 ]; 196 197 description(); 198 199 var wtu = WebGLTestUtils; 200 var gl = wtu.create3DContext(); 201 202 var reservedWordsLists = [ 203 GLSL_1_0_17_words, 204 GLSL_1_0_17_FutureWords 205 ]; 206 207 var reservedWords = []; 208 for (var ii = 0; ii < reservedWordsLists.length; ++ii) { 209 var list = reservedWordsLists[ii]; 210 for (var jj = 0; jj < list.length; ++jj) { 211 reservedWords.push(list[jj]); 212 } 213 } 214 215 var src = []; 216 for (var ii = 0; ii < 4; ++ii) { 217 var vsrc = document.getElementById("vertexShader" + ii).text; 218 var fsrc = document.getElementById("fragmentShader" + ii).text; 219 src.push({vsrc: vsrc, fsrc: fsrc}); 220 } 221 222 var wordNdx = 0; 223 224 function testNextWord() { 225 if (wordNdx >= reservedWords.length) { 226 finishTest(); 227 return; 228 } 229 testWord(reservedWords[wordNdx]); 230 ++wordNdx; 231 setTimeout(testNextWord, 0); 232 } 233 testNextWord(); 234 235 function testWord(word) { 236 debug(""); 237 debug("testing: " + word); 238 239 for (var ii = 0; ii < src.length; ++ii) { 240 var vs = src[ii].vsrc.replace(/\$replaceMe/g, word); 241 var fs = src[ii].fsrc.replace(/\$replaceMe/g, word); 242 243 var success = true; 244 var program = wtu.loadProgram(gl, vs, fs, function(msg) { 245 //debug(msg); 246 success = false; 247 }, true); 248 if (success) { 249 testFailed("shader with: '" + word + "' compiled even though it should not"); 250 } else { 251 testPassed("shader with: '" + word + "' correctly failed to compile"); 252 } 253 if (program) { 254 gl.deleteProgram(program); 255 } 256 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no GL errors"); 257 } 258 } 259 260 var successfullyParsed = true; 261 </script> 262 </body> 263 </html>