uninitialized-local-global-variables.html (8100B)
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>Uninitialized local/global variables should be initialized</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 17 <script id="vs_uninit_in_frag" type="x-shader/x-vertex"> 18 precision mediump float; 19 attribute vec4 a_position; 20 void main() { 21 gl_Position = a_position; 22 } 23 </script> 24 25 <!-- Uninitialized local in vertex shader --> 26 <script id="vs_uninit_local_in_vert" type="x-shader/x-vertex"> 27 precision mediump float; 28 attribute vec4 a_position; 29 varying vec3 v_uninit; 30 void main() { 31 vec3 uninit; // uninitialized 32 v_uninit = uninit; 33 gl_Position = a_position; 34 } 35 </script> 36 <script id="fs_uninit_local_in_vert" type="x-shader/x-fragment"> 37 precision mediump float; 38 varying vec3 v_uninit; 39 void main() { 40 gl_FragColor = v_uninit.xyzz; 41 } 42 </script> 43 44 <!-- Uninitialized local in fragment shader --> 45 <script id="fs_uninit_local_in_frag" type="x-shader/x-fragment"> 46 precision mediump float; 47 void main() { 48 vec2 uninit; // uninitialized 49 gl_FragColor = uninit.xyyy; 50 } 51 </script> 52 53 <!-- Uninitialized global in vertex shader --> 54 <script id="vs_uninit_global_in_vert" type="x-shader/x-vertex"> 55 precision mediump float; 56 attribute vec4 a_position; 57 varying float v_uninit; 58 float uninit; // uninitialized 59 void main() { 60 v_uninit = uninit; 61 gl_Position = a_position; 62 } 63 </script> 64 <script id="fs_uninit_global_in_vert" type="x-shader/x-fragment"> 65 precision mediump float; 66 varying float v_uninit; 67 void main() { 68 gl_FragColor = vec4(v_uninit); 69 } 70 </script> 71 72 <!-- Uninitialized global in fragment shader --> 73 <script id="fs_uninit_global_in_frag" type="x-shader/x-fragment"> 74 precision mediump float; 75 vec4 uninit; // uninitialized 76 void main() { 77 gl_FragColor = uninit; 78 } 79 </script> 80 81 <!-- Uninitialized local int in fragment shader --> 82 <script id="fs_uninit_local_int_in_frag" type="x-shader/x-fragment"> 83 precision mediump float; 84 void main() { 85 int uninit; 86 gl_FragColor = vec4(uninit); 87 } 88 </script> 89 90 <!-- Uninitialized local variable and another variable in the same declaration using it as an initializer in fragment shader --> 91 <script id="fs_uninit_two_local_variables_in_declaration_in_frag" type="x-shader/x-fragment"> 92 precision mediump float; 93 void main() { 94 vec2 uninit, uninit2 = uninit; 95 gl_FragColor = uninit2.xyyy; 96 } 97 </script> 98 99 <!-- Uninitialized local array and another variable in the same declaration using it in its initializer in fragment shader --> 100 <script id="fs_uninit_array_and_another_in_declaration_in_frag" type="x-shader/x-fragment"> 101 precision mediump float; 102 void main() { 103 vec2 uninit[2], uninit2 = uninit[0]; 104 gl_FragColor = uninit2.xyyy; 105 } 106 </script> 107 108 <!-- Uninitialized global int in fragment shader --> 109 <script id="fs_uninit_global_int_in_frag" type="x-shader/x-fragment"> 110 precision mediump float; 111 int uninit; // uninitialized 112 void main() { 113 gl_FragColor = vec4(uninit); 114 } 115 </script> 116 117 <!-- Uninitialized local struct in fragment shader --> 118 <script id="fs_uninit_local_struct_in_frag" type="x-shader/x-fragment"> 119 precision mediump float; 120 struct S { vec4 v; }; 121 void main() { 122 S uninit; // uninitialized 123 gl_FragColor = uninit.v; 124 } 125 </script> 126 127 <!-- Uninitialized global struct in fragment shader --> 128 <script id="fs_uninit_global_struct_in_frag" type="x-shader/x-fragment"> 129 precision mediump float; 130 struct S { vec4 v; }; 131 S uninit; // uninitialized 132 void main() { 133 gl_FragColor = uninit.v; 134 } 135 </script> 136 137 <!-- Uninitialized nameless local struct in fragment shader --> 138 <script id="fs_uninit_nameless_local_struct_in_frag" type="x-shader/x-fragment"> 139 precision mediump float; 140 void main() { 141 struct { vec4 v; } uninit; // uninitialized 142 gl_FragColor = uninit.v; 143 } 144 </script> 145 146 <!-- Uninitialized nameless global struct in fragment shader --> 147 <script id="fs_uninit_nameless_global_struct_in_frag" type="x-shader/x-fragment"> 148 precision mediump float; 149 struct { vec4 v; } uninit; // uninitialized 150 void main() { 151 gl_FragColor = uninit.v; 152 } 153 </script> 154 155 <!-- Uninitialized local bool in fragment shader --> 156 <script id="fs_uninit_local_bool_in_frag" type="x-shader/x-fragment"> 157 precision mediump float; 158 void main() { 159 bool uninit[16]; // uninitialized 160 bool result; 161 for (int i = 0; i < 16; i++) { 162 result = result || uninit[i]; 163 } 164 gl_FragColor = result ? vec4(1, 0, 0, 1) : vec4(0); 165 } 166 </script> 167 168 <!-- Uninitialized global bool in fragment shader --> 169 <script id="fs_uninit_global_bool_in_frag" type="x-shader/x-fragment"> 170 precision mediump float; 171 bool uninit[16]; // uninitialized 172 void main() { 173 bool result = false; 174 for (int i = 0; i < 16; i++) { 175 result = result || uninit[i]; 176 } 177 gl_FragColor = result ? vec4(1, 0, 0, 1) : vec4(0); 178 } 179 </script> 180 181 </head> 182 <body> 183 <canvas id="canvas" width="50" height="50"></canvas> 184 <div id="description"></div> 185 <div id="console"></div> 186 <script> 187 "use strict"; 188 description('Uninitialized local/global variables should be initialized: http://anglebug.com/1966'); 189 190 var wtu = WebGLTestUtils; 191 var gl = wtu.create3DContext("canvas"); 192 wtu.setupUnitQuad(gl); 193 194 var cases = [ 195 { 196 name: "Uninitialized local variable in vertex shader", 197 prog: ["vs_uninit_local_in_vert", "fs_uninit_local_in_vert"], 198 }, 199 { 200 name: "Uninitialized local variable in fragment shader", 201 prog: ["vs_uninit_in_frag", "fs_uninit_local_in_frag"], 202 }, 203 { 204 name: "Uninitialized global variable in vertex shader", 205 prog: ["vs_uninit_global_in_vert", "fs_uninit_global_in_vert"], 206 }, 207 { 208 name: "Uninitialized global variable in fragment shader", 209 prog: ["vs_uninit_in_frag", "fs_uninit_global_in_frag"], 210 }, 211 { 212 name: "Uninitialized local int variable in fragment shader", 213 prog: ["vs_uninit_in_frag", "fs_uninit_local_int_in_frag"], 214 }, 215 { 216 name: "Uninitialized local variable and another variable in the same declaration using it as an initializer in fragment shader", 217 prog: ["vs_uninit_in_frag", "fs_uninit_two_local_variables_in_declaration_in_frag"], 218 }, 219 { 220 name: "Uninitialized local array and another variable in the same declaration using it in its initializer in fragment shader", 221 prog: ["vs_uninit_in_frag", "fs_uninit_array_and_another_in_declaration_in_frag"], 222 }, 223 { 224 name: "Uninitialized global int variable in fragment shader", 225 prog: ["vs_uninit_in_frag", "fs_uninit_global_int_in_frag"], 226 }, 227 { 228 name: "Uninitialized local struct variable in fragment shader", 229 prog: ["vs_uninit_in_frag", "fs_uninit_local_struct_in_frag"], 230 }, 231 { 232 name: "Uninitialized global struct variable in fragment shader", 233 prog: ["vs_uninit_in_frag", "fs_uninit_global_struct_in_frag"], 234 }, 235 { 236 name: "Uninitialized nameless local struct variable in fragment shader", 237 prog: ["vs_uninit_in_frag", "fs_uninit_nameless_local_struct_in_frag"], 238 }, 239 { 240 name: "Uninitialized nameless global struct variable in fragment shader", 241 prog: ["vs_uninit_in_frag", "fs_uninit_nameless_global_struct_in_frag"], 242 }, 243 { 244 name: "Uninitialized local bool array variable in fragment shader", 245 prog: ["vs_uninit_in_frag", "fs_uninit_local_bool_in_frag"], 246 }, 247 { 248 name: "Uninitialized global bool array variable in fragment shader", 249 prog: ["vs_uninit_in_frag", "fs_uninit_global_bool_in_frag"], 250 }, 251 ]; 252 253 function runTest() { 254 for (var i = 0; i < cases.length; ++i) { 255 debug(""); 256 debug(cases[i].name); 257 var program = wtu.setupProgram(gl, cases[i].prog, ["a_position"], undefined, true); 258 gl.clearColor(1.0, 0.0, 0.0, 1.0); 259 wtu.clearAndDrawUnitQuad(gl); 260 wtu.checkCanvas(gl, [0, 0, 0, 0]); 261 } 262 263 debug(""); 264 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 265 } 266 267 runTest(); 268 269 var successfullyParsed = true; 270 </script> 271 <script src="../../../js/js-test-post.js"></script> 272 </body> 273 </html>