1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES Utilities
3 * ------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
7 * Licensed under the Apache License, Version 2.0 (the 'License');
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an 'AS IS' BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 goog.provide('functional.gles3.es3fIntegerStateQueryTests');
23 goog.require('framework.common.tcuTestCase');
24 goog.require('framework.delibs.debase.deRandom');
25 goog.require('framework.opengl.gluTextureUtil');
26 goog.require('functional.gles3.es3fApiCase');
27 goog.require('modules.shared.glsStateQuery');
29 goog.scope(function() {
30 var es3fIntegerStateQueryTests = functional.gles3.es3fIntegerStateQueryTests;
31 var tcuTestCase = framework.common.tcuTestCase;
32 var deRandom = framework.delibs.debase.deRandom;
33 var es3fApiCase = functional.gles3.es3fApiCase;
34 var glsStateQuery = modules.shared.glsStateQuery;
36 /** @type {string} */ var transformFeedbackTestVertSource = '' +
38 'void main (void)\n' +
40 ' gl_Position = vec4(0.0);\n' +
43 /** @type {string} */ var transformFeedbackTestFragSource = '' +
45 'layout(location = 0) out mediump vec4 fragColor;' +
46 'void main (void)\n' +
48 ' fragColor = vec4(0.0);\n' +
51 /** @type {string} */ var testVertSource = '' +
53 'void main (void)\n' +
55 ' gl_Position = vec4(0.0);\n' +
58 /** @type {string} */ var testFragSource = '' +
60 'layout(location = 0) out mediump vec4 fragColor;' +
61 'void main (void)\n' +
63 ' fragColor = vec4(0.0);\n' +
68 * @extends {es3fApiCase.ApiCase}
69 * @param {string} name
70 * @param {string} description
72 es3fIntegerStateQueryTests.TransformFeedbackTestCase = function(name, description) {
73 es3fApiCase.ApiCase.call(this, name, description, gl);
74 /** @type {WebGLTransformFeedback} */ this.m_transformfeedback;
77 es3fIntegerStateQueryTests.TransformFeedbackTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
78 es3fIntegerStateQueryTests.TransformFeedbackTestCase.prototype.constructor = es3fIntegerStateQueryTests.TransformFeedbackTestCase;
80 es3fIntegerStateQueryTests.TransformFeedbackTestCase.prototype.testTransformFeedback = function() {
81 throw new Error('This method should be implemented by child classes.');
84 es3fIntegerStateQueryTests.TransformFeedbackTestCase.prototype.test = function() {
85 this.beforeTransformFeedbackTest(); // [dag] added this as there is no other way this method would be called.
87 this.m_transformfeedback = gl.createTransformFeedback();
89 /** @type {WebGLShader} */ var shaderVert = gl.createShader(gl.VERTEX_SHADER);
90 gl.shaderSource(shaderVert, transformFeedbackTestVertSource);
91 gl.compileShader(shaderVert);
93 var compileStatus = /** @type {boolean} */ (gl.getShaderParameter(shaderVert, gl.COMPILE_STATUS));
94 glsStateQuery.compare(compileStatus, true);
96 /** @type {WebGLShader} */ var shaderFrag = gl.createShader(gl.FRAGMENT_SHADER);
97 gl.shaderSource(shaderFrag, transformFeedbackTestFragSource);
98 gl.compileShader(shaderFrag);
100 compileStatus = /** @type {boolean} */ (gl.getShaderParameter(shaderFrag, gl.COMPILE_STATUS));
101 glsStateQuery.compare(compileStatus, true);
103 /** @type {WebGLProgram} */ var shaderProg = gl.createProgram();
104 gl.attachShader(shaderProg, shaderVert);
105 gl.attachShader(shaderProg, shaderFrag);
106 /** @type {Array<string>} */ var transform_feedback_outputs = ['gl_Position'];
107 gl.transformFeedbackVaryings(shaderProg, transform_feedback_outputs, gl.INTERLEAVED_ATTRIBS);
108 gl.linkProgram(shaderProg);
110 var linkStatus = /** @type {boolean} */ (gl.getProgramParameter(shaderProg, gl.LINK_STATUS));
111 glsStateQuery.compare(linkStatus, true);
113 gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, this.m_transformfeedback);
116 /** @type {WebGLBuffer} */ var feedbackBufferId = gl.createBuffer();
117 gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER, feedbackBufferId);
118 gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, new Float32Array(16), gl.DYNAMIC_READ);
119 gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, feedbackBufferId);
121 gl.useProgram(shaderProg);
123 this.testTransformFeedback();
126 gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);
127 gl.deleteTransformFeedback(this.m_transformfeedback);
128 gl.deleteBuffer(feedbackBufferId);
129 gl.deleteShader(shaderVert);
130 gl.deleteShader(shaderFrag);
131 gl.deleteProgram(shaderProg);
133 this.afterTransformFeedbackTest(); // [dag] added this as there is no other way this method would be called.
138 * @extends {es3fIntegerStateQueryTests.TransformFeedbackTestCase}
139 * @param {string} name
141 es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase = function(name) {
142 es3fIntegerStateQueryTests.TransformFeedbackTestCase.call(this, name, 'GL_TRANSFORM_FEEDBACK_BINDING');
145 es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase.prototype = Object.create(es3fIntegerStateQueryTests.TransformFeedbackTestCase.prototype);
146 es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase;
149 es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase.prototype.beforeTransformFeedbackTest = function() {
150 this.check(glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_BINDING, null), 'beforeTransformFeedbackTest');
153 es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase.prototype.testTransformFeedback = function() {
154 this.check(glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_BINDING, this.m_transformfeedback), 'testTransformFeedback');
157 es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase.prototype.afterTransformFeedbackTest = function() {
158 this.check(glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_BINDING, null), 'afterTransformFeedbackTest');
163 * @extends {es3fApiCase.ApiCase}
164 * @param {string} name
165 * @param {string} description
166 * @param {number} targetName
167 * @param {number} minValue
169 es3fIntegerStateQueryTests.ConstantMinimumValueTestCase = function(name, description, targetName, minValue) {
170 es3fApiCase.ApiCase.call(this, name, description, gl);
171 /** @type {number} */ this.m_targetName = targetName;
172 /** @type {number} */ this.m_minValue = minValue;
175 es3fIntegerStateQueryTests.ConstantMinimumValueTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
176 es3fIntegerStateQueryTests.ConstantMinimumValueTestCase.prototype.constructor = es3fIntegerStateQueryTests.ConstantMinimumValueTestCase;
178 es3fIntegerStateQueryTests.ConstantMinimumValueTestCase.prototype.test = function() {
179 this.check(glsStateQuery.verifyGreaterOrEqual(this.m_targetName, this.m_minValue), 'Fail');
184 * @extends {es3fApiCase.ApiCase}
185 * @param {string} name
186 * @param {string} description
187 * @param {number} targetName
188 * @param {number} minValue
190 es3fIntegerStateQueryTests.ConstantMaximumValueTestCase = function(name, description, targetName, minValue) {
191 es3fApiCase.ApiCase.call(this, name, description, gl);
192 /** @type {number} */ this.m_targetName = targetName;
193 /** @type {number} */ this.m_minValue = minValue;
196 es3fIntegerStateQueryTests.ConstantMaximumValueTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
197 es3fIntegerStateQueryTests.ConstantMaximumValueTestCase.prototype.constructor = es3fIntegerStateQueryTests.ConstantMaximumValueTestCase;
199 es3fIntegerStateQueryTests.ConstantMaximumValueTestCase.prototype.test = function() {
200 this.check(glsStateQuery.verifyLessOrEqual(this.m_targetName, this.m_minValue), 'Fail');
205 * @extends {es3fApiCase.ApiCase}
206 * @param {string} name
207 * @param {string} description
209 es3fIntegerStateQueryTests.SampleBuffersTestCase = function(name, description) {
210 es3fApiCase.ApiCase.call(this, name, description, gl);
213 es3fIntegerStateQueryTests.SampleBuffersTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
214 es3fIntegerStateQueryTests.SampleBuffersTestCase.prototype.constructor = es3fIntegerStateQueryTests.SampleBuffersTestCase;
216 es3fIntegerStateQueryTests.SampleBuffersTestCase.prototype.test = function() {
217 /** @type {number} */ var expectedSampleBuffers = (/** @type {number} */ (gl.getParameter(gl.SAMPLES)) > 1) ? 1 : 0;
219 bufferedLogToConsole('Sample count is ' + expectedSampleBuffers + ', expecting GL_SAMPLE_BUFFERS to be ' + expectedSampleBuffers);
221 this.check(glsStateQuery.verify(gl.SAMPLE_BUFFERS, expectedSampleBuffers));
226 * @extends {es3fApiCase.ApiCase}
227 * @param {string} name
228 * @param {string} description
230 es3fIntegerStateQueryTests.SamplesTestCase = function(name, description) {
231 es3fApiCase.ApiCase.call(this, name, description, gl);
234 es3fIntegerStateQueryTests.SamplesTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
235 es3fIntegerStateQueryTests.SamplesTestCase.prototype.constructor = es3fIntegerStateQueryTests.SamplesTestCase;
237 es3fIntegerStateQueryTests.SamplesTestCase.prototype.test = function() {
238 var numSamples = /** @type {number} */ (gl.getParameter(gl.SAMPLES));
240 if (numSamples > 1) {
241 bufferedLogToConsole('Sample count is ' + numSamples);
243 this.check(glsStateQuery.verify(gl.SAMPLES, numSamples));
245 /** @type {Array<number>} */ var validSamples = [0, 1];
247 bufferedLogToConsole('Expecting GL_SAMPLES to be 0 or 1');
249 this.check(glsStateQuery.verifyAnyOf(gl.SAMPLES, validSamples));
255 * @extends {es3fApiCase.ApiCase}
256 * @param {string} name
257 * @param {string} description
258 * @param {number} targetName
260 es3fIntegerStateQueryTests.HintTestCase = function(name, description, targetName) {
261 es3fApiCase.ApiCase.call(this, name, description, gl);
262 /** @type {number} */ this.m_targetName = targetName;
265 es3fIntegerStateQueryTests.HintTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
266 es3fIntegerStateQueryTests.HintTestCase.prototype.constructor = es3fIntegerStateQueryTests.HintTestCase;
268 es3fIntegerStateQueryTests.HintTestCase.prototype.test = function() {
269 this.check(glsStateQuery.verify(this.m_targetName, gl.DONT_CARE));
271 gl.hint(this.m_targetName, gl.NICEST);
272 this.check(glsStateQuery.verify(this.m_targetName, gl.NICEST));
274 gl.hint(this.m_targetName, gl.FASTEST);
275 this.check(glsStateQuery.verify(this.m_targetName, gl.FASTEST));
277 gl.hint(this.m_targetName, gl.DONT_CARE);
278 this.check(glsStateQuery.verify(this.m_targetName, gl.DONT_CARE));
283 * @extends {es3fApiCase.ApiCase}
284 * @param {string} name
285 * @param {string} description
287 es3fIntegerStateQueryTests.DepthFuncTestCase = function(name, description) {
288 es3fApiCase.ApiCase.call(this, name, description, gl);
291 es3fIntegerStateQueryTests.DepthFuncTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
292 es3fIntegerStateQueryTests.DepthFuncTestCase.prototype.constructor = es3fIntegerStateQueryTests.DepthFuncTestCase;
294 es3fIntegerStateQueryTests.DepthFuncTestCase.prototype.test = function() {
295 this.check(glsStateQuery.verify(gl.DEPTH_FUNC, gl.LESS));
297 /** @type {Array<number>} */ var depthFunctions = [gl.NEVER, gl.ALWAYS, gl.LESS, gl.LEQUAL, gl.EQUAL, gl.GREATER, gl.GEQUAL, gl.NOTEQUAL];
298 for (var ndx = 0; ndx < depthFunctions.length; ndx++) {
299 gl.depthFunc(depthFunctions[ndx]);
301 this.check(glsStateQuery.verify(gl.DEPTH_FUNC, depthFunctions[ndx]));
307 * @extends {es3fApiCase.ApiCase}
308 * @param {string} name
309 * @param {string} description
311 es3fIntegerStateQueryTests.CullFaceTestCase = function(name, description) {
312 es3fApiCase.ApiCase.call(this, name, description, gl);
315 es3fIntegerStateQueryTests.CullFaceTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
316 es3fIntegerStateQueryTests.CullFaceTestCase.prototype.constructor = es3fIntegerStateQueryTests.CullFaceTestCase;
318 es3fIntegerStateQueryTests.CullFaceTestCase.prototype.test = function() {
319 this.check(glsStateQuery.verify(gl.CULL_FACE_MODE, gl.BACK));
321 /** @type {Array<number>} */ var cullFaces = [gl.FRONT, gl.BACK, gl.FRONT_AND_BACK];
322 for (var ndx = 0; ndx < cullFaces.length; ndx++) {
323 gl.cullFace(cullFaces[ndx]);
325 this.check(glsStateQuery.verify(gl.CULL_FACE_MODE, cullFaces[ndx]));
331 * @extends {es3fApiCase.ApiCase}
332 * @param {string} name
333 * @param {string} description
335 es3fIntegerStateQueryTests.FrontFaceTestCase = function(name, description) {
336 es3fApiCase.ApiCase.call(this, name, description, gl);
339 es3fIntegerStateQueryTests.FrontFaceTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
340 es3fIntegerStateQueryTests.FrontFaceTestCase.prototype.constructor = es3fIntegerStateQueryTests.FrontFaceTestCase;
342 es3fIntegerStateQueryTests.FrontFaceTestCase.prototype.test = function() {
343 this.check(glsStateQuery.verify(gl.FRONT_FACE, gl.CCW));
345 /** @type {Array<number>} */ var frontFaces = [gl.CW, gl.CCW];
346 for (var ndx = 0; ndx < frontFaces.length; ndx++) {
347 gl.frontFace(frontFaces[ndx]);
349 this.check(glsStateQuery.verify(gl.FRONT_FACE, frontFaces[ndx]));
355 * @extends {es3fApiCase.ApiCase}
356 * @param {string} name
357 * @param {string} description
359 es3fIntegerStateQueryTests.ViewPortTestCase = function(name, description) {
360 es3fApiCase.ApiCase.call(this, name, description, gl);
363 es3fIntegerStateQueryTests.ViewPortTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
364 es3fIntegerStateQueryTests.ViewPortTestCase.prototype.constructor = es3fIntegerStateQueryTests.ViewPortTestCase;
366 es3fIntegerStateQueryTests.ViewPortTestCase.prototype.test = function() {
367 /** @type {deRandom.Random} */ var rnd = new deRandom.Random(0xabcdef);
369 var maxViewportDimensions = /** @type {Array<number>} */ (gl.getParameter(gl.MAX_VIEWPORT_DIMS));
371 // verify initial value of first two values
372 this.check(glsStateQuery.verify(gl.VIEWPORT, new Int32Array([0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight])));
374 /** @type {number} */ var numIterations = 120;
375 for (var i = 0; i < numIterations; ++i) {
376 /** @type {number} */ var x = rnd.getInt(-64000, 64000);
377 /** @type {number} */ var y = rnd.getInt(-64000, 64000);
378 /** @type {number} */ var width = rnd.getInt(0, maxViewportDimensions[0]);
379 /** @type {number} */ var height = rnd.getInt(0, maxViewportDimensions[1]);
381 gl.viewport(x, y, width, height);
382 this.check(glsStateQuery.verify(gl.VIEWPORT, new Int32Array([x, y, width, height])));
388 * @extends {es3fApiCase.ApiCase}
389 * @param {string} name
390 * @param {string} description
392 es3fIntegerStateQueryTests.ScissorBoxTestCase = function(name, description) {
393 es3fApiCase.ApiCase.call(this, name, description, gl);
396 es3fIntegerStateQueryTests.ScissorBoxTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
397 es3fIntegerStateQueryTests.ScissorBoxTestCase.prototype.constructor = es3fIntegerStateQueryTests.ScissorBoxTestCase;
399 es3fIntegerStateQueryTests.ScissorBoxTestCase.prototype.test = function() {
400 /** @type {deRandom.Random} */ var rnd = new deRandom.Random(0xabcdef);
402 // verify initial value of first two values
403 this.check(glsStateQuery.verifyMask(gl.SCISSOR_BOX, [0, 0, 0, 0], [true, true, false, false]));
405 /** @type {number} */ var numIterations = 120;
406 for (var i = 0; i < numIterations; ++i) {
407 /** @type {number} */ var left = rnd.getInt(-64000, 64000);
408 /** @type {number} */ var bottom = rnd.getInt(-64000, 64000);
409 /** @type {number} */ var width = rnd.getInt(0, 64000);
410 /** @type {number} */ var height = rnd.getInt(0, 64000);
412 gl.scissor(left, bottom, width, height);
413 this.check(glsStateQuery.verify(gl.SCISSOR_BOX, new Int32Array([left, bottom, width, height])));
419 * @extends {es3fApiCase.ApiCase}
420 * @param {string} name
421 * @param {string} description
423 es3fIntegerStateQueryTests.MaxViewportDimsTestCase = function(name, description) {
424 es3fApiCase.ApiCase.call(this, name, description, gl);
427 es3fIntegerStateQueryTests.MaxViewportDimsTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
428 es3fIntegerStateQueryTests.MaxViewportDimsTestCase.prototype.constructor = es3fIntegerStateQueryTests.MaxViewportDimsTestCase;
430 es3fIntegerStateQueryTests.MaxViewportDimsTestCase.prototype.test = function() {
431 this.check(glsStateQuery.verifyGreaterOrEqual(gl.MAX_VIEWPORT_DIMS, [gl.drawingBufferWidth, gl.drawingBufferHeight]));
436 * @extends {es3fApiCase.ApiCase}
437 * @param {string} name
438 * @param {string} description
439 * @param {number} testTargetName
441 es3fIntegerStateQueryTests.StencilRefTestCase = function(name, description, testTargetName) {
442 es3fApiCase.ApiCase.call(this, name, description, gl);
443 /** @type {number} */ this.m_testTargetName = testTargetName;
446 es3fIntegerStateQueryTests.StencilRefTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
447 es3fIntegerStateQueryTests.StencilRefTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilRefTestCase;
449 es3fIntegerStateQueryTests.StencilRefTestCase.prototype.test = function() {
450 this.check(glsStateQuery.verify(this.m_testTargetName, 0));
452 var stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
454 for (var stencilBit = 0; stencilBit < stencilBits; ++stencilBit) {
455 /** @type {number} */ var ref = 1 << stencilBit;
457 gl.stencilFunc(gl.ALWAYS, ref, 0); // mask should not affect the REF
459 this.check(glsStateQuery.verify(this.m_testTargetName, ref));
461 gl.stencilFunc(gl.ALWAYS, ref, ref);
463 this.check(glsStateQuery.verify(this.m_testTargetName, ref));
469 * @extends {es3fApiCase.ApiCase}
470 * @param {string} name
471 * @param {string} description
472 * @param {number} testTargetName
473 * @param {number} stencilFuncTargetFace
475 es3fIntegerStateQueryTests.StencilRefSeparateTestCase = function(name, description, testTargetName, stencilFuncTargetFace) {
476 es3fApiCase.ApiCase.call(this, name, description, gl);
477 /** @type {number} */ this.m_testTargetName = testTargetName;
478 /** @type {number} */ this.m_stencilFuncTargetFace = stencilFuncTargetFace;
481 es3fIntegerStateQueryTests.StencilRefSeparateTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
482 es3fIntegerStateQueryTests.StencilRefSeparateTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilRefSeparateTestCase;
484 es3fIntegerStateQueryTests.StencilRefSeparateTestCase.prototype.test = function() {
485 this.check(glsStateQuery.verify(this.m_testTargetName, 0));
487 var stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
489 for (var stencilBit = 0; stencilBit < stencilBits; ++stencilBit) {
490 /** @type {number} */ var ref = 1 << stencilBit;
492 gl.stencilFuncSeparate(this.m_stencilFuncTargetFace, gl.ALWAYS, ref, 0);
494 this.check(glsStateQuery.verify(this.m_testTargetName, ref));
496 gl.stencilFuncSeparate(this.m_stencilFuncTargetFace, gl.ALWAYS, ref, ref);
498 this.check(glsStateQuery.verify(this.m_testTargetName, ref));
504 * @extends {es3fApiCase.ApiCase}
505 * @param {string} name
506 * @param {string} description
507 * @param {number} stencilOpName
509 es3fIntegerStateQueryTests.StencilOpTestCase = function(name, description, stencilOpName) {
510 es3fApiCase.ApiCase.call(this, name, description, gl);
511 /** @type {number} */ this.m_stencilOpName = stencilOpName;
514 es3fIntegerStateQueryTests.StencilOpTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
515 es3fIntegerStateQueryTests.StencilOpTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilOpTestCase;
517 es3fIntegerStateQueryTests.StencilOpTestCase.prototype.test = function() {
518 this.check(glsStateQuery.verify(this.m_stencilOpName, gl.KEEP));
520 /** @type {Array<number>} */ var stencilOpValues = [gl.KEEP, gl.ZERO, gl.REPLACE, gl.INCR, gl.DECR, gl.INVERT, gl.INCR_WRAP, gl.DECR_WRAP];
521 for (var ndx = 0; ndx < stencilOpValues.length; ++ndx) {
522 this.setStencilOp(stencilOpValues[ndx]);
524 this.check(glsStateQuery.verify(this.m_stencilOpName, stencilOpValues[ndx]));
528 es3fIntegerStateQueryTests.StencilOpTestCase.prototype.deinit = function() {
529 // [dag] need to reset everything once the test is done, otherwise related tests fail
530 gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
534 * @param {number} stencilOpValue
536 es3fIntegerStateQueryTests.StencilOpTestCase.prototype.setStencilOp = function(stencilOpValue) {
537 switch (this.m_stencilOpName) {
538 case gl.STENCIL_FAIL:
539 case gl.STENCIL_BACK_FAIL:
540 gl.stencilOp(stencilOpValue, gl.KEEP, gl.KEEP);
543 case gl.STENCIL_PASS_DEPTH_FAIL:
544 case gl.STENCIL_BACK_PASS_DEPTH_FAIL:
545 gl.stencilOp(gl.KEEP, stencilOpValue, gl.KEEP);
548 case gl.STENCIL_PASS_DEPTH_PASS:
549 case gl.STENCIL_BACK_PASS_DEPTH_PASS:
550 gl.stencilOp(gl.KEEP, gl.KEEP, stencilOpValue);
554 throw new Error('should not happen');
560 * @extends {es3fIntegerStateQueryTests.StencilOpTestCase}
561 * @param {string} name
562 * @param {string} description
563 * @param {number} stencilOpName
564 * @param {number} stencilOpFace
566 es3fIntegerStateQueryTests.StencilOpSeparateTestCase = function(name, description, stencilOpName, stencilOpFace) {
567 es3fIntegerStateQueryTests.StencilOpTestCase.call(this, name, description, stencilOpName);
568 /** @type {number} */ this.m_stencilOpName = stencilOpName;
569 /** @type {number} */ this.m_stencilOpFace = stencilOpFace;
572 es3fIntegerStateQueryTests.StencilOpSeparateTestCase.prototype = Object.create(es3fIntegerStateQueryTests.StencilOpTestCase.prototype);
573 es3fIntegerStateQueryTests.StencilOpSeparateTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilOpSeparateTestCase;
575 es3fIntegerStateQueryTests.StencilOpSeparateTestCase.prototype.test = function() {};
578 * @param {number} stencilOpValue
580 es3fIntegerStateQueryTests.StencilOpSeparateTestCase.prototype.setStencilOp = function(stencilOpValue) {
581 switch (this.m_stencilOpName) {
582 case gl.STENCIL_FAIL:
583 case gl.STENCIL_BACK_FAIL:
584 gl.stencilOpSeparate(this.m_stencilOpFace, stencilOpValue, gl.KEEP, gl.KEEP);
587 case gl.STENCIL_PASS_DEPTH_FAIL:
588 case gl.STENCIL_BACK_PASS_DEPTH_FAIL:
589 gl.stencilOpSeparate(this.m_stencilOpFace, gl.KEEP, stencilOpValue, gl.KEEP);
592 case gl.STENCIL_PASS_DEPTH_PASS:
593 case gl.STENCIL_BACK_PASS_DEPTH_PASS:
594 gl.stencilOpSeparate(this.m_stencilOpFace, gl.KEEP, gl.KEEP, stencilOpValue);
598 throw new Error('should not happen');
604 * @extends {es3fApiCase.ApiCase}
605 * @param {string} name
606 * @param {string} description
608 es3fIntegerStateQueryTests.StencilFuncTestCase = function(name, description) {
609 es3fApiCase.ApiCase.call(this, name, description, gl);
612 es3fIntegerStateQueryTests.StencilFuncTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
613 es3fIntegerStateQueryTests.StencilFuncTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilFuncTestCase;
615 es3fIntegerStateQueryTests.StencilFuncTestCase.prototype.test = function() {
616 this.check(glsStateQuery.verify(gl.STENCIL_FUNC, gl.ALWAYS));
618 /** @type {Array<number>} */ var stencilfuncValues = [gl.NEVER, gl.ALWAYS, gl.LESS, gl.LEQUAL, gl.EQUAL, gl.GEQUAL, gl.GREATER, gl.NOTEQUAL];
620 for (var ndx = 0; ndx < stencilfuncValues.length; ++ndx) {
621 gl.stencilFunc(stencilfuncValues[ndx], 0, 0);
623 this.check(glsStateQuery.verify(gl.STENCIL_FUNC, stencilfuncValues[ndx]));
625 this.check(glsStateQuery.verify(gl.STENCIL_BACK_FUNC, stencilfuncValues[ndx]));
629 es3fIntegerStateQueryTests.StencilFuncTestCase.prototype.deinit = function() {
630 // [dag] reset stencilFunc to ALWAYS
631 gl.stencilFunc(gl.ALWAYS, 0, 0);
636 * @extends {es3fApiCase.ApiCase}
637 * @param {string} name
638 * @param {string} description
639 * @param {number} stencilFuncName
640 * @param {number} stencilFuncFace
642 es3fIntegerStateQueryTests.StencilFuncSeparateTestCase = function(name, description, stencilFuncName, stencilFuncFace) {
643 es3fApiCase.ApiCase.call(this, name, description, gl);
644 /** @type {number} */ this.m_stencilFuncName = stencilFuncName;
645 /** @type {number} */ this.m_stencilFuncFace = stencilFuncFace;
648 es3fIntegerStateQueryTests.StencilFuncSeparateTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
649 es3fIntegerStateQueryTests.StencilFuncSeparateTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilFuncSeparateTestCase;
651 es3fIntegerStateQueryTests.StencilFuncSeparateTestCase.prototype.test = function() {
652 this.check(glsStateQuery.verify(this.m_stencilFuncName, gl.ALWAYS));
654 /** @type {Array<number>} */ var stencilfuncValues = [gl.NEVER, gl.ALWAYS, gl.LESS, gl.LEQUAL, gl.EQUAL, gl.GEQUAL, gl.GREATER, gl.NOTEQUAL];
656 for (var ndx = 0; ndx < stencilfuncValues.length; ++ndx) {
657 gl.stencilFuncSeparate(this.m_stencilFuncFace, stencilfuncValues[ndx], 0, 0);
659 this.check(glsStateQuery.verify(this.m_stencilFuncName, stencilfuncValues[ndx]));
663 es3fIntegerStateQueryTests.StencilFuncSeparateTestCase.prototype.deinit = function() {
664 // [dag] reset the stencil func
665 gl.stencilFuncSeparate(this.m_stencilFuncFace, gl.ALWAYS, 0, 0);
670 * @extends {es3fApiCase.ApiCase}
671 * @param {string} name
672 * @param {string} description
673 * @param {number} testTargetName
675 es3fIntegerStateQueryTests.StencilMaskTestCase = function(name, description, testTargetName) {
676 es3fApiCase.ApiCase.call(this, name, description, gl);
677 /** @type {number} */ this.m_testTargetName = testTargetName;
680 es3fIntegerStateQueryTests.StencilMaskTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
681 es3fIntegerStateQueryTests.StencilMaskTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilMaskTestCase;
683 es3fIntegerStateQueryTests.StencilMaskTestCase.prototype.test = function() {
684 var stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
686 this.check(glsStateQuery.verify(this.m_testTargetName, stencilBits));
688 for (var stencilBit = 0; stencilBit < stencilBits; ++stencilBit) {
689 /** @type {number} */ var mask = 1 << stencilBit;
691 gl.stencilFunc(gl.ALWAYS, 0, mask);
693 this.check(glsStateQuery.verify(this.m_testTargetName, mask));
699 * @extends {es3fApiCase.ApiCase}
700 * @param {string} name
701 * @param {string} description
702 * @param {number} testTargetName
703 * @param {number} stencilFuncTargetFace
705 es3fIntegerStateQueryTests.StencilMaskSeparateTestCase = function(name, description, testTargetName, stencilFuncTargetFace) {
706 es3fApiCase.ApiCase.call(this, name, description, gl);
707 /** @type {number} */ this.m_testTargetName = testTargetName;
708 /** @type {number} */ this.m_stencilFuncTargetFace = stencilFuncTargetFace;
711 es3fIntegerStateQueryTests.StencilMaskSeparateTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
712 es3fIntegerStateQueryTests.StencilMaskSeparateTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilMaskSeparateTestCase;
714 es3fIntegerStateQueryTests.StencilMaskSeparateTestCase.prototype.test = function() {
715 var stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
717 this.check(glsStateQuery.verify(this.m_testTargetName, stencilBits));
719 for (var stencilBit = 0; stencilBit < stencilBits; ++stencilBit) {
720 /** @type {number} */ var mask = 1 << stencilBit;
722 gl.stencilFuncSeparate(this.m_stencilFuncTargetFace, gl.ALWAYS, 0, mask);
724 this.check(glsStateQuery.verify(this.m_testTargetName, mask));
730 * @extends {es3fApiCase.ApiCase}
731 * @param {string} name
732 * @param {string} description
733 * @param {number} testTargetName
735 es3fIntegerStateQueryTests.StencilWriteMaskTestCase = function(name, description, testTargetName) {
736 /** @type {number} */ this.m_testTargetName = testTargetName;
737 es3fApiCase.ApiCase.call(this, name, description, gl);
740 es3fIntegerStateQueryTests.StencilWriteMaskTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
741 es3fIntegerStateQueryTests.StencilWriteMaskTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilWriteMaskTestCase;
743 es3fIntegerStateQueryTests.StencilWriteMaskTestCase.prototype.test = function() {
744 var stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
746 for (var stencilBit = 0; stencilBit < stencilBits; ++stencilBit) {
747 /** @type {number} */ var mask = 1 << stencilBit;
749 gl.stencilMask(mask);
751 this.check(glsStateQuery.verify(this.m_testTargetName, mask));
757 * @extends {es3fApiCase.ApiCase}
758 * @param {string} name
759 * @param {string} description
760 * @param {number} testTargetName
761 * @param {number} stencilTargetFace
763 es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase = function(name, description, testTargetName, stencilTargetFace) {
764 es3fApiCase.ApiCase.call(this, name, description, gl);
765 /** @type {number} */ this.m_testTargetName = testTargetName;
766 /** @type {number} */ this.m_stencilTargetFace = stencilTargetFace;
769 es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
770 es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase;
772 es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase.prototype.test = function() {
773 var stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
775 for (var stencilBit = 0; stencilBit < stencilBits; ++stencilBit) {
776 /** @type {number} */ var mask = 1 << stencilBit;
778 gl.stencilMaskSeparate(this.m_stencilTargetFace, mask);
780 this.check(glsStateQuery.verify(this.m_testTargetName, mask));
786 * @extends {es3fApiCase.ApiCase}
787 * @param {string} name
788 * @param {string} description
789 * @param {number} testTargetName
790 * @param {number} initialValue
792 es3fIntegerStateQueryTests.PixelStoreTestCase = function(name, description, testTargetName, initialValue) {
793 es3fApiCase.ApiCase.call(this, name, description, gl);
794 /** @type {number} */ this.m_testTargetName = testTargetName;
795 /** @type {number} */ this.m_initialValue = initialValue;
798 es3fIntegerStateQueryTests.PixelStoreTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
799 es3fIntegerStateQueryTests.PixelStoreTestCase.prototype.constructor = es3fIntegerStateQueryTests.PixelStoreTestCase;
801 es3fIntegerStateQueryTests.PixelStoreTestCase.prototype.test = function() {
802 /** @type {deRandom.Random} */ var rnd = new deRandom.Random(0xabcdef);
804 this.check(glsStateQuery.verify(this.m_testTargetName, this.m_initialValue));
806 /** @type {number} */ var numIterations = 120;
807 for (var i = 0; i < numIterations; ++i) {
808 /** @type {number} */ var referenceValue = rnd.getInt(0, 64000);
810 gl.pixelStorei(this.m_testTargetName, referenceValue);
812 this.check(glsStateQuery.verify(this.m_testTargetName, referenceValue));
818 * @extends {es3fApiCase.ApiCase}
819 * @param {string} name
820 * @param {string} description
821 * @param {number} testTargetName
823 es3fIntegerStateQueryTests.PixelStoreAlignTestCase = function(name, description, testTargetName) {
824 es3fApiCase.ApiCase.call(this, name, description, gl);
825 /** @type {number} */ this.m_testTargetName = testTargetName;
828 es3fIntegerStateQueryTests.PixelStoreAlignTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
829 es3fIntegerStateQueryTests.PixelStoreAlignTestCase.prototype.constructor = es3fIntegerStateQueryTests.PixelStoreAlignTestCase;
831 es3fIntegerStateQueryTests.PixelStoreAlignTestCase.prototype.test = function() {
832 this.check(glsStateQuery.verify(this.m_testTargetName, 4));
834 /** @type {Array<number>} */ var alignments = [1, 2, 4, 8];
836 for (var ndx = 0; ndx < alignments.length; ++ndx) {
837 /** @type {number} */ var referenceValue = alignments[ndx];
839 gl.pixelStorei(this.m_testTargetName, referenceValue);
841 this.check(glsStateQuery.verify(this.m_testTargetName, referenceValue));
847 * @extends {es3fApiCase.ApiCase}
848 * @param {string} name
849 * @param {string} description
850 * @param {number} testTargetName
851 * @param {number} initialValue
853 es3fIntegerStateQueryTests.BlendFuncTestCase = function(name, description, testTargetName) {
854 es3fApiCase.ApiCase.call(this, name, description, gl);
855 /** @type {number} */ this.m_testTargetName = testTargetName;
858 es3fIntegerStateQueryTests.BlendFuncTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
859 es3fIntegerStateQueryTests.BlendFuncTestCase.prototype.constructor = es3fIntegerStateQueryTests.BlendFuncTestCase;
861 es3fIntegerStateQueryTests.BlendFuncTestCase.prototype.test = function() {
862 /** @type {Array<number>} */ var blendFuncValues = [
863 gl.ZERO, gl.ONE, gl.SRC_COLOR, gl.ONE_MINUS_SRC_COLOR, gl.DST_COLOR, gl.ONE_MINUS_DST_COLOR,
864 gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.DST_ALPHA, gl.ONE_MINUS_DST_ALPHA, gl.CONSTANT_COLOR,
865 gl.ONE_MINUS_CONSTANT_COLOR, gl.CONSTANT_ALPHA, gl.ONE_MINUS_CONSTANT_ALPHA,
866 gl.SRC_ALPHA_SATURATE
869 for (var ndx = 0; ndx < blendFuncValues.length; ++ndx) {
870 /** @type {number} */ var referenceValue = blendFuncValues[ndx];
872 this.setBlendFunc(referenceValue);
874 this.check(glsStateQuery.verify(this.m_testTargetName, referenceValue));
878 * @param {number} func
880 es3fIntegerStateQueryTests.BlendFuncTestCase.prototype.setBlendFunc = function(func) {
881 switch (this.m_testTargetName) {
882 case gl.BLEND_SRC_RGB:
883 case gl.BLEND_SRC_ALPHA:
884 gl.blendFunc(func, gl.ZERO);
887 case gl.BLEND_DST_RGB:
888 case gl.BLEND_DST_ALPHA:
889 gl.blendFunc(gl.ZERO, func);
893 throw new Error('should not happen');
897 es3fIntegerStateQueryTests.BlendFuncTestCase.prototype.deinit = function() {
898 gl.blendFunc(gl.ONE, gl.ZERO);
903 * @extends {es3fIntegerStateQueryTests.BlendFuncTestCase}
904 * @param {string} name
905 * @param {string} description
906 * @param {number} testTargetName
907 * @param {number} initialValue
909 es3fIntegerStateQueryTests.BlendFuncSeparateTestCase = function(name, description, testTargetName) {
910 es3fIntegerStateQueryTests.BlendFuncTestCase.call(this, name, description, testTargetName);
911 /** @type {number} */ this.m_testTargetName = testTargetName;
914 es3fIntegerStateQueryTests.BlendFuncSeparateTestCase.prototype = Object.create(es3fIntegerStateQueryTests.BlendFuncTestCase.prototype);
915 es3fIntegerStateQueryTests.BlendFuncSeparateTestCase.prototype.constructor = es3fIntegerStateQueryTests.BlendFuncSeparateTestCase;
918 * @param {number} func
920 es3fIntegerStateQueryTests.BlendFuncSeparateTestCase.prototype.setBlendFunc = function(func) {
921 switch (this.m_testTargetName) {
922 case gl.BLEND_SRC_RGB:
923 gl.blendFuncSeparate(func, gl.ZERO, gl.ZERO, gl.ZERO);
926 case gl.BLEND_DST_RGB:
927 gl.blendFuncSeparate(gl.ZERO, func, gl.ZERO, gl.ZERO);
930 case gl.BLEND_SRC_ALPHA:
931 gl.blendFuncSeparate(gl.ZERO, gl.ZERO, func, gl.ZERO);
934 case gl.BLEND_DST_ALPHA:
935 gl.blendFuncSeparate(gl.ZERO, gl.ZERO, gl.ZERO, func);
939 throw new Error('should not happen');
943 es3fIntegerStateQueryTests.BlendFuncSeparateTestCase.prototype.deinit = function() {
944 gl.blendFuncSeparate(gl.ONE, gl.ZERO, gl.ONE, gl.ZERO);
949 * @extends {es3fApiCase.ApiCase}
950 * @param {string} name
951 * @param {string} description
952 * @param {number} testTargetName
953 * @param {number} initialValue
955 es3fIntegerStateQueryTests.BlendEquationTestCase = function(name, description, testTargetName, initialValue) {
956 es3fApiCase.ApiCase.call(this, name, description, gl);
957 /** @type {number} */ this.m_testTargetName = testTargetName;
958 /** @type {number} */ this.m_initialValue = initialValue;
961 es3fIntegerStateQueryTests.BlendEquationTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
962 es3fIntegerStateQueryTests.BlendEquationTestCase.prototype.constructor = es3fIntegerStateQueryTests.BlendEquationTestCase;
964 es3fIntegerStateQueryTests.BlendEquationTestCase.prototype.test = function() {
965 this.check(glsStateQuery.verify(this.m_testTargetName, this.m_initialValue));
967 /** @type {Array<number>} */ var blendFuncValues = [gl.FUNC_ADD, gl.FUNC_SUBTRACT, gl.FUNC_REVERSE_SUBTRACT, gl.MIN, gl.MAX];
969 for (var ndx = 0; ndx < blendFuncValues.length; ++ndx) {
970 /** @type {number} */ var referenceValue = blendFuncValues[ndx];
972 this.setBlendEquation(referenceValue);
974 this.check(glsStateQuery.verify(this.m_testTargetName, referenceValue));
979 * @param {number} equation
981 es3fIntegerStateQueryTests.BlendEquationTestCase.prototype.setBlendEquation = function(equation) {
982 gl.blendEquation(equation);
985 es3fIntegerStateQueryTests.BlendEquationTestCase.prototype.deinit = function() {
986 gl.blendEquation(this.m_initialValue);
991 * @extends {es3fIntegerStateQueryTests.BlendEquationTestCase}
992 * @param {string} name
993 * @param {string} description
994 * @param {number} testTargetName
995 * @param {number} initialValue
997 es3fIntegerStateQueryTests.BlendEquationSeparateTestCase = function(name, description, testTargetName, initialValue) {
998 es3fIntegerStateQueryTests.BlendEquationTestCase.call(this, name, description, testTargetName, initialValue);
999 /** @type {number} */ this.m_testTargetName = testTargetName;
1000 /** @type {number} */ this.m_initialValue = initialValue;
1003 es3fIntegerStateQueryTests.BlendEquationSeparateTestCase.prototype = Object.create(es3fIntegerStateQueryTests.BlendEquationTestCase.prototype);
1004 es3fIntegerStateQueryTests.BlendEquationSeparateTestCase.prototype.constructor = es3fIntegerStateQueryTests.BlendEquationSeparateTestCase;
1007 * @param {number} equation
1009 es3fIntegerStateQueryTests.BlendEquationSeparateTestCase.prototype.setBlendEquation = function(equation) {
1010 switch (this.m_testTargetName) {
1011 case gl.BLEND_EQUATION_RGB:
1012 gl.blendEquationSeparate(equation, gl.FUNC_ADD);
1015 case gl.BLEND_EQUATION_ALPHA:
1016 gl.blendEquationSeparate(gl.FUNC_ADD, equation);
1020 throw new Error('should not happen');
1026 * @extends {es3fApiCase.ApiCase}
1027 * @param {string} name
1028 * @param {string} description
1029 * @param {number} testTargetName
1030 * @param {number} minValue
1032 es3fIntegerStateQueryTests.ImplementationArrayTestCase = function(name, description, testTargetName, minValue) {
1033 es3fApiCase.ApiCase.call(this, name, description, gl);
1034 /** @type {number} */ this.m_testTargetName = testTargetName;
1035 /** @type {number} */ this.m_minValue = minValue;
1038 es3fIntegerStateQueryTests.ImplementationArrayTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1039 es3fIntegerStateQueryTests.ImplementationArrayTestCase.prototype.constructor = es3fIntegerStateQueryTests.ImplementationArrayTestCase;
1041 es3fIntegerStateQueryTests.ImplementationArrayTestCase.prototype.test = function() {
1042 if (!framework.opengl.gluTextureUtil.enableCompressedTextureETC()) {
1043 debug('Skipping ETC2 texture format tests: no support for WEBGL_compressed_texture_etc');
1047 var queryResult = /** @type {Array<number>} */ (gl.getParameter(this.m_testTargetName));
1048 this.check(glsStateQuery.compare(queryResult.length, this.m_minValue));
1050 /** @type {Array<number>} */ var textureFormats = [
1051 gl.COMPRESSED_R11_EAC, gl.COMPRESSED_SIGNED_R11_EAC, gl.COMPRESSED_RG11_EAC, gl.COMPRESSED_SIGNED_RG11_EAC, gl.COMPRESSED_RGB8_ETC2, gl.COMPRESSED_SRGB8_ETC2,
1052 gl.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, gl.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, gl.COMPRESSED_RGBA8_ETC2_EAC, gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
1055 for (var ndx = 0; ndx < textureFormats.length; ndx++) {
1056 /** @type {number} */ var format = textureFormats[ndx];
1057 /** @type {boolean} */ var isInArray = queryResult.indexOf(format) !== -1;
1058 this.check(glsStateQuery.compare(isInArray, true));
1065 * @extends {es3fApiCase.ApiCase}
1066 * @param {string} name
1067 * @param {string} description
1069 es3fIntegerStateQueryTests.CurrentProgramBindingTestCase = function(name, description) {
1070 es3fApiCase.ApiCase.call(this, name, description, gl);
1073 es3fIntegerStateQueryTests.CurrentProgramBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1074 es3fIntegerStateQueryTests.CurrentProgramBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.CurrentProgramBindingTestCase;
1076 es3fIntegerStateQueryTests.CurrentProgramBindingTestCase.prototype.test = function() {
1077 this.check(glsStateQuery.verify(gl.CURRENT_PROGRAM, null));
1079 /** @type {WebGLShader} */ var shaderVert = gl.createShader(gl.VERTEX_SHADER);
1080 gl.shaderSource(shaderVert, testVertSource);
1081 gl.compileShader(shaderVert);
1082 var compileStatus = /** @type {boolean} */ (gl.getShaderParameter(shaderVert, gl.COMPILE_STATUS));
1083 this.check(glsStateQuery.compare(compileStatus, true));
1085 /** @type {WebGLShader} */ var shaderFrag = gl.createShader(gl.FRAGMENT_SHADER);
1086 gl.shaderSource(shaderFrag, testFragSource);
1087 gl.compileShader(shaderFrag);
1088 compileStatus = /** @type {boolean} */ (gl.getShaderParameter(shaderFrag, gl.COMPILE_STATUS));
1089 this.check(glsStateQuery.compare(compileStatus, true));
1091 /** @type {WebGLProgram} */ var shaderProg = gl.createProgram();
1092 gl.attachShader(shaderProg, shaderVert);
1093 gl.attachShader(shaderProg, shaderFrag);
1094 gl.linkProgram(shaderProg);
1095 var linkStatus = /** @type {boolean} */ (gl.getProgramParameter(shaderProg, gl.LINK_STATUS));
1096 this.check(glsStateQuery.compare(linkStatus, true));
1098 gl.useProgram(shaderProg);
1100 this.check(glsStateQuery.verify(gl.CURRENT_PROGRAM, shaderProg));
1102 gl.deleteShader(shaderVert);
1103 gl.deleteShader(shaderFrag);
1104 gl.deleteProgram(shaderProg);
1106 this.check(glsStateQuery.verify(gl.CURRENT_PROGRAM, shaderProg));
1108 gl.useProgram(null);
1109 this.check(glsStateQuery.verify(gl.CURRENT_PROGRAM, null));
1114 * @extends {es3fApiCase.ApiCase}
1115 * @param {string} name
1116 * @param {string} description
1118 es3fIntegerStateQueryTests.VertexArrayBindingTestCase = function(name, description) {
1119 es3fApiCase.ApiCase.call(this, name, description, gl);
1122 es3fIntegerStateQueryTests.VertexArrayBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1123 es3fIntegerStateQueryTests.VertexArrayBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.VertexArrayBindingTestCase;
1125 es3fIntegerStateQueryTests.VertexArrayBindingTestCase.prototype.test = function() {
1126 this.check(glsStateQuery.verify(gl.VERTEX_ARRAY_BINDING, null));
1128 /** @type {WebGLVertexArrayObject} */ var vertexArrayObject = gl.createVertexArray();
1130 gl.bindVertexArray(vertexArrayObject);
1131 this.check(glsStateQuery.verify(gl.VERTEX_ARRAY_BINDING, vertexArrayObject));
1133 gl.deleteVertexArray(vertexArrayObject);
1134 this.check(glsStateQuery.verify(gl.VERTEX_ARRAY_BINDING, null));
1139 * @extends {es3fApiCase.ApiCase}
1140 * @param {string} name
1141 * @param {string} description
1142 * @param {number} bufferBindingName
1143 * @param {number} bufferType
1145 es3fIntegerStateQueryTests.BufferBindingTestCase = function(name, description, bufferBindingName, bufferType) {
1146 es3fApiCase.ApiCase.call(this, name, description, gl);
1147 /** @type {number} */ this.m_bufferBindingName = bufferBindingName;
1148 /** @type {number} */ this.m_bufferType = bufferType;
1151 es3fIntegerStateQueryTests.BufferBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1152 es3fIntegerStateQueryTests.BufferBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.BufferBindingTestCase;
1154 es3fIntegerStateQueryTests.BufferBindingTestCase.prototype.test = function() {
1155 this.check(glsStateQuery.verify(this.m_bufferBindingName, null));
1157 /** @type {WebGLBuffer} */ var bufferObject = gl.createBuffer();
1159 gl.bindBuffer(this.m_bufferType, bufferObject);
1160 this.check(glsStateQuery.verify(this.m_bufferBindingName, bufferObject));
1162 gl.deleteBuffer(bufferObject);
1163 this.check(glsStateQuery.verify(this.m_bufferBindingName, null));
1168 * @extends {es3fApiCase.ApiCase}
1169 * @param {string} name
1171 es3fIntegerStateQueryTests.ElementArrayBufferBindingTestCase = function(name) {
1172 es3fApiCase.ApiCase.call(this, name, 'GL_ELEMENT_ARRAY_BUFFER_BINDING', gl);
1175 es3fIntegerStateQueryTests.ElementArrayBufferBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1176 es3fIntegerStateQueryTests.ElementArrayBufferBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.ElementArrayBufferBindingTestCase;
1178 es3fIntegerStateQueryTests.ElementArrayBufferBindingTestCase.prototype.test = function() {
1179 // Test with default VAO
1180 bufferedLogToConsole('DefaultVAO: Test with default VAO');
1182 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, null));
1184 /** @type {WebGLBuffer} */ var bufferObject = gl.createBuffer();
1186 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, bufferObject);
1187 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, bufferObject));
1189 gl.deleteBuffer(bufferObject);
1190 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, null));
1192 // Test with multiple VAOs
1193 bufferedLogToConsole('WithVAO: Test with VAO');
1195 /** @type {Array<WebGLVertexArrayObject>} */ var vaos = [];
1196 /** @type {Array<WebGLBuffer>} */ var buffers = [];
1198 for (var ndx = 0; ndx < 2; ndx++) {
1199 vaos[ndx] = gl.createVertexArray();
1200 buffers[ndx] = gl.createBuffer();
1204 gl.bindVertexArray(vaos[0]);
1205 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, null));
1208 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers[0]);
1209 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, buffers[0]));
1212 gl.bindVertexArray(vaos[1]);
1213 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, null));
1215 // after setting to 2
1216 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers[1]);
1217 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, buffers[1]));
1219 // vao 1 still has buffer 1 bound?
1220 gl.bindVertexArray(vaos[0]);
1221 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, buffers[0]));
1223 // deleting clears from bound vaos ...
1224 for (var ndx = 0; ndx < 2; ndx++)
1225 gl.deleteBuffer(buffers[ndx]);
1226 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, null));
1228 // ... but does not from non-bound vaos?
1229 gl.bindVertexArray(vaos[1]);
1230 this.check(glsStateQuery.verify(gl.ELEMENT_ARRAY_BUFFER_BINDING, buffers[1]));
1232 for (var ndx = 0; ndx < 2; ndx++)
1233 gl.deleteVertexArray(vaos[ndx]);
1238 * @extends {es3fApiCase.ApiCase}
1239 * @param {string} name
1240 * @param {string} description
1242 es3fIntegerStateQueryTests.StencilClearValueTestCase = function(name, description) {
1243 es3fApiCase.ApiCase.call(this, name, description, gl);
1246 es3fIntegerStateQueryTests.StencilClearValueTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1247 es3fIntegerStateQueryTests.StencilClearValueTestCase.prototype.constructor = es3fIntegerStateQueryTests.StencilClearValueTestCase;
1249 es3fIntegerStateQueryTests.StencilClearValueTestCase.prototype.test = function() {
1250 this.check(glsStateQuery.verify(gl.STENCIL_CLEAR_VALUE, 0));
1252 var stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
1254 for (var stencilBit = 0; stencilBit < stencilBits; ++stencilBit) {
1255 /** @type {number} */ var ref = 1 << stencilBit;
1257 gl.clearStencil(ref); // mask should not affect the REF
1259 this.check(glsStateQuery.verify(gl.STENCIL_CLEAR_VALUE, ref));
1265 * @extends {es3fApiCase.ApiCase}
1266 * @param {string} name
1267 * @param {string} description
1269 es3fIntegerStateQueryTests.ActiveTextureTestCase = function(name, description) {
1270 es3fApiCase.ApiCase.call(this, name, description, gl);
1273 es3fIntegerStateQueryTests.ActiveTextureTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1274 es3fIntegerStateQueryTests.ActiveTextureTestCase.prototype.constructor = es3fIntegerStateQueryTests.ActiveTextureTestCase;
1276 es3fIntegerStateQueryTests.ActiveTextureTestCase.prototype.test = function() {
1277 this.check(glsStateQuery.verify(gl.ACTIVE_TEXTURE, gl.TEXTURE0));
1279 var textureUnits = /** @type {number} */ (gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS));
1281 for (var ndx = 0; ndx < textureUnits; ++ndx) {
1282 gl.activeTexture(gl.TEXTURE0 + ndx);
1284 this.check(glsStateQuery.verify(gl.ACTIVE_TEXTURE, gl.TEXTURE0 + ndx));
1288 es3fIntegerStateQueryTests.ActiveTextureTestCase.prototype.deinit = function() {
1289 // [dag] reset the state of the context
1290 gl.activeTexture(gl.TEXTURE0);
1295 * @extends {es3fApiCase.ApiCase}
1296 * @param {string} name
1297 * @param {string} description
1299 es3fIntegerStateQueryTests.RenderbufferBindingTestCase = function(name, description) {
1300 es3fApiCase.ApiCase.call(this, name, description, gl);
1303 es3fIntegerStateQueryTests.RenderbufferBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1304 es3fIntegerStateQueryTests.RenderbufferBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.RenderbufferBindingTestCase;
1306 es3fIntegerStateQueryTests.RenderbufferBindingTestCase.prototype.test = function() {
1307 this.check(glsStateQuery.verify(gl.RENDERBUFFER_BINDING, null));
1309 /** @type {WebGLRenderbuffer} */ var renderBuffer = gl.createRenderbuffer();
1311 gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer);
1313 this.check(glsStateQuery.verify(gl.RENDERBUFFER_BINDING, renderBuffer));
1315 gl.deleteRenderbuffer(renderBuffer);
1316 this.check(glsStateQuery.verify(gl.RENDERBUFFER_BINDING, null));
1321 * @extends {es3fApiCase.ApiCase}
1322 * @param {string} name
1323 * @param {string} description
1325 es3fIntegerStateQueryTests.SamplerObjectBindingTestCase = function(name, description) {
1326 es3fApiCase.ApiCase.call(this, name, description, gl);
1329 es3fIntegerStateQueryTests.SamplerObjectBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1330 es3fIntegerStateQueryTests.SamplerObjectBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.SamplerObjectBindingTestCase;
1332 es3fIntegerStateQueryTests.SamplerObjectBindingTestCase.prototype.test = function() {
1333 this.check(glsStateQuery.verify(gl.SAMPLER_BINDING, null));
1335 bufferedLogToConsole('SingleUnit: Single unit');
1336 /** @type {WebGLSampler} */ var sampler = gl.createSampler();
1338 gl.bindSampler(0, sampler);
1340 this.check(glsStateQuery.verify(gl.SAMPLER_BINDING, sampler));
1342 gl.deleteSampler(sampler);
1343 this.check(glsStateQuery.verify(gl.SAMPLER_BINDING, null));
1345 bufferedLogToConsole('MultipleUnits: Multiple units');
1347 /** @type {WebGLSampler} */ var samplerA = gl.createSampler();
1348 /** @type {WebGLSampler} */ var samplerB = gl.createSampler();
1350 gl.bindSampler(1, samplerA);
1351 gl.bindSampler(2, samplerB);
1353 this.check(glsStateQuery.verify(gl.SAMPLER_BINDING, null));
1355 gl.activeTexture(gl.TEXTURE1);
1356 this.check(glsStateQuery.verify(gl.SAMPLER_BINDING, samplerA));
1358 gl.activeTexture(gl.TEXTURE2);
1359 this.check(glsStateQuery.verify(gl.SAMPLER_BINDING, samplerB));
1361 gl.deleteSampler(samplerB);
1362 gl.deleteSampler(samplerA);
1365 es3fIntegerStateQueryTests.SamplerObjectBindingTestCase.prototype.deinit = function() {
1366 gl.activeTexture(gl.TEXTURE0);
1371 * @extends {es3fApiCase.ApiCase}
1372 * @param {string} name
1373 * @param {string} description
1374 * @param {number} testBindingName
1375 * @param {number} textureType
1377 es3fIntegerStateQueryTests.TextureBindingTestCase = function(name, description, testBindingName, textureType) {
1378 es3fApiCase.ApiCase.call(this, name, description, gl);
1379 /** @type {number} */ this.m_testBindingName = testBindingName;
1380 /** @type {number} */ this.m_textureType = textureType;
1383 es3fIntegerStateQueryTests.TextureBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1384 es3fIntegerStateQueryTests.TextureBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.TextureBindingTestCase;
1386 es3fIntegerStateQueryTests.TextureBindingTestCase.prototype.test = function() {
1387 this.check(glsStateQuery.verify(this.m_testBindingName, null));
1389 /** @type {WebGLTexture} */ var texture = gl.createTexture();
1391 gl.bindTexture(this.m_textureType, texture);
1392 this.check(glsStateQuery.verify(this.m_testBindingName, texture));
1394 gl.deleteTexture(texture);
1396 this.check(glsStateQuery.verify(this.m_testBindingName, null));
1401 * @extends {es3fApiCase.ApiCase}
1402 * @param {string} name
1403 * @param {string} description
1405 es3fIntegerStateQueryTests.FrameBufferBindingTestCase = function(name, description) {
1406 es3fApiCase.ApiCase.call(this, name, description, gl);
1409 es3fIntegerStateQueryTests.FrameBufferBindingTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1410 es3fIntegerStateQueryTests.FrameBufferBindingTestCase.prototype.constructor = es3fIntegerStateQueryTests.FrameBufferBindingTestCase;
1412 es3fIntegerStateQueryTests.FrameBufferBindingTestCase.prototype.test = function() {
1413 this.check(glsStateQuery.verify(gl.DRAW_FRAMEBUFFER_BINDING, null));
1414 this.check(glsStateQuery.verify(gl.FRAMEBUFFER_BINDING, null));
1415 this.check(glsStateQuery.verify(gl.READ_FRAMEBUFFER_BINDING, null));
1417 /** @type {WebGLFramebuffer} */ var framebufferId = gl.createFramebuffer();
1419 gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferId);
1421 this.check(glsStateQuery.verify(gl.DRAW_FRAMEBUFFER_BINDING, framebufferId));
1422 this.check(glsStateQuery.verify(gl.FRAMEBUFFER_BINDING, framebufferId));
1423 this.check(glsStateQuery.verify(gl.READ_FRAMEBUFFER_BINDING, framebufferId));
1425 gl.bindFramebuffer(gl.FRAMEBUFFER, null);
1427 this.check(glsStateQuery.verify(gl.DRAW_FRAMEBUFFER_BINDING, null));
1428 this.check(glsStateQuery.verify(gl.FRAMEBUFFER_BINDING, null));
1429 this.check(glsStateQuery.verify(gl.READ_FRAMEBUFFER_BINDING, null));
1431 gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebufferId);
1433 this.check(glsStateQuery.verify(gl.DRAW_FRAMEBUFFER_BINDING, null));
1434 this.check(glsStateQuery.verify(gl.FRAMEBUFFER_BINDING, null));
1435 this.check(glsStateQuery.verify(gl.READ_FRAMEBUFFER_BINDING, framebufferId));
1437 gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, framebufferId);
1439 this.check(glsStateQuery.verify(gl.DRAW_FRAMEBUFFER_BINDING, framebufferId));
1440 this.check(glsStateQuery.verify(gl.FRAMEBUFFER_BINDING, framebufferId));
1441 this.check(glsStateQuery.verify(gl.READ_FRAMEBUFFER_BINDING, framebufferId));
1443 gl.deleteFramebuffer(framebufferId);
1445 this.check(glsStateQuery.verify(gl.DRAW_FRAMEBUFFER_BINDING, null));
1446 this.check(glsStateQuery.verify(gl.FRAMEBUFFER_BINDING, null));
1447 this.check(glsStateQuery.verify(gl.READ_FRAMEBUFFER_BINDING, null));
1452 * @extends {es3fApiCase.ApiCase}
1453 * @param {string} name
1454 * @param {string} description
1456 es3fIntegerStateQueryTests.ImplementationColorReadTestCase = function(name, description) {
1457 es3fApiCase.ApiCase.call(this, name, description, gl);
1460 es3fIntegerStateQueryTests.ImplementationColorReadTestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1461 es3fIntegerStateQueryTests.ImplementationColorReadTestCase.prototype.constructor = es3fIntegerStateQueryTests.ImplementationColorReadTestCase;
1463 es3fIntegerStateQueryTests.ImplementationColorReadTestCase.prototype.test = function() {
1464 /** @type {Array<number>} */ var defaultColorTypes = [
1465 gl.UNSIGNED_BYTE, gl.BYTE, gl.UNSIGNED_SHORT, gl.SHORT,
1466 gl.UNSIGNED_INT, gl.INT, gl.HALF_FLOAT, gl.FLOAT, gl.UNSIGNED_SHORT_5_6_5,
1467 gl.UNSIGNED_SHORT_4_4_4_4, gl.UNSIGNED_SHORT_5_5_5_1,
1468 gl.UNSIGNED_INT_2_10_10_10_REV, gl.UNSIGNED_INT_10F_11F_11F_REV
1471 /** @type {Array<number>} */ var defaultColorFormats = [
1472 gl.RGBA, gl.RGBA_INTEGER, gl.RGB, gl.RGB_INTEGER,
1473 gl.RG, gl.RG_INTEGER, gl.RED, gl.RED_INTEGER
1476 /** @type {Array<number>} */ var validColorTypes = [];
1477 /** @type {Array<number>} */ var validColorFormats = [];
1479 // Defined by the spec
1481 for (var ndx = 0; ndx < defaultColorTypes.length; ++ndx)
1482 validColorTypes.push(defaultColorTypes[ndx]);
1483 for (var ndx = 0; ndx < defaultColorFormats.length; ++ndx)
1484 validColorFormats.push(defaultColorFormats[ndx]);
1488 // if (this.m_context.getContextInfo().isExtensionSupported("gl.EXT_texture_format_BGRA8888") ||
1489 // this.m_context.getContextInfo().isExtensionSupported("gl.APPLE_texture_format_BGRA8888"))
1490 // validColorFormats.push(gl.BGRA);
1492 // if (this.m_context.getContextInfo().isExtensionSupported("gl.EXT_read_format_bgra")) {
1493 // validColorFormats.push(gl.BGRA);
1494 // validColorTypes.push(gl.UNSIGNED_SHORT_4_4_4_4_REV);
1495 // validColorTypes.push(gl.UNSIGNED_SHORT_1_5_5_5_REV);
1498 // if (this.m_context.getContextInfo().isExtensionSupported("gl.IMG_read_format")) {
1499 // validColorFormats.push(gl.BGRA);
1500 // validColorTypes.push(gl.UNSIGNED_SHORT_4_4_4_4_REV);
1503 // if (this.m_context.getContextInfo().isExtensionSupported("gl.NV_sRGB_formats")) {
1504 // validColorFormats.push(gl.SLUMINANCE_NV);
1505 // validColorFormats.push(gl.SLUMINANCE_ALPHA_NV);
1508 // if (this.m_context.getContextInfo().isExtensionSupported("gl.NV_bgr")) {
1509 // validColorFormats.push(gl.BGR_NV);
1512 this.check(glsStateQuery.verifyAnyOf(gl.IMPLEMENTATION_COLOR_READ_TYPE, validColorTypes));
1513 this.check(glsStateQuery.verifyAnyOf(gl.IMPLEMENTATION_COLOR_READ_FORMAT, validColorFormats));
1518 * @extends {es3fApiCase.ApiCase}
1519 * @param {string} name
1520 * @param {string} description
1522 es3fIntegerStateQueryTests.ReadBufferCase = function(name, description) {
1523 es3fApiCase.ApiCase.call(this, name, description, gl);
1526 es3fIntegerStateQueryTests.ReadBufferCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1527 es3fIntegerStateQueryTests.ReadBufferCase.prototype.constructor = es3fIntegerStateQueryTests.ReadBufferCase;
1529 es3fIntegerStateQueryTests.ReadBufferCase.prototype.test = function() {
1530 /** @type {Array<number>} */ var validInitialValues = [gl.BACK, gl.NONE];
1531 this.check(glsStateQuery.verifyAnyOf(gl.READ_BUFFER, validInitialValues));
1533 gl.readBuffer(gl.NONE);
1534 this.check(glsStateQuery.verify(gl.READ_BUFFER, gl.NONE));
1536 gl.readBuffer(gl.BACK);
1537 this.check(glsStateQuery.verify(gl.READ_BUFFER, gl.BACK));
1539 // test gl.READ_BUFFER with framebuffers
1541 /** @type {WebGLFramebuffer} */ var framebufferId = gl.createFramebuffer();
1543 /** @type {WebGLRenderbuffer} */ var renderbuffer_id = gl.createRenderbuffer();
1545 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer_id);
1547 gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8, 128, 128);
1549 gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebufferId);
1551 gl.framebufferRenderbuffer(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbuffer_id);
1553 this.check(glsStateQuery.verify(gl.READ_BUFFER, gl.COLOR_ATTACHMENT0));
1555 gl.deleteFramebuffer(framebufferId);
1556 gl.deleteRenderbuffer(renderbuffer_id);
1558 this.check(glsStateQuery.verify(gl.READ_BUFFER, gl.BACK));
1563 * @extends {es3fApiCase.ApiCase}
1564 * @param {string} name
1565 * @param {string} description
1567 es3fIntegerStateQueryTests.DrawBufferCase = function(name, description) {
1568 es3fApiCase.ApiCase.call(this, name, description, gl);
1571 es3fIntegerStateQueryTests.DrawBufferCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1572 es3fIntegerStateQueryTests.DrawBufferCase.prototype.constructor = es3fIntegerStateQueryTests.DrawBufferCase;
1574 es3fIntegerStateQueryTests.DrawBufferCase.prototype.test = function() {
1575 /** @type {Array<number>} */ var validInitialValues = [gl.BACK, gl.NONE];
1576 this.check(glsStateQuery.verifyAnyOf(gl.DRAW_BUFFER0, validInitialValues));
1578 /** @type {number} */ var bufs = gl.NONE;
1579 gl.drawBuffers([bufs]);
1580 this.check(glsStateQuery.verify(gl.DRAW_BUFFER0, gl.NONE));
1583 gl.drawBuffers([bufs]);
1584 this.check(glsStateQuery.verify(gl.DRAW_BUFFER0, gl.BACK));
1586 // test gl.DRAW_BUFFER with framebuffers
1588 /** @type {WebGLFramebuffer} */ var framebufferId = gl.createFramebuffer();
1590 /** @type {Array<WebGLRenderbuffer>} */ var renderbuffer_ids = [];
1592 for (var ndx = 0; ndx < 2; ndx++)
1593 renderbuffer_ids[ndx] = gl.createRenderbuffer();
1595 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer_ids[0]);
1596 gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8, 128, 128);
1598 gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer_ids[1]);
1599 gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8, 128, 128);
1601 gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, framebufferId);
1603 gl.framebufferRenderbuffer(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbuffer_ids[0]);
1604 gl.framebufferRenderbuffer(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.RENDERBUFFER, renderbuffer_ids[1]);
1606 // only the initial state the draw buffer for fragment color zero is defined
1607 this.check(glsStateQuery.verify(gl.DRAW_BUFFER0, gl.COLOR_ATTACHMENT0));
1609 /** @type {Array<number>} */ var bufTargets = [gl.NONE, gl.COLOR_ATTACHMENT1];
1610 gl.drawBuffers(bufTargets);
1611 this.check(glsStateQuery.verify(gl.DRAW_BUFFER0, gl.NONE));
1612 this.check(glsStateQuery.verify(gl.DRAW_BUFFER1, gl.COLOR_ATTACHMENT1));
1614 gl.deleteFramebuffer(framebufferId);
1615 gl.deleteRenderbuffer(renderbuffer_ids[0]);
1616 gl.deleteRenderbuffer(renderbuffer_ids[1]);
1618 this.check(glsStateQuery.verify(gl.DRAW_BUFFER0, gl.BACK));
1624 * @extends {es3fApiCase.ApiCase}
1625 * @param {string} name
1626 * @param {string} description
1627 * @param {number} targetName
1628 * @param {number} minValue
1630 es3fIntegerStateQueryTests.ConstantMinimumValue64TestCase = function(name, description, targetName, minValue) {
1631 es3fApiCase.ApiCase.call(this, name, description, gl);
1632 /** @type {number} */ this.m_targetName = targetName;
1633 /** @type {number} */ this.m_minValue = minValue;
1636 es3fIntegerStateQueryTests.ConstantMinimumValue64TestCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1637 es3fIntegerStateQueryTests.ConstantMinimumValue64TestCase.prototype.constructor = es3fIntegerStateQueryTests.ConstantMinimumValue64TestCase;
1639 es3fIntegerStateQueryTests.ConstantMinimumValue64TestCase.prototype.test = function() {
1640 this.check(glsStateQuery.verifyGreaterOrEqual(this.m_targetName, this.m_minValue), 'Fail');
1645 * @extends {es3fApiCase.ApiCase}
1646 * @param {string} name
1647 * @param {string} description
1648 * @param {number} targetName
1649 * @param {number} targetMaxUniformBlocksName
1650 * @param {number} targetMaxUniformComponentsName
1652 es3fIntegerStateQueryTests.MaxCombinedStageUniformComponentsCase = function(name, description, targetName, targetMaxUniformBlocksName, targetMaxUniformComponentsName) {
1653 es3fApiCase.ApiCase.call(this, name, description, gl);
1654 /** @type {number} */ this.m_targetName = targetName;
1655 /** @type {number} */ this.m_targetMaxUniformBlocksName = targetMaxUniformBlocksName;
1656 /** @type {number} */ this.m_targetMaxUniformComponentsName = targetMaxUniformComponentsName;
1659 es3fIntegerStateQueryTests.MaxCombinedStageUniformComponentsCase.prototype = Object.create(es3fApiCase.ApiCase.prototype);
1660 es3fIntegerStateQueryTests.MaxCombinedStageUniformComponentsCase.prototype.constructor = es3fIntegerStateQueryTests.MaxCombinedStageUniformComponentsCase;
1662 es3fIntegerStateQueryTests.MaxCombinedStageUniformComponentsCase.prototype.test = function() {
1663 var uniformBlockSize = /** @type {number} */ (gl.getParameter(gl.MAX_UNIFORM_BLOCK_SIZE));
1664 var maxUniformBlocks = /** @type {number} */ (gl.getParameter(this.m_targetMaxUniformBlocksName));
1665 var maxUniformComponents = /** @type {number} */ (gl.getParameter(this.m_targetMaxUniformComponentsName));
1667 // MAX_stage_UNIFORM_BLOCKS
\x02* MAX_UNIFORM_BLOCK_SIZE / 4 + MAX_stage_UNIFORM_COMPONENTS
1668 /** @type {number} */ var minCombinedUniformComponents = maxUniformBlocks * uniformBlockSize / 4 + maxUniformComponents;
1670 this.check(glsStateQuery.verifyGreaterOrEqual(this.m_targetName, minCombinedUniformComponents));
1675 * @extends {tcuTestCase.DeqpTest}
1677 es3fIntegerStateQueryTests.IntegerStateQueryTests = function() {
1678 tcuTestCase.DeqpTest.call(this, 'integers', 'Integer Values');
1681 es3fIntegerStateQueryTests.IntegerStateQueryTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
1682 es3fIntegerStateQueryTests.IntegerStateQueryTests.prototype.constructor = es3fIntegerStateQueryTests.IntegerStateQueryTests;
1684 es3fIntegerStateQueryTests.IntegerStateQueryTests.prototype.init = function() {
1688 * @param {string} name
1689 * @param {string} description
1690 * @param {number} targetName
1691 * @param {number} value
1693 var LimitedStateInteger = function(name, description, targetName, value) {
1694 /** @type {string} */ this.name = name;
1695 /** @type {string} */ this.description = description;
1696 /** @type {number} */ this.targetName = targetName;
1697 /** @type {number} */ this.value = value;
1700 /** @type {Array<LimitedStateInteger>} */ var implementationMinLimits = [
1701 new LimitedStateInteger('subpixel_bits', 'SUBPIXEL_BITS has minimum value of 4', gl.SUBPIXEL_BITS, 4),
1702 new LimitedStateInteger('max_3d_texture_size', 'MAX_3D_TEXTURE_SIZE has minimum value of 256', gl.MAX_3D_TEXTURE_SIZE, 256),
1703 new LimitedStateInteger('max_texture_size', 'MAX_TEXTURE_SIZE has minimum value of 2048', gl.MAX_TEXTURE_SIZE, 2048),
1704 new LimitedStateInteger('max_array_texture_layers', 'MAX_ARRAY_TEXTURE_LAYERS has minimum value of 256', gl.MAX_ARRAY_TEXTURE_LAYERS, 256),
1705 new LimitedStateInteger('max_cube_map_texture_size', 'MAX_CUBE_MAP_TEXTURE_SIZE has minimum value of 2048', gl.MAX_CUBE_MAP_TEXTURE_SIZE, 2048),
1706 new LimitedStateInteger('max_renderbuffer_size', 'MAX_RENDERBUFFER_SIZE has minimum value of 2048', gl.MAX_RENDERBUFFER_SIZE, 2048),
1707 new LimitedStateInteger('max_draw_buffers', 'MAX_DRAW_BUFFERS has minimum value of 4', gl.MAX_DRAW_BUFFERS, 4),
1708 new LimitedStateInteger('max_color_attachments', 'MAX_COLOR_ATTACHMENTS has minimum value of 4', gl.MAX_COLOR_ATTACHMENTS, 4),
1709 new LimitedStateInteger('max_elements_indices', 'MAX_ELEMENTS_INDICES has minimum value of 0', gl.MAX_ELEMENTS_INDICES, 0),
1710 new LimitedStateInteger('max_elements_vertices', 'MAX_ELEMENTS_VERTICES has minimum value of 0', gl.MAX_ELEMENTS_VERTICES, 0),
1711 new LimitedStateInteger('max_vertex_attribs', 'MAX_VERTEX_ATTRIBS has minimum value of 16', gl.MAX_VERTEX_ATTRIBS, 16),
1712 new LimitedStateInteger('max_vertex_uniform_components', 'MAX_VERTEX_UNIFORM_COMPONENTS has minimum value of 1024', gl.MAX_VERTEX_UNIFORM_COMPONENTS, 1024),
1713 new LimitedStateInteger('max_vertex_uniform_vectors', 'MAX_VERTEX_UNIFORM_VECTORS has minimum value of 256', gl.MAX_VERTEX_UNIFORM_VECTORS, 256),
1714 new LimitedStateInteger('max_vertex_uniform_blocks', 'MAX_VERTEX_UNIFORM_BLOCKS has minimum value of 12', gl.MAX_VERTEX_UNIFORM_BLOCKS, 12),
1715 new LimitedStateInteger('max_vertex_output_components', 'MAX_VERTEX_OUTPUT_COMPONENTS has minimum value of 64', gl.MAX_VERTEX_OUTPUT_COMPONENTS, 64),
1716 new LimitedStateInteger('max_vertex_texture_image_units', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS has minimum value of 16', gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS, 16),
1717 new LimitedStateInteger('max_fragment_uniform_components', 'MAX_FRAGMENT_UNIFORM_COMPONENTS has minimum value of 896', gl.MAX_FRAGMENT_UNIFORM_COMPONENTS, 896),
1718 new LimitedStateInteger('max_fragment_uniform_vectors', 'MAX_FRAGMENT_UNIFORM_VECTORS has minimum value of 224', gl.MAX_FRAGMENT_UNIFORM_VECTORS, 224),
1719 new LimitedStateInteger('max_fragment_uniform_blocks', 'MAX_FRAGMENT_UNIFORM_BLOCKS has minimum value of 12', gl.MAX_FRAGMENT_UNIFORM_BLOCKS, 12),
1720 new LimitedStateInteger('max_fragment_input_components', 'MAX_FRAGMENT_INPUT_COMPONENTS has minimum value of 60', gl.MAX_FRAGMENT_INPUT_COMPONENTS, 60),
1721 new LimitedStateInteger('max_texture_image_units', 'MAX_TEXTURE_IMAGE_UNITS has minimum value of 16', gl.MAX_TEXTURE_IMAGE_UNITS, 16),
1722 new LimitedStateInteger('max_program_texel_offset', 'MAX_PROGRAM_TEXEL_OFFSET has minimum value of 7', gl.MAX_PROGRAM_TEXEL_OFFSET, 7),
1723 new LimitedStateInteger('max_uniform_buffer_bindings', 'MAX_UNIFORM_BUFFER_BINDINGS has minimum value of 24', gl.MAX_UNIFORM_BUFFER_BINDINGS, 24),
1724 new LimitedStateInteger('max_combined_uniform_blocks', 'MAX_COMBINED_UNIFORM_BLOCKS has minimum value of 24', gl.MAX_COMBINED_UNIFORM_BLOCKS, 24),
1725 new LimitedStateInteger('max_varying_components', 'MAX_VARYING_COMPONENTS has minimum value of 60', gl.MAX_VARYING_COMPONENTS, 60),
1726 new LimitedStateInteger('max_varying_vectors', 'MAX_VARYING_VECTORS has minimum value of 15', gl.MAX_VARYING_VECTORS, 15),
1727 new LimitedStateInteger('max_combined_texture_image_units', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS has minimum value of 32', gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS, 32),
1728 new LimitedStateInteger('max_transform_feedback_interleaved_components', 'MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS has minimum value of 64', gl.MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, 64),
1729 new LimitedStateInteger('max_transform_feedback_separate_attribs', 'MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS has minimum value of 4', gl.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, 4),
1730 new LimitedStateInteger('max_transform_feedback_separate_components', 'MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS has minimum value of 4', gl.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, 4),
1731 new LimitedStateInteger('max_samples', 'MAX_SAMPLES has minimum value of 4', gl.MAX_SAMPLES, 4),
1732 new LimitedStateInteger('red_bits', 'RED_BITS has minimum value of 0', gl.RED_BITS, 0),
1733 new LimitedStateInteger('green_bits', 'GREEN_BITS has minimum value of 0', gl.GREEN_BITS, 0),
1734 new LimitedStateInteger('blue_bits', 'BLUE_BITS has minimum value of 0', gl.BLUE_BITS, 0),
1735 new LimitedStateInteger('alpha_bits', 'ALPHA_BITS has minimum value of 0', gl.ALPHA_BITS, 0),
1736 new LimitedStateInteger('depth_bits', 'DEPTH_BITS has minimum value of 0', gl.DEPTH_BITS, 0),
1737 new LimitedStateInteger('stencil_bits', 'STENCIL_BITS has minimum value of 0', gl.STENCIL_BITS, 0)
1740 /** @type {Array<LimitedStateInteger>} */ var implementationMaxLimits = [
1741 new LimitedStateInteger('min_program_texel_offset', 'MIN_PROGRAM_TEXEL_OFFSET has maximum value of -8', gl.MIN_PROGRAM_TEXEL_OFFSET, -8),
1742 new LimitedStateInteger('uniform_buffer_offset_alignment', 'UNIFORM_BUFFER_OFFSET_ALIGNMENT has minimum value of 1', gl.UNIFORM_BUFFER_OFFSET_ALIGNMENT, 256)
1747 for (var testNdx = 0; testNdx < implementationMinLimits.length; testNdx++)
1748 testCtx.addChild(new es3fIntegerStateQueryTests.ConstantMinimumValueTestCase(implementationMinLimits[testNdx].name, implementationMinLimits[testNdx].description, implementationMinLimits[testNdx].targetName, implementationMinLimits[testNdx].value));
1750 for (var testNdx = 0; testNdx < implementationMaxLimits.length; testNdx++)
1751 testCtx.addChild(new es3fIntegerStateQueryTests.ConstantMaximumValueTestCase(implementationMaxLimits[testNdx].name, implementationMaxLimits[testNdx].description, implementationMaxLimits[testNdx].targetName, implementationMaxLimits[testNdx].value));
1753 testCtx.addChild(new es3fIntegerStateQueryTests.SampleBuffersTestCase('sample_buffers', 'SAMPLE_BUFFERS'));
1754 testCtx.addChild(new es3fIntegerStateQueryTests.SamplesTestCase('samples' , 'SAMPLES'));
1755 testCtx.addChild(new es3fIntegerStateQueryTests.HintTestCase('generate_mipmap_hint', 'GENERATE_MIPMAP_HINT', gl.GENERATE_MIPMAP_HINT));
1756 testCtx.addChild(new es3fIntegerStateQueryTests.HintTestCase('fragment_shader_derivative_hint', 'FRAGMENT_SHADER_DERIVATIVE_HINT', gl.FRAGMENT_SHADER_DERIVATIVE_HINT));
1757 testCtx.addChild(new es3fIntegerStateQueryTests.DepthFuncTestCase('depth_func', 'DEPTH_FUNC'));
1758 testCtx.addChild(new es3fIntegerStateQueryTests.CullFaceTestCase('cull_face_mode', 'CULL_FACE_MODE'));
1759 testCtx.addChild(new es3fIntegerStateQueryTests.FrontFaceTestCase('front_face_mode', 'FRONT_FACE'));
1760 testCtx.addChild(new es3fIntegerStateQueryTests.ViewPortTestCase('viewport', 'VIEWPORT'));
1761 testCtx.addChild(new es3fIntegerStateQueryTests.ScissorBoxTestCase('scissor_box', 'SCISSOR_BOX'));
1762 testCtx.addChild(new es3fIntegerStateQueryTests.MaxViewportDimsTestCase('max_viewport_dims', 'MAX_VIEWPORT_DIMS'));
1763 testCtx.addChild(new es3fIntegerStateQueryTests.StencilRefTestCase('stencil_ref', 'STENCIL_REF', gl.STENCIL_REF));
1764 testCtx.addChild(new es3fIntegerStateQueryTests.StencilRefTestCase('stencil_back_ref', 'STENCIL_BACK_REF', gl.STENCIL_BACK_REF));
1765 testCtx.addChild(new es3fIntegerStateQueryTests.StencilRefSeparateTestCase('stencil_ref_separate', 'STENCIL_REF (separate)', gl.STENCIL_REF, gl.FRONT));
1766 testCtx.addChild(new es3fIntegerStateQueryTests.StencilRefSeparateTestCase('stencil_ref_separate_both', 'STENCIL_REF (separate)', gl.STENCIL_REF, gl.FRONT_AND_BACK));
1767 testCtx.addChild(new es3fIntegerStateQueryTests.StencilRefSeparateTestCase('stencil_back_ref_separate', 'STENCIL_BACK_REF (separate)', gl.STENCIL_BACK_REF, gl.BACK));
1768 testCtx.addChild(new es3fIntegerStateQueryTests.StencilRefSeparateTestCase('stencil_back_ref_separate_both', 'STENCIL_BACK_REF (separate)', gl.STENCIL_BACK_REF, gl.FRONT_AND_BACK));
1773 * @param {string} name
1774 * @param {string} frontDescription
1775 * @param {number} frontTarget
1776 * @param {string} backDescription
1777 * @param {number} backTarget
1779 var NamedStencilOp = function(name, frontDescription, frontTarget, backDescription, backTarget) {
1780 /** @type {string} */ this.name = name;
1781 /** @type {string} */ this.frontDescription = frontDescription;
1782 /** @type {number} */ this.frontTarget = frontTarget;
1783 /** @type {string} */ this.backDescription = backDescription;
1784 /** @type {number} */ this.backTarget = backTarget;
1787 /** @type {Array<NamedStencilOp>} */ var stencilOps = [
1788 new NamedStencilOp('fail', 'STENCIL_FAIL', gl.STENCIL_FAIL, 'STENCIL_BACK_FAIL', gl.STENCIL_BACK_FAIL),
1789 new NamedStencilOp('depth_fail', 'STENCIL_PASS_DEPTH_FAIL', gl.STENCIL_PASS_DEPTH_FAIL, 'STENCIL_BACK_PASS_DEPTH_FAIL', gl.STENCIL_BACK_PASS_DEPTH_FAIL),
1790 new NamedStencilOp('depth_pass', 'STENCIL_PASS_DEPTH_PASS', gl.STENCIL_PASS_DEPTH_PASS, 'STENCIL_BACK_PASS_DEPTH_PASS', gl.STENCIL_BACK_PASS_DEPTH_PASS)
1793 for (var testNdx = 0; testNdx < stencilOps.length; testNdx++) {
1794 testCtx.addChild(new es3fIntegerStateQueryTests.StencilOpTestCase('stencil_' + stencilOps[testNdx].name, stencilOps[testNdx].frontDescription, stencilOps[testNdx].frontTarget));
1795 testCtx.addChild(new es3fIntegerStateQueryTests.StencilOpTestCase('stencil_back_' + stencilOps[testNdx].name, stencilOps[testNdx].backDescription, stencilOps[testNdx].backTarget));
1797 testCtx.addChild(new es3fIntegerStateQueryTests.StencilOpSeparateTestCase('stencil_' + stencilOps[testNdx].name + '_separate_both', stencilOps[testNdx].frontDescription, stencilOps[testNdx].frontTarget, gl.FRONT_AND_BACK));
1798 testCtx.addChild(new es3fIntegerStateQueryTests.StencilOpSeparateTestCase('stencil_back_' + stencilOps[testNdx].name + '_separate_both', stencilOps[testNdx].backDescription, stencilOps[testNdx].backTarget, gl.FRONT_AND_BACK));
1800 testCtx.addChild(new es3fIntegerStateQueryTests.StencilOpSeparateTestCase('stencil_' + stencilOps[testNdx].name + '_separate', stencilOps[testNdx].frontDescription, stencilOps[testNdx].frontTarget, gl.FRONT));
1801 testCtx.addChild(new es3fIntegerStateQueryTests.StencilOpSeparateTestCase('stencil_back_' + stencilOps[testNdx].name + '_separate', stencilOps[testNdx].backDescription, stencilOps[testNdx].backTarget, gl.BACK));
1804 testCtx.addChild(new es3fIntegerStateQueryTests.StencilFuncTestCase('stencil_func', 'STENCIL_FUNC'));
1805 testCtx.addChild(new es3fIntegerStateQueryTests.StencilFuncSeparateTestCase('stencil_func_separate', 'STENCIL_FUNC (separate)', gl.STENCIL_FUNC, gl.FRONT));
1806 testCtx.addChild(new es3fIntegerStateQueryTests.StencilFuncSeparateTestCase('stencil_func_separate_both', 'STENCIL_FUNC (separate)', gl.STENCIL_FUNC, gl.FRONT_AND_BACK));
1807 testCtx.addChild(new es3fIntegerStateQueryTests.StencilFuncSeparateTestCase('stencil_back_func_separate', 'STENCIL_FUNC (separate)', gl.STENCIL_BACK_FUNC, gl.BACK));
1808 testCtx.addChild(new es3fIntegerStateQueryTests.StencilFuncSeparateTestCase('stencil_back_func_separate_both', 'STENCIL_FUNC (separate)', gl.STENCIL_BACK_FUNC, gl.FRONT_AND_BACK));
1809 testCtx.addChild(new es3fIntegerStateQueryTests.StencilMaskTestCase('stencil_value_mask', 'STENCIL_VALUE_MASK', gl.STENCIL_VALUE_MASK));
1810 testCtx.addChild(new es3fIntegerStateQueryTests.StencilMaskTestCase('stencil_back_value_mask', 'STENCIL_BACK_VALUE_MASK', gl.STENCIL_BACK_VALUE_MASK));
1811 testCtx.addChild(new es3fIntegerStateQueryTests.StencilMaskSeparateTestCase('stencil_value_mask_separate', 'STENCIL_VALUE_MASK (separate)', gl.STENCIL_VALUE_MASK, gl.FRONT));
1812 testCtx.addChild(new es3fIntegerStateQueryTests.StencilMaskSeparateTestCase('stencil_value_mask_separate_both', 'STENCIL_VALUE_MASK (separate)', gl.STENCIL_VALUE_MASK, gl.FRONT_AND_BACK));
1813 testCtx.addChild(new es3fIntegerStateQueryTests.StencilMaskSeparateTestCase('stencil_back_value_mask_separate', 'STENCIL_BACK_VALUE_MASK (separate)', gl.STENCIL_BACK_VALUE_MASK, gl.BACK));
1814 testCtx.addChild(new es3fIntegerStateQueryTests.StencilMaskSeparateTestCase('stencil_back_value_mask_separate_both', 'STENCIL_BACK_VALUE_MASK (separate)', gl.STENCIL_BACK_VALUE_MASK, gl.FRONT_AND_BACK));
1815 testCtx.addChild(new es3fIntegerStateQueryTests.StencilWriteMaskTestCase('stencil_writemask', 'STENCIL_WRITEMASK', gl.STENCIL_WRITEMASK));
1816 testCtx.addChild(new es3fIntegerStateQueryTests.StencilWriteMaskTestCase('stencil_back_writemask', 'STENCIL_BACK_WRITEMASK', gl.STENCIL_BACK_WRITEMASK));
1817 testCtx.addChild(new es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase('stencil_writemask_separate', 'STENCIL_WRITEMASK (separate)', gl.STENCIL_WRITEMASK, gl.FRONT));
1818 testCtx.addChild(new es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase('stencil_writemask_separate_both', 'STENCIL_WRITEMASK (separate)', gl.STENCIL_WRITEMASK, gl.FRONT_AND_BACK));
1819 testCtx.addChild(new es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase('stencil_back_writemask_separate', 'STENCIL_BACK_WRITEMASK (separate)', gl.STENCIL_BACK_WRITEMASK, gl.BACK));
1820 testCtx.addChild(new es3fIntegerStateQueryTests.StencilWriteMaskSeparateTestCase('stencil_back_writemask_separate_both', 'STENCIL_BACK_WRITEMASK (separate)', gl.STENCIL_BACK_WRITEMASK, gl.FRONT_AND_BACK));
1825 * @param {string} name
1826 * @param {string} description
1827 * @param {number} target
1828 * @param {number} initialValue
1830 var PixelStoreState = function(name, description, target, initialValue) {
1831 /** @type {string} */ this.name = name;
1832 /** @type {string} */ this.description = description;
1833 /** @type {number} */ this.target = target;
1834 /** @type {number} */ this.initialValue = initialValue;
1837 /** @type {Array<PixelStoreState>} */ var pixelStoreStates = [
1838 new PixelStoreState('unpack_image_height', 'UNPACK_IMAGE_HEIGHT', gl.UNPACK_IMAGE_HEIGHT, 0),
1839 new PixelStoreState('unpack_skip_images', 'UNPACK_SKIP_IMAGES', gl.UNPACK_SKIP_IMAGES, 0),
1840 new PixelStoreState('unpack_row_length', 'UNPACK_ROW_LENGTH', gl.UNPACK_ROW_LENGTH, 0),
1841 new PixelStoreState('unpack_skip_rows', 'UNPACK_SKIP_ROWS', gl.UNPACK_SKIP_ROWS, 0),
1842 new PixelStoreState('unpack_skip_pixels', 'UNPACK_SKIP_PIXELS', gl.UNPACK_SKIP_PIXELS, 0),
1843 new PixelStoreState('pack_row_length', 'PACK_ROW_LENGTH', gl.PACK_ROW_LENGTH, 0),
1844 new PixelStoreState('pack_skip_rows', 'PACK_SKIP_ROWS', gl.PACK_SKIP_ROWS, 0),
1845 new PixelStoreState('pack_skip_pixels', 'PACK_SKIP_PIXELS', gl.PACK_SKIP_PIXELS, 0)
1848 for (var testNdx = 0; testNdx < pixelStoreStates.length; testNdx++)
1849 testCtx.addChild(new es3fIntegerStateQueryTests.PixelStoreTestCase(pixelStoreStates[testNdx].name, pixelStoreStates[testNdx].description, pixelStoreStates[testNdx].target, pixelStoreStates[testNdx].initialValue));
1851 testCtx.addChild(new es3fIntegerStateQueryTests.PixelStoreAlignTestCase('unpack_alignment', 'UNPACK_ALIGNMENT', gl.UNPACK_ALIGNMENT));
1852 testCtx.addChild(new es3fIntegerStateQueryTests.PixelStoreAlignTestCase('pack_alignment', 'PACK_ALIGNMENT', gl.PACK_ALIGNMENT));
1857 * @param {string} name
1858 * @param {string} description
1859 * @param {number} target
1860 * @param {number} initialValue
1862 var BlendColorState = function(name, description, target, initialValue) {
1863 /** @type {string} */ this.name = name;
1864 /** @type {string} */ this.description = description;
1865 /** @type {number} */ this.target = target;
1866 /** @type {number} */ this.initialValue = initialValue;
1869 /** @type {Array<PixelStoreState>} */ var blendColorStates = [
1870 new BlendColorState('blend_src_rgb', 'BLEND_SRC_RGB', gl.BLEND_SRC_RGB),
1871 new BlendColorState('blend_src_alpha', 'BLEND_SRC_ALPHA', gl.BLEND_SRC_ALPHA),
1872 new BlendColorState('blend_dst_rgb', 'BLEND_DST_RGB', gl.BLEND_DST_RGB),
1873 new BlendColorState('blend_dst_alpha', 'BLEND_DST_ALPHA', gl.BLEND_DST_ALPHA)
1876 for (var testNdx = 0; testNdx < blendColorStates.length; testNdx++) {
1877 testCtx.addChild(new es3fIntegerStateQueryTests.BlendFuncTestCase(blendColorStates[testNdx].name, blendColorStates[testNdx].description, blendColorStates[testNdx].target));
1878 testCtx.addChild(new es3fIntegerStateQueryTests.BlendFuncSeparateTestCase(blendColorStates[testNdx].name + '_separate', blendColorStates[testNdx].description, blendColorStates[testNdx].target));
1884 * @param {string} name
1885 * @param {string} description
1886 * @param {number} target
1887 * @param {number} initialValue
1889 var BlendEquationState = function(name, description, target, initialValue) {
1890 /** @type {string} */ this.name = name;
1891 /** @type {string} */ this.description = description;
1892 /** @type {number} */ this.target = target;
1893 /** @type {number} */ this.initialValue = initialValue;
1896 /** @type {Array<PixelStoreState>} */ var blendEquationStates = [
1897 new BlendEquationState('blend_equation_rgb', 'BLEND_EQUATION_RGB', gl.BLEND_EQUATION_RGB, gl.FUNC_ADD),
1898 new BlendEquationState('blend_equation_alpha', 'BLEND_EQUATION_ALPHA', gl.BLEND_EQUATION_ALPHA, gl.FUNC_ADD)
1901 for (var testNdx = 0; testNdx < blendEquationStates.length; testNdx++) {
1902 testCtx.addChild(new es3fIntegerStateQueryTests.BlendEquationTestCase(blendEquationStates[testNdx].name, blendEquationStates[testNdx].description, blendEquationStates[testNdx].target, blendEquationStates[testNdx].initialValue));
1903 testCtx.addChild(new es3fIntegerStateQueryTests.BlendEquationSeparateTestCase(blendEquationStates[testNdx].name + '_separate', blendEquationStates[testNdx].description, blendEquationStates[testNdx].target, blendEquationStates[testNdx].initialValue));
1909 * @param {string} name
1910 * @param {string} description
1911 * @param {number} target
1912 * @param {number} minValue
1914 var ImplementationArrayReturningState = function(name, description, target, minValue) {
1915 /** @type {string} */ this.name = name;
1916 /** @type {string} */ this.description = description;
1917 /** @type {number} */ this.target = target;
1918 /** @type {number} */ this.minValue = minValue;
1921 /** @type {ImplementationArrayReturningState} */ var implementationArrayReturningStates = new ImplementationArrayReturningState('compressed_texture_formats', 'COMPRESSED_TEXTURE_FORMATS', gl.COMPRESSED_TEXTURE_FORMATS, 10);
1923 testCtx.addChild(new es3fIntegerStateQueryTests.ImplementationArrayTestCase(implementationArrayReturningStates.name, implementationArrayReturningStates.description, implementationArrayReturningStates.target, implementationArrayReturningStates.minValue));
1928 * @param {string} name
1929 * @param {string} description
1930 * @param {number} target
1931 * @param {number} type
1933 var BufferBindingState = function(name, description, target, type) {
1934 /** @type {string} */ this.name = name;
1935 /** @type {string} */ this.description = description;
1936 /** @type {number} */ this.target = target;
1937 /** @type {number} */ this.type = type;
1940 /** @type {Array<BufferBindingState>} */ var bufferBindingStates = [
1941 new BufferBindingState('array_buffer_binding', 'ARRAY_BUFFER_BINDING', gl.ARRAY_BUFFER_BINDING, gl.ARRAY_BUFFER),
1942 new BufferBindingState('uniform_buffer_binding', 'UNIFORM_BUFFER_BINDING', gl.UNIFORM_BUFFER_BINDING, gl.UNIFORM_BUFFER),
1943 new BufferBindingState('pixel_pack_buffer_binding', 'PIXEL_PACK_BUFFER_BINDING', gl.PIXEL_PACK_BUFFER_BINDING, gl.PIXEL_PACK_BUFFER),
1944 new BufferBindingState('pixel_unpack_buffer_binding', 'PIXEL_UNPACK_BUFFER_BINDING', gl.PIXEL_UNPACK_BUFFER_BINDING, gl.PIXEL_UNPACK_BUFFER),
1945 new BufferBindingState('transform_feedback_buffer_binding', 'TRANSFORM_FEEDBACK_BUFFER_BINDING', gl.TRANSFORM_FEEDBACK_BUFFER_BINDING, gl.TRANSFORM_FEEDBACK_BUFFER),
1946 new BufferBindingState('copy_read_buffer_binding', 'COPY_READ_BUFFER_BINDING', gl.COPY_READ_BUFFER_BINDING, gl.COPY_READ_BUFFER),
1947 new BufferBindingState('copy_write_buffer_binding', 'COPY_WRITE_BUFFER_BINDING', gl.COPY_WRITE_BUFFER_BINDING, gl.COPY_WRITE_BUFFER)
1950 for (var testNdx = 0; testNdx < bufferBindingStates.length; testNdx++)
1951 testCtx.addChild(new es3fIntegerStateQueryTests.BufferBindingTestCase(bufferBindingStates[testNdx].name, bufferBindingStates[testNdx].description, bufferBindingStates[testNdx].target, bufferBindingStates[testNdx].type));
1953 testCtx.addChild(new es3fIntegerStateQueryTests.ElementArrayBufferBindingTestCase('element_array_buffer_binding'));
1954 testCtx.addChild(new es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase('transform_feedback_binding'));
1955 testCtx.addChild(new es3fIntegerStateQueryTests.TransformFeedbackBindingTestCase('transform_feedback_binding'));
1956 testCtx.addChild(new es3fIntegerStateQueryTests.CurrentProgramBindingTestCase('current_program_binding', 'CURRENT_PROGRAM'));
1957 testCtx.addChild(new es3fIntegerStateQueryTests.VertexArrayBindingTestCase('vertex_array_binding', 'VERTEX_ARRAY_BINDING'));
1958 testCtx.addChild(new es3fIntegerStateQueryTests.StencilClearValueTestCase('stencil_clear_value', 'STENCIL_CLEAR_VALUE'));
1959 testCtx.addChild(new es3fIntegerStateQueryTests.ActiveTextureTestCase('active_texture', 'ACTIVE_TEXTURE'));
1960 testCtx.addChild(new es3fIntegerStateQueryTests.RenderbufferBindingTestCase('renderbuffer_binding', 'RENDERBUFFER_BINDING'));
1961 testCtx.addChild(new es3fIntegerStateQueryTests.SamplerObjectBindingTestCase('sampler_binding', 'SAMPLER_BINDING'));
1966 * @param {string} name
1967 * @param {string} description
1968 * @param {number} target
1969 * @param {number} type
1971 var TextureBinding = function(name, description, target, type) {
1972 /** @type {string} */ this.name = name;
1973 /** @type {string} */ this.description = description;
1974 /** @type {number} */ this.target = target;
1975 /** @type {number} */ this.type = type;
1978 /** @type {Array<TextureBinding>} */ var textureBindings = [
1979 new TextureBinding('texture_binding_2d', 'TEXTURE_BINDING_2D', gl.TEXTURE_BINDING_2D, gl.TEXTURE_2D),
1980 new TextureBinding('texture_binding_3d', 'TEXTURE_BINDING_3D', gl.TEXTURE_BINDING_3D, gl.TEXTURE_3D),
1981 new TextureBinding('texture_binding_2d_array', 'TEXTURE_BINDING_2D_ARRAY', gl.TEXTURE_BINDING_2D_ARRAY, gl.TEXTURE_2D_ARRAY),
1982 new TextureBinding('texture_binding_cube_map', 'TEXTURE_BINDING_CUBE_MAP', gl.TEXTURE_BINDING_CUBE_MAP, gl.TEXTURE_CUBE_MAP)
1985 for (var testNdx = 0; testNdx < textureBindings.length; testNdx++)
1986 testCtx.addChild(new es3fIntegerStateQueryTests.TextureBindingTestCase(textureBindings[testNdx].name, textureBindings[testNdx].description, textureBindings[testNdx].target, textureBindings[testNdx].type));
1988 testCtx.addChild(new es3fIntegerStateQueryTests.FrameBufferBindingTestCase('framebuffer_binding', 'DRAW_FRAMEBUFFER_BINDING and READ_FRAMEBUFFER_BINDING'));
1989 testCtx.addChild(new es3fIntegerStateQueryTests.ImplementationColorReadTestCase('implementation_color_read', 'IMPLEMENTATION_COLOR_READ_TYPE and IMPLEMENTATION_COLOR_READ_FORMAT'));
1990 testCtx.addChild(new es3fIntegerStateQueryTests.ReadBufferCase('read_buffer', 'READ_BUFFER'));
1991 testCtx.addChild(new es3fIntegerStateQueryTests.DrawBufferCase('draw_buffer', 'DRAW_BUFFER'));
1998 * @param {string} name
1999 * @param {string} description
2000 * @param {number} targetName
2001 * @param {number} minValue
2003 var LimitedStateInteger64 = function(name, description, targetName, minValue) {
2004 /** @type {string} */ this.name = name;
2005 /** @type {string} */ this.description = description;
2006 /** @type {number} */ this.targetName = targetName;
2007 /** @type {number} */ this.minValue = minValue;
2011 /** @type {Array<LimitedStateInteger64>} */ var implementationLimits = [
2012 new LimitedStateInteger64('max_element_index', 'MAX_ELEMENT_INDEX', gl.MAX_ELEMENT_INDEX, 0x00FFFFFF),
2013 new LimitedStateInteger64('max_server_wait_timeout', 'MAX_SERVER_WAIT_TIMEOUT', gl.MAX_SERVER_WAIT_TIMEOUT, 0),
2014 new LimitedStateInteger64('max_uniform_block_size', 'MAX_UNIFORM_BLOCK_SIZE', gl.MAX_UNIFORM_BLOCK_SIZE, 16384)
2017 for (var testNdx = 0; testNdx < implementationLimits.length; testNdx++)
2018 this.addChild(new es3fIntegerStateQueryTests.ConstantMinimumValue64TestCase(implementationLimits[testNdx].name, implementationLimits[testNdx].description, implementationLimits[testNdx].targetName, implementationLimits[testNdx].minValue));
2020 this.addChild(new es3fIntegerStateQueryTests.MaxCombinedStageUniformComponentsCase('max_combined_vertex_uniform_components', 'MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS', gl.MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, gl.MAX_VERTEX_UNIFORM_BLOCKS, gl.MAX_VERTEX_UNIFORM_COMPONENTS));
2021 this.addChild(new es3fIntegerStateQueryTests.MaxCombinedStageUniformComponentsCase('max_combined_fragment_uniform_components', 'MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS', gl.MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, gl.MAX_FRAGMENT_UNIFORM_BLOCKS, gl.MAX_FRAGMENT_UNIFORM_COMPONENTS));
2027 * @param {WebGL2RenderingContext} context
2029 es3fIntegerStateQueryTests.run = function(context) {
2031 //Set up Test Root parameters
2032 var state = tcuTestCase.runner;
2033 state.setRoot(new es3fIntegerStateQueryTests.IntegerStateQueryTests());
2035 //Set up name and description of this test series.
2036 setCurrentTestName(state.testCases.fullName());
2037 description(state.testCases.getDescription());
2041 tcuTestCase.runTestCases();
2044 testFailedOptions('Failed to es3fIntegerStateQueryTests.run tests', false);
2045 tcuTestCase.runner.terminate();