/*------------------------------------------------------------------------- * drawElements Quality Program OpenGL ES Utilities * ------------------------------------------------ * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ 'use strict'; goog.provide('functional.gles3.es3fBooleanStateQuery'); goog.require('framework.common.tcuTestCase'); goog.require('functional.gles3.es3fApiCase'); goog.require('modules.shared.glsStateQuery'); goog.scope(function() { var es3fBooleanStateQuery = functional.gles3.es3fBooleanStateQuery; var tcuTestCase = framework.common.tcuTestCase; var glsStateQuery = modules.shared.glsStateQuery; var es3fApiCase = functional.gles3.es3fApiCase; var setParentClass = function(child, parent) { child.prototype = Object.create(parent.prototype); child.prototype.constructor = child; }; /** * @constructor * @extends {es3fApiCase.ApiCase} * @param {string} name * @param {string} description * @param {number} targetName * @param {boolean} value */ es3fBooleanStateQuery.IsEnabledStateTestCase = function(name, description, targetName, value) { es3fApiCase.ApiCase.call(this, name, description, gl); this.m_targetName = targetName; this.m_initial = value; }; setParentClass(es3fBooleanStateQuery.IsEnabledStateTestCase, es3fApiCase.ApiCase); es3fBooleanStateQuery.IsEnabledStateTestCase.prototype.test = function() { // check inital value this.m_pass &= glsStateQuery.verify(this.m_targetName, this.m_initial); // check toggle gl.enable(this.m_targetName); this.m_pass &= glsStateQuery.verify(this.m_targetName, true); gl.disable(this.m_targetName); this.m_pass &= glsStateQuery.verify(this.m_targetName, false); }; /** * @constructor * @extends {es3fApiCase.ApiCase} * @param {string} name * @param {string} description */ es3fBooleanStateQuery.DepthWriteMaskTestCase = function(name, description) { es3fApiCase.ApiCase.call(this, name, description, gl); }; setParentClass(es3fBooleanStateQuery.DepthWriteMaskTestCase, es3fApiCase.ApiCase); es3fBooleanStateQuery.DepthWriteMaskTestCase.prototype.test = function() { this.m_pass &= glsStateQuery.verify(gl.DEPTH_WRITEMASK, true); gl.depthMask(false); this.m_pass &= glsStateQuery.verify(gl.DEPTH_WRITEMASK, false); gl.depthMask(true); this.m_pass &= glsStateQuery.verify(gl.DEPTH_WRITEMASK, true); }; /** * @constructor * @extends {es3fApiCase.ApiCase} * @param {string} name * @param {string} description */ es3fBooleanStateQuery.SampleCoverageInvertTestCase = function(name, description) { es3fApiCase.ApiCase.call(this, name, description, gl); }; setParentClass(es3fBooleanStateQuery.SampleCoverageInvertTestCase, es3fApiCase.ApiCase); es3fBooleanStateQuery.SampleCoverageInvertTestCase.prototype.test = function() { this.m_pass &= glsStateQuery.verify(gl.SAMPLE_COVERAGE_INVERT, false); gl.sampleCoverage(1, true); this.m_pass &= glsStateQuery.verify(gl.SAMPLE_COVERAGE_INVERT, true); gl.sampleCoverage(1, false); this.m_pass &= glsStateQuery.verify(gl.SAMPLE_COVERAGE_INVERT, false); }; /** * @constructor * @extends {es3fApiCase.ApiCase} * @param {string} name * @param {string} description * @param {number} targetName * @param {boolean} value */ es3fBooleanStateQuery.InitialBooleanTestCase = function(name, description, targetName, value) { es3fApiCase.ApiCase.call(this, name, description, gl); this.m_targetName = targetName; this.m_initial = value; }; setParentClass(es3fBooleanStateQuery.InitialBooleanTestCase, es3fApiCase.ApiCase); es3fBooleanStateQuery.InitialBooleanTestCase.prototype.test = function() { // check inital value this.m_pass &= glsStateQuery.verify(this.m_targetName, this.m_initial); }; /** * @constructor * @extends {es3fApiCase.ApiCase} * @param {string} name * @param {string} description */ es3fBooleanStateQuery.ColorMaskTestCase = function(name, description) { es3fApiCase.ApiCase.call(this, name, description, gl); }; setParentClass(es3fBooleanStateQuery.ColorMaskTestCase, es3fApiCase.ApiCase); es3fBooleanStateQuery.ColorMaskTestCase.prototype.test = function() { this.m_pass &= glsStateQuery.verify(gl.COLOR_WRITEMASK, [true, true, true, true]); var testMasks = [ [true, true, true, true], [true, true, true, false], [true, true, false, true], [true, true, false, false], [true, false, true, true], [true, false, true, false], [true, false, false, true], [true, false, false, false], [false, true, true, true], [false, true, true, false], [false, true, false, true], [false, true, false, false], [false, false, true, true], [false, false, true, false], [false, false, false, true], [false, false, false, false] ]; for (var ndx = 0; ndx < testMasks.length; ndx++) { var mask = testMasks[ndx]; gl.colorMask(mask[0], mask[1], mask[2], mask[3]); this.m_pass &= glsStateQuery.verify(gl.COLOR_WRITEMASK, mask); } }; /** * @constructor * @extends {es3fApiCase.ApiCase} * @param {string} name * @param {string} description */ es3fBooleanStateQuery.TransformFeedbackTestCase = function(name, description) { es3fApiCase.ApiCase.call(this, name, description, gl); /** @type {WebGLTransformFeedback} */ this.m_transformfeedback = null; }; setParentClass(es3fBooleanStateQuery.TransformFeedbackTestCase, es3fApiCase.ApiCase); es3fBooleanStateQuery.TransformFeedbackTestCase.prototype.testTransformFeedback = function() { throw new Error('Virtual function.'); }; es3fBooleanStateQuery.TransformFeedbackTestCase.prototype.test = function() { var transformFeedbackTestVertSource = '#version 300 es\n' + 'void main (void)\n' + '{\n' + ' gl_Position = vec4(0.0);\n' + '}\n'; var transformFeedbackTestFragSource = '#version 300 es\n' + 'layout(location = 0) out mediump vec4 fragColor;' + 'void main (void)\n' + '{\n' + ' fragColor = vec4(0.0);\n' + '}\n'; this.m_transformfeedback = gl.createTransformFeedback(); var shaderVert = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(shaderVert, transformFeedbackTestVertSource); gl.compileShader(shaderVert); this.m_pass &= glsStateQuery.verifyShader(shaderVert, gl.COMPILE_STATUS, true); var shaderFrag = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(shaderFrag, transformFeedbackTestFragSource); gl.compileShader(shaderFrag); this.m_pass &= glsStateQuery.verifyShader(shaderFrag, gl.COMPILE_STATUS, true); var shaderProg = gl.createProgram(); gl.attachShader(shaderProg, shaderVert); gl.attachShader(shaderProg, shaderFrag); var transform_feedback_outputs = ['gl_Position']; gl.transformFeedbackVaryings(shaderProg, transform_feedback_outputs, gl.INTERLEAVED_ATTRIBS); gl.linkProgram(shaderProg); this.m_pass &= glsStateQuery.verifyProgram(shaderProg, gl.LINK_STATUS, true); gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, this.m_transformfeedback); var buffer = gl.createBuffer(); gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER, buffer); gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, 16, gl.DYNAMIC_READ); gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, buffer); gl.useProgram(shaderProg); this.testTransformFeedback(); gl.useProgram(null); gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null); gl.deleteTransformFeedback(this.m_transformfeedback); gl.deleteBuffer(buffer); gl.deleteShader(shaderVert); gl.deleteShader(shaderFrag); gl.deleteProgram(shaderProg); }; /** * @constructor * @extends {es3fBooleanStateQuery.TransformFeedbackTestCase} * @param {string} name */ es3fBooleanStateQuery.TransformFeedbackBasicTestCase = function(name) { es3fBooleanStateQuery.TransformFeedbackTestCase.call(this, name, 'Test TRANSFORM_FEEDBACK_ACTIVE and TRANSFORM_FEEDBACK_PAUSED'); }; setParentClass(es3fBooleanStateQuery.TransformFeedbackBasicTestCase, es3fBooleanStateQuery.TransformFeedbackTestCase); es3fBooleanStateQuery.TransformFeedbackBasicTestCase.prototype.testTransformFeedback = function() { gl.beginTransformFeedback(gl.POINTS); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_ACTIVE, true); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_PAUSED, false); gl.pauseTransformFeedback(); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_ACTIVE, true); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_PAUSED, true); gl.resumeTransformFeedback(); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_ACTIVE, true); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_PAUSED, false); gl.endTransformFeedback(); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_ACTIVE, false); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_PAUSED, false); }; /** * @constructor * @extends {es3fBooleanStateQuery.TransformFeedbackTestCase} * @param {string} name */ es3fBooleanStateQuery.TransformFeedbackImplicitResumeTestCase = function(name) { es3fBooleanStateQuery.TransformFeedbackTestCase.call(this, name, 'EndTransformFeedback performs an implicit ResumeTransformFeedback.'); }; setParentClass(es3fBooleanStateQuery.TransformFeedbackImplicitResumeTestCase, es3fBooleanStateQuery.TransformFeedbackTestCase); es3fBooleanStateQuery.TransformFeedbackImplicitResumeTestCase.prototype.testTransformFeedback = function() { gl.beginTransformFeedback(gl.POINTS); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_ACTIVE, true); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_PAUSED, false); gl.pauseTransformFeedback(); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_ACTIVE, true); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_PAUSED, true); gl.endTransformFeedback(); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_ACTIVE, false); this.m_pass &= glsStateQuery.verify(gl.TRANSFORM_FEEDBACK_PAUSED, false); }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fBooleanStateQuery.BooleanStateQuery = function() { tcuTestCase.DeqpTest.call(this, 'boolean', 'Boolean State Query tests'); }; es3fBooleanStateQuery.BooleanStateQuery.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fBooleanStateQuery.BooleanStateQuery.prototype.constructor = es3fBooleanStateQuery.BooleanStateQuery; es3fBooleanStateQuery.BooleanStateQuery.prototype.init = function() { var testRoot = this; var isEnableds = [ ['rasterizer_discard', 'RASTERIZER_DISCARD', gl.RASTERIZER_DISCARD, false], ['cull_face', 'CULL_FACE', gl.CULL_FACE, false], ['polygon_offset_fill', 'POLYGON_OFFSET_FILL', gl.POLYGON_OFFSET_FILL, false], ['sample_alpha_to_coverage', 'SAMPLE_ALPHA_TO_COVERAGE', gl.SAMPLE_ALPHA_TO_COVERAGE, false], ['sample_coverage', 'SAMPLE_COVERAGE', gl.SAMPLE_COVERAGE, false], ['scissor_test', 'SCISSOR_TEST', gl.SCISSOR_TEST, false], ['stencil_test', 'STENCIL_TEST', gl.STENCIL_TEST, false], ['depth_test', 'DEPTH_TEST', gl.DEPTH_TEST, false], ['blend', 'BLEND', gl.BLEND, false], ['dither', 'DITHER', gl.DITHER, true] ]; isEnableds.forEach(function(elem) { var name = elem[0]; var description = elem[1]; var targetName = elem[2]; var value = elem[3]; testRoot.addChild(new es3fBooleanStateQuery.IsEnabledStateTestCase(name, description, targetName, value)); }); testRoot.addChild(new es3fBooleanStateQuery.ColorMaskTestCase('color_writemask', 'COLOR_WRITEMASK')); testRoot.addChild(new es3fBooleanStateQuery.DepthWriteMaskTestCase('depth_writemask', 'DEPTH_WRITEMASK')); testRoot.addChild(new es3fBooleanStateQuery.SampleCoverageInvertTestCase('sample_coverage_invert', 'SAMPLE_COVERAGE_INVERT')); testRoot.addChild(new es3fBooleanStateQuery.InitialBooleanTestCase('transform_feedback_active_initial', 'initial TRANSFORM_FEEDBACK_ACTIVE', gl.TRANSFORM_FEEDBACK_ACTIVE, false)); testRoot.addChild(new es3fBooleanStateQuery.InitialBooleanTestCase('transform_feedback_paused_initial', 'initial TRANSFORM_FEEDBACK_PAUSED', gl.TRANSFORM_FEEDBACK_PAUSED, false)); testRoot.addChild(new es3fBooleanStateQuery.TransformFeedbackBasicTestCase('transform_feedback')); testRoot.addChild(new es3fBooleanStateQuery.TransformFeedbackImplicitResumeTestCase('transform_feedback_implicit_resume')); }; /** * Run test * @param {WebGL2RenderingContext} context */ es3fBooleanStateQuery.run = function(context) { gl = context; //Set up Test Root parameters var state = tcuTestCase.runner; state.setRoot(new es3fBooleanStateQuery.BooleanStateQuery()); //Set up name and description of this test series. setCurrentTestName(state.testCases.fullName()); description(state.testCases.getDescription()); try { //Run test cases tcuTestCase.runTestCases(); } catch (err) { testFailedOptions('Failed to es3fBooleanStateQuery.run tests', false); tcuTestCase.runner.terminate(); } }; });