/*------------------------------------------------------------------------- * drawElements Quality Program OpenGL ES 3.0 Module * ------------------------------------------------- * * 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. * *//*! * \file * \brief Attribute location test *//*--------------------------------------------------------------------*/ 'use strict'; goog.provide('functional.gles3.es3fAttribLocationTests'); goog.require('framework.opengl.gluShaderUtil'); goog.require('modules.shared.glsAttributeLocationTests'); goog.scope(function() { var es3fAttribLocationTests = functional.gles3.es3fAttribLocationTests; var glsAttributeLocationTests = modules.shared.glsAttributeLocationTests; var tcuTestCase = framework.common.tcuTestCase; var gluShaderUtil = framework.opengl.gluShaderUtil; es3fAttribLocationTests.createAttributeLocationTests = function() { /** @type {Array} */ var types = [ new glsAttributeLocationTests.AttribType('float', 1, gl.FLOAT), new glsAttributeLocationTests.AttribType('vec2', 1, gl.FLOAT_VEC2), new glsAttributeLocationTests.AttribType('vec3', 1, gl.FLOAT_VEC3), new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), new glsAttributeLocationTests.AttribType('mat2', 2, gl.FLOAT_MAT2), new glsAttributeLocationTests.AttribType('mat3', 3, gl.FLOAT_MAT3), new glsAttributeLocationTests.AttribType('mat4', 4, gl.FLOAT_MAT4), new glsAttributeLocationTests.AttribType('int', 1, gl.INT), new glsAttributeLocationTests.AttribType('ivec2', 1, gl.INT_VEC2), new glsAttributeLocationTests.AttribType('ivec3', 1, gl.INT_VEC3), new glsAttributeLocationTests.AttribType('ivec4', 1, gl.INT_VEC4), new glsAttributeLocationTests.AttribType('uint', 1, gl.UNSIGNED_INT), new glsAttributeLocationTests.AttribType('uvec2', 1, gl.UNSIGNED_INT_VEC2), new glsAttributeLocationTests.AttribType('uvec3', 1, gl.UNSIGNED_INT_VEC3), new glsAttributeLocationTests.AttribType('uvec4', 1, gl.UNSIGNED_INT_VEC4), new glsAttributeLocationTests.AttribType('mat2x2', 2, gl.FLOAT_MAT2), new glsAttributeLocationTests.AttribType('mat2x3', 2, gl.FLOAT_MAT2x3), new glsAttributeLocationTests.AttribType('mat2x4', 2, gl.FLOAT_MAT2x4), new glsAttributeLocationTests.AttribType('mat3x2', 3, gl.FLOAT_MAT3x2), new glsAttributeLocationTests.AttribType('mat3x3', 3, gl.FLOAT_MAT3), new glsAttributeLocationTests.AttribType('mat3x4', 3, gl.FLOAT_MAT3x4), new glsAttributeLocationTests.AttribType('mat4x2', 4, gl.FLOAT_MAT4x2), new glsAttributeLocationTests.AttribType('mat4x3', 4, gl.FLOAT_MAT4x3), new glsAttributeLocationTests.AttribType('mat4x4', 4, gl.FLOAT_MAT4) ]; /** @type {Array} */ var es2Types = [ new glsAttributeLocationTests.AttribType('float', 1, gl.FLOAT), new glsAttributeLocationTests.AttribType('vec2', 1, gl.FLOAT_VEC2), new glsAttributeLocationTests.AttribType('vec3', 1, gl.FLOAT_VEC3), new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), new glsAttributeLocationTests.AttribType('mat2', 2, gl.FLOAT_MAT2), new glsAttributeLocationTests.AttribType('mat3', 3, gl.FLOAT_MAT3), new glsAttributeLocationTests.AttribType('mat4', 4, gl.FLOAT_MAT4) ]; /** @type {tcuTestCase.DeqpTest} */ var root = tcuTestCase.newTest('attribute_location', 'Attribute location tests'); /** @type {number} */ var typeNdx; /** @type {glsAttributeLocationTests.AttribType} */ var type; // Basic bind attribute tests /** @type {tcuTestCase.DeqpTest} */ var bindAttributeGroup = tcuTestCase.newTest('bind', 'Basic bind attribute location tests.'); root.addChild(bindAttributeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; bindAttributeGroup.addChild(new glsAttributeLocationTests.BindAttributeTest(type)); } // Bind max number of attributes /** @type {tcuTestCase.DeqpTest} */ var bindMaxAttributeGroup = tcuTestCase.newTest('bind_max_attributes', 'Use bind with maximum number of attributes.'); root.addChild(bindMaxAttributeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; bindMaxAttributeGroup.addChild(new glsAttributeLocationTests.BindMaxAttributesTest(type)); } // Test filling holes in attribute location /** @type {tcuTestCase.DeqpTest} */ var holeGroup = tcuTestCase.newTest('bind_hole', 'Bind all, but one attribute and leave hole in location space for it.'); root.addChild(holeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; // Bind first location, leave hole size of type and fill rest of locations holeGroup.addChild(new glsAttributeLocationTests.BindHoleAttributeTest(type)); } // Test binding at different times /** @type {tcuTestCase.DeqpTest} */ var bindTimeGroup = tcuTestCase.newTest('bind_time', 'Bind time tests. Test binding at different stages.'); root.addChild(bindTimeGroup); bindTimeGroup.addChild(new glsAttributeLocationTests.PreAttachBindAttributeTest()); bindTimeGroup.addChild(new glsAttributeLocationTests.PreLinkBindAttributeTest()); bindTimeGroup.addChild(new glsAttributeLocationTests.PostLinkBindAttributeTest()); bindTimeGroup.addChild(new glsAttributeLocationTests.BindRelinkAttributeTest()); bindTimeGroup.addChild(new glsAttributeLocationTests.BindReattachAttributeTest()); // Basic layout location attribute tests /** @type {tcuTestCase.DeqpTest} */ var layoutAttributeGroup = tcuTestCase.newTest('layout', 'Basic layout location tests.'); root.addChild(layoutAttributeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; layoutAttributeGroup.addChild(new glsAttributeLocationTests.LocationAttributeTest(type)); } // Test max attributes with layout locations /** @type {tcuTestCase.DeqpTest} */ var layoutMaxAttributeGroup = tcuTestCase.newTest('layout_max_attributes', 'Maximum attributes used with layout location qualifiers.'); root.addChild(layoutMaxAttributeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; layoutMaxAttributeGroup.addChild(new glsAttributeLocationTests.LocationMaxAttributesTest(type)); } // Test filling holes in attribute location holeGroup = tcuTestCase.newTest('layout_hole', 'Define layout location for all, but one attribute consuming max attribute locations.'); root.addChild(holeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; // Location first location, leave hole size of type and fill rest of locations holeGroup.addChild(new glsAttributeLocationTests.LocationHoleAttributeTest(type)); } // Basic mixed mixed attribute tests /** @type {tcuTestCase.DeqpTest} */ var mixedAttributeGroup = tcuTestCase.newTest('mixed', 'Basic mixed location tests.'); root.addChild(mixedAttributeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; mixedAttributeGroup.addChild(new glsAttributeLocationTests.MixedAttributeTest(type)); } /** @type {tcuTestCase.DeqpTest} */ var mixedMaxAttributeGroup = tcuTestCase.newTest('mixed_max_attributes', 'Maximum attributes used with mixed binding and layout qualifiers.'); root.addChild(mixedMaxAttributeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; mixedMaxAttributeGroup.addChild(new glsAttributeLocationTests.MixedMaxAttributesTest(type)); } // Test mixed binding at different times /** @type {tcuTestCase.DeqpTest} */ var mixedTimeGroup = tcuTestCase.newTest('mixed_time', 'Bind time tests. Test binding at different stages.'); root.addChild(mixedTimeGroup); mixedTimeGroup.addChild(new glsAttributeLocationTests.PreAttachMixedAttributeTest()); mixedTimeGroup.addChild(new glsAttributeLocationTests.PreLinkMixedAttributeTest()); mixedTimeGroup.addChild(new glsAttributeLocationTests.PostLinkMixedAttributeTest()); mixedTimeGroup.addChild(new glsAttributeLocationTests.MixedRelinkAttributeTest()); mixedTimeGroup.addChild(new glsAttributeLocationTests.MixedReattachAttributeTest()); holeGroup = tcuTestCase.newTest('mixed_hole', 'Use layout location qualifiers and binding. Leave hole in location space for only free attribute.'); root.addChild(holeGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; holeGroup.addChild(new glsAttributeLocationTests.MixedHoleAttributeTest(type)); } // Test hole in location space that moves when relinking /** @type {tcuTestCase.DeqpTest} */ var relinkBindHoleGroup = tcuTestCase.newTest('bind_relink_hole', 'Test relinking with moving hole in attribute location space.'); root.addChild(relinkBindHoleGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; relinkBindHoleGroup.addChild(new glsAttributeLocationTests.BindRelinkHoleAttributeTest(type)); } // Test hole in location space that moves when relinking /** @type {tcuTestCase.DeqpTest} */ var relinkMixedHoleGroup = tcuTestCase.newTest('mixed_relink_hole', 'Test relinking with moving hole in attribute location space.'); root.addChild(relinkMixedHoleGroup); for (typeNdx = 0; typeNdx < types.length; typeNdx++) { type = types[typeNdx]; relinkMixedHoleGroup.addChild(new glsAttributeLocationTests.MixedRelinkHoleAttributeTest(type)); } return root; }; es3fAttribLocationTests.run = function(context) { gl = context; //Set up root Test var state = tcuTestCase.runner; var test = es3fAttribLocationTests.createAttributeLocationTests(); var testName = test.fullName(); var testDescription = test.getDescription() === undefined ? '' : test.getDescription(); state.testName = testName; state.setRoot(test); //Set up name and description of this test series. setCurrentTestName(testName); description(testDescription); try { //Create test cases test.init(); //Run test cases tcuTestCase.runTestCases(); } catch (err) { bufferedLogToConsole('Exception: ' + err); testFailedOptions('Failed to es3fAttribLocationTests.run tests', false); tcuTestCase.runner.terminate(); } }; });