Source code
Revision control
Copy as Markdown
Other Tools
/*-------------------------------------------------------------------------
* 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
*
*
* 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.es3fRboStateQueryTests');
goog.require('framework.common.tcuTestCase');
goog.require('framework.delibs.debase.deRandom');
goog.require('functional.gles3.es3fApiCase');
goog.require('modules.shared.glsStateQuery');
goog.scope(function() {
var es3fRboStateQueryTests = functional.gles3.es3fRboStateQueryTests;
var tcuTestCase = framework.common.tcuTestCase;
var glsStateQuery = modules.shared.glsStateQuery;
var es3fApiCase = functional.gles3.es3fApiCase;
var deRandom = framework.delibs.debase.deRandom;
var setParentClass = function(child, parent) {
child.prototype = Object.create(parent.prototype);
child.prototype.constructor = child;
};
/**
* @this {es3fApiCase.ApiCase}
*/
var checkRenderbufferComponentSize = function(r, g, b, a, d, s) {
var referenceSizes = [r, g, b, a, d, s];
var paramNames = [
gl.RENDERBUFFER_RED_SIZE,
gl.RENDERBUFFER_GREEN_SIZE,
gl.RENDERBUFFER_BLUE_SIZE,
gl.RENDERBUFFER_ALPHA_SIZE,
gl.RENDERBUFFER_DEPTH_SIZE,
gl.RENDERBUFFER_STENCIL_SIZE
];
for (var ndx = 0; ndx < referenceSizes.length; ++ndx) {
if (referenceSizes[ndx] == -1)
continue;
var value = /** @type {number} */ (gl.getRenderbufferParameter(gl.RENDERBUFFER, paramNames[ndx]));
this.check(value >= referenceSizes[ndx], 'Expected greater or equal to ' + referenceSizes[ndx] + ' got ' + value);
}
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fRboStateQueryTests.RboSizeCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fRboStateQueryTests.RboSizeCase, es3fApiCase.ApiCase);
es3fRboStateQueryTests.RboSizeCase.prototype.test = function() {
var rnd = new deRandom.Random(0xabcdef);
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_WIDTH, 0));
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_HEIGHT, 0));
var numIterations = 60;
for (var i = 0; i < numIterations; ++i) {
var w = rnd.getInt(0, 128);
var h = rnd.getInt(0, 128);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGB8, w, h);
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_WIDTH, w));
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_HEIGHT, h));
}
gl.deleteRenderbuffer(renderbufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fRboStateQueryTests.RboInternalFormatCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fRboStateQueryTests.RboInternalFormatCase, es3fApiCase.ApiCase);
es3fRboStateQueryTests.RboInternalFormatCase.prototype.test = function() {
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_INTERNAL_FORMAT, gl.RGBA4));
var requiredColorformats = [
gl.R8, gl.RG8, gl.RGB8, gl.RGB565, gl.RGBA4, gl.RGB5_A1, gl.RGBA8, gl.RGB10_A2,
gl.RGB10_A2UI, gl.SRGB8_ALPHA8, gl.R8I, gl.R8UI, gl.R16I, gl.R16UI, gl.R32I, gl.R32UI,
gl.RG8I, gl.RG8UI, gl.RG16I, gl.RG16UI, gl.RG32I, gl.RG32UI, gl.RGBA8I, gl.RGBA8UI,
gl.RGBA16I, gl.RGBA16UI, gl.RGBA32I, gl.RGBA32UI
];
for (var ndx = 0; ndx < requiredColorformats.length; ++ndx) {
gl.renderbufferStorage(gl.RENDERBUFFER, requiredColorformats[ndx], 128, 128);
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_INTERNAL_FORMAT, requiredColorformats[ndx]));
}
gl.deleteRenderbuffer(renderbufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fRboStateQueryTests.RboComponentSizeColorCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fRboStateQueryTests.RboComponentSizeColorCase, es3fApiCase.ApiCase);
es3fRboStateQueryTests.RboComponentSizeColorCase.prototype.test = function() {
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
checkRenderbufferComponentSize.bind(this, 0, 0, 0, 0, 0, 0);
var requiredColorFormats = [
// format, r, g, b, a
[gl.R8, 8, 0, 0, 0],
[gl.RG8, 8, 8, 0, 0],
[gl.RGB8, 8, 8, 8, 0],
[gl.RGB565, 5, 6, 5, 0],
[gl.RGBA4, 4, 4, 4, 4],
[gl.RGB5_A1, 5, 5, 5, 1],
[gl.RGBA8, 8, 8, 8, 8],
[gl.RGB10_A2, 10, 10, 10, 2],
[gl.RGB10_A2UI, 10, 10, 10, 2],
[gl.SRGB8_ALPHA8, 8, 8, 8, 8],
[gl.R8I, 8, 0, 0, 0],
[gl.R8UI, 8, 0, 0, 0],
[gl.R16I, 16, 0, 0, 0],
[gl.R16UI, 16, 0, 0, 0],
[gl.R32I, 32, 0, 0, 0],
[gl.R32UI, 32, 0, 0, 0],
[gl.RG8I, 8, 8, 0, 0],
[gl.RG8UI, 8, 8, 0, 0],
[gl.RG16I, 16, 16, 0, 0],
[gl.RG16UI, 16, 16, 0, 0],
[gl.RG32I, 32, 32, 0, 0],
[gl.RG32UI, 32, 32, 0, 0],
[gl.RGBA8I, 8, 8, 8, 8],
[gl.RGBA8UI, 8, 8, 8, 8],
[gl.RGBA16I, 16, 16, 16, 16],
[gl.RGBA16UI, 16, 16, 16, 16],
[gl.RGBA32I, 32, 32, 32, 32],
[gl.RGBA32UI, 32, 32, 32, 32]
];
for (var ndx = 0; ndx < requiredColorFormats.length; ++ndx) {
gl.renderbufferStorage(gl.RENDERBUFFER, requiredColorFormats[ndx][0], 128, 128);
checkRenderbufferComponentSize.bind(this, requiredColorFormats[ndx][1], requiredColorFormats[ndx][2], requiredColorFormats[ndx][3], requiredColorFormats[ndx][4], -1, -1);
}
gl.deleteRenderbuffer(renderbufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fRboStateQueryTests.RboComponentSizeDepthCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fRboStateQueryTests.RboComponentSizeDepthCase, es3fApiCase.ApiCase);
es3fRboStateQueryTests.RboComponentSizeDepthCase.prototype.test = function() {
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
var requiredDepthFormats = [
// format, depth, stencil
[gl.DEPTH_COMPONENT16, 16, 0],
[gl.DEPTH_COMPONENT24, 24, 0],
[gl.DEPTH_COMPONENT32F, 32, 0],
[gl.DEPTH24_STENCIL8, 24, 8],
[gl.DEPTH32F_STENCIL8, 32, 8]
];
for (var ndx = 0; ndx < requiredDepthFormats.length; ++ndx) {
gl.renderbufferStorage(gl.RENDERBUFFER, requiredDepthFormats[ndx][0], 128, 128);
checkRenderbufferComponentSize.bind(this, -1, -1, -1, -1, requiredDepthFormats[ndx][1], requiredDepthFormats[ndx][2]);
}
// STENCIL_INDEX8 is required, in that case sBits >= 8
gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, 128, 128);
var value = /** @type {number} */ (gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE));
this.check(value >= 8, 'Expected greater or equal to 8; got ' + value);
gl.deleteRenderbuffer(renderbufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fRboStateQueryTests.RboSamplesCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fRboStateQueryTests.RboSamplesCase, es3fApiCase.ApiCase);
es3fRboStateQueryTests.RboSamplesCase.prototype.test = function() {
var rnd = new deRandom.Random(0xabcdef);
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_SAMPLES, 0));
var max_samples = /** @type {number} */ (gl.getParameter(gl.MAX_SAMPLES));
// 0 samples is a special case
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 0, gl.RGBA8, 128, 128);
this.check(glsStateQuery.verifyRenderbuffer(gl.RENDERBUFFER_SAMPLES, 0));
// test [1, n] samples
for (var samples = 1; samples <= max_samples; ++samples) {
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, gl.RGBA8, 128, 128);
var value = /** @type {number} */ (gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_SAMPLES));
this.check(value >= samples, 'Expected greater or equal to ' + samples + ' got ' + value);
}
gl.deleteRenderbuffer(renderbufferID);
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
es3fRboStateQueryTests.RboStateQueryTests = function() {
tcuTestCase.DeqpTest.call(this, 'rbo', 'Rbo State Query tests');
};
es3fRboStateQueryTests.RboStateQueryTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
es3fRboStateQueryTests.RboStateQueryTests.prototype.constructor = es3fRboStateQueryTests.RboStateQueryTests;
es3fRboStateQueryTests.RboStateQueryTests.prototype.init = function() {
this.addChild(new es3fRboStateQueryTests.RboSizeCase('renderbuffer_size', 'RENDERBUFFER_WIDTH and RENDERBUFFER_HEIGHT'));
this.addChild(new es3fRboStateQueryTests.RboInternalFormatCase('renderbuffer_internal_format', 'RENDERBUFFER_INTERNAL_FORMAT'));
this.addChild(new es3fRboStateQueryTests.RboComponentSizeColorCase('renderbuffer_component_size_color', 'RENDERBUFFER_x_SIZE'));
this.addChild(new es3fRboStateQueryTests.RboComponentSizeDepthCase('renderbuffer_component_size_depth', 'RENDERBUFFER_x_SIZE'));
this.addChild(new es3fRboStateQueryTests.RboSamplesCase('renderbuffer_samples', 'RENDERBUFFER_SAMPLES'));
};
/**
* Run test
* @param {WebGL2RenderingContext} context
*/
es3fRboStateQueryTests.run = function(context) {
gl = context;
//Set up Test Root parameters
var state = tcuTestCase.runner;
state.setRoot(new es3fRboStateQueryTests.RboStateQueryTests());
//Set up name and description of this test series.
setCurrentTestName(state.testCases.fullName());
description(state.testCases.getDescription());
try {
//Run test cases
tcuTestCase.runTestCases();
}
catch (err) {
testFailedOptions('Failed to es3fRboStateQueryTests.run tests', false);
tcuTestCase.runner.terminate();
}
};
});