| /*------------------------------------------------------------------------- |
| * 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(); |
| } |
| |
| }; |
| |
| }); |