OLD | NEW |
| (Empty) |
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" | |
2 "http://www.w3.org/TR/html4/loose.dtd"> | |
3 <html> | |
4 <head> | |
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |
6 <title>WebGL BindAttribLocation Conformance Tests</title> | |
7 <script src="../../../resources/js-test.js"></script> | |
8 <script src="resources/webgl-test.js"></script> | |
9 </head> | |
10 <body> | |
11 <div id="description"></div> | |
12 <div id="console"></div> | |
13 <canvas style="border: 1px solid black;" id="canvas" width="50" height="50"></ca
nvas> | |
14 <script id="vshader" type="text/something-not-javascript"> | |
15 attribute vec4 vPosition; | |
16 attribute vec4 vColor; | |
17 varying vec4 color; | |
18 void main() | |
19 { | |
20 gl_Position = vPosition; | |
21 color = vColor; | |
22 } | |
23 </script> | |
24 <script id="fshader" type="text/something-not-javascript"> | |
25 #ifdef GL_ES | |
26 precision highp float; | |
27 #endif | |
28 varying vec4 color; | |
29 void main() | |
30 { | |
31 gl_FragColor = color; | |
32 } | |
33 </script> | |
34 <script> | |
35 description("This test ensures WebGL implementations don't allow names that star
t with 'gl_' when calling bindAttribLocation."); | |
36 | |
37 if (window.internals) | |
38 window.internals.settings.setWebGLErrorsToConsoleEnabled(false); | |
39 | |
40 debug(""); | |
41 debug("Canvas.getContext"); | |
42 | |
43 var gl = create3DContext(document.getElementById("canvas")); | |
44 shouldBeNonNull(gl); | |
45 | |
46 function fail(x,y, buf, shouldBe) | |
47 { | |
48 var i = (y*50+x) * 4; | |
49 var reason = "pixel at ("+x+","+y+") is ("+buf[i]+","+buf[i+1]+","+buf[i+2]+",
"+buf[i+3]+"), should be "+shouldBe; | |
50 testFailed(reason); | |
51 } | |
52 | |
53 function pass() | |
54 { | |
55 testPassed("drawing is correct"); | |
56 } | |
57 | |
58 function loadShader(shaderType, shaderId) { | |
59 // Get the shader source. | |
60 var shaderSource = document.getElementById(shaderId).text; | |
61 | |
62 // Create the shader object | |
63 var shader = gl.createShader(shaderType); | |
64 if (shader == null) { | |
65 debug("*** Error: unable to create shader '"+shaderId+"'"); | |
66 return null; | |
67 } | |
68 | |
69 // Load the shader source | |
70 gl.shaderSource(shader, shaderSource); | |
71 | |
72 // Compile the shader | |
73 gl.compileShader(shader); | |
74 | |
75 // Check the compile status | |
76 var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); | |
77 if (!compiled) { | |
78 // Something went wrong during compilation; get the error | |
79 var error = gl.getShaderInfoLog(shader); | |
80 debug("*** Error compiling shader '"+shader+"':"+error); | |
81 gl.deleteShader(shader); | |
82 return null; | |
83 } | |
84 return shader; | |
85 } | |
86 | |
87 debug(""); | |
88 debug("Checking gl.bindAttribLocation."); | |
89 | |
90 var program = gl.createProgram(); | |
91 gl.bindAttribLocation(program, 0, "gl_foo"); | |
92 glErrorShouldBe(gl, gl.INVALID_OPERATION, | |
93 "bindAttribLocation should return INVALID_OPERATION if name starts with 'gl_
'"); | |
94 gl.bindAttribLocation(program, 0, "gl_TexCoord0"); | |
95 glErrorShouldBe(gl, gl.INVALID_OPERATION, | |
96 "bindAttribLocation should return INVALID_OPERATION if name starts with 'gl_
'"); | |
97 | |
98 var vs = loadShader(gl.VERTEX_SHADER, "vshader"); | |
99 var fs = loadShader(gl.FRAGMENT_SHADER, "fshader"); | |
100 gl.attachShader(program, vs); | |
101 gl.attachShader(program, fs); | |
102 | |
103 var positions = gl.createBuffer(); | |
104 gl.bindBuffer(gl.ARRAY_BUFFER, positions); | |
105 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,0.5,0, -0.5,-0.5,0, 0.5,-0.5
,0 ]), gl.STATIC_DRAW); | |
106 | |
107 var colors = gl.createBuffer(); | |
108 gl.bindBuffer(gl.ARRAY_BUFFER, colors); | |
109 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ | |
110 0,1,0,1, | |
111 0,1,0,1, | |
112 0,1,0,1]), gl.STATIC_DRAW); | |
113 | |
114 function setBindLocations(colorLocation, positionLocation) { | |
115 gl.bindAttribLocation(program, positionLocation, "vPosition"); | |
116 gl.bindAttribLocation(program, colorLocation, "vColor"); | |
117 gl.linkProgram(program); | |
118 gl.useProgram(program); | |
119 var linked = (gl.getProgramParameter(program, gl.LINK_STATUS) != 0); | |
120 assertMsg(linked, "program linked successfully"); | |
121 | |
122 debug("vPosition:" + gl.getAttribLocation(program, "vPosition")) | |
123 debug("vColor :" + gl.getAttribLocation(program, "vColor")) | |
124 assertMsg(gl.getAttribLocation(program, "vPosition") == positionLocation, | |
125 "location of vPositon should be " + positionLocation); | |
126 assertMsg(gl.getAttribLocation(program, "vColor") == colorLocation, | |
127 "location of vColor should be " + colorLocation); | |
128 | |
129 var ploc = gl.getAttribLocation(program, "vPosition"); | |
130 var cloc = gl.getAttribLocation(program, "vColor"); | |
131 gl.bindBuffer(gl.ARRAY_BUFFER, positions); | |
132 gl.enableVertexAttribArray(positionLocation); | |
133 gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, 0, 0); | |
134 gl.bindBuffer(gl.ARRAY_BUFFER, colors); | |
135 gl.enableVertexAttribArray(colorLocation); | |
136 gl.vertexAttribPointer(colorLocation, 4, gl.FLOAT, false, 0, 0); | |
137 } | |
138 | |
139 function checkDraw(colorLocation, positionLocation, r, g, b, a) { | |
140 gl.clearColor(0, 0, 0, 1); | |
141 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); | |
142 gl.drawArrays(gl.TRIANGLES, 0, 3); | |
143 | |
144 var width = 50; | |
145 var height = 50; | |
146 var buf = new Uint8Array(width * height * 4); | |
147 gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf); | |
148 | |
149 function checkPixel(x, y, r, g, b, a) { | |
150 var offset = (y * width + x) * 4; | |
151 if (buf[offset + 0] != r || | |
152 buf[offset + 1] != g || | |
153 buf[offset + 2] != b || | |
154 buf[offset + 3] != a) { | |
155 fail(x, y, buf, "(" + r + "," + g + "," + b + "," + a + ")"); | |
156 return false; | |
157 } | |
158 return true; | |
159 } | |
160 | |
161 // Test several locations | |
162 // First line should be all black | |
163 var success = true; | |
164 for (var i = 0; i < 50; ++i) | |
165 success = success && checkPixel(i, 0, 0, 0, 0, 255); | |
166 | |
167 // Line 15 should be red for at least 10 rgba pixels starting 20 pixels in | |
168 var offset = (15 * 50 + 20) * 4; | |
169 for (var i = 0; i < 10; ++i) | |
170 success = success && checkPixel(20 + i, 15, r, g, b, a); | |
171 | |
172 // Last line should be all black | |
173 for (var i = 0; i < 50; ++i) | |
174 success = success && checkPixel(i, 49, 0, 0, 0, 255); | |
175 | |
176 if (success) | |
177 pass(); | |
178 | |
179 gl.disableVertexAttribArray(positionLocation); | |
180 gl.disableVertexAttribArray(colorLocation); | |
181 } | |
182 | |
183 setBindLocations(2, 3); | |
184 checkDraw(2, 3, 0, 255, 0, 255); | |
185 | |
186 setBindLocations(0, 3); | |
187 gl.disableVertexAttribArray(0); | |
188 gl.vertexAttrib4f(0, 1, 0, 0, 1); | |
189 checkDraw(0, 3, 255, 0, 0, 255); | |
190 | |
191 glErrorShouldBe(gl, gl.NO_ERROR); | |
192 | |
193 debug(""); | |
194 | |
195 </script> | |
196 | |
197 </body> | |
198 </html> | |
OLD | NEW |