/*------------------------------------------------------------------------- * 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.es3fVertexArrayTests'); goog.require('framework.common.tcuSurface'); goog.require('framework.common.tcuTestCase'); goog.require('framework.common.tcuTexture'); goog.require('framework.delibs.debase.deMath'); goog.require('framework.delibs.debase.deRandom'); goog.require('framework.delibs.debase.deString'); goog.require('framework.delibs.debase.deUtil'); goog.require('framework.opengl.gluDrawUtil'); goog.require('framework.opengl.gluShaderProgram'); goog.require('framework.opengl.gluShaderUtil'); goog.require('framework.opengl.gluTexture'); goog.require('framework.opengl.gluVarType'); goog.require('modules.shared.glsVertexArrayTests'); goog.scope(function() { var es3fVertexArrayTests = functional.gles3.es3fVertexArrayTests; var gluDrawUtil = framework.opengl.gluDrawUtil; var gluShaderUtil = framework.opengl.gluShaderUtil; var gluShaderProgram = framework.opengl.gluShaderProgram; var gluTexture = framework.opengl.gluTexture; var gluVarType = framework.opengl.gluVarType; var tcuTestCase = framework.common.tcuTestCase; var tcuSurface = framework.common.tcuSurface; var tcuTexture = framework.common.tcuTexture; var deMath = framework.delibs.debase.deMath; var deString = framework.delibs.debase.deString; var deRandom = framework.delibs.debase.deRandom; var deUtil = framework.delibs.debase.deUtil; var glsVertexArrayTests = modules.shared.glsVertexArrayTests; var DE_ASSERT = function(x) { if (!x) throw new Error('Assert failed'); }; /** * es3fVertexArrayTests.SingleVertexArrayUsageGroup * @constructor * @extends {tcuTestCase.DeqpTest} * @param {glsVertexArrayTests.deArray.Usage} usage */ es3fVertexArrayTests.SingleVertexArrayUsageGroup = function(usage) { tcuTestCase.DeqpTest.call( this, "single_attribute.usages." + glsVertexArrayTests.deArray.usageTypeToString(usage), glsVertexArrayTests.deArray.usageTypeToString(usage) ); this.makeExecutable(); this.m_usage = usage; }; es3fVertexArrayTests.SingleVertexArrayUsageGroup.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayUsageGroup.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayUsageGroup; /** * init */ es3fVertexArrayTests.SingleVertexArrayUsageGroup.prototype.init = function() { /** @type {Array} */ var counts = [1, 256]; /** @type {Array} */ var strides = [0, -1, 17, 32]; // Treat negative value as sizeof input. Same as 0, but done outside of GL. /** @type {Array} */ var inputTypes = [ glsVertexArrayTests.deArray.InputType.FLOAT, /*glsVertexArrayTests.deArray.InputType.FIXED,*/ glsVertexArrayTests.deArray.InputType.SHORT, glsVertexArrayTests.deArray.InputType.BYTE ]; for (var inputTypeNdx = 0; inputTypeNdx < inputTypes.length; inputTypeNdx++) { for (var countNdx = 0; countNdx < counts.length; countNdx++) { for (var strideNdx = 0; strideNdx < strides.length; strideNdx++) { /** @type {number} */ var stride = (strides[strideNdx] < 0 ? glsVertexArrayTests.deArray.inputTypeSize(inputTypes[inputTypeNdx]) * 2 : strides[strideNdx]); /** @type {boolean} */ var aligned = (stride % glsVertexArrayTests.deArray.inputTypeSize(inputTypes[inputTypeNdx])) == 0; /** @type {string} */ var name = 'stride' + stride + '_' + glsVertexArrayTests.deArray.inputTypeToString(inputTypes[inputTypeNdx]) + '_quads' + counts[countNdx]; var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( inputTypes[inputTypeNdx], glsVertexArrayTests.deArray.OutputType.VEC2, glsVertexArrayTests.deArray.Storage.BUFFER, this.m_usage, 2, 0, stride, false, glsVertexArrayTests.GLValue.getMinValue(inputTypes[inputTypeNdx]), glsVertexArrayTests.GLValue.getMaxValue(inputTypes[inputTypeNdx]) ); var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = counts[countNdx]; spec.first = 0; spec.arrays.push(arraySpec); if (aligned) this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, name ) ); } } } }; /** * es3fVertexArrayTests.SingleVertexArrayStrideGroup * @constructor * @extends {tcuTestCase.DeqpTest} * @param {glsVertexArrayTests.deArray.InputType} type */ es3fVertexArrayTests.SingleVertexArrayStrideGroup = function(type) { tcuTestCase.DeqpTest.call(this, glsVertexArrayTests.deArray.inputTypeToString(type), glsVertexArrayTests.deArray.inputTypeToString(type)); this.makeExecutable(); this.m_type = type; }; es3fVertexArrayTests.SingleVertexArrayStrideGroup.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayStrideGroup.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayStrideGroup; /** * init */ es3fVertexArrayTests.SingleVertexArrayStrideGroup.prototype.init = function() { /** @type {Array} */ var storages = [ // User storage not supported in WebGL - glsVertexArrayTests.deArray.Storage.USER, glsVertexArrayTests.deArray.Storage.BUFFER ]; var counts = [1, 256]; var strides = [/*0,*/ -1, 17, 32]; // Treat negative value as sizeof input. Same as 0, but done outside of GL. for (var storageNdx = 0; storageNdx < storages.length; storageNdx++) { for (var componentCount = 2; componentCount < 5; componentCount++) { for (var countNdx = 0; countNdx < counts.length; countNdx++) { for (var strideNdx = 0; strideNdx < strides.length; strideNdx++) { /** @type {boolean} */ var packed = this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10 || this.m_type == glsVertexArrayTests.deArray.InputType.INT_2_10_10_10; /** @type {number} */ var stride = (strides[strideNdx] < 0) ? ((packed) ? (16) : (glsVertexArrayTests.deArray.inputTypeSize(this.m_type) * componentCount)) : (strides[strideNdx]); /** @type {number} */ var alignment = (packed) ? (glsVertexArrayTests.deArray.inputTypeSize(this.m_type) * componentCount) : (glsVertexArrayTests.deArray.inputTypeSize(this.m_type)); /** @type {boolean} */ var bufferUnaligned = (storages[storageNdx] == glsVertexArrayTests.deArray.Storage.BUFFER) && (stride % alignment) != 0; /** @type {string} */ var name = glsVertexArrayTests.deArray.storageToString(storages[storageNdx]) + '_stride' + stride + '_components' + componentCount + '_quads' + counts[countNdx]; if ((this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10 || this.m_type == glsVertexArrayTests.deArray.InputType.INT_2_10_10_10) && componentCount != 4) continue; /** @type {glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec} */ var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( this.m_type, glsVertexArrayTests.deArray.OutputType.VEC4, storages[storageNdx], glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, componentCount, 0, stride, false, glsVertexArrayTests.GLValue.getMinValue(this.m_type), glsVertexArrayTests.GLValue.getMaxValue(this.m_type) ); var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = counts[countNdx]; spec.first = 0; spec.arrays.push(arraySpec); if (!bufferUnaligned) this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, name ) ); } } } } }; /** * es3fVertexArrayTests.SingleVertexArrayStrideTests * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.SingleVertexArrayStrideTests = function() { tcuTestCase.DeqpTest.call(this, 'single_attribute.strides', 'Single stride vertex atribute'); this.makeExecutable(); }; es3fVertexArrayTests.SingleVertexArrayStrideTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayStrideTests.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayStrideTests; es3fVertexArrayTests.SingleVertexArrayStrideTests.prototype.init = function() { /** @type {Array} */ var inputTypes = [ glsVertexArrayTests.deArray.InputType.FLOAT, glsVertexArrayTests.deArray.InputType.SHORT, glsVertexArrayTests.deArray.InputType.BYTE, /*glsVertexArrayTests.deArray.InputType.UNSIGNED_SHORT, glsVertexArrayTests.deArray.InputType.UNSIGNED_BYTE, glsVertexArrayTests.deArray.InputType.FIXED,*/ glsVertexArrayTests.deArray.InputType.INT_2_10_10_10 ]; for (var inputTypeNdx = 0; inputTypeNdx < inputTypes.length; inputTypeNdx++) this.addChild( new es3fVertexArrayTests.SingleVertexArrayStrideGroup( inputTypes[inputTypeNdx] ) ); }; /** * @constructor * @extends {tcuTestCase.DeqpTest} * @param {glsVertexArrayTests.deArray.InputType} type */ es3fVertexArrayTests.SingleVertexArrayFirstGroup = function(type) { tcuTestCase.DeqpTest.call( this, glsVertexArrayTests.deArray.inputTypeToString(type), glsVertexArrayTests.deArray.inputTypeToString(type) ); this.makeExecutable(); this.m_type = type; }; es3fVertexArrayTests.SingleVertexArrayFirstGroup.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayFirstGroup.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayFirstGroup; /** * init */ es3fVertexArrayTests.SingleVertexArrayFirstGroup.prototype.init = function() { var counts = [5, 256]; var firsts = [6, 24]; var offsets = [1, 16, 17]; var strides = [/*0,*/ -1, 17, 32]; // Tread negative value as sizeof input. Same as 0, but done outside of GL. for (var offsetNdx = 0; offsetNdx < offsets.length; offsetNdx++) { for (var countNdx = 0; countNdx < counts.length; countNdx++) { for (var strideNdx = 0; strideNdx < strides.length; strideNdx++) { for (var firstNdx = 0; firstNdx < firsts.length; firstNdx++) { var packed = this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10 || this.m_type == glsVertexArrayTests.deArray.InputType.INT_2_10_10_10; var componentCount = packed ? 4 : 2; var stride = strides[strideNdx] < 0 ? (packed ? 8 : (glsVertexArrayTests.deArray.inputTypeSize(this.m_type) * componentCount)) : (strides[strideNdx]); var alignment = packed ? (glsVertexArrayTests.deArray.inputTypeSize(this.m_type) * componentCount) : (glsVertexArrayTests.deArray.inputTypeSize(this.m_type)); var aligned = ((stride % alignment) == 0) && ((offsets[offsetNdx] % alignment) == 0); var name = 'first' + firsts[firstNdx] + '_offset' + offsets[offsetNdx] + '_stride' + stride + '_quads' + counts[countNdx]; var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( this.m_type, glsVertexArrayTests.deArray.OutputType.VEC2, glsVertexArrayTests.deArray.Storage.BUFFER, glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, componentCount, offsets[offsetNdx], stride, false, glsVertexArrayTests.GLValue.getMinValue(this.m_type), glsVertexArrayTests.GLValue.getMaxValue(this.m_type) ); var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = counts[countNdx]; spec.first = firsts[firstNdx]; spec.arrays.push(arraySpec); if (aligned) this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, name ) ); } } } } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.SingleVertexArrayFirstTests = function() { tcuTestCase.DeqpTest.call(this, 'single_attribute.first', 'Single vertex attribute, different first values to drawArrays'); this.makeExecutable(); }; es3fVertexArrayTests.SingleVertexArrayFirstTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayFirstTests.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayFirstTests; /** * init */ es3fVertexArrayTests.SingleVertexArrayFirstTests.prototype.init = function() { // Test offset with different input types, component counts and storage, Usage(?) var inputTypes = [ glsVertexArrayTests.deArray.InputType.FLOAT, glsVertexArrayTests.deArray.InputType.BYTE, glsVertexArrayTests.deArray.InputType.INT_2_10_10_10 ]; for (var inputTypeNdx = 0; inputTypeNdx < inputTypes.length; inputTypeNdx++) { this.addChild( new es3fVertexArrayTests.SingleVertexArrayFirstGroup( inputTypes[inputTypeNdx] ) ); } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} * @param {glsVertexArrayTests.deArray.InputType} type */ es3fVertexArrayTests.SingleVertexArrayOffsetGroup = function(type) { tcuTestCase.DeqpTest.call( this, glsVertexArrayTests.deArray.inputTypeToString(type), glsVertexArrayTests.deArray.inputTypeToString(type) ); this.makeExecutable(); this.m_type = type; }; es3fVertexArrayTests.SingleVertexArrayOffsetGroup.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayOffsetGroup.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayOffsetGroup; /** * init */ es3fVertexArrayTests.SingleVertexArrayOffsetGroup.prototype.init = function() { var counts = [1, 256]; var offsets = [1, 4, 17, 32]; var strides = [/*0,*/ -1, 17, 32]; // Tread negative value as sizeof input. Same as 0, but done outside of GL. for (var offsetNdx = 0; offsetNdx < offsets.length; offsetNdx++) { for (var countNdx = 0; countNdx < counts.length; countNdx++) { for (var strideNdx = 0; strideNdx < strides.length; strideNdx++) { var packed = this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10 || this.m_type == glsVertexArrayTests.deArray.InputType.INT_2_10_10_10; var componentCount = packed ? 4 : 2; var stride = ( strides[strideNdx] < 0 ? glsVertexArrayTests.deArray.inputTypeSize( this.m_type ) * componentCount : strides[strideNdx] ); var alignment = packed ? glsVertexArrayTests.deArray.inputTypeSize(this.m_type) * componentCount : glsVertexArrayTests.deArray.inputTypeSize(this.m_type); var aligned = ((stride % alignment) == 0) && ((offsets[offsetNdx] % alignment) == 0); var name = 'offset' + offsets[offsetNdx] + '_stride' + stride + '_quads' + counts[countNdx]; /** @type {glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec} */ var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( this.m_type, glsVertexArrayTests.deArray.OutputType.VEC2, glsVertexArrayTests.deArray.Storage.BUFFER, glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, componentCount, offsets[offsetNdx], stride, false, glsVertexArrayTests.GLValue.getMinValue(this.m_type), glsVertexArrayTests.GLValue.getMaxValue(this.m_type) ); var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = counts[countNdx]; spec.first = 0; spec.arrays.push(arraySpec); if (aligned) this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, name ) ); } } } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.SingleVertexArrayOffsetTests = function() { tcuTestCase.DeqpTest.call(this, 'single_attribute.offset', 'Single vertex atribute offset element'); this.makeExecutable(); }; es3fVertexArrayTests.SingleVertexArrayOffsetTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayOffsetTests.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayOffsetTests; /** * init */ es3fVertexArrayTests.SingleVertexArrayOffsetTests.prototype.init = function() { // Test offset with different input types, component counts and storage, Usage(?) var inputTypes = [ glsVertexArrayTests.deArray.InputType.FLOAT, glsVertexArrayTests.deArray.InputType.BYTE, glsVertexArrayTests.deArray.InputType.INT_2_10_10_10 ]; for (var inputTypeNdx = 0; inputTypeNdx < inputTypes.length; inputTypeNdx++) { this.addChild( new es3fVertexArrayTests.SingleVertexArrayOffsetGroup( inputTypes[inputTypeNdx] ) ); } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} * @param {glsVertexArrayTests.deArray.InputType} type */ es3fVertexArrayTests.SingleVertexArrayNormalizeGroup = function(type) { tcuTestCase.DeqpTest.call( this, glsVertexArrayTests.deArray.inputTypeToString(type), glsVertexArrayTests.deArray.inputTypeToString(type) ); this.makeExecutable(); this.m_type = type; }; es3fVertexArrayTests.SingleVertexArrayNormalizeGroup.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayNormalizeGroup.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayNormalizeGroup; /** * init for SingleVertexArrayNormalizeGroup */ es3fVertexArrayTests.SingleVertexArrayNormalizeGroup.prototype.init = function() { var counts = [1, 256]; for (var componentCount = 2; componentCount < 5; componentCount++) { for (var countNdx = 0; countNdx < counts.length; countNdx++) { if ( ( this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10 || this.m_type == glsVertexArrayTests.deArray.InputType.INT_2_10_10_10 ) && componentCount != 4 ) continue; var name = 'components' + componentCount.toString() + '_quads' + counts[countNdx].toString(); var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( this.m_type, glsVertexArrayTests.deArray.OutputType.VEC4, glsVertexArrayTests.deArray.Storage.BUFFER, //No USER Storage support in WebGL2 glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, componentCount, 0, 0, true, glsVertexArrayTests.GLValue.getMinValue(this.m_type), glsVertexArrayTests.GLValue.getMaxValue(this.m_type) ); var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = counts[countNdx]; spec.first = 0; spec.arrays.push(arraySpec); this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, name ) ); } } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.SingleVertexArrayNormalizeTests = function() { tcuTestCase.DeqpTest.call(this, 'single_attribute.normalize', 'Single normalize vertex atribute'); this.makeExecutable(); }; es3fVertexArrayTests.SingleVertexArrayNormalizeTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayNormalizeTests.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayNormalizeTests; /** * init */ es3fVertexArrayTests.SingleVertexArrayNormalizeTests.prototype.init = function() { // Test normalization with different input types, component counts and storage /** @type {Array} */ var inputTypes = [ glsVertexArrayTests.deArray.InputType.FLOAT, glsVertexArrayTests.deArray.InputType.SHORT, glsVertexArrayTests.deArray.InputType.BYTE, glsVertexArrayTests.deArray.InputType.UNSIGNED_SHORT, glsVertexArrayTests.deArray.InputType.UNSIGNED_BYTE, //glsVertexArrayTests.deArray.InputType.FIXED, glsVertexArrayTests.deArray.InputType.UNSIGNED_INT, glsVertexArrayTests.deArray.InputType.INT, glsVertexArrayTests.deArray.InputType.HALF, glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10, glsVertexArrayTests.deArray.InputType.INT_2_10_10_10 ]; for (var inputTypeNdx = 0; inputTypeNdx < inputTypes.length; inputTypeNdx++) { this.addChild( new es3fVertexArrayTests.SingleVertexArrayNormalizeGroup( inputTypes[inputTypeNdx] ) ); } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} * @param {glsVertexArrayTests.deArray.InputType} type */ es3fVertexArrayTests.SingleVertexArrayOutputTypeGroup = function(type) { tcuTestCase.DeqpTest.call( this, "single_attribute.output_types." + glsVertexArrayTests.deArray.inputTypeToString(type), glsVertexArrayTests.deArray.inputTypeToString(type) ); this.makeExecutable(); this.m_type = type; }; es3fVertexArrayTests.SingleVertexArrayOutputTypeGroup.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.SingleVertexArrayOutputTypeGroup.prototype.constructor = es3fVertexArrayTests.SingleVertexArrayOutputTypeGroup; es3fVertexArrayTests.SingleVertexArrayOutputTypeGroup.prototype.init = function() { var outputTypes = [ glsVertexArrayTests.deArray.OutputType.VEC2, glsVertexArrayTests.deArray.OutputType.VEC3, glsVertexArrayTests.deArray.OutputType.VEC4, glsVertexArrayTests.deArray.OutputType.IVEC2, glsVertexArrayTests.deArray.OutputType.IVEC3, glsVertexArrayTests.deArray.OutputType.IVEC4, glsVertexArrayTests.deArray.OutputType.UVEC2, glsVertexArrayTests.deArray.OutputType.UVEC3, glsVertexArrayTests.deArray.OutputType.UVEC4 ]; var storages = [glsVertexArrayTests.deArray.Storage.BUFFER]; //No USER storage support in WebGL2 var counts = [1, 256]; for (var outputTypeNdx = 0; outputTypeNdx < outputTypes.length; outputTypeNdx++) { for (var storageNdx = 0; storageNdx < storages.length; storageNdx++) { for (var componentCount = 2; componentCount < 5; componentCount++) { for (var countNdx = 0; countNdx < counts.length; countNdx++) { var name = 'components' + componentCount + '_' + glsVertexArrayTests.deArray.outputTypeToString( outputTypes[outputTypeNdx] ) + '_quads' + counts[countNdx]; var inputIsSignedInteger = this.m_type == glsVertexArrayTests.deArray.InputType.INT || this.m_type == glsVertexArrayTests.deArray.InputType.SHORT || this.m_type == glsVertexArrayTests.deArray.InputType.BYTE; var inputIsUnignedInteger = this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT || this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_SHORT || this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_BYTE; var outputIsSignedInteger = outputTypes[outputTypeNdx] == glsVertexArrayTests.deArray.OutputType.IVEC2 || outputTypes[outputTypeNdx] == glsVertexArrayTests.deArray.OutputType.IVEC3 || outputTypes[outputTypeNdx] == glsVertexArrayTests.deArray.OutputType.IVEC4; var outputIsUnsignedInteger = outputTypes[outputTypeNdx] == glsVertexArrayTests.deArray.OutputType.UVEC2 || outputTypes[outputTypeNdx] == glsVertexArrayTests.deArray.OutputType.UVEC3 || outputTypes[outputTypeNdx] == glsVertexArrayTests.deArray.OutputType.UVEC4; // If input type is float type and output type is int type skip if ((this.m_type == glsVertexArrayTests.deArray.InputType.FLOAT || this.m_type == glsVertexArrayTests.deArray.InputType.HALF) && (outputTypes[outputTypeNdx] >= glsVertexArrayTests.deArray.OutputType.INT)) continue; if ((this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10 || this.m_type == glsVertexArrayTests.deArray.InputType.INT_2_10_10_10) && (outputTypes[outputTypeNdx] >= glsVertexArrayTests.deArray.OutputType.INT)) continue; if ((this.m_type == glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10 || this.m_type == glsVertexArrayTests.deArray.InputType.INT_2_10_10_10) && componentCount != 4) continue; // Loading signed data as unsigned causes undefined values and vice versa if (inputIsSignedInteger && outputIsUnsignedInteger) continue; if (inputIsUnignedInteger && outputIsSignedInteger) continue; var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( this.m_type, outputTypes[outputTypeNdx], storages[storageNdx], glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, componentCount, 0, 0, false, glsVertexArrayTests.GLValue.getMinValue(this.m_type), glsVertexArrayTests.GLValue.getMaxValue(this.m_type) ); var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = counts[countNdx]; spec.first = 0; spec.arrays.push(arraySpec); this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, name ) ); } } } } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.MultiVertexArrayCountTests = function() { tcuTestCase.DeqpTest.call(this, 'multiple_attributes.attribute_count', 'Attribute counts'); this.makeExecutable(); }; es3fVertexArrayTests.MultiVertexArrayCountTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.MultiVertexArrayCountTests.prototype.constructor = es3fVertexArrayTests.MultiVertexArrayCountTests; /** * @param {glsVertexArrayTests.MultiVertexArrayTest.Spec} spec * @return {string} */ es3fVertexArrayTests.MultiVertexArrayCountTests.prototype.getTestName = function(spec) { var name = ''; name += spec.arrays.length; return name; }; es3fVertexArrayTests.MultiVertexArrayCountTests.prototype.init = function() { // Test attribute counts var arrayCounts = [2, 3, 4, 5, 6, 7, 8]; for (var arrayCountNdx = 0; arrayCountNdx < arrayCounts.length; arrayCountNdx++) { var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = 256; spec.first = 0; for (var arrayNdx = 0; arrayNdx < arrayCounts[arrayCountNdx]; arrayNdx++) { var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( glsVertexArrayTests.deArray.InputType.FLOAT, glsVertexArrayTests.deArray.OutputType.VEC2, glsVertexArrayTests.deArray.Storage.BUFFER, // No USER storage support in WebGL2 glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, 2, 0, 0, false, glsVertexArrayTests.GLValue.getMinValue(glsVertexArrayTests.deArray.InputType.FLOAT), glsVertexArrayTests.GLValue.getMaxValue(glsVertexArrayTests.deArray.InputType.FLOAT) ); spec.arrays.push(arraySpec); } var name = this.getTestName(spec); var desc = this.getTestName(spec); this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, desc ) ); } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.MultiVertexArrayStorageTests = function() { tcuTestCase.DeqpTest.call(this, 'multiple_attributes.storage', 'Attribute storages'); this.makeExecutable(); }; es3fVertexArrayTests.MultiVertexArrayStorageTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.MultiVertexArrayStorageTests.prototype.constructor = es3fVertexArrayTests.MultiVertexArrayStorageTests; /** * @param {glsVertexArrayTests.MultiVertexArrayTest.Spec} spec * @return {string} */ es3fVertexArrayTests.MultiVertexArrayStorageTests.prototype.getTestName = function(spec) { var name = ''; name += spec.arrays.length; for (var arrayNdx = 0; arrayNdx < spec.arrays.length; arrayNdx++) name += '_' + glsVertexArrayTests.deArray.storageToString(spec.arrays[arrayNdx].storage); return name; }; /** * @param {glsVertexArrayTests.MultiVertexArrayTest.Spec} spec * @param {number} depth */ es3fVertexArrayTests.MultiVertexArrayStorageTests.prototype.addStorageCases = function(spec, depth) { if (depth == 0) { // Skip trivial case, used elsewhere var ok = false; for (var arrayNdx = 0; arrayNdx < spec.arrays.length; arrayNdx++) { if (spec.arrays[arrayNdx].storage != glsVertexArrayTests.deArray.Storage.USER) { ok = true; break; } } if (!ok) return; var name = this.getTestName(spec); var desc = this.getTestName(spec); this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, desc ) ); return; } var storages = [ //glsVertexArrayTests.deArray.Storage.USER, Not supported in WebGL 2.0 glsVertexArrayTests.deArray.Storage.BUFFER ]; for (var storageNdx = 0; storageNdx < storages.length; storageNdx++) { var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( glsVertexArrayTests.deArray.InputType.FLOAT, glsVertexArrayTests.deArray.OutputType.VEC2, storages[storageNdx], glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, 2, 0, 0, false, glsVertexArrayTests.GLValue.getMinValue(glsVertexArrayTests.deArray.InputType.FLOAT), glsVertexArrayTests.GLValue.getMaxValue(glsVertexArrayTests.deArray.InputType.FLOAT) ); var _spec = spec; _spec.arrays.push(arraySpec); this.addStorageCases(_spec, depth - 1); } }; /** * init */ es3fVertexArrayTests.MultiVertexArrayStorageTests.prototype.init = function() { // Test different storages var arrayCounts = [3]; var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = 256; spec.first = 0; for (var arrayCountNdx = 0; arrayCountNdx < arrayCounts.length; arrayCountNdx++) this.addStorageCases(spec, arrayCounts[arrayCountNdx]); }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.MultiVertexArrayStrideTests = function() { tcuTestCase.DeqpTest.call(this, 'multiple_attributes.stride', 'Strides'); this.makeExecutable(); }; es3fVertexArrayTests.MultiVertexArrayStrideTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.MultiVertexArrayStrideTests.prototype.constructor = es3fVertexArrayTests.MultiVertexArrayStrideTests; /** * @param {glsVertexArrayTests.MultiVertexArrayTest.Spec} spec * @return {string} */ es3fVertexArrayTests.MultiVertexArrayStrideTests.prototype.getTestName = function(spec) { var name = ''; name += spec.arrays.length; for (var arrayNdx = 0; arrayNdx < spec.arrays.length; arrayNdx++) { name += '_' + glsVertexArrayTests.deArray.inputTypeToString(spec.arrays[arrayNdx].inputType) + spec.arrays[arrayNdx].componentCount + '_' + spec.arrays[arrayNdx].stride; } return name; }; /** * init */ es3fVertexArrayTests.MultiVertexArrayStrideTests.prototype.init = function() { // Test different strides, with multiple arrays, input types?? var arrayCounts = [3]; var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = 256; spec.first = 0; for (var arrayCountNdx = 0; arrayCountNdx < arrayCounts.length; arrayCountNdx++) this.addStrideCases(spec, arrayCounts[arrayCountNdx]); }; /** * @param {glsVertexArrayTests.MultiVertexArrayTest.Spec} spec * @param {number} depth */ es3fVertexArrayTests.MultiVertexArrayStrideTests.prototype.addStrideCases = function(spec, depth) { if (depth == 0) { var name = this.getTestName(spec); var desc = this.getTestName(spec); this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, desc ) ); return; } var strides = [0, -1, 17, 32]; var inputType = glsVertexArrayTests.deArray.InputType.FLOAT; for (var strideNdx = 0; strideNdx < strides.length; strideNdx++) { var componentCount = 2; var stride = strides[strideNdx] >= 0 ? strides[strideNdx] : componentCount * glsVertexArrayTests.deArray.inputTypeSize(glsVertexArrayTests.deArray.InputType.FLOAT); var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( inputType, glsVertexArrayTests.deArray.OutputType.VEC2, glsVertexArrayTests.deArray.Storage.BUFFER, //USER storage not supported in WebGL 2.0 glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, componentCount, 0, stride, false, glsVertexArrayTests.GLValue.getMinValue(glsVertexArrayTests.deArray.InputType.FLOAT), glsVertexArrayTests.GLValue.getMaxValue(glsVertexArrayTests.deArray.InputType.FLOAT) ); /** @type {boolean} */ var aligned = (stride % glsVertexArrayTests.deArray.inputTypeSize(inputType)) == 0; if (aligned) { var _spec = /** @type {glsVertexArrayTests.MultiVertexArrayTest.Spec} */ (deUtil.clone(spec)); //To assign spec by value; _spec.arrays.push(arraySpec); this.addStrideCases(_spec, depth - 1); } } }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.MultiVertexArrayOutputTests = function() { tcuTestCase.DeqpTest.call(this, 'multiple_attributes.input_types', 'input types'); this.makeExecutable(); }; es3fVertexArrayTests.MultiVertexArrayOutputTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.MultiVertexArrayOutputTests.prototype.constructor = es3fVertexArrayTests.MultiVertexArrayOutputTests; /** * @param {glsVertexArrayTests.MultiVertexArrayTest.Spec} spec * @return {string} */ es3fVertexArrayTests.MultiVertexArrayOutputTests.prototype.getTestName = function(spec) { var name = ''; name += spec.arrays.length; for (var arrayNdx = 0; arrayNdx < spec.arrays.length; arrayNdx++) { name += '_' + glsVertexArrayTests.deArray.inputTypeToString(spec.arrays[arrayNdx].inputType) + spec.arrays[arrayNdx].componentCount + '_' + glsVertexArrayTests.deArray.outputTypeToString(spec.arrays[arrayNdx].outputType); } return name; }; /** * init */ es3fVertexArrayTests.MultiVertexArrayOutputTests.prototype.init = function() { // Test different input types, with multiple arrays var arrayCounts = [3]; var spec = new glsVertexArrayTests.MultiVertexArrayTest.Spec(); spec.primitive = glsVertexArrayTests.deArray.Primitive.TRIANGLES; spec.drawCount = 256; spec.first = 0; for (var arrayCountNdx = 0; arrayCountNdx < arrayCounts.length; arrayCountNdx++) this.addInputTypeCases(spec, arrayCounts[arrayCountNdx]); }; /** * @param {glsVertexArrayTests.MultiVertexArrayTest.Spec} spec * @param {number} depth */ es3fVertexArrayTests.MultiVertexArrayOutputTests.prototype.addInputTypeCases = function(spec, depth) { if (depth == 0) { var name = this.getTestName(spec); var desc = this.getTestName(spec); this.addChild( new glsVertexArrayTests.MultiVertexArrayTest( spec, name, desc ) ); return; } var inputTypes = [ glsVertexArrayTests.deArray.InputType.BYTE, glsVertexArrayTests.deArray.InputType.SHORT, glsVertexArrayTests.deArray.InputType.UNSIGNED_BYTE, glsVertexArrayTests.deArray.InputType.UNSIGNED_SHORT ]; for (var inputTypeNdx = 0; inputTypeNdx < inputTypes.length; inputTypeNdx++) { var arraySpec = new glsVertexArrayTests.MultiVertexArrayTest.Spec.ArraySpec( inputTypes[inputTypeNdx], glsVertexArrayTests.deArray.OutputType.VEC2, glsVertexArrayTests.deArray.Storage.BUFFER, //USER storage not supported in WebGL 2.0 glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, 2, 0, 0, false, glsVertexArrayTests.GLValue.getMinValue(inputTypes[inputTypeNdx]), glsVertexArrayTests.GLValue.getMaxValue(inputTypes[inputTypeNdx]) ); var _spec = /** @type {glsVertexArrayTests.MultiVertexArrayTest.Spec} */ (deUtil.clone(spec)); _spec.arrays.push(arraySpec); this.addInputTypeCases(_spec, depth - 1); } }; /** * es3fVertexArrayTests.VertexArrayTestGroup * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fVertexArrayTests.VertexArrayTestGroup = function() { tcuTestCase.DeqpTest.call(this, 'vertex_arrays', 'Vertex array and array tests'); this.makeExecutable(); }; es3fVertexArrayTests.VertexArrayTestGroup.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fVertexArrayTests.VertexArrayTestGroup.prototype.constructor = es3fVertexArrayTests.VertexArrayTestGroup; /** * init */ es3fVertexArrayTests.VertexArrayTestGroup.prototype.init = function() { this.addChild(new es3fVertexArrayTests.SingleVertexArrayStrideTests()); this.addChild(new es3fVertexArrayTests.SingleVertexArrayNormalizeTests()); // Test output types with different input types, component counts and storage, Usage?, Precision?, float? var inputTypes = [ glsVertexArrayTests.deArray.InputType.FLOAT, glsVertexArrayTests.deArray.InputType.SHORT, glsVertexArrayTests.deArray.InputType.BYTE, glsVertexArrayTests.deArray.InputType.UNSIGNED_SHORT, glsVertexArrayTests.deArray.InputType.UNSIGNED_BYTE, glsVertexArrayTests.deArray.InputType.UNSIGNED_INT, glsVertexArrayTests.deArray.InputType.INT, glsVertexArrayTests.deArray.InputType.HALF, glsVertexArrayTests.deArray.InputType.UNSIGNED_INT_2_10_10_10, glsVertexArrayTests.deArray.InputType.INT_2_10_10_10 ]; for (var inputTypeNdx = 0; inputTypeNdx < inputTypes.length; inputTypeNdx++) { this.addChild(new es3fVertexArrayTests.SingleVertexArrayOutputTypeGroup(inputTypes[inputTypeNdx])); } /** @type {Array} */ var usages = [ glsVertexArrayTests.deArray.Usage.STATIC_DRAW, glsVertexArrayTests.deArray.Usage.STREAM_DRAW, glsVertexArrayTests.deArray.Usage.DYNAMIC_DRAW, glsVertexArrayTests.deArray.Usage.STATIC_COPY, glsVertexArrayTests.deArray.Usage.STREAM_COPY, glsVertexArrayTests.deArray.Usage.DYNAMIC_COPY, glsVertexArrayTests.deArray.Usage.STATIC_READ, glsVertexArrayTests.deArray.Usage.STREAM_READ, glsVertexArrayTests.deArray.Usage.DYNAMIC_READ ]; for (var usageNdx = 0; usageNdx < usages.length; usageNdx++) { this.addChild(new es3fVertexArrayTests.SingleVertexArrayUsageGroup(usages[usageNdx])); } this.addChild(new es3fVertexArrayTests.SingleVertexArrayOffsetTests()); this.addChild(new es3fVertexArrayTests.SingleVertexArrayFirstTests()); this.addChild(new es3fVertexArrayTests.MultiVertexArrayCountTests()); this.addChild(new es3fVertexArrayTests.MultiVertexArrayStorageTests()); this.addChild(new es3fVertexArrayTests.MultiVertexArrayStrideTests()); this.addChild(new es3fVertexArrayTests.MultiVertexArrayOutputTests()); }; /** * Create and execute the test cases * @param {WebGL2RenderingContext} context */ es3fVertexArrayTests.run = function(context, range) { gl = context; //Set up root Test var state = tcuTestCase.runner; var test = new es3fVertexArrayTests.VertexArrayTestGroup(); var testName = test.fullName(); var testDescription = test.getDescription(); state.testCases = test; state.testName = testName; //Set up name and description of this test series. setCurrentTestName(testName); description(testDescription); try { if (range) state.setRange(range); //Run test cases tcuTestCase.runTestCases(); } catch (err) { testFailedOptions('Failed to es3fVertexArrayTests.run tests', false); tcuTestCase.runner.terminate(); } }; });