blob: 93f91eca1d7b0d17c6cb4080565669b1e56fa7b0 [file] [log] [blame]
/*-------------------------------------------------------------------------
* 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<glsAttributeLocationTests.AttribType>} */
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<glsAttributeLocationTests.AttribType>} */
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();
}
};
});