diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboColorbufferTests.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboColorbufferTests.js')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboColorbufferTests.js | 1049 |
1 files changed, 1049 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboColorbufferTests.js b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboColorbufferTests.js new file mode 100644 index 0000000000..deb692a7b6 --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboColorbufferTests.js @@ -0,0 +1,1049 @@ +/*------------------------------------------------------------------------- + * 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.es3fFboColorbufferTests'); +goog.require('framework.common.tcuSurface'); +goog.require('framework.common.tcuTestCase'); +goog.require('framework.common.tcuTexture'); +goog.require('framework.opengl.gluTextureUtil'); +goog.require('functional.gles3.es3fFboTestCase'); +goog.require('functional.gles3.es3fFboTestUtil'); +goog.require('framework.common.tcuRGBA'); +goog.require('framework.delibs.debase.deRandom'); +goog.require('framework.common.tcuImageCompare'); +goog.require('framework.common.tcuTextureUtil'); +goog.require('framework.referencerenderer.rrUtil'); +goog.require('framework.delibs.debase.deMath'); +goog.require('framework.opengl.gluShaderUtil'); + +goog.scope(function() { +var es3fFboColorbufferTests = functional.gles3.es3fFboColorbufferTests; +var es3fFboTestCase = functional.gles3.es3fFboTestCase; +var es3fFboTestUtil = functional.gles3.es3fFboTestUtil; +var tcuTestCase = framework.common.tcuTestCase; +var tcuSurface = framework.common.tcuSurface; +var tcuTexture = framework.common.tcuTexture; +var gluTextureUtil = framework.opengl.gluTextureUtil; +var tcuRGBA = framework.common.tcuRGBA; +var deRandom = framework.delibs.debase.deRandom; +var tcuImageCompare = framework.common.tcuImageCompare; +var tcuTextureUtil = framework.common.tcuTextureUtil; +var rrUtil = framework.referencerenderer.rrUtil; +var deMath = framework.delibs.debase.deMath; +var gluShaderUtil = framework.opengl.gluShaderUtil; + +/** @type {WebGL2RenderingContext} */ var gl; + +/** @const*/ var MIN_THRESHOLD = new tcuRGBA.RGBA([12, 12, 12, 12]); + +let canvasWH = 256; +let texPotSize = [128, 128, 5]; +let texNpotSizeA = [129, 117]; +let texNpotSizeB = [99, 128]; +if (tcuTestCase.isQuickMode()) { + canvasWH = 32; + texPotSize = [16, 16, 5]; + texNpotSizeA = [12, 11]; + texNpotSizeB = [9, 16]; +} +const texW = texPotSize[0]; +const texH = texPotSize[1]; + +var setParentClass = function(child, parent) { + child.prototype = Object.create(parent.prototype); + child.prototype.constructor = child; +}; + +/** + * @param {deRandom.Random} rnd + * @param {Array<number>} minVal + * @param {Array<number>} maxVal + * @return {Array<number>} + */ +es3fFboColorbufferTests.randomVector = function(rnd, minVal, maxVal) { + var res = []; + for (var ndx = 0; ndx < minVal.length; ndx++) + res[ndx] = rnd.getFloat(minVal[ndx], maxVal[ndx]); + return res; +}; + +/** + * @param {deRandom.Random} rnd + * @return {Array<number>} + */ +es3fFboColorbufferTests.generateRandomColor = function(rnd) { + var retVal = []; + + for (var i = 0; i < 3; ++i) + retVal[i] = rnd.getFloat(); + retVal[3] = 1; + + return retVal; +}; + +/** + * @constructor + * @extends {es3fFboTestCase.FboTestCase} + * @param {string} name + * @param {string} desc + * @param {number} format + */ +es3fFboColorbufferTests.FboColorbufferCase = function(name, desc, format) { + es3fFboTestCase.FboTestCase.call(this, name, desc); + this.m_format = format; +}; + +setParentClass(es3fFboColorbufferTests.FboColorbufferCase, es3fFboTestCase.FboTestCase); + +/** + * @param {tcuSurface.Surface} reference + * @param {tcuSurface.Surface} result + * @return {boolean} + */ +es3fFboColorbufferTests.FboColorbufferCase.prototype.compare = function(reference, result) { + /** @type {tcuRGBA.RGBA} */ var threshold = tcuRGBA.max(es3fFboTestUtil.getFormatThreshold(this.m_format), MIN_THRESHOLD); + + bufferedLogToConsole('Comparing images, threshold: ' + threshold); + + return tcuImageCompare.bilinearCompare('Result', 'Image comparison result', reference.getAccess(), result.getAccess(), threshold); + }; + +/** + * Deinit. Clear some GL state variables + */ +es3fFboColorbufferTests.FboColorbufferCase.prototype.deinit = function() { + // Texture state + { + // Only TEXTURE0 and TEXTURE1 are used in this test + var numTexUnits = 2; + + for (var ndx = 0; ndx < numTexUnits; ndx++) { + gl.activeTexture(gl.TEXTURE0 + ndx); + + // Reset 2D texture + gl.bindTexture(gl.TEXTURE_2D, null); + + // Reset cube map texture + gl.bindTexture(gl.TEXTURE_CUBE_MAP, null); + + // Reset 2D array texture + gl.bindTexture(gl.TEXTURE_2D_ARRAY, null); + + // Reset 3D texture + gl.bindTexture(gl.TEXTURE_3D, null); + } + + gl.activeTexture(gl.TEXTURE0); + } + + // Pixel operations + { + gl.disable(gl.SCISSOR_TEST); + gl.disable(gl.BLEND); + } + + // Framebuffer control + { + gl.clearColor(0.0, 0.0, 0.0, 0.0); + } + }; + +/** + * @constructor + * @extends {es3fFboColorbufferTests.FboColorbufferCase} + * @param {string} name + * @param {string} desc + * @param {number} format + * @param {number} width + * @param {number} height + */ +es3fFboColorbufferTests.FboColorClearCase = function(name, desc, format, width, height) { + es3fFboColorbufferTests.FboColorbufferCase.call(this, name, desc, format); + this.m_width = width; + this.m_height = height; +}; + +setParentClass(es3fFboColorbufferTests.FboColorClearCase, es3fFboColorbufferTests.FboColorbufferCase); + +es3fFboColorbufferTests.FboColorClearCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + }; + +es3fFboColorbufferTests.FboColorClearCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var fboFormat = gluTextureUtil.mapGLInternalFormat(this.m_format); + var fmtClass = tcuTexture.getTextureChannelClass(fboFormat.type); + var fmtInfo = tcuTextureUtil.getTextureFormatInfo(fboFormat); + var rnd = new deRandom.Random(17); + var numClears = 16; + + var fbo = ctx.createFramebuffer(); + var rbo = ctx.createRenderbuffer(); + + ctx.bindRenderbuffer(gl.RENDERBUFFER, rbo); + ctx.renderbufferStorage(gl.RENDERBUFFER, this.m_format, this.m_width, this.m_height); + this.checkError(); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + ctx.viewport(0, 0, this.m_width, this.m_height); + + // Initialize to transparent black. + switch (fmtClass) { + case tcuTexture.TextureChannelClass.FLOATING_POINT: + case tcuTexture.TextureChannelClass.SIGNED_FIXED_POINT: + case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT: + ctx.clearBufferfv(gl.COLOR, 0, new Float32Array(4)); + break; + + case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER: + ctx.clearBufferuiv(gl.COLOR, 0, new Uint32Array(4)); + break; + + case tcuTexture.TextureChannelClass.SIGNED_INTEGER: + ctx.clearBufferiv(gl.COLOR, 0, new Int32Array(4)); + break; + + default: + throw new Error('Invalid channelclass ' + fmtClass); + } + + // Do random scissored clears. + ctx.enable(gl.SCISSOR_TEST); + for (var ndx = 0; ndx < numClears; ndx++) { + var x = rnd.getInt(0, this.m_width - 1); + var y = rnd.getInt(0, this.m_height - 1); + var w = rnd.getInt(1, this.m_width - x); + var h = rnd.getInt(1, this.m_height - y); + var color = es3fFboColorbufferTests.randomVector(rnd, fmtInfo.valueMin, fmtInfo.valueMax); + + ctx.scissor(x, y, w, h); + + switch (fmtClass) { + case tcuTexture.TextureChannelClass.FLOATING_POINT: + case tcuTexture.TextureChannelClass.SIGNED_FIXED_POINT: + case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT: + ctx.clearBufferfv(gl.COLOR, 0, color); + break; + + case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER: + ctx.clearBufferuiv(gl.COLOR, 0, color); + break; + + case tcuTexture.TextureChannelClass.SIGNED_INTEGER: + ctx.clearBufferiv(gl.COLOR, 0, color); + break; + + default: + throw new Error('Invalid channelclass ' + fmtClass); + } + } + + // Read results from renderbuffer. + this.readPixelsUsingFormat(dst, 0, 0, this.m_width, this.m_height, fboFormat, fmtInfo.lookupScale, fmtInfo.lookupBias); + this.checkError(); + }; + +/** + * @constructor + * @extends {es3fFboColorbufferTests.FboColorbufferCase} + * @param {string} name + * @param {string} desc + * @param {number} tex0Fmt + * @param {Array<number>} tex0Size + * @param {number} tex1Fmt + * @param {Array<number>} tex1Size + */ +es3fFboColorbufferTests.FboColorMultiTex2DCase = function(name, desc, tex0Fmt, tex0Size, tex1Fmt, tex1Size) { + es3fFboColorbufferTests.FboColorbufferCase.call(this, name, desc, tex0Fmt); + this.m_tex0Fmt = tex0Fmt; + this.m_tex0Size = tex0Size; + this.m_tex1Fmt = tex1Fmt; + this.m_tex1Size = tex1Size; +}; + +setParentClass(es3fFboColorbufferTests.FboColorMultiTex2DCase, es3fFboColorbufferTests.FboColorbufferCase); + +es3fFboColorbufferTests.FboColorMultiTex2DCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_tex0Fmt); + this.checkFormatSupport(this.m_tex1Fmt); + return true; // No exception thrown + }; + +es3fFboColorbufferTests.FboColorMultiTex2DCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var texFmt0 = gluTextureUtil.mapGLInternalFormat(this.m_tex0Fmt); + var texFmt1 = gluTextureUtil.mapGLInternalFormat(this.m_tex1Fmt); + var fmtInfo0 = tcuTextureUtil.getTextureFormatInfo(texFmt0); + var fmtInfo1 = tcuTextureUtil.getTextureFormatInfo(texFmt1); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var texToFbo0Shader = new es3fFboTestUtil.Texture2DShader( + [gluShaderUtil.DataType.SAMPLER_2D], es3fFboTestUtil.getFragmentOutputType(texFmt0), + deMath.subtract(fmtInfo0.valueMax, fmtInfo0.valueMin), + fmtInfo0.valueMin); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var texToFbo1Shader = new es3fFboTestUtil.Texture2DShader( + [gluShaderUtil.DataType.SAMPLER_2D], es3fFboTestUtil.getFragmentOutputType(texFmt1), + deMath.subtract(fmtInfo1.valueMax, fmtInfo1.valueMin), + fmtInfo1.valueMin); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var multiTexShader = new es3fFboTestUtil.Texture2DShader( + [gluTextureUtil.getSampler2DType(texFmt0), gluTextureUtil.getSampler2DType(texFmt1)], + gluShaderUtil.DataType.FLOAT_VEC4); + + var texToFbo0ShaderID = ctx.createProgram(texToFbo0Shader); + var texToFbo1ShaderID = ctx.createProgram(texToFbo1Shader); + var multiTexShaderID = ctx.createProgram(multiTexShader); + + // Setup shaders + multiTexShader.setTexScaleBias(0, deMath.scale(fmtInfo0.lookupScale, 0.5), deMath.scale(fmtInfo0.lookupBias, 0.5)); + multiTexShader.setTexScaleBias(1, deMath.scale(fmtInfo1.lookupScale, 0.5), deMath.scale(fmtInfo1.lookupBias, 0.5)); + texToFbo0Shader.setUniforms(ctx, texToFbo0ShaderID); + texToFbo1Shader.setUniforms(ctx, texToFbo1ShaderID); + multiTexShader.setUniforms(ctx, multiTexShaderID); + + var fbo0 = ctx.createFramebuffer(); + var fbo1 = ctx.createFramebuffer(); + var tex0 = ctx.createTexture(); + var tex1 = ctx.createTexture(); + + for (var ndx = 0; ndx < 2; ndx++) { + var transferFmt = gluTextureUtil.getTransferFormat(ndx ? texFmt1 : texFmt0); + var format = ndx ? this.m_tex1Fmt : this.m_tex0Fmt; + var isFilterable = gluTextureUtil.isGLInternalColorFormatFilterable(format); + var size = ndx ? this.m_tex1Size : this.m_tex0Size; + var fbo = ndx ? fbo1 : fbo0; + var tex = ndx ? tex1 : tex0; + + ctx.bindTexture(gl.TEXTURE_2D, tex); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, isFilterable ? gl.LINEAR : gl.NEAREST); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, isFilterable ? gl.LINEAR : gl.NEAREST); + ctx.texImage2D(gl.TEXTURE_2D, 0, format, size[0], size[1], 0, transferFmt.format, transferFmt.dataType, null); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + } + + // Render textures to both framebuffers. + for (var ndx = 0; ndx < 2; ndx++) { + var format = gl.RGBA; + var dataType = gl.UNSIGNED_BYTE; + var tmpTex; + var fbo = ndx ? fbo1 : fbo0; + var viewport = ndx ? this.m_tex1Size : this.m_tex0Size; + var data = new tcuTexture.TextureLevel(gluTextureUtil.mapGLTransferFormat(format, dataType), texW, texH, 1); + + if (ndx == 0) + tcuTextureUtil.fillWithComponentGradients(data.getAccess(), [0, 0, 0, 0], [1, 1, 1, 1]); + else + tcuTextureUtil.fillWithGrid(data.getAccess(), 8, [0.2, 0.7, 0.1, 1.0], [0.7, 0.1, 0.5, 0.8]); + + tmpTex = ctx.createTexture(); + ctx.bindTexture(gl.TEXTURE_2D, tmpTex); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + ctx.texImage2D(gl.TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr()); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.viewport(0, 0, viewport[0], viewport[1]); + rrUtil.drawQuad(ctx, ndx ? texToFbo1ShaderID : texToFbo0ShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + } + + // Render to framebuffer. + ctx.bindFramebuffer(gl.FRAMEBUFFER, null); + ctx.viewport(0, 0, ctx.getWidth(), ctx.getHeight()); + ctx.activeTexture(gl.TEXTURE0); + ctx.bindTexture(gl.TEXTURE_2D, tex0); + ctx.activeTexture(gl.TEXTURE1); + ctx.bindTexture(gl.TEXTURE_2D, tex1); + rrUtil.drawQuad(ctx, multiTexShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + + this.readPixels(dst, 0, 0, ctx.getWidth(), ctx.getHeight()); + }; + +/** + * @constructor + * @extends {es3fFboColorbufferTests.FboColorbufferCase} + * @param {string} name + * @param {string} desc + * @param {number} texFmt + * @param {Array<number>} texSize + */ +es3fFboColorbufferTests.FboColorTexCubeCase = function(name, desc, texFmt, texSize) { + es3fFboColorbufferTests.FboColorbufferCase.call(this, name, desc, texFmt); + this.m_texSize = texSize; +}; + +setParentClass(es3fFboColorbufferTests.FboColorTexCubeCase, es3fFboColorbufferTests.FboColorbufferCase); + +es3fFboColorbufferTests.FboColorTexCubeCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + }; + +es3fFboColorbufferTests.FboColorTexCubeCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var texFmt = gluTextureUtil.mapGLInternalFormat(this.m_format); + var fmtInfo = tcuTextureUtil.getTextureFormatInfo(texFmt); + + var cubeGLFaces = [ + gl.TEXTURE_CUBE_MAP_POSITIVE_X, + gl.TEXTURE_CUBE_MAP_POSITIVE_Y, + gl.TEXTURE_CUBE_MAP_POSITIVE_Z, + gl.TEXTURE_CUBE_MAP_NEGATIVE_X, + gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, + gl.TEXTURE_CUBE_MAP_NEGATIVE_Z + ]; + + var cubeTexFaces = [ + tcuTexture.CubeFace.CUBEFACE_POSITIVE_X, + tcuTexture.CubeFace.CUBEFACE_POSITIVE_Y, + tcuTexture.CubeFace.CUBEFACE_POSITIVE_Z, + tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X, + tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Y, + tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Z + ]; + + var rnd = new deRandom.Random(21); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var texToFboShader = new es3fFboTestUtil.Texture2DShader( + [gluShaderUtil.DataType.SAMPLER_2D], es3fFboTestUtil.getFragmentOutputType(texFmt), + deMath.subtract(fmtInfo.valueMax, fmtInfo.valueMin), + fmtInfo.valueMin); + + /** @type {es3fFboTestUtil.TextureCubeShader} */ + var cubeTexShader = new es3fFboTestUtil.TextureCubeShader( + gluTextureUtil.getSamplerCubeType(texFmt), + gluShaderUtil.DataType.FLOAT_VEC4); + + var texToFboShaderID = ctx.createProgram(texToFboShader); + var cubeTexShaderID = ctx.createProgram(cubeTexShader); + + // Setup shaders + texToFboShader.setUniforms(ctx, texToFboShaderID); + cubeTexShader.setTexScaleBias(fmtInfo.lookupScale, fmtInfo.lookupBias); + + // Framebuffers. + var fbos = []; + var tex; + + var transferFmt = gluTextureUtil.getTransferFormat(texFmt); + var isFilterable = gluTextureUtil.isGLInternalColorFormatFilterable(this.m_format); + var size = this.m_texSize; + + tex = ctx.createTexture(); + + ctx.bindTexture(gl.TEXTURE_CUBE_MAP, tex); + ctx.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, isFilterable ? gl.LINEAR : gl.NEAREST); + ctx.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, isFilterable ? gl.LINEAR : gl.NEAREST); + + // Generate an image and FBO for each cube face + for (var ndx = 0; ndx < cubeGLFaces.length; ndx++) + ctx.texImage2D(cubeGLFaces[ndx], 0, this.m_format, size[0], size[1], 0, transferFmt.format, transferFmt.dataType, null); + this.checkError(); + + for (var ndx = 0; ndx < cubeGLFaces.length; ndx++) { + var layerFbo = ctx.createFramebuffer(); + ctx.bindFramebuffer(gl.FRAMEBUFFER, layerFbo); + ctx.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, cubeGLFaces[ndx], tex, 0); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + fbos.push(layerFbo); + } + + // Render test images to random cube faces + var order = []; + + for (var n = 0; n < fbos.length; n++) + order.push(n); + rnd.shuffle(order); + + for (var ndx = 0; ndx < 4; ndx++) { + var face = order[ndx]; + var format = gl.RGBA; + var dataType = gl.UNSIGNED_BYTE; + var tmpTex; + var fbo = fbos[face]; + var viewport = this.m_texSize; + var data = new tcuTexture.TextureLevel(gluTextureUtil.mapGLTransferFormat(format, dataType), texW, texH, 1); + + tcuTextureUtil.fillWithGrid(data.getAccess(), 8, es3fFboColorbufferTests.generateRandomColor(rnd), [0, 0, 0, 0]); + + tmpTex = ctx.createTexture(); + ctx.bindTexture(gl.TEXTURE_2D, tmpTex); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + ctx.texImage2D(gl.TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr()); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.viewport(0, 0, viewport[0], viewport[1]); + rrUtil.drawQuad(ctx, texToFboShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + this.checkError(); + + // Render to framebuffer + var p0 = [(ndx % 2) - 1.0, Math.floor(ndx / 2) - 1.0, 0.0]; + var p1 = deMath.add(p0, [1.0, 1.0, 0.0]); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, null); + ctx.viewport(0, 0, ctx.getWidth(), ctx.getHeight()); + + ctx.activeTexture(gl.TEXTURE0); + ctx.bindTexture(gl.TEXTURE_CUBE_MAP, tex); + + cubeTexShader.setFace(cubeTexFaces[face]); + cubeTexShader.setUniforms(ctx, cubeTexShaderID); + + rrUtil.drawQuad(ctx, cubeTexShaderID, p0, p1); + this.checkError(); + } + + this.readPixels(dst, 0, 0, ctx.getWidth(), ctx.getHeight()); + }; + +/** + * @constructor + * @extends {es3fFboColorbufferTests.FboColorbufferCase} + * @param {string} name + * @param {string} desc + * @param {number} texFmt + * @param {Array<number>} texSize + */ +es3fFboColorbufferTests.FboColorTex2DArrayCase = function(name, desc, texFmt, texSize) { + es3fFboColorbufferTests.FboColorbufferCase.call(this, name, desc, texFmt); + this.m_texSize = texSize; +}; + +setParentClass(es3fFboColorbufferTests.FboColorTex2DArrayCase, es3fFboColorbufferTests.FboColorbufferCase); + +es3fFboColorbufferTests.FboColorTex2DArrayCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + }; + + es3fFboColorbufferTests.FboColorTex2DArrayCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var texFmt = gluTextureUtil.mapGLInternalFormat(this.m_format); + var fmtInfo = tcuTextureUtil.getTextureFormatInfo(texFmt); + var rnd = new deRandom.Random(100); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var texToFboShader = new es3fFboTestUtil.Texture2DShader( + [gluShaderUtil.DataType.SAMPLER_2D], es3fFboTestUtil.getFragmentOutputType(texFmt), + deMath.subtract(fmtInfo.valueMax, fmtInfo.valueMin), + fmtInfo.valueMin); + + /** @type {es3fFboTestUtil.Texture2DArrayShader} */ + var arrayTexShader = new es3fFboTestUtil.Texture2DArrayShader( + gluTextureUtil.getSampler2DArrayType(texFmt), + gluShaderUtil.DataType.FLOAT_VEC4); + + var texToFboShaderID = ctx.createProgram(texToFboShader); + var arrayTexShaderID = ctx.createProgram(arrayTexShader); + + // Setup textures + texToFboShader.setUniforms(ctx, texToFboShaderID); + arrayTexShader.setTexScaleBias(fmtInfo.lookupScale, fmtInfo.lookupBias); + + // Framebuffers. + var fbos = []; + var tex; + + var transferFmt = gluTextureUtil.getTransferFormat(texFmt); + var isFilterable = gluTextureUtil.isGLInternalColorFormatFilterable(this.m_format); + var size = this.m_texSize; + + tex = ctx.createTexture(); + + ctx.bindTexture(gl.TEXTURE_2D_ARRAY, tex); + ctx.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, isFilterable ? gl.LINEAR : gl.NEAREST); + ctx.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, isFilterable ? gl.LINEAR : gl.NEAREST); + ctx.texImage3D(gl.TEXTURE_2D_ARRAY, 0, this.m_format, size[0], size[1], size[2], 0, transferFmt.format, transferFmt.dataType, null); + + // Generate an FBO for each layer + for (var ndx = 0; ndx < this.m_texSize[2]; ndx++) { + var layerFbo = ctx.createFramebuffer(); + ctx.bindFramebuffer(gl.FRAMEBUFFER, layerFbo); + ctx.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex, 0, ndx); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + fbos.push(layerFbo); + } + + // Render test images to random texture layers + var order = []; + + for (var n = 0; n < fbos.length; n++) + order.push(n); + rnd.shuffle(order); + + for (var ndx = 0; ndx < 4; ndx++) { + var layer = order[ndx]; + var format = gl.RGBA; + var dataType = gl.UNSIGNED_BYTE; + var fbo = fbos[layer]; + var viewport = this.m_texSize; + var data = new tcuTexture.TextureLevel(gluTextureUtil.mapGLTransferFormat(format, dataType), texW, texH, 1); + + tcuTextureUtil.fillWithGrid(data.getAccess(), 8, es3fFboColorbufferTests.generateRandomColor(rnd), [0, 0, 0, 0]); + + var tmpTex = ctx.createTexture(); + ctx.bindTexture(gl.TEXTURE_2D, tmpTex); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + ctx.texImage2D(gl.TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr()); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.viewport(0, 0, viewport[0], viewport[1]); + rrUtil.drawQuad(ctx, texToFboShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + this.checkError(); + + // Render to framebuffer + var p0 = [(ndx % 2) - 1.0, Math.floor(ndx / 2) - 1.0, 0.0]; + var p1 = deMath.add(p0, [1.0, 1.0, 0.0]); + debug('Layer:' + layer + ' rectangle: ' + p0 + ' ' + p1); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, null); + ctx.viewport(0, 0, ctx.getWidth(), ctx.getHeight()); + + ctx.activeTexture(gl.TEXTURE0); + ctx.bindTexture(gl.TEXTURE_2D_ARRAY, tex); + + arrayTexShader.setLayer(layer); + arrayTexShader.setUniforms(ctx, arrayTexShaderID); + + rrUtil.drawQuad(ctx, arrayTexShaderID, p0, p1); + this.checkError(); + } + + this.readPixels(dst, 0, 0, ctx.getWidth(), ctx.getHeight()); + }; + +/** + * @constructor + * @extends {es3fFboColorbufferTests.FboColorbufferCase} + * @param {string} name + * @param {string} desc + * @param {number} texFmt + * @param {Array<number>} texSize + */ +es3fFboColorbufferTests.FboColorTex3DCase = function(name, desc, texFmt, texSize) { + es3fFboColorbufferTests.FboColorbufferCase.call(this, name, desc, texFmt); + this.m_texSize = texSize; +}; + +setParentClass(es3fFboColorbufferTests.FboColorTex3DCase, es3fFboColorbufferTests.FboColorbufferCase); + +es3fFboColorbufferTests.FboColorTex3DCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + }; + + es3fFboColorbufferTests.FboColorTex3DCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var texFmt = gluTextureUtil.mapGLInternalFormat(this.m_format); + var fmtInfo = tcuTextureUtil.getTextureFormatInfo(texFmt); + var rnd = new deRandom.Random(100); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var texToFboShader = new es3fFboTestUtil.Texture2DShader( + [gluShaderUtil.DataType.SAMPLER_2D], es3fFboTestUtil.getFragmentOutputType(texFmt), + deMath.subtract(fmtInfo.valueMax, fmtInfo.valueMin), + fmtInfo.valueMin); + + /** @type {es3fFboTestUtil.Texture3DShader} */ + var tdTexShader = new es3fFboTestUtil.Texture3DShader( + gluTextureUtil.getSampler3D(texFmt), + gluShaderUtil.DataType.FLOAT_VEC4); + + var texToFboShaderID = ctx.createProgram(texToFboShader); + var tdTexShaderID = ctx.createProgram(tdTexShader); + + // Setup textures + texToFboShader.setUniforms(ctx, texToFboShaderID); + tdTexShader.setTexScaleBias(fmtInfo.lookupScale, fmtInfo.lookupBias); + + // Framebuffers. + var fbos = []; + var tex;{ + var transferFmt = gluTextureUtil.getTransferFormat(texFmt); + var size = this.m_texSize; + + tex = ctx.createTexture(); + + ctx.bindTexture(gl.TEXTURE_3D, tex); + ctx.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + ctx.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + ctx.texImage3D(gl.TEXTURE_3D, 0, this.m_format, size[0], size[1], size[2], 0, transferFmt.format, transferFmt.dataType, null); + + // Generate an FBO for each layer + for (var ndx = 0; ndx < this.m_texSize[2]; ndx++) { + var layerFbo = ctx.createFramebuffer(); + ctx.bindFramebuffer(gl.FRAMEBUFFER, layerFbo); + ctx.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex, 0, ndx); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + fbos.push(layerFbo); + } + } + + // Render test images to random texture layers + var order = []; + + for (var n = 0; n < fbos.length; n++) + order.push(n); + rnd.shuffle(order); + + for (var ndx = 0; ndx < 4; ndx++) { + var layer = order[ndx]; + var format = gl.RGBA; + var dataType = gl.UNSIGNED_BYTE; + var fbo = fbos[layer]; + var viewport = this.m_texSize; + var data = new tcuTexture.TextureLevel(gluTextureUtil.mapGLTransferFormat(format, dataType), texW, texH, 1); + + tcuTextureUtil.fillWithGrid(data.getAccess(), 8, es3fFboColorbufferTests.generateRandomColor(rnd), [0, 0, 0, 0]); + + var tmpTex = ctx.createTexture(); + ctx.bindTexture(gl.TEXTURE_2D, tmpTex); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + ctx.texImage2D(gl.TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr()); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.viewport(0, 0, viewport[0], viewport[1]); + rrUtil.drawQuad(ctx, texToFboShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + this.checkError(); + + // Render to framebuffer + var p0 = [(ndx % 2) - 1.0, Math.floor(ndx / 2) - 1.0, 0.0]; + var p1 = deMath.add(p0, [1.0, 1.0, 0.0]); + debug('Layer:' + layer + ' rectangle: ' + p0 + ' ' + p1); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, null); + ctx.viewport(0, 0, ctx.getWidth(), ctx.getHeight()); + + ctx.activeTexture(gl.TEXTURE0); + ctx.bindTexture(gl.TEXTURE_3D, tex); + + tdTexShader.setDepth(layer / (this.m_texSize[2] - 1)); + tdTexShader.setUniforms(ctx, tdTexShaderID); + + rrUtil.drawQuad(ctx, tdTexShaderID, p0, p1); + this.checkError(); + } + + this.readPixels(dst, 0, 0, ctx.getWidth(), ctx.getHeight()); +}; + +/** + * @constructor + * @extends {es3fFboColorbufferTests.FboColorbufferCase} + * @param {string} name + * @param {string} desc + * @param {number} format + * @param {Array<number>} size + * @param {number} funcRGB + * @param {number} funcAlpha + * @param {number} srcRGB + * @param {number} dstRGB + * @param {number} srcAlpha + * @param {number} dstAlpha + */ +es3fFboColorbufferTests.FboBlendCase = function(name, desc, format, size, funcRGB, funcAlpha, srcRGB, dstRGB, srcAlpha, dstAlpha) { + es3fFboColorbufferTests.FboColorbufferCase.call(this, name, desc, format); + this.m_size = size; + this.m_funcRGB = funcRGB; + this.m_funcAlpha = funcAlpha; + this.m_srcRGB = srcRGB; + this.m_dstRGB = dstRGB; + this.m_srcAlpha = srcAlpha; + this.m_dstAlpha = dstAlpha +}; + +setParentClass(es3fFboColorbufferTests.FboBlendCase, es3fFboColorbufferTests.FboColorbufferCase); + +es3fFboColorbufferTests.FboBlendCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + } + + es3fFboColorbufferTests.FboBlendCase.prototype.render = function(dst) { + // \note Assumes floating-point or fixed-point format. + var ctx = this.getCurrentContext(); + var fboFmt = gluTextureUtil.mapGLInternalFormat(this.m_format); + var fmtInfo = tcuTextureUtil.getTextureFormatInfo(fboFmt); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var texShader = new es3fFboTestUtil.Texture2DShader( + [gluShaderUtil.DataType.SAMPLER_2D], gluShaderUtil.DataType.FLOAT_VEC4); + + /** @type {es3fFboTestUtil.GradientShader} */ + var gradShader = new es3fFboTestUtil.GradientShader(gluShaderUtil.DataType.FLOAT_VEC4); + + var texShaderID = ctx.createProgram(texShader); + var gradShaderID = ctx.createProgram(gradShader); + + // Setup shaders + texShader.setUniforms (ctx, texShaderID); + gradShader.setGradient(ctx, gradShaderID, [0, 0, 0, 0], [1, 1, 1, 1]); + + var fbo = ctx.createFramebuffer(); + var rbo = ctx.createRenderbuffer(); + + ctx.bindRenderbuffer(gl.RENDERBUFFER, rbo); + ctx.renderbufferStorage(gl.RENDERBUFFER, this.m_format, this.m_size[0], this.m_size[1]); + this.checkError(); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + ctx.viewport(0, 0, this.m_size[0], this.m_size[1]); + + // Fill framebuffer with grid pattern. + var format = gl.RGBA; + var dataType = gl.UNSIGNED_BYTE; + var data = new tcuTexture.TextureLevel(gluTextureUtil.mapGLTransferFormat(format, dataType), texW, texH, 1); + + tcuTextureUtil.fillWithGrid(data.getAccess(), 8, [0.2, 0.7, 0.1, 1.0], [0.7, 0.1, 0.5, 0.8]); + + var gridTex = ctx.createTexture(); + ctx.bindTexture(gl.TEXTURE_2D, gridTex); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + ctx.texImage2D(gl.TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr()); + + rrUtil.drawQuad(ctx, texShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + this.checkError(); + + // Setup blend. + ctx.enable(gl.BLEND); + ctx.blendEquationSeparate(this.m_funcRGB, this.m_funcAlpha); + ctx.blendFuncSeparate(this.m_srcRGB, this.m_dstRGB, this.m_srcAlpha, this.m_dstAlpha); + + // Render gradient with blend. + rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + + es3fFboTestUtil.readPixels(ctx, dst, 0, 0, this.m_size[0], this.m_size[1], fboFmt, [1, 1, 1, 1], [0, 0, 0, 0]); + }; + +/** + * @constructor + * @extends {tcuTestCase.DeqpTest} + */ +es3fFboColorbufferTests.FboColorbufferTests = function() { + tcuTestCase.DeqpTest.call(this, 'color', 'Colorbuffer tests'); +}; + +setParentClass(es3fFboColorbufferTests.FboColorbufferTests, tcuTestCase.DeqpTest); + +es3fFboColorbufferTests.FboColorbufferTests.prototype.init = function() { + var colorFormats = [ + // RGBA formats + gl.RGBA32I, + gl.RGBA32UI, + gl.RGBA16I, + gl.RGBA16UI, + gl.RGBA8, + gl.RGBA8I, + gl.RGBA8UI, + gl.SRGB8_ALPHA8, + gl.RGB10_A2, + gl.RGB10_A2UI, + gl.RGBA4, + gl.RGB5_A1, + + // RGB formats + gl.RGB8, + gl.RGB565, + + // RG formats + gl.RG32I, + gl.RG32UI, + gl.RG16I, + gl.RG16UI, + gl.RG8, + gl.RG8I, + gl.RG8UI, + + // R formats + gl.R32I, + gl.R32UI, + gl.R16I, + gl.R16UI, + gl.R8, + gl.R8I, + gl.R8UI, + + // gl.EXT_color_buffer_float + gl.RGBA32F, + gl.RGBA16F, + gl.R11F_G11F_B10F, + gl.RG32F, + gl.RG16F, + gl.R32F, + gl.R16F, + + // gl.EXT_color_buffer_half_float is not exposed in WebGL 2.0. + // gl.RGB16F + ]; + + // .clear + var clearGroup = tcuTestCase.newTest("clear", "Color clears"); + this.addChild(clearGroup); + + for (var ndx = 0; ndx < colorFormats.length; ndx++) { + clearGroup.addChild(new es3fFboColorbufferTests.FboColorClearCase( + es3fFboTestUtil.getFormatName(colorFormats[ndx]), "", colorFormats[ndx], texNpotSizeA[0], texNpotSizeA[1])); + } + + var numGroups = 6; + + // .tex2d + var tex2DGroup = []; + for (var ii = 0; ii < numGroups; ++ii) { + tex2DGroup[ii] = tcuTestCase.newTest("tex2d", "Texture 2D tests"); + this.addChild(tex2DGroup[ii]); + } + for (var ndx = 0; ndx < colorFormats.length; ndx++) { + tex2DGroup[ndx % numGroups].addChild(new es3fFboColorbufferTests.FboColorMultiTex2DCase( + es3fFboTestUtil.getFormatName(colorFormats[ndx]), "", colorFormats[ndx], texNpotSizeA, colorFormats[ndx], texNpotSizeB)); + } + + // .texcube + var texCubeGroup = []; + for (var ii = 0; ii < numGroups; ++ii) { + texCubeGroup[ii] = tcuTestCase.newTest("texcube", "Texture cube map tests"); + this.addChild(texCubeGroup[ii]); + } + for (var ndx = 0; ndx < colorFormats.length; ndx++) { + texCubeGroup[ndx % numGroups].addChild(new es3fFboColorbufferTests.FboColorTexCubeCase( + es3fFboTestUtil.getFormatName(colorFormats[ndx]), "", colorFormats[ndx], texPotSize)); + } + + // .tex2darray + var tex2DArrayGroup = []; + for (var ii = 0; ii < numGroups; ++ii) { + tex2DArrayGroup[ii] = tcuTestCase.newTest("tex2darray", "Texture 2D array tests"); + this.addChild(tex2DArrayGroup[ii]); + } + for (var ndx = 0; ndx < colorFormats.length; ndx++) { + tex2DArrayGroup[ndx % numGroups].addChild(new es3fFboColorbufferTests.FboColorTex2DArrayCase( + es3fFboTestUtil.getFormatName(colorFormats[ndx]), "", colorFormats[ndx], texPotSize)); + } + + // .tex3d + var tex3DGroup = []; + for (var ii = 0; ii < numGroups; ++ii) { + tex3DGroup[ii] = tcuTestCase.newTest("tex3d", "Texture 3D tests"); + this.addChild(tex3DGroup[ii]); + } + for (var ndx = 0; ndx < colorFormats.length; ndx++) { + tex3DGroup[ndx % numGroups].addChild(new es3fFboColorbufferTests.FboColorTex3DCase( + es3fFboTestUtil.getFormatName(colorFormats[ndx]), "", colorFormats[ndx], texPotSize)); + } + + // .blend + var blendGroup = tcuTestCase.newTest("blend", "Blending tests"); + this.addChild(blendGroup); + + for (var ndx = 0; ndx < colorFormats.length; ndx++) { + var format = colorFormats[ndx]; + var texFmt = gluTextureUtil.mapGLInternalFormat(format); + var fmtClass = tcuTexture.getTextureChannelClass(texFmt.type); + var fmtName = es3fFboTestUtil.getFormatName(format); + + if (texFmt.type == tcuTexture.ChannelType.FLOAT || + fmtClass == tcuTexture.TextureChannelClass.SIGNED_INTEGER || + fmtClass == tcuTexture.TextureChannelClass.UNSIGNED_INTEGER) + continue; // Blending is not supported. + + blendGroup.addChild(new es3fFboColorbufferTests.FboBlendCase(fmtName + "_src_over", "", format, + texNpotSizeA, gl.FUNC_ADD, gl.FUNC_ADD, gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE)); + } +}; + +/** +* Run test +* @param {WebGL2RenderingContext} context +*/ +es3fFboColorbufferTests.run = function(context, range) { + gl = context; + + const canvas = gl.canvas; + canvas.width = canvasWH; + canvas.height = canvasWH; + + //Set up Test Root parameters + var state = tcuTestCase.runner; + state.setRoot(new es3fFboColorbufferTests.FboColorbufferTests()); + + //Set up name and description of this test series. + setCurrentTestName(state.testCases.fullName()); + description(state.testCases.getDescription()); + + try { + if (range) + state.setRange(range); + //Run test cases + tcuTestCase.runTestCases(); + } + catch (err) { + testFailedOptions('Failed to es3fFboColorbufferTests.run tests', false); + tcuTestCase.runner.terminate(); + } +}; + +}); |