Source code
Revision control
Copy as Markdown
Other Tools
/*-------------------------------------------------------------------------
* drawElements Quality Program OpenGL (ES) 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
*
*
* 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 tests
*//*--------------------------------------------------------------------*/
'use strict';
goog.provide('modules.shared.glsAttributeLocationTests');
goog.require('framework.common.tcuStringTemplate');
goog.require('framework.common.tcuTestCase');
goog.require('framework.opengl.gluShaderUtil');
goog.scope(function() {
var glsAttributeLocationTests = modules.shared.glsAttributeLocationTests;
var tcuTestCase = framework.common.tcuTestCase;
var gluShaderUtil = framework.opengl.gluShaderUtil;
var tcuStringTemplate = framework.common.tcuStringTemplate;
/**
* @param {Array<number>} bindings
* @param {string} attrib
* @return {number}
*/
glsAttributeLocationTests.getBoundLocation = function(bindings, attrib) {
return (bindings[attrib] === undefined ? glsAttributeLocationTests.LocationEnum.UNDEF : bindings[attrib]);
};
/**
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @param {Array<number>} bindings
* @return {boolean}
*/
glsAttributeLocationTests.hasAttributeAliasing = function(attributes, bindings) {
/** @type {Array<boolean>} */ var reservedSpaces = [];
/** @type {number} */ var location;
/** @type {number} */ var size;
for (var attribNdx = 0; attribNdx < attributes.length; attribNdx++) {
location = glsAttributeLocationTests.getBoundLocation(bindings, attributes[attribNdx].getName());
size = attributes[attribNdx].getType().getLocationSize();
if (location != glsAttributeLocationTests.LocationEnum.UNDEF) {
for (var i = 0; i < size; i++) {
if (reservedSpaces[location + i])
return true;
reservedSpaces[location + i] = true;
}
}
}
return false;
};
/**
* @return {number}
*/
glsAttributeLocationTests.getMaxAttributeLocations = function() {
/** @type {number} */ var maxAttribs;
maxAttribs = /** @type {number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
return maxAttribs;
};
/**
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @return {string}
*/
glsAttributeLocationTests.generateAttributeDefinitions = function(attributes) {
/** @type {string} */ var src = '';
for (var i = 0; i < attributes.length; i++) {
if (attributes[i].getLayoutLocation() != glsAttributeLocationTests.LocationEnum.UNDEF)
src += ('layout(location = ' + attributes[i].getLayoutLocation() + ') ');
src += '${VTX_INPUT} mediump ';
src += (attributes[i].getType().getName() + ' ');
src += attributes[i].getName();
src += (attributes[i].getArraySize() != glsAttributeLocationTests.ArrayEnum.NOT ?
'[' + attributes[i].getArraySize() + ']' : '');
src += ';\n';
}
return src;
};
/**
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @return {string}
*/
glsAttributeLocationTests.generateConditionUniformDefinitions = function(attributes) {
/** @type {string} */ var src = '';
/** @type {Array<string>} */ var conditions = [];
for (var i = 0; i < attributes.length; i++) {
if (attributes[i].getCondition().notEquals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.NEVER)) &&
attributes[i].getCondition().notEquals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS)))
if (conditions.indexOf(attributes[i].getCondition().getName()) == -1)
conditions.push(attributes[i].getCondition().getName());
}
for (var i = 0; i < conditions.length; i++)
src += ('uniform mediump float u_' + conditions[i] + ';\n');
return src;
};
/**
* @param {glsAttributeLocationTests.Attribute} attrib
* @param {number=} id
* @return {string}
*/
glsAttributeLocationTests.generateToVec4Expression = function(attrib, id) {
/** @type {string} */ var src = '';
id = id === undefined ? -1 : id;
/** @type {string} */
var variableName = (attrib.getName() + (attrib.getArraySize() != glsAttributeLocationTests.ArrayEnum.NOT ? '[' + id + ']' : ''));
switch (attrib.getType().getGLTypeEnum()) {
case gl.INT_VEC2:
case gl.UNSIGNED_INT_VEC2:
case gl.FLOAT_VEC2:
src += ('vec4(' + variableName + '.xy, ' + variableName + '.yx)');
break;
case gl.INT_VEC3:
case gl.UNSIGNED_INT_VEC3:
case gl.FLOAT_VEC3:
src += ('vec4(' + variableName + '.xyz, ' + variableName + '.x)');
break;
default:
src += ('vec4(' + variableName + ')');
break;
}
return src;
};
/**
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @return {string}
*/
glsAttributeLocationTests.generateOutputCode = function(attributes) {
/** @type {string} */ var src = '';
for (var i = 0; i < attributes.length; i++) {
if (attributes[i].getCondition().equals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.NEVER))) {
src += '\tif (0 != 0)\n\t{\n';
if (attributes[i].getArraySize() == glsAttributeLocationTests.ArrayEnum.NOT)
src += ('\t\tcolor += ' + glsAttributeLocationTests.generateToVec4Expression(attributes[i]) + ';\n');
else {
for (var j = 0; j < attributes[i].getArraySize(); i++)
src += ('\t\tcolor += ' + glsAttributeLocationTests.generateToVec4Expression(attributes[i], j) + ';\n');
}
src += '\t}\n';
} else if (attributes[i].getCondition().equals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS))) {
if (attributes[i].getArraySize() == glsAttributeLocationTests.ArrayEnum.NOT)
src += ('\tcolor += ' + glsAttributeLocationTests.generateToVec4Expression(attributes[i]) + ';\n');
else {
for (var j = 0; j < attributes[i].getArraySize(); j++)
src += ('\tcolor += ' + glsAttributeLocationTests.generateToVec4Expression(attributes[i], j) + ';\n');
}
} else {
src += ('\tif (u_' + attributes[i].getCondition().getName() + (attributes[i].getCondition().getNegate() ? ' != ' : ' == ') + '0.0)\n');
src += '\t{\n';
if (attributes[i].getArraySize() == glsAttributeLocationTests.ArrayEnum.NOT)
src += ('\t\tcolor += ' + glsAttributeLocationTests.generateToVec4Expression(attributes[i]) + ';\n');
else {
for (var j = 0; j < attributes[i].getArraySize(); i++)
src += ('\t\tcolor += ' + glsAttributeLocationTests.generateToVec4Expression(attributes[i], j) + ';\n');
}
src += '\t}\n';
}
}
return src;
};
/**
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @return {string}
*/
glsAttributeLocationTests.generateVertexShaderTemplate = function(attributes) {
/** @type {string} */ var src = '';
src = '${VERSION}\n' +
'${VTX_OUTPUT} mediump vec4 v_color;\n' +
glsAttributeLocationTests.generateAttributeDefinitions(attributes) +
'\n' +
glsAttributeLocationTests.generateConditionUniformDefinitions(attributes) +
'\n' +
'void main (void)\n' +
'{\n' +
'\tmediump vec4 color = vec4(0.0);\n' +
'\n' +
glsAttributeLocationTests.generateOutputCode(attributes) +
'\n' +
'\tv_color = color;\n' +
'\tgl_Position = color;\n' +
'}\n';
return src;
};
/**
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @param {boolean} attributeAliasing
* @return {string}
*/
glsAttributeLocationTests.createVertexShaderSource = function(attributes, attributeAliasing) {
// \note On GLES only GLSL #version 100 supports aliasing
/** @type {gluShaderUtil.GLSLVersion} */ var glslVersion = gluShaderUtil.getGLSLVersion(gl);
glslVersion = attributeAliasing ? gluShaderUtil.GLSLVersion.V100_ES : glslVersion;
/** @type {boolean} */ var usesInOutQualifiers = gluShaderUtil.glslVersionUsesInOutQualifiers(glslVersion);
/** @type {string} */ var vertexShaderTemplate = glsAttributeLocationTests.generateVertexShaderTemplate(attributes);
/** @type {Array<string>} */ var parameters = [];
parameters['VERSION'] = gluShaderUtil.getGLSLVersionDeclaration(glslVersion);
parameters['VTX_OUTPUT'] = usesInOutQualifiers ? 'out' : 'varying';
parameters['VTX_INPUT'] = usesInOutQualifiers ? 'in' : 'attribute';
parameters['FRAG_INPUT'] = usesInOutQualifiers ? 'in' : 'varying';
parameters['FRAG_OUTPUT_VAR'] = usesInOutQualifiers ? 'dEQP_FragColor' : 'gl_FragColor';
parameters['FRAG_OUTPUT_DECLARATION'] = usesInOutQualifiers ? 'layout(location=0) out mediump vec4 dEQP_FragColor;' : '';
return tcuStringTemplate.specialize(vertexShaderTemplate, parameters);
};
/**
* @param {boolean} attributeAliasing
* @return {string}
*/
glsAttributeLocationTests.createFragmentShaderSource = function(attributeAliasing) {
/** @type {string} */ var fragmentShaderSource = '';
fragmentShaderSource = '${VERSION}\n' +
'${FRAG_OUTPUT_DECLARATION}\n' +
'${FRAG_INPUT} mediump vec4 v_color;\n' +
'void main (void)\n' +
'{\n' +
'\t${FRAG_OUTPUT_VAR} = v_color;\n' +
'}\n';
// \note On GLES only GLSL #version 100 supports aliasing
/** @type {gluShaderUtil.GLSLVersion} */ var glslVersion = gluShaderUtil.getGLSLVersion(gl);
glslVersion = attributeAliasing ? gluShaderUtil.GLSLVersion.V100_ES : glslVersion;
/** @type {boolean} */ var usesInOutQualifiers = gluShaderUtil.glslVersionUsesInOutQualifiers(glslVersion);
/** @type {Array<string>} */ var parameters = [];
parameters['VERSION'] = gluShaderUtil.getGLSLVersionDeclaration(glslVersion);
parameters['VTX_OUTPUT'] = usesInOutQualifiers ? 'out' : 'varying';
parameters['VTX_INPUT'] = usesInOutQualifiers ? 'in' : 'attribute';
parameters['FRAG_INPUT'] = usesInOutQualifiers ? 'in' : 'varying';
parameters['FRAG_OUTPUT_VAR'] = usesInOutQualifiers ? 'dEQP_FragColor' : 'gl_FragColor';
parameters['FRAG_OUTPUT_DECLARATION'] = usesInOutQualifiers ? 'layout(location=0) out mediump vec4 dEQP_FragColor;' : '';
return tcuStringTemplate.specialize(fragmentShaderSource, parameters);
};
glsAttributeLocationTests.logProgram = function(program) {
var programLinkOk = /** @type {boolean} */ (gl.getProgramParameter(program, gl.LINK_STATUS));
/**@type{string} */ var programInfoLog = gl.getProgramInfoLog(program);
/**@type{string} */ var log = 'Program Link Info: ' + programInfoLog +
'Link result: ' + (programLinkOk ? 'Ok' : 'Fail');
bufferedLogToConsole(log);
};
glsAttributeLocationTests.logAttributes = function(attributes) {
/**@type{string} */ var log;
for (var i = 0; i < attributes.length; i++) {
log = 'Type: ' + attributes[i].getType().getName() +
', Name: ' + attributes[i].getName() +
(attributes[i].getLayoutLocation() != glsAttributeLocationTests.LocationEnum.UNDEF ? ', Layout location ' + attributes[i].getLayoutLocation() : '');
bufferedLogToConsole(log);
}
};
/**
* @param {string} vertexShaderSource
* @param {string} vertexShaderInfoLog
* @param {boolean} vertexCompileOk
* @param {string} fragmentShaderSource
* @param {string} fragmentShaderInfoLog
* @param {boolean} fragmentCompileOk
*/
glsAttributeLocationTests.logShaders = function(vertexShaderSource, vertexShaderInfoLog, vertexCompileOk, fragmentShaderSource, fragmentShaderInfoLog, fragmentCompileOk) {
/**@type{string} */ var log;
log = '\nVertex Shader Info: ' +
vertexShaderSource +
'\nInfo Log: ' +
vertexShaderInfoLog +
'\nCompilation result: ' + (vertexCompileOk ? 'Ok' : 'Failed') +
'\nFragment Shader Info: ' +
fragmentShaderSource +
'\nInfo Log: ' +
fragmentShaderInfoLog +
'\nCompilation result: ' + (fragmentCompileOk ? 'Ok' : 'Failed');
bufferedLogToConsole(log);
};
/**
* @param {WebGLProgram} program
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @return {boolean}
*/
glsAttributeLocationTests.checkActiveAttribQuery = function(program, attributes) {
/** @type {number} */ var activeAttribCount = 0;
/** @type {Array<string>} */ var activeAttributes = [];
/** @type {boolean} */ var isOk = true;
/** @type {string} */ var log;
activeAttribCount = /** @type {number} */ (gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES));
/** @type {glsAttributeLocationTests.Attribute} */ var attrib;
/** @type {boolean} */ var isActive;
/** @type {WebGLActiveInfo} */ var activeInfo;
for (var activeAttribNdx = 0; activeAttribNdx < activeAttribCount; activeAttribNdx++) {
activeInfo = gl.getActiveAttrib(program, activeAttribNdx);
log = 'glGetActiveAttrib(program' +
'\nindex= ' + activeAttribNdx +
'\nsize= ' + activeInfo.size +
'\ntype= ' + activeInfo.type +
'\nname= ' + activeInfo.name;
bufferedLogToConsole(log);
/** @type {boolean} */ var found = false;
for (var attribNdx = 0; attribNdx < attributes.length; attribNdx++) {
attrib = attributes[attribNdx];
if (attrib.getName() == activeInfo.name) {
if (activeInfo.type != attrib.getType().getGLTypeEnum()) {
log = 'Error: Wrong type ' + attrib.getType().getGLTypeEnum() +
' expected= ' + activeInfo.type;
bufferedLogToConsole(log);
isOk = false;
}
if (attrib.getArraySize() == glsAttributeLocationTests.ArrayEnum.NOT) {
if (activeInfo.size != 1) {
bufferedLogToConsole('Error: Wrong size ' + activeInfo.size + ' expected 1');
isOk = false;
}
} else {
if (activeInfo.size != attrib.getArraySize()) {
bufferedLogToConsole('Error: Wrong size ' + activeInfo.size + ' expected ' + attrib.getArraySize());
isOk = false;
}
}
found = true;
break;
}
}
if (!found) {
log = 'Error: Unknown attribute ' + activeInfo.name + ' returned= by glGetActiveAttrib().';
bufferedLogToConsole(log);
isOk = false;
}
activeAttributes.push(activeInfo.name);
}
for (var attribNdx = 0; attribNdx < attributes.length; attribNdx++) {
attrib = attributes[attribNdx];
isActive = attrib.getCondition().notEquals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.NEVER));
if (isActive) {
if (activeAttributes.indexOf(attrib.getName()) == -1) {
bufferedLogToConsole('Error: Active attribute ' + attrib.getName() + 'wasn\'t returned by glGetActiveAttrib().');
isOk = false;
}
} else {
if (activeAttributes[attrib.getName()] === undefined)
bufferedLogToConsole('Note: Inactive attribute ' + attrib.getName() + 'was returned by glGetActiveAttrib().');
}
}
return isOk;
};
/**
* @param {WebGLProgram} program
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @param {Array<number>} bindings
* @return {boolean}
*/
glsAttributeLocationTests.checkAttribLocationQuery = function(program, attributes, bindings) {
/** @type {boolean} */ var isOk = true;
/** @type {string} */ var log;
for (var attribNdx = 0; attribNdx < attributes.length; attribNdx++) {
/** @type {glsAttributeLocationTests.Attribute} */ var attrib = attributes[attribNdx];
/** @type {number} */ var expectedLocation = (attrib.getLayoutLocation() != glsAttributeLocationTests.LocationEnum.UNDEF ? attrib.getLayoutLocation() : glsAttributeLocationTests.getBoundLocation(bindings, attrib.getName()));
var location = /** @type {number} */ (gl.getAttribLocation(program, attrib.getName()));
if (attrib.getCondition().equals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.NEVER)) && location != -1)
bufferedLogToConsole('Note: Inactive attribute with location.');
if (attrib.getCondition().notEquals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.NEVER)) && expectedLocation != glsAttributeLocationTests.LocationEnum.UNDEF && expectedLocation != location)
bufferedLogToConsole('Error: Invalid attribute location.');
isOk = (attrib.getCondition().equals(glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.NEVER)) || expectedLocation == glsAttributeLocationTests.LocationEnum.UNDEF || expectedLocation == location);
}
return isOk;
};
/**
* @param {WebGLProgram} program
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @param {Array<number>} bindings
* @return {boolean}
*/
glsAttributeLocationTests.checkQuery = function(program, attributes, bindings) {
/** @type {boolean} */ var isOk = glsAttributeLocationTests.checkActiveAttribQuery(program, attributes);
if (!glsAttributeLocationTests.checkAttribLocationQuery(program, attributes, bindings))
isOk = false;
return isOk;
};
/**
* @param {WebGLProgram} program
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @param {boolean} attributeAliasing
* @return {Object}
*/
glsAttributeLocationTests.createAndAttachShaders = function(program, attributes, attributeAliasing) {
/** @type {string} */ var vertexShaderSource = glsAttributeLocationTests.createVertexShaderSource(attributes, attributeAliasing);
/** @type {string} */ var fragmentShaderSource = glsAttributeLocationTests.createFragmentShaderSource(attributeAliasing);
/** @type {WebGLShader} */ var vertexShader = gl.createShader(gl.VERTEX_SHADER);
/** @type {WebGLShader} */ var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(vertexShader);
gl.compileShader(fragmentShader);
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
var vertexShaderCompileOk = /** @type {boolean} */ (gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS));
var fragmentShaderCompileOk = /** @type {boolean} */ (gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS));
// log shaders
glsAttributeLocationTests.logShaders(vertexShaderSource, gl.getShaderInfoLog(vertexShader),
vertexShaderCompileOk,
fragmentShaderSource, gl.getShaderInfoLog(fragmentShader),
fragmentShaderCompileOk);
assertMsgOptions(vertexShaderCompileOk, 'vertex Shader compile failed', false, true);
assertMsgOptions(fragmentShaderCompileOk, 'fragment Shader compile failed', false, true);
gl.deleteShader(vertexShader);
gl.deleteShader(fragmentShader);
return {first: vertexShader, second: fragmentShader};
};
/**
* @param {WebGLProgram} program
* @param {Array<glsAttributeLocationTests.Bind>} binds
*/
glsAttributeLocationTests.bindAttributes = function(program, binds) {
for (var i = 0; i < binds.length; i++) {
bufferedLogToConsole('Bind attribute: ' + binds[i].getAttributeName() + ' to ' + binds[i].getLocation());
gl.bindAttribLocation(program, binds[i].getLocation(), binds[i].getAttributeName());
}
};
/**
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
* @return {string}
*/
glsAttributeLocationTests.generateTestName = function(type, arraySize) {
return type.getName() + (arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? '_array_' + arraySize : '');
};
/**
* @constructor
* @param {string} name
* @param {number} locationSize
* @param {number} typeEnum
*/
glsAttributeLocationTests.AttribType = function(name, locationSize, typeEnum) {
/** @type {string} */ this.m_name = name;
/** @type {number} */ this.m_locationSize = locationSize;
/** @type {number} */ this.m_glTypeEnum = typeEnum;
};
/**
* @return {string}
*/
glsAttributeLocationTests.AttribType.prototype.getName = function() {
return this.m_name;
};
/**
* @return {number}
*/
glsAttributeLocationTests.AttribType.prototype.getLocationSize = function() {
return this.m_locationSize;
};
/**
* @return {number}
*/
glsAttributeLocationTests.AttribType.prototype.getGLTypeEnum = function() {
return this.m_glTypeEnum;
};
/**
* @enum {number}
*/
glsAttributeLocationTests.ConstCond = {
ALWAYS: 0,
NEVER: 1
};
/**
* @constructor
* @param {string} name
* @param {boolean=} negate
*/
glsAttributeLocationTests.Cond = function(name, negate) {
/** @type {boolean} */ this.m_negate = negate === undefined ? false : negate;
/** @type {string} */ this.m_name = name;
};
/**
* @param {glsAttributeLocationTests.ConstCond} cond
* @return {glsAttributeLocationTests.Cond}
*/
glsAttributeLocationTests.NewCondWithEnum = function(cond) {
var condObj = new glsAttributeLocationTests.Cond('', false);
condObj.m_name = '__always__';
condObj.m_negate = (cond != glsAttributeLocationTests.ConstCond.NEVER);
return condObj;
};
/**
* @param {glsAttributeLocationTests.Cond} other
* @return {boolean}
*/
glsAttributeLocationTests.Cond.prototype.equals = function(other) {
return (this.m_negate == other.m_negate && this.m_name == other.m_name);
};
/**
* @param {glsAttributeLocationTests.Cond} other
* @return {boolean}
*/
glsAttributeLocationTests.Cond.prototype.notEquals = function(other) {
return (!this.equals(other));
};
/**
* @return {string}
*/
glsAttributeLocationTests.Cond.prototype.getName = function() {
return this.m_name;
};
/**
* @return {boolean}
*/
glsAttributeLocationTests.Cond.prototype.getNegate = function() {
return this.m_negate;
};
/**
* @enum {number}
*/
glsAttributeLocationTests.LocationEnum = {
UNDEF: -1
};
/**
* @enum {number}
*/
glsAttributeLocationTests.ArrayEnum = {
NOT: -1
};
/**
* @constructor
* @param {glsAttributeLocationTests.AttribType} type
* @param {string} name
* @param {number=} layoutLocation
* @param {glsAttributeLocationTests.Cond=} cond
* @param {number=} arraySize
*/
glsAttributeLocationTests.Attribute = function(type, name, layoutLocation, cond, arraySize) {
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
/** @type {string} */ this.m_name = name;
/** @type {number} */ this.m_layoutLocation = layoutLocation === undefined ? glsAttributeLocationTests.LocationEnum.UNDEF : layoutLocation;
/** @type {glsAttributeLocationTests.Cond} */ this.m_cond = cond === undefined ?
glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS) : cond;
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
};
/**
* @return {glsAttributeLocationTests.AttribType}
*/
glsAttributeLocationTests.Attribute.prototype.getType = function() {
return this.m_type;
};
/**
* @return {string}
*/
glsAttributeLocationTests.Attribute.prototype.getName = function() {
return this.m_name;
};
/**
* @return {number}
*/
glsAttributeLocationTests.Attribute.prototype.getLayoutLocation = function() {
return this.m_layoutLocation;
};
/**
* @return {glsAttributeLocationTests.Cond}
*/
glsAttributeLocationTests.Attribute.prototype.getCondition = function() {
return this.m_cond;
};
/**
* @return {number}
*/
glsAttributeLocationTests.Attribute.prototype.getArraySize = function() {
return this.m_arraySize;
};
/**
* @constructor
* @param {string} attribute
* @param {number} location
*/
glsAttributeLocationTests.Bind = function(attribute, location) {
/** @type {string} */ this.m_attribute = attribute;
/** @type {number} */ this.m_location = location;
};
/**
* @return {string}
*/
glsAttributeLocationTests.Bind.prototype.getAttributeName = function() {
return this.m_attribute;
};
/**
* @return {number}
*/
glsAttributeLocationTests.Bind.prototype.getLocation = function() {
return this.m_location;
};
/**
* @param {Array<glsAttributeLocationTests.Attribute>} attributes
* @param {Array<glsAttributeLocationTests.Bind>} preAttachBind
* @param {Array<glsAttributeLocationTests.Bind>} preLinkBind
* @param {Array<glsAttributeLocationTests.Bind>} postLinkBind
* @param {boolean} relink
* @param {boolean=} reattach
* @param {Array<glsAttributeLocationTests.Attribute>=} reattachAttributes
*/
glsAttributeLocationTests.runTest = function(attributes, preAttachBind, preLinkBind, postLinkBind, relink, reattach, reattachAttributes) {
reattach = reattach === undefined ? false : reattach;
reattachAttributes = reattachAttributes === undefined ? [] : reattachAttributes;
try {
/** @type {boolean} */ var isOk = true;
/** @type {Array<number>} */ var activeBindings = [];
for (var bindNdx = 0; bindNdx < preAttachBind.length; bindNdx++)
activeBindings[preAttachBind[bindNdx].getAttributeName()] = preAttachBind[bindNdx].getLocation();
for (var bindNdx = 0; bindNdx < preLinkBind.length; bindNdx++)
activeBindings[preLinkBind[bindNdx].getAttributeName()] = preLinkBind[bindNdx].getLocation();
glsAttributeLocationTests.logAttributes(attributes);
/** @type {WebGLProgram} */ var program = gl.createProgram();
if (!preAttachBind.length == 0)
glsAttributeLocationTests.bindAttributes(program, preAttachBind);
/** @type {*} */ var shaders = glsAttributeLocationTests.createAndAttachShaders(program, attributes, glsAttributeLocationTests.hasAttributeAliasing(attributes, activeBindings));
if (!preLinkBind.length == 0)
glsAttributeLocationTests.bindAttributes(program, preLinkBind);
gl.linkProgram(program);
assertMsgOptions(gl.getProgramParameter(program, gl.LINK_STATUS) == true, 'link program failed', false, true);
glsAttributeLocationTests.logProgram(program);
if (!glsAttributeLocationTests.checkQuery(program, attributes, activeBindings))
isOk = false;
if (!postLinkBind.length == 0) {
glsAttributeLocationTests.bindAttributes(program, postLinkBind);
if (!glsAttributeLocationTests.checkQuery(program, attributes, activeBindings))
isOk = false;
}
if (relink) {
gl.linkProgram(program);
assertMsgOptions(gl.getProgramParameter(program, gl.LINK_STATUS) == true, 'link program failed', false, true);
glsAttributeLocationTests.logProgram(program);
for (var bindNdx = 0; bindNdx < postLinkBind.length; bindNdx++)
activeBindings[postLinkBind[bindNdx].getAttributeName()] = postLinkBind[bindNdx].getLocation();
if (!glsAttributeLocationTests.checkQuery(program, attributes, activeBindings))
isOk = false;
}
if (reattach) {
gl.detachShader(program, shaders.first);
gl.detachShader(program, shaders.second);
glsAttributeLocationTests.createAndAttachShaders(program, reattachAttributes, glsAttributeLocationTests.hasAttributeAliasing(reattachAttributes, activeBindings));
gl.linkProgram(program);
assertMsgOptions(gl.getProgramParameter(program, gl.LINK_STATUS) == true, 'link program failed', false, true);
glsAttributeLocationTests.logProgram(program);
if (!glsAttributeLocationTests.checkQuery(program, reattachAttributes, activeBindings))
isOk = false;
}
gl.deleteProgram(program);
assertMsgOptions(isOk, '', true, true);
} catch (e) {
if (program)
gl.deleteProgram(program);
throw e;
}
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.BindAttributeTest = function(type, arraySize) {
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.BindAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.BindAttributeTest.prototype.constructor = glsAttributeLocationTests.BindAttributeTest;
glsAttributeLocationTests.BindAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_0', glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.BindMaxAttributesTest = function(type, arraySize) {
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.BindMaxAttributesTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.BindMaxAttributesTest.prototype.constructor = glsAttributeLocationTests.BindMaxAttributesTest;
glsAttributeLocationTests.BindMaxAttributesTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {number} */ var ndx = 0;
bufferedLogToConsole('MAX_VERTEX_ATTRIBS: ' + maxAttributes);
for (var loc = maxAttributes - (arrayElementCount * this.m_type.getLocationSize()); loc >= 0; loc -= (arrayElementCount * this.m_type.getLocationSize())) {
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_' + ndx, glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
bindings.push(new glsAttributeLocationTests.Bind('a_' + ndx, loc));
ndx++;
}
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.BindHoleAttributeTest = function(type, arraySize) {
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.BindHoleAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.BindHoleAttributeTest.prototype.constructor = glsAttributeLocationTests.BindHoleAttributeTest;
glsAttributeLocationTests.BindHoleAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0'));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 0));
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_1', glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
/** @type {number} */ var ndx = 2;
for (var loc = 1 + this.m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++) {
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_' + ndx));
bindings.push(new glsAttributeLocationTests.Bind('a_' + ndx, loc));
ndx++;
}
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.PreAttachBindAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'pre_attach', 'pre_attach');
};
glsAttributeLocationTests.PreAttachBindAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.PreAttachBindAttributeTest.prototype.constructor = glsAttributeLocationTests.PreAttachBindAttributeTest;
glsAttributeLocationTests.PreAttachBindAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {number} */ var ndx = 0;
attributes.push(new glsAttributeLocationTests.Attribute(new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), 'a_0'));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
glsAttributeLocationTests.runTest(attributes, bindings, noBindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.PreLinkBindAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'pre_link', 'pre_link');
};
glsAttributeLocationTests.PreLinkBindAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.PreLinkBindAttributeTest.prototype.constructor = glsAttributeLocationTests.PreLinkBindAttributeTest;
glsAttributeLocationTests.PreLinkBindAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {number} */ var ndx = 0;
attributes.push(new glsAttributeLocationTests.Attribute(new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), 'a_0'));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
glsAttributeLocationTests.runTest(attributes, bindings, noBindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.PostLinkBindAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'post_link', 'post_link');
};
glsAttributeLocationTests.PostLinkBindAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.PostLinkBindAttributeTest.prototype.constructor = glsAttributeLocationTests.PostLinkBindAttributeTest;
glsAttributeLocationTests.PostLinkBindAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), 'a_0'));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
glsAttributeLocationTests.runTest(attributes, noBindings, noBindings, bindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.BindReattachAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'reattach', 'reattach');
};
glsAttributeLocationTests.BindReattachAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.BindReattachAttributeTest.prototype.constructor = glsAttributeLocationTests.BindReattachAttributeTest;
glsAttributeLocationTests.BindReattachAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {glsAttributeLocationTests.AttribType} */ var vec2 = new glsAttributeLocationTests.AttribType('vec2', 1, gl.FLOAT_VEC2);
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var reattachAttributes = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0'));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 1));
bindings.push(new glsAttributeLocationTests.Bind('a_1', 1));
reattachAttributes.push(new glsAttributeLocationTests.Attribute(vec2, 'a_1'));
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false, true, reattachAttributes);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.LocationAttributeTest = function(type, arraySize) {
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.LocationAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.LocationAttributeTest.prototype.constructor = glsAttributeLocationTests.LocationAttributeTest;
glsAttributeLocationTests.LocationAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_0', 3, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
glsAttributeLocationTests.runTest(attributes, noBindings, noBindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.LocationMaxAttributesTest = function(type, arraySize) {
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.LocationMaxAttributesTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.LocationMaxAttributesTest.prototype.constructor = glsAttributeLocationTests.LocationMaxAttributesTest;
glsAttributeLocationTests.LocationMaxAttributesTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {number} */ var ndx = 0;
bufferedLogToConsole('MAX_VERTEX_ATTRIBS: ' + maxAttributes);
for (var loc = maxAttributes - (arrayElementCount * this.m_type.getLocationSize()); loc >= 0; loc -= (arrayElementCount * this.m_type.getLocationSize())) {
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_' + ndx, loc, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
ndx++;
}
glsAttributeLocationTests.runTest(attributes, noBindings, noBindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.LocationHoleAttributeTest = function(type, arraySize) {
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.LocationHoleAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.LocationHoleAttributeTest.prototype.constructor = glsAttributeLocationTests.LocationHoleAttributeTest;
glsAttributeLocationTests.LocationHoleAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0', 0));
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_1', glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
/** @type {number} */ var ndx = 2;
for (var loc = 1 + this.m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++) {
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_' + ndx, loc));
ndx++;
}
glsAttributeLocationTests.runTest(attributes, noBindings, noBindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.MixedAttributeTest = function(type, arraySize) {
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.MixedAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.MixedAttributeTest.prototype.constructor = glsAttributeLocationTests.MixedAttributeTest;
glsAttributeLocationTests.MixedAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_0', 3, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 4));
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.MixedMaxAttributesTest = function(type, arraySize) {
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.MixedMaxAttributesTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.MixedMaxAttributesTest.prototype.constructor = glsAttributeLocationTests.MixedMaxAttributesTest;
glsAttributeLocationTests.MixedMaxAttributesTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {number} */ var ndx = 0;
bufferedLogToConsole('MAX_VERTEX_ATTRIBS: ' + maxAttributes);
for (var loc = maxAttributes - (arrayElementCount * this.m_type.getLocationSize()); loc >= 0; loc -= (arrayElementCount * this.m_type.getLocationSize())) {
if ((ndx % 2) != 0)
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_' + ndx, loc, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
else {
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_' + ndx, glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
bindings.push(new glsAttributeLocationTests.Bind('a_' + ndx, loc));
}
ndx++;
}
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.MixedHoleAttributeTest = function(type, arraySize) {
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.MixedHoleAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.MixedHoleAttributeTest.prototype.constructor = glsAttributeLocationTests.MixedHoleAttributeTest;
glsAttributeLocationTests.MixedHoleAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0'));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 0));
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_1', glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
/** @type {number} */ var ndx = 2;
for (var loc = 1 + this.m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++) {
if ((ndx % 2) != 0)
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_' + ndx, loc));
else {
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_' + ndx, loc));
bindings.push(new glsAttributeLocationTests.Bind('a_' + ndx, loc));
}
ndx++;
}
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.BindRelinkAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'relink', 'relink');
};
glsAttributeLocationTests.BindRelinkAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.BindRelinkAttributeTest.prototype.constructor = glsAttributeLocationTests.BindRelinkAttributeTest;
glsAttributeLocationTests.BindRelinkAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var preLinkBindings = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var postLinkBindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0'));
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_1'));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 5));
postLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 6));
glsAttributeLocationTests.runTest(attributes, noBindings, preLinkBindings, postLinkBindings, true);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.BindRelinkHoleAttributeTest = function(type, arraySize) {
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.BindRelinkHoleAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.BindRelinkHoleAttributeTest.prototype.constructor = glsAttributeLocationTests.BindRelinkHoleAttributeTest;
glsAttributeLocationTests.BindRelinkHoleAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var preLinkBindings = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var postLinkBindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0'));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 0));
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_1', glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
/** @type {number} */ var ndx = 2;
for (var loc = 1 + this.m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++) {
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_' + ndx));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_' + ndx, loc));
ndx++;
}
postLinkBindings.push(new glsAttributeLocationTests.Bind('a_2', 1));
glsAttributeLocationTests.runTest(attributes, noBindings, preLinkBindings, postLinkBindings, true);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
* @param {glsAttributeLocationTests.AttribType} type
* @param {number=} arraySize
*/
glsAttributeLocationTests.MixedRelinkHoleAttributeTest = function(type, arraySize) {
/** @type {glsAttributeLocationTests.AttribType} */ this.m_type = type;
/** @type {number} */ this.m_arraySize = arraySize === undefined ? glsAttributeLocationTests.ArrayEnum.NOT : arraySize;
tcuTestCase.DeqpTest.call(this, glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize), glsAttributeLocationTests.generateTestName(this.m_type, this.m_arraySize));
};
glsAttributeLocationTests.MixedRelinkHoleAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.MixedRelinkHoleAttributeTest.prototype.constructor = glsAttributeLocationTests.MixedRelinkHoleAttributeTest;
glsAttributeLocationTests.MixedRelinkHoleAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {number} */ var maxAttributes = glsAttributeLocationTests.getMaxAttributeLocations();
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {number} */ var arrayElementCount = (this.m_arraySize != glsAttributeLocationTests.ArrayEnum.NOT ? this.m_arraySize : 1);
/** @type {Array<glsAttributeLocationTests.Bind>} */ var preLinkBindings = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var postLinkBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0'));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 0));
attributes.push(new glsAttributeLocationTests.Attribute(this.m_type, 'a_1', glsAttributeLocationTests.LocationEnum.UNDEF, glsAttributeLocationTests.NewCondWithEnum(glsAttributeLocationTests.ConstCond.ALWAYS), this.m_arraySize));
/** @type {number} */ var ndx = 2;
for (var loc = 1 + this.m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++) {
if ((ndx % 2) != 0)
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_' + ndx, loc));
else {
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_' + ndx));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_' + ndx, loc));
}
ndx++;
}
postLinkBindings.push(new glsAttributeLocationTests.Bind('a_2', 1));
glsAttributeLocationTests.runTest(attributes, noBindings, preLinkBindings, postLinkBindings, true);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.PreAttachMixedAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'pre_attach', 'pre_attach');
};
glsAttributeLocationTests.PreAttachMixedAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.PreAttachMixedAttributeTest.prototype.constructor = glsAttributeLocationTests.PreAttachMixedAttributeTest;
glsAttributeLocationTests.PreAttachMixedAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), 'a_0', 1));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
glsAttributeLocationTests.runTest(attributes, bindings, noBindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.PreLinkMixedAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'pre_link', 'pre_link');
};
glsAttributeLocationTests.PreLinkMixedAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.PreLinkMixedAttributeTest.prototype.constructor = glsAttributeLocationTests.PreLinkMixedAttributeTest;
glsAttributeLocationTests.PreLinkMixedAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), 'a_0', 1));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.PostLinkMixedAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'post_link', 'post_link');
};
glsAttributeLocationTests.PostLinkMixedAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.PostLinkMixedAttributeTest.prototype.constructor = glsAttributeLocationTests.PostLinkMixedAttributeTest;
glsAttributeLocationTests.PostLinkMixedAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4), 'a_0', 1));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
glsAttributeLocationTests.runTest(attributes, noBindings, noBindings, bindings, false);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.MixedReattachAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'reattach', 'reattach');
};
glsAttributeLocationTests.MixedReattachAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.MixedReattachAttributeTest.prototype.constructor = glsAttributeLocationTests.MixedReattachAttributeTest;
glsAttributeLocationTests.MixedReattachAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {glsAttributeLocationTests.AttribType} */ var vec2 = new glsAttributeLocationTests.AttribType('vec2', 1, gl.FLOAT_VEC2);
/** @type {Array<glsAttributeLocationTests.Bind>} */ var bindings = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var reattachAttributes = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0', 2));
bindings.push(new glsAttributeLocationTests.Bind('a_0', 1));
bindings.push(new glsAttributeLocationTests.Bind('a_1', 1));
reattachAttributes.push(new glsAttributeLocationTests.Attribute(vec2, 'a_1'));
glsAttributeLocationTests.runTest(attributes, noBindings, bindings, noBindings, false, true, reattachAttributes);
return tcuTestCase.IterateResult.STOP;
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
glsAttributeLocationTests.MixedRelinkAttributeTest = function() {
tcuTestCase.DeqpTest.call(this, 'relink', 'relink');
};
glsAttributeLocationTests.MixedRelinkAttributeTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
glsAttributeLocationTests.MixedRelinkAttributeTest.prototype.constructor = glsAttributeLocationTests.MixedRelinkAttributeTest;
glsAttributeLocationTests.MixedRelinkAttributeTest.prototype.iterate = function() {
/** @type {Array<glsAttributeLocationTests.Bind>} */ var noBindings = [];
/** @type {glsAttributeLocationTests.AttribType} */ var vec4 = new glsAttributeLocationTests.AttribType('vec4', 1, gl.FLOAT_VEC4);
/** @type {Array<glsAttributeLocationTests.Attribute>} */ var attributes = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var preLinkBindings = [];
/** @type {Array<glsAttributeLocationTests.Bind>} */ var postLinkBindings = [];
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_0', 1));
attributes.push(new glsAttributeLocationTests.Attribute(vec4, 'a_1'));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 3));
preLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 5));
postLinkBindings.push(new glsAttributeLocationTests.Bind('a_0', 6));
glsAttributeLocationTests.runTest(attributes, noBindings, preLinkBindings, postLinkBindings, true);
return tcuTestCase.IterateResult.STOP;
};
});