/*------------------------------------------------------------------------- * 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.es3fTextureFormatTests'); goog.require('framework.common.tcuCompressedTexture'); goog.require('framework.common.tcuSurface'); goog.require('framework.common.tcuTestCase'); goog.require('framework.common.tcuTexture'); goog.require('framework.common.tcuTextureUtil'); goog.require('framework.delibs.debase.deMath'); goog.require('framework.delibs.debase.deRandom'); goog.require('framework.opengl.gluShaderUtil'); goog.require('framework.opengl.gluStrUtil'); goog.require('framework.opengl.gluTexture'); goog.require('framework.opengl.gluTextureUtil'); goog.require('modules.shared.glsTextureTestUtil'); goog.scope(function() { var es3fTextureFormatTests = functional.gles3.es3fTextureFormatTests; var gluShaderUtil = framework.opengl.gluShaderUtil; var deRandom = framework.delibs.debase.deRandom; var tcuTestCase = framework.common.tcuTestCase; var tcuSurface = framework.common.tcuSurface; var gluTexture = framework.opengl.gluTexture; var gluTextureUtil = framework.opengl.gluTextureUtil; var tcuTexture = framework.common.tcuTexture; var glsTextureTestUtil = modules.shared.glsTextureTestUtil; var tcuTextureUtil = framework.common.tcuTextureUtil; var gluStrUtil = framework.opengl.gluStrUtil; var deMath = framework.delibs.debase.deMath; var tcuCompressedTexture = framework.common.tcuCompressedTexture; /** @type {WebGL2RenderingContext} */ var gl; var DE_ASSERT = function(x) { if (!x) throw new Error('Assert failed'); }; es3fTextureFormatTests.version = '300 es'; es3fTextureFormatTests.testDescription = function() { var test = tcuTestCase.runner.currentTest; return test.description; }; es3fTextureFormatTests.setParentClass = function(child, parent) { child.prototype = Object.create(parent.prototype); child.prototype.constructor = child; }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fTextureFormatTests.Texture2DFormatCase = function(descriptor) { tcuTestCase.DeqpTest.call(this, descriptor.name, descriptor.description); this.m_format = descriptor.format; this.m_dataType = descriptor.dataType; this.m_width = descriptor.width; this.m_height = descriptor.height; this.m_renderer = new glsTextureTestUtil.TextureRenderer(es3fTextureFormatTests.version, gluShaderUtil.precision.PRECISION_HIGHP); }; es3fTextureFormatTests.setParentClass(es3fTextureFormatTests.Texture2DFormatCase, tcuTestCase.DeqpTest); es3fTextureFormatTests.Texture2DFormatCase.prototype.init = function() { /*tcu::TextureFormat*/ var fmt = this.m_dataType ? gluTextureUtil.mapGLTransferFormat(this.m_format, this.m_dataType) : gluTextureUtil.mapGLInternalFormat(this.m_format); /*tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(fmt); /* TODO : Port std::ostringstream fmtName; if (m_dataType) fmtName << glu::getPixelFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType); else fmtName << glu::getPixelFormatStr(m_format); log << TestLog::Message << "2D texture, " << fmtName.str() << ", " << m_width << "x" << m_height << ",\n fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient" << TestLog::EndMessage; */ this.m_texture = this.m_dataType ? gluTexture.texture2DFromFormat(gl, this.m_format, this.m_dataType, this.m_width, this.m_height) : // Implicit internal format. gluTexture.texture2DFromInternalFormat(gl, this.m_format, this.m_width, this.m_height); // Explicit internal format. // Fill level 0. this.m_texture.getRefTexture().allocLevel(0); tcuTextureUtil.fillWithComponentGradients(this.m_texture.getRefTexture().getLevel(0), spec.valueMin, spec.valueMax); }; es3fTextureFormatTests.Texture2DFormatCase.prototype.deinit = function() { /* TODO: Implement */ }; es3fTextureFormatTests.Texture2DFormatCase.prototype.iterate = function() { /* TODO: Implement */ var viewport = new glsTextureTestUtil.RandomViewport(document.getElementById('canvas'), this.m_width, this.m_height/*, deStringHash(getName())*/); /* tcu::Surface */ var renderedFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* tcu::Surface */ var referenceFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* TODO: Implement // tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); */ var threshold = [3, 3, 3, 3]; var renderParams = new glsTextureTestUtil.ReferenceParams(glsTextureTestUtil.textureType.TEXTURETYPE_2D); /* tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(this.m_texture.getRefTexture().getFormat()); /** @const */ var wrapS = gl.CLAMP_TO_EDGE; /** @const */ var wrapT = gl.CLAMP_TO_EDGE; /** @const */ var minFilter = gl.NEAREST; /** @const */ var magFilter = gl.NEAREST; renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; renderParams.samplerType = glsTextureTestUtil.getSamplerType(this.m_texture.getRefTexture().getFormat()); renderParams.sampler = new tcuTexture.Sampler(tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.FilterMode.NEAREST, tcuTexture.FilterMode.NEAREST); renderParams.colorScale = spec.lookupScale; renderParams.colorBias = spec.lookupBias; var texCoord = glsTextureTestUtil.computeQuadTexCoord2D([0, 0], [1, 1]); // log << TestLog::Message << "Texture parameters:" // << "\n WRAP_S = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_S, wrapS) // << "\n WRAP_T = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_T, wrapT) // << "\n MIN_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MIN_FILTER, minFilter) // << "\n MAG_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MAG_FILTER, magFilter) // << TestLog::EndMessage; // Setup base viewport. gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); // Upload texture data to GL. this.m_texture.upload(); // Bind to unit 0. gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, this.m_texture.getGLTexture()); // Setup nearest neighbor filtering and clamp-to-edge. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter); // // Draw. this.m_renderer.renderQuad(0, texCoord, renderParams); renderedFrame.readViewport(gl, viewport); // // Compute reference. glsTextureTestUtil.sampleTexture2D(new glsTextureTestUtil.SurfaceAccess(referenceFrame, undefined /*m_renderCtx.getRenderTarget().getPixelFormat()*/), this.m_texture.getRefTexture(), texCoord, renderParams); // Compare and log. var isOk = glsTextureTestUtil.compareImages(referenceFrame, renderedFrame, threshold); assertMsgOptions(isOk, es3fTextureFormatTests.testDescription(), true, false); return tcuTestCase.IterateResult.STOP; }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fTextureFormatTests.TextureCubeFormatCase = function(descriptor) { tcuTestCase.DeqpTest.call(this, descriptor.name, descriptor.description); this.m_format = descriptor.format; this.m_dataType = descriptor.dataType; this.m_width = descriptor.width; this.m_height = descriptor.height; this.m_renderer = new glsTextureTestUtil.TextureRenderer(es3fTextureFormatTests.version, gluShaderUtil.precision.PRECISION_HIGHP); DE_ASSERT(this.m_width == this.m_height); }; es3fTextureFormatTests.setParentClass(es3fTextureFormatTests.TextureCubeFormatCase, tcuTestCase.DeqpTest); es3fTextureFormatTests.TextureCubeFormatCase.prototype.init = function() { /*tcu::TextureFormat*/ var fmt = this.m_dataType ? gluTextureUtil.mapGLTransferFormat(this.m_format, this.m_dataType) : gluTextureUtil.mapGLInternalFormat(this.m_format); /*tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(fmt); /* TODO : Port std::ostringstream fmtName; if (m_dataType) fmtName << glu::getPixelFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType); else fmtName << glu::getPixelFormatStr(m_format); log << TestLog::Message << "2D texture, " << fmtName.str() << ", " << m_width << "x" << m_height << ",\n fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient" << TestLog::EndMessage; */ this.m_texture = this.m_dataType ? gluTexture.cubeFromFormat(gl, this.m_format, this.m_dataType, this.m_width) : // Implicit internal format. gluTexture.cubeFromInternalFormat(gl, this.m_format, this.m_width); // Explicit internal format. // Fill level 0. for (var face in tcuTexture.CubeFace) { var gMin = null; var gMax = null; switch (tcuTexture.CubeFace[face]) { case 0: gMin = deMath.swizzle(spec.valueMin, [0, 1, 2, 3]); gMax = deMath.swizzle(spec.valueMax, [0, 1, 2, 3]); break; case 1: gMin = deMath.swizzle(spec.valueMin, [2, 1, 0, 3]); gMax = deMath.swizzle(spec.valueMax, [2, 1, 0, 3]); break; case 2: gMin = deMath.swizzle(spec.valueMin, [1, 2, 0, 3]); gMax = deMath.swizzle(spec.valueMax, [1, 2, 0, 3]); break; case 3: gMin = deMath.swizzle(spec.valueMax, [0, 1, 2, 3]); gMax = deMath.swizzle(spec.valueMin, [0, 1, 2, 3]); break; case 4: gMin = deMath.swizzle(spec.valueMax, [2, 1, 0, 3]); gMax = deMath.swizzle(spec.valueMin, [2, 1, 0, 3]); break; case 5: gMin = deMath.swizzle(spec.valueMax, [1, 2, 0, 3]); gMax = deMath.swizzle(spec.valueMin, [1, 2, 0, 3]); break; default: DE_ASSERT(false); } this.m_texture.getRefTexture().allocLevel(tcuTexture.CubeFace[face], 0); tcuTextureUtil.fillWithComponentGradients(this.m_texture.getRefTexture().getLevelFace(0, tcuTexture.CubeFace[face]), gMin, gMax); } this.m_texture.upload(); this.m_curFace = 0; this.m_isOk = true; }; es3fTextureFormatTests.TextureCubeFormatCase.prototype.testFace = function(face) { /* TODO: Implement */ var viewport = new glsTextureTestUtil.RandomViewport(document.getElementById('canvas'), this.m_width, this.m_height/*, deStringHash(getName())*/); /* tcu::Surface */ var renderedFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* tcu::Surface */ var referenceFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* TODO: Implement // tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); */ var threshold = [3, 3, 3, 3]; var renderParams = new glsTextureTestUtil.ReferenceParams(glsTextureTestUtil.textureType.TEXTURETYPE_CUBE); /* tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(this.m_texture.getRefTexture().getFormat()); /** @const */ var wrapS = gl.CLAMP_TO_EDGE; /** @const */ var wrapT = gl.CLAMP_TO_EDGE; /** @const */ var minFilter = gl.NEAREST; /** @const */ var magFilter = gl.NEAREST; renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; renderParams.samplerType = glsTextureTestUtil.getSamplerType(this.m_texture.getRefTexture().getFormat()); renderParams.sampler = new tcuTexture.Sampler(tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.FilterMode.NEAREST, tcuTexture.FilterMode.NEAREST); renderParams.colorScale = spec.lookupScale; renderParams.colorBias = spec.lookupBias; // Log render info on first face. if (face === tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X) { renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; } var texCoord = glsTextureTestUtil.computeQuadTexCoordCube(face); // log << TestLog::Message << "Texture parameters:" // << "\n WRAP_S = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_S, wrapS) // << "\n WRAP_T = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_T, wrapT) // << "\n MIN_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MIN_FILTER, minFilter) // << "\n MAG_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MAG_FILTER, magFilter) // << TestLog::EndMessage; // Setup base viewport. gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); // Bind to unit 0. gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.m_texture.getGLTexture()); // Setup nearest neighbor filtering and clamp-to-edge. gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, wrapT); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, magFilter); // // Draw. this.m_renderer.renderQuad(0, texCoord, renderParams); renderedFrame.readViewport(gl, viewport); // // Compute reference. glsTextureTestUtil.sampleTextureCube(new glsTextureTestUtil.SurfaceAccess(referenceFrame, undefined /*m_renderCtx.getRenderTarget().getPixelFormat()*/), this.m_texture.getRefTexture(), texCoord, renderParams); // Compare and log. var skipPixels = null; if (renderParams.samplerType == glsTextureTestUtil.samplerType.SAMPLERTYPE_INT || renderParams.samplerType == glsTextureTestUtil.samplerType.SAMPLERTYPE_UINT) { // Skip top right pixel due to Mac Intel driver bug. // https://github.com/KhronosGroup/WebGL/issues/1819 skipPixels = [ [this.m_width - 1, this.m_height - 1] ]; } var isOk = glsTextureTestUtil.compareImages(referenceFrame, renderedFrame, threshold, skipPixels); assertMsgOptions(isOk, 'Face: ' + this.m_curFace + ' ' + es3fTextureFormatTests.testDescription(), true, false); return isOk; }; es3fTextureFormatTests.TextureCubeFormatCase.prototype.iterate = function() { debug('Testing face ' + this.m_curFace); // Execute test for all faces. if (!this.testFace(this.m_curFace)) this.m_isOk = false; this.m_curFace += 1; if (this.m_curFace < Object.keys(tcuTexture.CubeFace).length) return tcuTestCase.IterateResult.CONTINUE; else return tcuTestCase.IterateResult.STOP; }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fTextureFormatTests.Texture2DArrayFormatCase = function(descriptor) { tcuTestCase.DeqpTest.call(this, descriptor.name, descriptor.description); this.m_format = descriptor.format; this.m_dataType = descriptor.dataType; this.m_width = descriptor.width; this.m_height = descriptor.height; this.m_numLayers = descriptor.numLayers; this.m_renderer = new glsTextureTestUtil.TextureRenderer(es3fTextureFormatTests.version, gluShaderUtil.precision.PRECISION_HIGHP); }; es3fTextureFormatTests.setParentClass(es3fTextureFormatTests.Texture2DArrayFormatCase, tcuTestCase.DeqpTest); es3fTextureFormatTests.Texture2DArrayFormatCase.prototype.init = function() { /*tcu::TextureFormat*/ var fmt = this.m_dataType ? gluTextureUtil.mapGLTransferFormat(this.m_format, this.m_dataType) : gluTextureUtil.mapGLInternalFormat(this.m_format); /*tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(fmt); /* TODO : Port std::ostringstream fmtName; if (m_dataType) fmtName << glu::getPixelFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType); else fmtName << glu::getPixelFormatStr(m_format); log << TestLog::Message << "2D texture, " << fmtName.str() << ", " << m_width << "x" << m_height << ",\n fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient" << TestLog::EndMessage; */ this.m_texture = this.m_dataType ? gluTexture.texture2DArrayFromFormat(gl, this.m_format, this.m_dataType, this.m_width, this.m_height, this.m_numLayers) : // Implicit internal format. gluTexture.texture2DArrayFromInternalFormat(gl, this.m_format, this.m_width, this.m_height, this.m_numLayers); // Explicit internal format. this.m_texture.getRefTexture().allocLevel(0); tcuTextureUtil.fillWithComponentGradients(this.m_texture.getRefTexture().getLevel(0), spec.valueMin, spec.valueMax); this.m_curLayer = 0; this.m_isOk = true; }; es3fTextureFormatTests.Texture2DArrayFormatCase.prototype.testLayer = function(layerNdx) { /* TODO: Implement */ var viewport = new glsTextureTestUtil.RandomViewport(document.getElementById('canvas'), this.m_width, this.m_height/*, deStringHash(getName())*/); /* tcu::Surface */ var renderedFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* tcu::Surface */ var referenceFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* TODO: Implement // tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); */ var threshold = [3, 3, 3, 3]; var renderParams = new glsTextureTestUtil.ReferenceParams(glsTextureTestUtil.textureType.TEXTURETYPE_2D_ARRAY); /* tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(this.m_texture.getRefTexture().getFormat()); /** @const */ var wrapS = gl.CLAMP_TO_EDGE; /** @const */ var wrapT = gl.CLAMP_TO_EDGE; /** @const */ var minFilter = gl.NEAREST; /** @const */ var magFilter = gl.NEAREST; renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; renderParams.samplerType = glsTextureTestUtil.getSamplerType(this.m_texture.getRefTexture().getFormat()); renderParams.sampler = new tcuTexture.Sampler(tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.FilterMode.NEAREST, tcuTexture.FilterMode.NEAREST); renderParams.colorScale = spec.lookupScale; renderParams.colorBias = spec.lookupBias; var texCoord = glsTextureTestUtil.computeQuadTexCoord2DArray(layerNdx, [0, 0], [1, 1]); // log << TestLog::Message << "Texture parameters:" // << "\n WRAP_S = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_S, wrapS) // << "\n WRAP_T = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_T, wrapT) // << "\n MIN_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MIN_FILTER, minFilter) // << "\n MAG_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MAG_FILTER, magFilter) // << TestLog::EndMessage; // Setup base viewport. gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); this.m_texture.upload(); // Bind to unit 0. gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.m_texture.getGLTexture()); // Setup nearest neighbor filtering and clamp-to-edge. gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, wrapT); gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, magFilter); // // Draw. this.m_renderer.renderQuad(0, texCoord, renderParams); renderedFrame.readViewport(gl, viewport); // // Compute reference. glsTextureTestUtil.sampleTexture2DArray(new glsTextureTestUtil.SurfaceAccess(referenceFrame, undefined /*m_renderCtx.getRenderTarget().getPixelFormat()*/), this.m_texture.getRefTexture().getView(), texCoord, renderParams); // Compare and log. var isOk = glsTextureTestUtil.compareImages(referenceFrame, renderedFrame, threshold); assertMsgOptions(isOk, 'Layer: ' + this.m_curLayer + ' ' + es3fTextureFormatTests.testDescription(), true, false); return isOk; }; es3fTextureFormatTests.Texture2DArrayFormatCase.prototype.iterate = function() { debug('Testing layer ' + this.m_curLayer); // Execute test for all layers. if (!this.testLayer(this.m_curLayer)) this.m_isOk = false; this.m_curLayer += 1; if (this.m_curLayer == this.m_numLayers) return tcuTestCase.IterateResult.STOP; else return tcuTestCase.IterateResult.CONTINUE; }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fTextureFormatTests.Texture3DFormatCase = function(descriptor) { tcuTestCase.DeqpTest.call(this, descriptor.name, descriptor.description); this.m_format = descriptor.format; this.m_dataType = descriptor.dataType; this.m_width = descriptor.width; this.m_height = descriptor.height; this.m_depth = descriptor.depth; this.m_renderer = new glsTextureTestUtil.TextureRenderer(es3fTextureFormatTests.version, gluShaderUtil.precision.PRECISION_HIGHP); }; es3fTextureFormatTests.setParentClass(es3fTextureFormatTests.Texture3DFormatCase, tcuTestCase.DeqpTest); es3fTextureFormatTests.Texture3DFormatCase.prototype.init = function() { /*tcu::TextureFormat*/ var fmt = this.m_dataType ? gluTextureUtil.mapGLTransferFormat(this.m_format, this.m_dataType) : gluTextureUtil.mapGLInternalFormat(this.m_format); /*tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(fmt); /* TODO : Port std::ostringstream fmtName; if (m_dataType) fmtName << glu::getPixelFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType); else fmtName << glu::getPixelFormatStr(m_format); log << TestLog::Message << "2D texture, " << fmtName.str() << ", " << m_width << "x" << m_height << ",\n fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient" << TestLog::EndMessage; */ this.m_texture = this.m_dataType ? gluTexture.texture3DFromFormat(gl, this.m_format, this.m_dataType, this.m_width, this.m_height, this.m_depth) : // Implicit internal format. gluTexture.texture3DFromInternalFormat(gl, this.m_format, this.m_width, this.m_height, this.m_depth); // Explicit internal format. this.m_texture.getRefTexture().allocLevel(0); tcuTextureUtil.fillWithComponentGradients(this.m_texture.getRefTexture().getLevel(0), spec.valueMin, spec.valueMax); this.m_curSlice = 0; this.m_isOk = true; }; es3fTextureFormatTests.Texture3DFormatCase.prototype.testSlice = function(sliceNdx) { /* TODO: Implement */ var viewport = new glsTextureTestUtil.RandomViewport(document.getElementById('canvas'), this.m_width, this.m_height/*, deStringHash(getName())*/); /* tcu::Surface */ var renderedFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* tcu::Surface */ var referenceFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* TODO: Implement // tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); */ var threshold = [3, 3, 3, 3]; var renderParams = new glsTextureTestUtil.ReferenceParams(glsTextureTestUtil.textureType.TEXTURETYPE_3D); /* tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(this.m_texture.getRefTexture().getFormat()); var r = (sliceNdx + 0.5) / this.m_depth; /** @const */ var wrapS = gl.CLAMP_TO_EDGE; /** @const */ var wrapT = gl.CLAMP_TO_EDGE; /** @const */ var minFilter = gl.NEAREST; /** @const */ var magFilter = gl.NEAREST; renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; renderParams.samplerType = glsTextureTestUtil.getSamplerType(this.m_texture.getRefTexture().getFormat()); renderParams.sampler = new tcuTexture.Sampler(tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.FilterMode.NEAREST, tcuTexture.FilterMode.NEAREST); renderParams.colorScale = spec.lookupScale; renderParams.colorBias = spec.lookupBias; var texCoord = glsTextureTestUtil.computeQuadTexCoord3D([0, 0, r], [1, 1, r], [0, 1, 2]); // log << TestLog::Message << "Texture parameters:" // << "\n WRAP_S = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_S, wrapS) // << "\n WRAP_T = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_T, wrapT) // << "\n MIN_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MIN_FILTER, minFilter) // << "\n MAG_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MAG_FILTER, magFilter) // << TestLog::EndMessage; // Setup base viewport. gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); this.m_texture.upload(); // Bind to unit 0. gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_3D, this.m_texture.getGLTexture()); // Setup nearest neighbor filtering and clamp-to-edge. gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_T, wrapT); gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, magFilter); // // Draw. this.m_renderer.renderQuad(0, texCoord, renderParams); renderedFrame.readViewport(gl, viewport); // // Compute reference. glsTextureTestUtil.sampleTexture3D(new glsTextureTestUtil.SurfaceAccess(referenceFrame, undefined /*m_renderCtx.getRenderTarget().getPixelFormat()*/), this.m_texture.getRefTexture(), texCoord, renderParams); // Compare and log. var isOk = glsTextureTestUtil.compareImages(referenceFrame, renderedFrame, threshold); assertMsgOptions(isOk, 'Slice: ' + this.m_curSlice + ' ' + es3fTextureFormatTests.testDescription(), true, false); return isOk; }; es3fTextureFormatTests.Texture3DFormatCase.prototype.iterate = function() { debug('Testing slice ' + this.m_curSlice); // Execute test for all layers. if (!this.testSlice(this.m_curSlice)) this.m_isOk = false; this.m_curSlice += 1; if (this.m_curSlice >= this.m_depth) return tcuTestCase.IterateResult.STOP; else return tcuTestCase.IterateResult.CONTINUE; }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fTextureFormatTests.Compressed2DFormatCase = function(descriptor) { tcuTestCase.DeqpTest.call(this, descriptor.name, descriptor.description); this.m_format = descriptor.format; this.m_dataType = descriptor.dataType; this.m_width = descriptor.width; this.m_height = descriptor.height; this.m_renderer = new glsTextureTestUtil.TextureRenderer(es3fTextureFormatTests.version, gluShaderUtil.precision.PRECISION_HIGHP); }; es3fTextureFormatTests.setParentClass(es3fTextureFormatTests.Compressed2DFormatCase, tcuTestCase.DeqpTest); es3fTextureFormatTests.Compressed2DFormatCase.prototype.init = function() { var compressed = new tcuCompressedTexture.CompressedTexture(this.m_format, this.m_width, this.m_height); var rand = new deRandom.Random(0); for (var i = 0; i < compressed.m_data.length; i++) { compressed.m_data[i] = rand.getInt(0, 255); } this.m_texture = gluTexture.compressed2DFromInternalFormat(gl, this.m_format, this.m_width, this.m_height, compressed); }; es3fTextureFormatTests.Compressed2DFormatCase.prototype.deinit = function() { /* TODO: Implement */ }; es3fTextureFormatTests.Compressed2DFormatCase.prototype.iterate = function() { /* TODO: Implement */ var viewport = new glsTextureTestUtil.RandomViewport(document.getElementById('canvas'), this.m_width, this.m_height/*, deStringHash(getName())*/); /* tcu::Surface */ var renderedFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* tcu::Surface */ var referenceFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* TODO: Implement // tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); */ var threshold = [3, 3, 3, 3]; var renderParams = new glsTextureTestUtil.ReferenceParams(glsTextureTestUtil.textureType.TEXTURETYPE_2D); /* tcu::TextureFormatInfo*/ var spec = tcuTextureUtil.getTextureFormatInfo(this.m_texture.getRefTexture().getFormat()); /** @const */ var wrapS = gl.CLAMP_TO_EDGE; /** @const */ var wrapT = gl.CLAMP_TO_EDGE; /** @const */ var minFilter = gl.NEAREST; /** @const */ var magFilter = gl.NEAREST; renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; renderParams.samplerType = glsTextureTestUtil.getSamplerType(this.m_texture.getRefTexture().getFormat()); renderParams.sampler = new tcuTexture.Sampler(tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.FilterMode.NEAREST, tcuTexture.FilterMode.NEAREST); renderParams.colorScale = spec.lookupScale; renderParams.colorBias = spec.lookupBias; var texCoord = glsTextureTestUtil.computeQuadTexCoord2D([0, 0], [1, 1]); // log << TestLog::Message << "Texture parameters:" // << "\n WRAP_S = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_S, wrapS) // << "\n WRAP_T = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_T, wrapT) // << "\n MIN_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MIN_FILTER, minFilter) // << "\n MAG_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MAG_FILTER, magFilter) // << TestLog::EndMessage; // Setup base viewport. gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); // Bind to unit 0. gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, this.m_texture.getGLTexture()); // Setup nearest neighbor filtering and clamp-to-edge. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter); // // Draw. this.m_renderer.renderQuad(0, texCoord, renderParams); renderedFrame.readViewport(gl, viewport); // // Compute reference. glsTextureTestUtil.sampleTexture2D(new glsTextureTestUtil.SurfaceAccess(referenceFrame, undefined /*m_renderCtx.getRenderTarget().getPixelFormat()*/), this.m_texture.getRefTexture(), texCoord, renderParams); // Compare and log. var isOk = glsTextureTestUtil.compareImages(referenceFrame, renderedFrame, threshold); assertMsgOptions(isOk, es3fTextureFormatTests.testDescription(), true, false); return tcuTestCase.IterateResult.STOP; }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fTextureFormatTests.CompressedCubeFormatCase = function(descriptor) { tcuTestCase.DeqpTest.call(this, descriptor.name, descriptor.description); this.m_format = descriptor.format; this.m_dataType = descriptor.dataType; this.m_width = descriptor.width; this.m_height = descriptor.height; this.m_renderer = new glsTextureTestUtil.TextureRenderer(es3fTextureFormatTests.version, gluShaderUtil.precision.PRECISION_HIGHP); this.m_curFace = 0; this.m_isOk = true; DE_ASSERT(this.m_width == this.m_height); }; es3fTextureFormatTests.setParentClass(es3fTextureFormatTests.CompressedCubeFormatCase, tcuTestCase.DeqpTest); es3fTextureFormatTests.CompressedCubeFormatCase.prototype.init = function() { var compressed = new tcuCompressedTexture.CompressedTexture(this.m_format, this.m_width, this.m_height); var rand = new deRandom.Random(0); for (var i = 0; i < compressed.m_data.length; i++) { compressed.m_data[i] = rand.getInt(0, 255); } this.m_texture = gluTexture.compressedCubeFromInternalFormat(gl, this.m_format, this.m_width, compressed); }; es3fTextureFormatTests.CompressedCubeFormatCase.prototype.testFace = function(face) { /* TODO: Implement */ var viewport = new glsTextureTestUtil.RandomViewport(document.getElementById('canvas'), this.m_width, this.m_height/*, deStringHash(getName())*/); /* tcu::Surface */ var renderedFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* tcu::Surface */ var referenceFrame = new tcuSurface.Surface(viewport.width, viewport.height); /* TODO: Implement // tcu::RGBA threshold = m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1); */ // Threshold high enough to cover numerical errors in software decoders on Windows and Mac. Threshold is 17 in native dEQP. var threshold = [6, 6, 6, 6]; var renderParams = new glsTextureTestUtil.ReferenceParams(glsTextureTestUtil.textureType.TEXTURETYPE_CUBE); /** @const */ var wrapS = gl.CLAMP_TO_EDGE; /** @const */ var wrapT = gl.CLAMP_TO_EDGE; /** @const */ var minFilter = gl.NEAREST; /** @const */ var magFilter = gl.NEAREST; renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; renderParams.samplerType = glsTextureTestUtil.getSamplerType(this.m_texture.getRefTexture().getFormat()); renderParams.sampler = new tcuTexture.Sampler(tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.WrapMode.CLAMP_TO_EDGE, tcuTexture.FilterMode.NEAREST, tcuTexture.FilterMode.NEAREST); // Log render info on first face. if (face === tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X) { renderParams.flags.log_programs = true; renderParams.flags.log_uniforms = true; } var texCoord = glsTextureTestUtil.computeQuadTexCoordCube(face); // log << TestLog::Message << "Texture parameters:" // << "\n WRAP_S = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_S, wrapS) // << "\n WRAP_T = " << glu::getTextureParameterValueStr(gl.TEXTURE_WRAP_T, wrapT) // << "\n MIN_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MIN_FILTER, minFilter) // << "\n MAG_FILTER = " << glu::getTextureParameterValueStr(gl.TEXTURE_MAG_FILTER, magFilter) // << TestLog::EndMessage; // Setup base viewport. gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height); // Bind to unit 0. gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.m_texture.getGLTexture()); // Setup nearest neighbor filtering and clamp-to-edge. gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, wrapT); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, magFilter); // // Draw. this.m_renderer.renderQuad(0, texCoord, renderParams); renderedFrame.readViewport(gl, viewport); // // Compute reference. glsTextureTestUtil.sampleTextureCube(new glsTextureTestUtil.SurfaceAccess(referenceFrame, undefined /*m_renderCtx.getRenderTarget().getPixelFormat()*/), this.m_texture.getRefTexture(), texCoord, renderParams); // Compare and log. var isOk = glsTextureTestUtil.compareImages(referenceFrame, renderedFrame, threshold); assertMsgOptions(isOk, 'Face: ' + this.m_curFace + ' ' + es3fTextureFormatTests.testDescription(), true, false); return isOk; }; es3fTextureFormatTests.CompressedCubeFormatCase.prototype.iterate = function() { debug('Testing face ' + this.m_curFace); // Execute test for all faces. if (!this.testFace(this.m_curFace)) this.m_isOk = false; this.m_curFace += 1; if (this.m_curFace < Object.keys(tcuTexture.CubeFace).length) return tcuTestCase.IterateResult.CONTINUE; else return tcuTestCase.IterateResult.STOP; }; es3fTextureFormatTests.genTestCases = function() { var state = tcuTestCase.runner; state.setRoot(tcuTestCase.newTest('texture_format', 'Top level')); var texFormats = [ ['alpha', gl.ALPHA, gl.UNSIGNED_BYTE], ['luminance', gl.LUMINANCE, gl.UNSIGNED_BYTE], ['luminance_alpha', gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE], ['rgb_unsigned_short_5_6_5', gl.RGB, gl.UNSIGNED_SHORT_5_6_5], ['rgb_unsigned_byte', gl.RGB, gl.UNSIGNED_BYTE], ['rgba_unsigned_short_4_4_4_4', gl.RGBA, gl.UNSIGNED_SHORT_4_4_4_4], ['rgba_unsigned_short_5_5_5_1', gl.RGBA, gl.UNSIGNED_SHORT_5_5_5_1], ['rgba_unsigned_byte', gl.RGBA, gl.UNSIGNED_BYTE] ]; var unsized2DGroup = tcuTestCase.newTest('unsized', 'Unsized formats (2D, Cubemap)'); state.testCases.addChild(unsized2DGroup); var unsized2DArrayGroup = tcuTestCase.newTest('unsized', 'Unsized formats (2D Array)'); state.testCases.addChild(unsized2DArrayGroup); var unsized3DGroup = tcuTestCase.newTest('unsized', 'Unsized formats (3D)'); state.testCases.addChild(unsized3DGroup); texFormats.forEach(function(elem) { var format = elem[1]; var dataType = elem[2]; var nameBase = elem[0]; var descriptionBase = gluStrUtil.getPixelFormatName(format) + ', ' + gluStrUtil.getTypeName(dataType); unsized2DGroup.addChild(new es3fTextureFormatTests.Texture2DFormatCase({ name: nameBase + '_2d_pot', description: descriptionBase + ' gl.TEXTURE_2D', format: format, dataType: dataType, width: 128, height: 128 })); unsized2DGroup.addChild(new es3fTextureFormatTests.Texture2DFormatCase({ name: nameBase + '_2d_npot', description: descriptionBase + ' gl.TEXTURE_2D', format: format, dataType: dataType, width: 63, height: 112 })); unsized2DGroup.addChild(new es3fTextureFormatTests.TextureCubeFormatCase({ name: nameBase + '_cube_pot', description: descriptionBase + ' gl.TEXTURE_CUBE_MAP', format: format, dataType: dataType, width: 64, height: 64 })); unsized2DGroup.addChild(new es3fTextureFormatTests.TextureCubeFormatCase({ name: nameBase + '_cube_npot', description: descriptionBase + ' gl.TEXTURE_CUBE_MAP', format: format, dataType: dataType, width: 57, height: 57 })); unsized2DArrayGroup.addChild(new es3fTextureFormatTests.Texture2DArrayFormatCase({ name: nameBase + '_2d_array_pot', description: descriptionBase + ' gl.TEXTURE_2D_ARRAY', format: format, dataType: dataType, width: 64, height: 64, numLayers: 8 })); unsized2DArrayGroup.addChild(new es3fTextureFormatTests.Texture2DArrayFormatCase({ name: nameBase + '_2d_array_npot', description: descriptionBase + ' gl.TEXTURE_2D_ARRAY', format: format, dataType: dataType, width: 63, height: 57, numLayers: 7 })); unsized3DGroup.addChild(new es3fTextureFormatTests.Texture3DFormatCase({ name: nameBase + '_3d_pot', description: descriptionBase + ' gl.TEXTURE_3D', format: format, dataType: dataType, width: 8, height: 32, depth: 16 })); unsized3DGroup.addChild(new es3fTextureFormatTests.Texture3DFormatCase({ name: nameBase + '_3d_npot', description: descriptionBase + ' gl.TEXTURE_3D', format: format, dataType: dataType, width: 11, height: 31, depth: 7 })); }); var sizedColorFormats = [ ['rgba32f', gl.RGBA32F], ['rgba32i', gl.RGBA32I], ['rgba32ui', gl.RGBA32UI], ['rgba16f', gl.RGBA16F], ['rgba16i', gl.RGBA16I], ['rgba16ui', gl.RGBA16UI], ['rgba8', gl.RGBA8], ['rgba8i', gl.RGBA8I], ['rgba8ui', gl.RGBA8UI], ['srgb8_alpha8', gl.SRGB8_ALPHA8], ['rgb10_a2', gl.RGB10_A2], ['rgb10_a2ui', gl.RGB10_A2UI], ['rgba4', gl.RGBA4], ['rgb5_a1', gl.RGB5_A1], ['rgba8_snorm', gl.RGBA8_SNORM], ['rgb8', gl.RGB8], ['rgb565', gl.RGB565], ['r11f_g11f_b10f', gl.R11F_G11F_B10F], ['rgb32f', gl.RGB32F], ['rgb32i', gl.RGB32I], ['rgb32ui', gl.RGB32UI], ['rgb16f', gl.RGB16F], ['rgb16i', gl.RGB16I], ['rgb16ui', gl.RGB16UI], ['rgb8_snorm', gl.RGB8_SNORM], ['rgb8i', gl.RGB8I], ['rgb8ui', gl.RGB8UI], ['srgb8', gl.SRGB8], ['rgb9_e5', gl.RGB9_E5], ['rg32f', gl.RG32F], ['rg32i', gl.RG32I], ['rg32ui', gl.RG32UI], ['rg16f', gl.RG16F], ['rg16i', gl.RG16I], ['rg16ui', gl.RG16UI], ['rg8', gl.RG8], ['rg8i', gl.RG8I], ['rg8ui', gl.RG8UI], ['rg8_snorm', gl.RG8_SNORM], ['r32f', gl.R32F], ['r32i', gl.R32I], ['r32ui', gl.R32UI], ['r16f', gl.R16F], ['r16i', gl.R16I], ['r16ui', gl.R16UI], ['r8', gl.R8], ['r8i', gl.R8I], ['r8ui', gl.R8UI], ['r8_snorm', gl.R8_SNORM] ]; var splitSizedColorTests = 4; var sizedColor2DPOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColor2DPOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (2D POT)')); state.testCases.addChild(sizedColor2DPOTGroup[ii]); } var sizedColor2DNPOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColor2DNPOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (2D NPOT)')); state.testCases.addChild(sizedColor2DNPOTGroup[ii]); } var sizedColorCubePOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColorCubePOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (Cubemap POT)')); state.testCases.addChild(sizedColorCubePOTGroup[ii]); } var sizedColorCubeNPOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColorCubeNPOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (Cubemap NPOT)')); state.testCases.addChild(sizedColorCubeNPOTGroup[ii]); } var sizedColor2DArrayPOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColor2DArrayPOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (2D Array POT)')); state.testCases.addChild(sizedColor2DArrayPOTGroup[ii]); } var sizedColor2DArrayNPOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColor2DArrayNPOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (2D Array NPOT)')); state.testCases.addChild(sizedColor2DArrayNPOTGroup[ii]); } var sizedColor3DPOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColor3DPOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (3D POT)')); state.testCases.addChild(sizedColor3DPOTGroup[ii]); } var sizedColor3DNPOTGroup = []; for (var ii = 0; ii < splitSizedColorTests; ++ii) { sizedColor3DNPOTGroup.push(tcuTestCase.newTest('sized', 'Sized formats (3D NPOT)')); state.testCases.addChild(sizedColor3DNPOTGroup[ii]); } for (var ii = 0; ii < sizedColorFormats.length; ++ii) { var internalFormat = sizedColorFormats[ii][1]; var nameBase = sizedColorFormats[ii][0]; var descriptionBase = gluStrUtil.getPixelFormatName(internalFormat); sizedColor2DPOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.Texture2DFormatCase({ name: nameBase + '_pot', description: descriptionBase + ' gl.TEXTURE_2D', format: internalFormat, width: 128, height: 128 })); sizedColor2DNPOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.Texture2DFormatCase({ name: nameBase + '_npot', description: descriptionBase + ' gl.TEXTURE_2D', format: internalFormat, width: 63, height: 112 })); sizedColorCubePOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.TextureCubeFormatCase({ name: nameBase + '_pot', description: descriptionBase + ' gl.TEXTURE_CUBE_MAP', format: internalFormat, width: 64, height: 64 })); sizedColorCubeNPOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.TextureCubeFormatCase({ name: nameBase + '_npot', description: descriptionBase + ' gl.TEXTURE_CUBE_MAP', format: internalFormat, width: 57, height: 57 })); sizedColor2DArrayPOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.Texture2DArrayFormatCase({ name: nameBase + '_pot', description: descriptionBase + ' gl.TEXTURE_2D_ARRAY', format: internalFormat, width: 64, height: 64, numLayers: 8 })); sizedColor2DArrayNPOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.Texture2DArrayFormatCase({ name: nameBase + '_npot', description: descriptionBase + ' gl.TEXTURE_2D_ARRAY', format: internalFormat, width: 63, height: 57, numLayers: 7 })); sizedColor3DPOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.Texture3DFormatCase({ name: nameBase + '_pot', description: descriptionBase + ' gl.TEXTURE_3D', format: internalFormat, width: 8, height: 32, depth: 16 })); sizedColor3DNPOTGroup[ii % splitSizedColorTests].addChild(new es3fTextureFormatTests.Texture3DFormatCase({ name: nameBase + '_npot', description: descriptionBase + ' gl.TEXTURE_3D', format: internalFormat, width: 11, height: 31, depth: 7 })); } var sizedDepthStencilFormats = [ // Depth and stencil formats ['depth_component32f', gl.DEPTH_COMPONENT32F], ['depth_component24', gl.DEPTH_COMPONENT24], ['depth_component16', gl.DEPTH_COMPONENT16], // The following format is restricted in WebGL2. // ['depth32f_stencil8', gl.DEPTH32F_STENCIL8], ['depth24_stencil8', gl.DEPTH24_STENCIL8] ]; var sizedDepthStencilGroup = tcuTestCase.newTest('sized', 'Sized formats (Depth Stencil)'); state.testCases.addChild(sizedDepthStencilGroup); sizedDepthStencilFormats.forEach(function(elem) { var internalFormat = elem[1]; var nameBase = elem[0]; var descriptionBase = gluStrUtil.getPixelFormatName(internalFormat); sizedDepthStencilGroup.addChild(new es3fTextureFormatTests.Texture2DFormatCase({ name: nameBase + '_pot', description: descriptionBase + ' gl.TEXTURE_2D', format: internalFormat, width: 128, height: 128 })); sizedDepthStencilGroup.addChild(new es3fTextureFormatTests.Texture2DFormatCase({ name: nameBase + '_npot', description: descriptionBase + ' gl.TEXTURE_2D', format: internalFormat, width: 63, height: 112 })); sizedDepthStencilGroup.addChild(new es3fTextureFormatTests.TextureCubeFormatCase({ name: nameBase + '_pot', description: descriptionBase + ' gl.TEXTURE_CUBE_MAP', format: internalFormat, width: 64, height: 64 })); sizedDepthStencilGroup.addChild(new es3fTextureFormatTests.TextureCubeFormatCase({ name: nameBase + '_npot', description: descriptionBase + ' gl.TEXTURE_CUBE_MAP', format: internalFormat, width: 57, height: 57 })); sizedDepthStencilGroup.addChild(new es3fTextureFormatTests.Texture2DArrayFormatCase({ name: nameBase + '_pot', description: descriptionBase + ' gl.TEXTURE_2D_ARRAY', format: internalFormat, width: 64, height: 64, numLayers: 8 })); sizedDepthStencilGroup.addChild(new es3fTextureFormatTests.Texture2DArrayFormatCase({ name: nameBase + '_npot', description: descriptionBase + ' gl.TEXTURE_2D_ARRAY', format: internalFormat, width: 63, height: 57, numLayers: 7 })); }); var compressed2DGroup = tcuTestCase.newTest('compressed', 'Compressed formats (2D)'); state.testCases.addChild(compressed2DGroup); var compressedCubeGroup = tcuTestCase.newTest('compressed', 'Compressed formats (Cubemap)'); state.testCases.addChild(compressedCubeGroup); var etc2Formats = [ ['gl.COMPRESSED_R11_EAC', 'eac_r11', tcuCompressedTexture.Format.EAC_R11], ['gl.COMPRESSED_SIGNED_R11_EAC', 'eac_signed_r11', tcuCompressedTexture.Format.EAC_SIGNED_R11], ['gl.COMPRESSED_RG11_EAC', 'eac_rg11', tcuCompressedTexture.Format.EAC_RG11], ['gl.COMPRESSED_SIGNED_RG11_EAC', 'eac_signed_rg11', tcuCompressedTexture.Format.EAC_SIGNED_RG11], ['gl.COMPRESSED_RGB8_ETC2', 'etc2_rgb8', tcuCompressedTexture.Format.ETC2_RGB8], ['gl.COMPRESSED_SRGB8_ETC2', 'etc2_srgb8', tcuCompressedTexture.Format.ETC2_SRGB8], ['gl.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2', 'etc2_rgb8_punchthrough_alpha1', tcuCompressedTexture.Format.ETC2_RGB8_PUNCHTHROUGH_ALPHA1], ['gl.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2', 'etc2_srgb8_punchthrough_alpha1', tcuCompressedTexture.Format.ETC2_SRGB8_PUNCHTHROUGH_ALPHA1], ['gl.COMPRESSED_RGBA8_ETC2_EAC', 'etc2_eac_rgba8', tcuCompressedTexture.Format.ETC2_EAC_RGBA8], ['gl.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC', 'etc2_eac_srgb8_alpha8', tcuCompressedTexture.Format.ETC2_EAC_SRGB8_ALPHA8] ]; if (!gluTextureUtil.enableCompressedTextureETC()) { debug('Skipping ETC2/EAC texture format tests: no support for WEBGL_compressed_texture_etc'); etc2Formats = []; } etc2Formats.forEach(function(elem) { var nameBase = elem[1]; var descriptionBase = elem[0]; var format = elem[2]; compressed2DGroup.addChild(new es3fTextureFormatTests.Compressed2DFormatCase({ name: nameBase + '_2d_pot', description: descriptionBase + ', gl.TEXTURE_2D', format: format, width: 128, height: 64 })); compressedCubeGroup.addChild(new es3fTextureFormatTests.CompressedCubeFormatCase({ name: nameBase + '_cube_pot', description: descriptionBase + ', gl.TEXTURE_CUBE_MAP', format: format, width: 64, height: 64 })); compressed2DGroup.addChild(new es3fTextureFormatTests.Compressed2DFormatCase({ name: nameBase + '_2d_pot', description: descriptionBase + ', gl.TEXTURE_2D', format: format, width: 128, height: 64 })); compressedCubeGroup.addChild(new es3fTextureFormatTests.CompressedCubeFormatCase({ name: nameBase + '_cube_npot', description: descriptionBase + ', gl.TEXTURE_CUBE_MAP', format: format, width: 51, height: 51 })); }); }; /** * Create and execute the test cases */ es3fTextureFormatTests.run = function(context, range) { gl = context; var state = tcuTestCase.runner; try { es3fTextureFormatTests.genTestCases(); if (range) state.setRange(range); state.runCallback(tcuTestCase.runTestCases); } catch (err) { bufferedLogToConsole(err); state.terminate(); } }; });