blob: ccfd34331357afb5268cbe5392ba3113ed491f53 [file] [log] [blame]
/*-------------------------------------------------------------------------
* 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<number>} */ var counts = [1, 256];
/** @type {Array<number>} */ var strides = [0, -1, 17, 32]; // Treat negative value as sizeof input. Same as 0, but done outside of GL.
/** @type {Array<glsVertexArrayTests.deArray.InputType>} */ 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<glsVertexArrayTests.deArray.Storage>} */ 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<glsVertexArrayTests.deArray.InputType>} */ 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<glsVertexArrayTests.deArray.InputType>} */ 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<glsVertexArrayTests.deArray.Usage>} */ 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();
}
};
});