blob: 4795790ef47eaa8537a5b75d3b49e0f1ca9d03dc [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.es3fFboStateQueryTests');
goog.require('framework.common.tcuTestCase');
goog.require('functional.gles3.es3fApiCase');
goog.require('modules.shared.glsStateQuery');
goog.scope(function() {
var es3fFboStateQueryTests = functional.gles3.es3fFboStateQueryTests;
var tcuTestCase = framework.common.tcuTestCase;
var glsStateQuery = modules.shared.glsStateQuery;
var es3fApiCase = functional.gles3.es3fApiCase;
var setParentClass = function(child, parent) {
child.prototype = Object.create(parent.prototype);
child.prototype.constructor = child;
};
// WebGL bit depths
es3fFboStateQueryTests.colorBits = [8, 8, 8, 8];
es3fFboStateQueryTests.depthBits = 0;
es3fFboStateQueryTests.stencilBits = 0;
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
* @param {number} framebufferTarget
*/
es3fFboStateQueryTests.DefaultFramebufferCase = function(name, description, framebufferTarget) {
es3fApiCase.ApiCase.call(this, name, description, gl);
this.m_framebufferTarget = framebufferTarget;
};
setParentClass(es3fFboStateQueryTests.DefaultFramebufferCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.DefaultFramebufferCase.prototype.test = function() {
var hasColorBuffer = es3fFboStateQueryTests.colorBits[0] > 0 ||
es3fFboStateQueryTests.colorBits[1] > 0 ||
es3fFboStateQueryTests.colorBits[2] > 0 ||
es3fFboStateQueryTests.colorBits[3] > 0;
var attachments = [
gl.BACK,
gl.DEPTH,
gl.STENCIL
];
var attachmentExists = [
hasColorBuffer,
es3fFboStateQueryTests.depthBits > 0,
es3fFboStateQueryTests.stencilBits > 0
];
for (var ndx = 0; ndx < attachments.length; ++ndx) {
var objType = gl.getFramebufferAttachmentParameter(this.m_framebufferTarget, attachments[ndx], gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE);
if (attachmentExists[ndx]) {
this.check(objType === gl.FRAMEBUFFER_DEFAULT);
} else {
// \note [jarkko] FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE "identifes the type of object which contains the attached image". However, it
// is unclear if an object of type FRAMEBUFFER_DEFAULT can contain a null image (or a 0-bits-per-pixel image). Accept both
// FRAMEBUFFER_DEFAULT and NONE as valid results in these cases.
this.check(objType === gl.FRAMEBUFFER_DEFAULT || objType === gl.NONE);
}
}
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentObjectCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentObjectCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentObjectCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
// initial
this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, gl.NONE));
this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, null));
// texture
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, textureID);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 128, 128, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, 0);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, gl.TEXTURE));
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, textureID));
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
// rb
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGB8, 128, 128);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, gl.RENDERBUFFER));
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, renderbufferID));
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentTextureLevelCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentTextureLevelCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentTextureLevelCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
for (var mipmapLevel = 0; mipmapLevel < 7; ++mipmapLevel) {
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, textureID);
gl.texStorage2D(gl.TEXTURE_2D, 7, gl.RGB8, 128, 128);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, mipmapLevel);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, mipmapLevel));
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
}
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_CUBE_MAP, textureID);
gl.texStorage2D(gl.TEXTURE_CUBE_MAP, 1, gl.RGB8, 128, 128);
var faces = [
gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
gl.TEXTURE_CUBE_MAP_POSITIVE_Z, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z
];
for (var ndx = 0; ndx < faces.length; ++ndx) {
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, faces[ndx], textureID, 0);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, faces[ndx]));
}
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentTextureLayerCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentTextureLayerCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentTextureLayerCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
// tex3d
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_3D, textureID);
gl.texStorage3D(gl.TEXTURE_3D, 1, gl.RGBA8, 16, 16, 16);
for (var layer = 0; layer < 16; ++layer) {
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureID, 0, layer);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, layer));
}
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
// tex2d array
textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D_ARRAY, textureID);
gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, 16, 16, 16);
for (var layer = 0; layer < 16; ++layer) {
gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureID, 0, layer);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, layer));
}
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentTextureColorCodingCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentTextureColorCodingCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentTextureColorCodingCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
// rgb8 color
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGB8, 128, 128);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
// srgb8_alpha8 color
renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.SRGB8_ALPHA8, 128, 128);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.SRGB));
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
// depth
renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 128, 128);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentTextureComponentTypeCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentTextureComponentTypeCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentTextureComponentTypeCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
// color-renderable required texture formats
var requiredColorformats = [
[gl.R8, gl.UNSIGNED_NORMALIZED],
[gl.RG8, gl.UNSIGNED_NORMALIZED],
[gl.RGB8, gl.UNSIGNED_NORMALIZED],
[gl.RGB565, gl.UNSIGNED_NORMALIZED],
[gl.RGBA4, gl.UNSIGNED_NORMALIZED],
[gl.RGB5_A1, gl.UNSIGNED_NORMALIZED],
[gl.RGBA8, gl.UNSIGNED_NORMALIZED],
[gl.RGB10_A2, gl.UNSIGNED_NORMALIZED],
[gl.RGB10_A2UI, gl.UNSIGNED_INT],
[gl.SRGB8_ALPHA8, gl.UNSIGNED_NORMALIZED],
[gl.R8I, gl.INT],
[gl.R8UI, gl.UNSIGNED_INT],
[gl.R16I, gl.INT],
[gl.R16UI, gl.UNSIGNED_INT],
[gl.R32I, gl.INT],
[gl.R32UI, gl.UNSIGNED_INT],
[gl.RG8I, gl.INT],
[gl.RG8UI, gl.UNSIGNED_INT],
[gl.RG16I, gl.INT],
[gl.RG16UI, gl.UNSIGNED_INT],
[gl.RG32I, gl.INT],
[gl.RG32UI, gl.UNSIGNED_INT],
[gl.RGBA8I, gl.INT],
[gl.RGBA8UI, gl.UNSIGNED_INT],
[gl.RGBA16I, gl.INT],
[gl.RGBA16UI, gl.UNSIGNED_INT],
[gl.RGBA32I, gl.INT],
[gl.RGBA32UI, gl.UNSIGNED_INT]
];
for (var ndx = 0; ndx < requiredColorformats.length; ++ndx) {
var colorFormat = requiredColorformats[ndx][0];
var componentType = requiredColorformats[ndx][1];
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, textureID);
gl.texStorage2D(gl.TEXTURE_2D, 1, colorFormat, 128, 128);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, 0);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, componentType));
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
}
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentSizeInitialCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentSizeInitialCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentSizeInitialCase.prototype.attachmentExists = function(attachment) {
var objType = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, attachment, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE);
return objType !== gl.NONE;
};
/**
* @this {es3fApiCase.ApiCase}
*/
var checkAttachmentComponentSizeAtLeast = function(target, attachment, r, g, b, a, d, s) {
var referenceSizes = [r, g, b, a, d, s];
var paramNames = [
gl.FRAMEBUFFER_ATTACHMENT_RED_SIZE, gl.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
gl.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, gl.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
gl.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, gl.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
];
for (var ndx = 0; ndx < referenceSizes.length; ++ndx) {
if (referenceSizes[ndx] == -1)
continue;
var value = /** @type {number} */ (gl.getFramebufferAttachmentParameter(target, attachment, paramNames[ndx]));
this.check(value >= referenceSizes[ndx], 'Expected greater or equal to ' + referenceSizes[ndx] + ' got ' + value);
}
};
/**
* @this {es3fApiCase.ApiCase}
*/
var checkAttachmentComponentSizeExactly = function(target, attachment, r, g, b, a, d, s) {
var referenceSizes = [r, g, b, a, d, s];
var paramNames = [
gl.FRAMEBUFFER_ATTACHMENT_RED_SIZE, gl.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
gl.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, gl.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
gl.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, gl.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
];
for (var ndx = 0; ndx < referenceSizes.length; ++ndx) {
if (referenceSizes[ndx] == -1)
continue;
var value = gl.getFramebufferAttachmentParameter(target, attachment, paramNames[ndx]);
this.check(value == referenceSizes[ndx], 'Expected equal to ' + referenceSizes[ndx] + ' got ' + value);
}
};
es3fFboStateQueryTests.AttachmentSizeInitialCase.prototype.test = function() {
// check default
if (this.attachmentExists(gl.BACK)) {
checkAttachmentComponentSizeAtLeast.bind(this,
gl.FRAMEBUFFER,
gl.BACK,
es3fFboStateQueryTests.colorBits[0],
es3fFboStateQueryTests.colorBits[1],
es3fFboStateQueryTests.colorBits[2],
es3fFboStateQueryTests.colorBits[3],
-1,
-1);
}
if (this.attachmentExists(gl.DEPTH)) {
checkAttachmentComponentSizeAtLeast.bind(this,
gl.FRAMEBUFFER,
gl.DEPTH,
-1,
-1,
-1,
-1,
es3fFboStateQueryTests.depthBits,
-1);
}
if (this.attachmentExists(gl.STENCIL)) {
checkAttachmentComponentSizeAtLeast.bind(this,
gl.FRAMEBUFFER,
gl.STENCIL,
-1,
-1,
-1,
-1,
-1,
es3fFboStateQueryTests.stencilBits);
}
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentSizeCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.AttachmentSizeCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.AttachmentSizeCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
// check some color targets
var colorAttachments = [
//format, red, green, blue, alpha
[gl.RGBA8, 8, 8, 8, 8],
[gl.RGB565, 5, 6, 5, 0],
[gl.RGBA4, 4, 4, 4, 4],
[gl.RGB5_A1, 5, 5, 5, 1],
[gl.RGBA8I, 8, 8, 8, 8],
[gl.RG32UI, 32, 32, 0, 0]
];
for (var ndx = 0; ndx < colorAttachments.length; ++ndx)
this.testColorAttachment(colorAttachments[ndx][0], gl.COLOR_ATTACHMENT0, colorAttachments[ndx][1], colorAttachments[ndx][2], colorAttachments[ndx][3], colorAttachments[ndx][4]);
// check some depth targets
var depthAttachments = [
// format, attachment, depth, stencil
[gl.DEPTH_COMPONENT16, gl.DEPTH_ATTACHMENT, 16, 0],
[gl.DEPTH_COMPONENT24, gl.DEPTH_ATTACHMENT, 24, 0],
[gl.DEPTH_COMPONENT32F, gl.DEPTH_ATTACHMENT, 32, 0],
[gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT, 24, 8],
[gl.DEPTH32F_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT, 32, 8]
];
for (var ndx = 0; ndx < depthAttachments.length; ++ndx)
this.testDepthAttachment(depthAttachments[ndx][0], depthAttachments[ndx][1], depthAttachments[ndx][2], depthAttachments[ndx][3]);
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fFboStateQueryTests.AttachmentSizeCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentSizeRboCase = function(name, description) {
es3fFboStateQueryTests.AttachmentSizeCase.call(this, name, description);
};
setParentClass(es3fFboStateQueryTests.AttachmentSizeRboCase, es3fFboStateQueryTests.AttachmentSizeCase);
es3fFboStateQueryTests.AttachmentSizeRboCase.prototype.testColorAttachment = function(internalFormat, attachment, r, g, b, a) {
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, 128, 128);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderbufferID);
checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, r, g, b, a, -1, -1);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, 0, 0);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
};
es3fFboStateQueryTests.AttachmentSizeRboCase.prototype.testDepthAttachment = function(internalFormat, attachment, depth, stencil) {
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, 128, 128);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderbufferID);
checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, depth, stencil);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, 0, 0, 0, 0, -1, -1);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
};
/**
* @constructor
* @extends {es3fFboStateQueryTests.AttachmentSizeCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.AttachmentSizeTextureCase = function(name, description) {
es3fFboStateQueryTests.AttachmentSizeCase.call(this, name, description);
};
setParentClass(es3fFboStateQueryTests.AttachmentSizeTextureCase, es3fFboStateQueryTests.AttachmentSizeCase);
es3fFboStateQueryTests.AttachmentSizeTextureCase.prototype.testColorAttachment = function(internalFormat, attachment, r, g, b, a) {
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, textureID);
gl.texStorage2D(gl.TEXTURE_2D, 1, internalFormat, 128, 128);
gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureID, 0);
checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, r, g, b, a, -1, -1);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, 0, 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
};
es3fFboStateQueryTests.AttachmentSizeTextureCase.prototype.testDepthAttachment = function(internalFormat, attachment, depth, stencil) {
// don't test stencil formats with textures
if (attachment == gl.DEPTH_STENCIL_ATTACHMENT)
return;
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, textureID);
gl.texStorage2D(gl.TEXTURE_2D, 1, internalFormat, 128, 128);
gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureID, 0);
checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, depth, stencil);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, 0, 0, 0, 0, -1, -1);
gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
// color
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
// depth
renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbufferID);
this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase.prototype.test = function() {
var framebufferID = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
// check color target
this.testColorAttachment();
// check depth target
this.testDepthAttachment();
gl.deleteFramebuffer(framebufferID);
};
/**
* @constructor
* @extends {es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase = function(name, description) {
es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase.call(this, name, description);
};
setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase, es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase);
es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase.prototype.testColorAttachment = function() {
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, 0, 0, 0, 0, 0, 0);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
};
es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase.prototype.testDepthAttachment = function() {
var renderbufferID = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbufferID);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, 0, 0, 0, 0, 0, 0);
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);
gl.deleteRenderbuffer(renderbufferID);
};
/**
* @constructor
* @extends {es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase = function(name, description) {
es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase.call(this, name, description);
};
setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase, es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase);
es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase.prototype.testColorAttachment = function() {
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, textureID);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, 0);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, 0, 0, 0, 0, 0, 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
};
es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase.prototype.testDepthAttachment = function() {
var textureID = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, textureID);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, textureID, 0);
checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, 0, 0, 0, 0, 0, 0);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, null, 0);
gl.deleteTexture(textureID);
};
/**
* @constructor
* @extends {es3fApiCase.ApiCase}
* @param {string} name
* @param {string} description
*/
es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase = function(name, description) {
es3fApiCase.ApiCase.call(this, name, description, gl);
};
setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase, es3fApiCase.ApiCase);
es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase.prototype.test = function() {
};
/**
* @constructor
* @extends {tcuTestCase.DeqpTest}
*/
es3fFboStateQueryTests.FboStateQueryTests = function() {
tcuTestCase.DeqpTest.call(this, 'fbo', 'Fbo State Query tests');
};
es3fFboStateQueryTests.FboStateQueryTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
es3fFboStateQueryTests.FboStateQueryTests.prototype.constructor = es3fFboStateQueryTests.FboStateQueryTests;
es3fFboStateQueryTests.FboStateQueryTests.prototype.init = function() {
var red = /** @type {number} */ (gl.getParameter(gl.RED_BITS));
var green = /** @type {number} */ (gl.getParameter(gl.GREEN_BITS));
var blue = /** @type {number} */ (gl.getParameter(gl.BLUE_BITS));
var alpha = /** @type {number} */ (gl.getParameter(gl.ALPHA_BITS));
es3fFboStateQueryTests.colorBits = [red, green, blue, alpha];
es3fFboStateQueryTests.depthBits = /** @type {number} */ (gl.getParameter(gl.DEPTH_BITS));
es3fFboStateQueryTests.stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
this.addChild(new es3fFboStateQueryTests.DefaultFramebufferCase('draw_framebuffer_default_framebuffer', 'default framebuffer', gl.DRAW_FRAMEBUFFER));
this.addChild(new es3fFboStateQueryTests.DefaultFramebufferCase('read_framebuffer_default_framebuffer', 'default framebuffer', gl.READ_FRAMEBUFFER));
this.addChild(new es3fFboStateQueryTests.AttachmentObjectCase('framebuffer_attachment_object', 'FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE and FRAMEBUFFER_ATTACHMENT_OBJECT_NAME'));
this.addChild(new es3fFboStateQueryTests.AttachmentTextureLevelCase('framebuffer_attachment_texture_level', 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL'));
this.addChild(new es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase('framebuffer_attachment_texture_cube_map_face', 'FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE'));
this.addChild(new es3fFboStateQueryTests.AttachmentTextureLayerCase('framebuffer_attachment_texture_layer', 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER'));
this.addChild(new es3fFboStateQueryTests.AttachmentTextureColorCodingCase('framebuffer_attachment_color_encoding', 'FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING'));
this.addChild(new es3fFboStateQueryTests.AttachmentTextureComponentTypeCase('framebuffer_attachment_component_type', 'FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE'));
this.addChild(new es3fFboStateQueryTests.AttachmentSizeInitialCase('framebuffer_attachment_x_size_initial', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
this.addChild(new es3fFboStateQueryTests.AttachmentSizeRboCase('framebuffer_attachment_x_size_rbo', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
this.addChild(new es3fFboStateQueryTests.AttachmentSizeTextureCase('framebuffer_attachment_x_size_texture', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase('framebuffer_unspecified_attachment_color_encoding', 'FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING'));
this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase('framebuffer_unspecified_attachment_component_type', 'FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE'));
this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase('framebuffer_unspecified_attachment_x_size_rbo', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase('framebuffer_unspecified_attachment_x_size_texture', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
};
/**
* Run test
* @param {WebGL2RenderingContext} context
*/
es3fFboStateQueryTests.run = function(context) {
gl = context;
//Set up Test Root parameters
var state = tcuTestCase.runner;
state.setRoot(new es3fFboStateQueryTests.FboStateQueryTests());
//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 es3fFboStateQueryTests.run tests', false);
tcuTestCase.runner.terminate();
}
};
});