/*------------------------------------------------------------------------- * 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.es3fTextureSpecificationTests'); goog.require('framework.common.tcuImageCompare'); goog.require('framework.common.tcuLogImage'); goog.require('framework.common.tcuPixelFormat'); 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.delibs.debase.deString'); goog.require('framework.opengl.gluShaderUtil'); goog.require('framework.opengl.gluTextureUtil'); goog.require('framework.opengl.simplereference.sglrGLContext'); goog.require('framework.opengl.simplereference.sglrReferenceContext'); goog.require('framework.referencerenderer.rrUtil'); goog.require('functional.gles3.es3fFboTestUtil'); goog.scope(function() { var es3fTextureSpecificationTests = functional.gles3.es3fTextureSpecificationTests; var tcuPixelFormat = framework.common.tcuPixelFormat; var tcuImageCompare = framework.common.tcuImageCompare; var tcuSurface = framework.common.tcuSurface; var tcuTestCase = framework.common.tcuTestCase; var tcuTexture = framework.common.tcuTexture; var tcuTextureUtil = framework.common.tcuTextureUtil; var deMath = framework.delibs.debase.deMath; var deRandom = framework.delibs.debase.deRandom; var deString = framework.delibs.debase.deString; var gluShaderUtil = framework.opengl.gluShaderUtil; var gluTextureUtil = framework.opengl.gluTextureUtil; var sglrGLContext = framework.opengl.simplereference.sglrGLContext; var sglrReferenceContext = framework.opengl.simplereference.sglrReferenceContext; var rrUtil = framework.referencerenderer.rrUtil; var es3fFboTestUtil = functional.gles3.es3fFboTestUtil; var tcuLogImage = framework.common.tcuLogImage; /** * @param {number} internalFormat * @return {tcuTexture.TextureFormat} */ es3fTextureSpecificationTests.mapGLUnsizedInternalFormat = function( internalFormat ) { switch (internalFormat) { case gl.ALPHA: return new tcuTexture.TextureFormat( tcuTexture.ChannelOrder.A, tcuTexture.ChannelType.UNORM_INT8 ); case gl.LUMINANCE: return new tcuTexture.TextureFormat( tcuTexture.ChannelOrder.L, tcuTexture.ChannelType.UNORM_INT8 ); case gl.LUMINANCE_ALPHA: return new tcuTexture.TextureFormat( tcuTexture.ChannelOrder.LA, tcuTexture.ChannelType.UNORM_INT8 ); case gl.RGB: return new tcuTexture.TextureFormat( tcuTexture.ChannelOrder.RGB, tcuTexture.ChannelType.UNORM_INT8 ); case gl.RGBA: return new tcuTexture.TextureFormat( tcuTexture.ChannelOrder.RGBA, tcuTexture.ChannelType.UNORM_INT8 ); default: throw new Error( 'Can\'t map GL unsized internal format (' + internalFormat.toString(16) + ') to texture format' ); } }; var VIEWPORT_WIDTH = 256; var VIEWPORT_HEIGHT = 256; /** * @param {number} width * @param {number} height * @param {number=} depth * @return {number} */ es3fTextureSpecificationTests.maxLevelCount = function( width, height, depth ) { depth = depth || 0; return deMath.logToFloor(Math.max(width, Math.max(height, depth))) + 1; }; /** * @param {deRandom.Random} rnd * @param {Array} minVal * @param {Array} maxVal * @param {number} size * @return {Array} */ es3fTextureSpecificationTests.randomVector = function( rnd, minVal, maxVal, size ) { var res = []; for (var ndx = 0; ndx < size; ndx++) res[ndx] = rnd.getFloat(minVal[ndx], maxVal[ndx]); return res; }; /** * @param {tcuPixelFormat.PixelFormat} pixelFormat * @param {tcuTexture.TextureFormat} textureFormat * @return {Array} (ivec4) */ es3fTextureSpecificationTests.getPixelFormatCompareDepth = function( pixelFormat, textureFormat ) { switch (textureFormat.order) { case tcuTexture.ChannelOrder.L: case tcuTexture.ChannelOrder.LA: return [ pixelFormat.redBits, pixelFormat.redBits, pixelFormat.redBits, pixelFormat.alphaBits ]; default: return [ pixelFormat.redBits, pixelFormat.greenBits, pixelFormat.blueBits, pixelFormat.alphaBits ]; } }; /** * @param {tcuPixelFormat.PixelFormat} pixelFormat * @param {tcuTexture.TextureFormat} textureFormat * @return {Array} (uvec4) */ es3fTextureSpecificationTests.computeCompareThreshold = function( pixelFormat, textureFormat ) { /** @type {Array} */ var texFormatBits = tcuTextureUtil.getTextureFormatBitDepth( textureFormat ); /** @type {Array} */ var pixelFormatBits = es3fTextureSpecificationTests.getPixelFormatCompareDepth( pixelFormat, textureFormat ); /** @type {Array} */ var accurateFmtBits = deMath.min(pixelFormatBits, texFormatBits); /** @type {Array} */ var compareBits = deMath.addScalar( tcuTextureUtil.select( accurateFmtBits, [8, 8, 8, 8], deMath.greaterThan(accurateFmtBits, [0, 0, 0, 0]) ), - 1 ); var result = []; for (var i = 0; i < compareBits.length; i++) result.push(1 << compareBits[i]); return result; }; /** * @constructor * @extends {tcuTestCase.DeqpTest} * @param {string} name * @param {string} desc * context */ es3fTextureSpecificationTests.TextureSpecCase = function(name, desc) { tcuTestCase.DeqpTest.call(this, name, desc); /** * @type { * ?sglrGLContext.GLContext|sglrReferenceContext.ReferenceContext * } */ this.m_context = null; }; es3fTextureSpecificationTests.TextureSpecCase.prototype = Object.create( tcuTestCase.DeqpTest.prototype ); es3fTextureSpecificationTests.TextureSpecCase.prototype.constructor = es3fTextureSpecificationTests.TextureSpecCase; /** * deinit */ es3fTextureSpecificationTests.TextureSpecCase.prototype.deinit = function() { gl.pixelStorei(gl.UNPACK_ALIGNMENT, 4); gl.pixelStorei(gl.UNPACK_ROW_LENGTH, 0); gl.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, 0); gl.pixelStorei(gl.UNPACK_SKIP_PIXELS, 0); gl.pixelStorei(gl.UNPACK_SKIP_ROWS, 0); gl.pixelStorei(gl.UNPACK_SKIP_IMAGES, 0); gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, null); } /** * createTexture - Needs to be overridden */ es3fTextureSpecificationTests.TextureSpecCase.prototype.createTexture = function() { throw new Error('Must override'); }; /** * verifyTexture - Needs to be overridden * @param {sglrGLContext.GLContext} webgl2Context * @param {sglrReferenceContext.ReferenceContext} refContext * @return {boolean} */ es3fTextureSpecificationTests.TextureSpecCase.prototype.verifyTexture = function( webgl2Context, refContext ) { throw new Error('Must override'); }; /** * @return {tcuTestCase.IterateResult} */ es3fTextureSpecificationTests.TextureSpecCase.prototype.iterate = function() { if (gl.canvas.width < VIEWPORT_WIDTH || gl.canvas.height < VIEWPORT_HEIGHT) throw new Error('Too small viewport', ''); // Context size, and viewport for GLES3 var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var width = Math.min(gl.canvas.width, VIEWPORT_WIDTH); var height = Math.min(gl.canvas.height, VIEWPORT_HEIGHT); var x = rnd.getInt(0, gl.canvas.width - width); var y = rnd.getInt(0, gl.canvas.height - height); // Contexts. /** @type {sglrGLContext.GLContext} */ var webgl2Context = new sglrGLContext.GLContext( gl, [x, y, width, height] ); /** @type {sglrReferenceContext.ReferenceContextBuffers} */ var refBuffers = new sglrReferenceContext.ReferenceContextBuffers( new tcuPixelFormat.PixelFormat( 8, 8, 8, gl.getParameter(gl.ALPHA_BITS) ? 8 : 0 ), 0 /* depth */, 0 /* stencil */, width, height ); /** @type {sglrReferenceContext.ReferenceContext} */ var refContext = new sglrReferenceContext.ReferenceContext( new sglrReferenceContext.ReferenceContextLimits(gl), refBuffers.getColorbuffer(), refBuffers.getDepthbuffer(), refBuffers.getStencilbuffer() ); // Clear color buffer. for (var ndx = 0; ndx < 2; ndx++) { this.m_context = ndx ? refContext : webgl2Context; // C++ port uses (0.125, 0.25, 0.5, 1.0), but here we use (0, 0, 0, 0) // in order to optimize the `clear' op in ReferenceContext. this.m_context.clearColor(0, 0, 0, 0); this.m_context.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT ); } // Construct texture using both GLES3 and reference contexts. for (var ndx = 0; ndx < 2; ndx++) { this.m_context = ndx ? refContext : webgl2Context; this.createTexture(); checkMessage( this.m_context.getError() == gl.NO_ERROR, 'Problem creating texture.' ); } // Verify results. if (this.verifyTexture(webgl2Context, refContext)) testPassed(); else testFailed('Verification failed'); return tcuTestCase.IterateResult.STOP; }; /** * @param {tcuSurface.Surface} dst * @param { * ?WebGLProgram| * framework.opengl.simplereference.sglrShaderProgram.ShaderProgram * } program * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.TextureSpecCase.prototype.renderTex = function(dst, program, width, height) { var targetW = this.m_context.getWidth(); var targetH = this.m_context.getHeight(); var w = width / targetW; var h = height / targetH; rrUtil.drawQuad( this.m_context, program, [-1.0, -1.0, 0.0], [-1.0 + w * 2.0, -1.0 + h * 2.0, 0.0] ); // Read pixels back. dst.readViewport(this.m_context, [0, 0, width, height]); }; /** * @constructor * @extends {es3fTextureSpecificationTests.TextureSpecCase} * @param {string} name * @param {string} desc * @param {tcuTexture.TextureFormat} format * @param {number} width * @param {number} height * @param {number} numLevels */ es3fTextureSpecificationTests.Texture2DSpecCase = function( name, desc, format, width, height, numLevels ) { es3fTextureSpecificationTests.TextureSpecCase.call(this, name, desc); this.m_texFormat = format; this.m_texFormatInfo = tcuTextureUtil.getTextureFormatInfo(format); this.m_width = width; this.m_height = height; this.m_numLevels = numLevels; }; es3fTextureSpecificationTests.Texture2DSpecCase.prototype = Object.create( es3fTextureSpecificationTests.TextureSpecCase.prototype ); es3fTextureSpecificationTests.Texture2DSpecCase.prototype.constructor = es3fTextureSpecificationTests.Texture2DSpecCase; /** * @param {sglrGLContext.GLContext} webgl2Context * @param {sglrReferenceContext.ReferenceContext} refContext */ es3fTextureSpecificationTests.Texture2DSpecCase.prototype.verifyTexture = function( webgl2Context, refContext ) { /** @type {es3fFboTestUtil.Texture2DShader} */ var shader = new es3fFboTestUtil.Texture2DShader( [gluTextureUtil.getSampler2DType(this.m_texFormat)], gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderIDgles = webgl2Context.createProgram(shader); var shaderIDRef = refContext.createProgram(shader); shader.setTexScaleBias( 0, this.m_texFormatInfo.lookupScale, this.m_texFormatInfo.lookupBias ); // Set state. for (var ndx = 0; ndx < 2; ndx++) { var ctx = ndx ? refContext : webgl2Context; this.m_context = ctx; this.m_context.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST ); this.m_context.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); this.m_context.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAX_LEVEL, this.m_numLevels - 1 ); } for (var levelNdx = 0; levelNdx < this.m_numLevels; levelNdx++) { var levelW = Math.max(1, this.m_width >> levelNdx); var levelH = Math.max(1, this.m_height >> levelNdx); /** @type {tcuSurface.Surface} */ var reference = new tcuSurface.Surface(); /** @type {tcuSurface.Surface} */ var result = new tcuSurface.Surface(); for (var ndx = 0; ndx < 2; ndx++) { /** @type {tcuSurface.Surface} */ var dst = ndx ? reference : result; var ctx = ndx ? refContext : webgl2Context; var shaderID = ndx ? shaderIDRef : shaderIDgles; this.m_context = ctx; shader.setUniforms(ctx, shaderID); this.renderTex(dst, shaderID, levelW, levelH); } var threshold = es3fTextureSpecificationTests.computeCompareThreshold( tcuPixelFormat.PixelFormatFromContext(gl), this.m_texFormat ); var levelStr = levelNdx.toString(); var name = 'Level' + levelStr; var desc = 'Level ' + levelStr; var isOk = tcuImageCompare.intThresholdCompare( name, desc, reference.getAccess(), result.getAccess(), threshold, levelNdx == 0 ? tcuImageCompare.CompareLogMode.RESULT : tcuImageCompare.CompareLogMode.ON_ERROR ); if (!isOk) { testFailed('Image comparison failed'); return false; } else { // tcuLogImage.logImageWithInfo(result.getAccess(),'Comparison OK on level: ' + levelNdx); } } return true; }; /** * @constructor * @extends {es3fTextureSpecificationTests.TextureSpecCase} * @param {string} name * @param {string} desc * @param {tcuTexture.TextureFormat} format * @param {number} size * @param {number} numLevels */ es3fTextureSpecificationTests.TextureCubeSpecCase = function( name, desc, format, size, numLevels ) { es3fTextureSpecificationTests.TextureSpecCase.call( this, name, desc ); this.m_texFormat = format; this.m_texFormatInfo = tcuTextureUtil.getTextureFormatInfo(format); this.m_size = size; this.m_numLevels = numLevels; }; es3fTextureSpecificationTests.TextureCubeSpecCase.prototype = Object.create(es3fTextureSpecificationTests.TextureSpecCase.prototype); es3fTextureSpecificationTests.TextureCubeSpecCase.prototype.constructor = es3fTextureSpecificationTests.TextureCubeSpecCase; /** * @param {sglrGLContext.GLContext} webgl2Context * @param {sglrReferenceContext.ReferenceContext} refContext */ es3fTextureSpecificationTests.TextureCubeSpecCase.prototype.verifyTexture = function( webgl2Context, refContext ) { /** @type {es3fFboTestUtil.TextureCubeShader} */ var shader = new es3fFboTestUtil.TextureCubeShader( gluTextureUtil.getSamplerCubeType(this.m_texFormat), gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderIDgles = webgl2Context.createProgram(shader); var shaderIDRef = refContext.createProgram(shader); shader.setTexScaleBias( this.m_texFormatInfo.lookupScale, this.m_texFormatInfo.lookupBias ); // Set state. for (var ndx = 0; ndx < 2; ndx++) { var ctx = ndx ? refContext : webgl2Context; this.m_context = ctx; this.m_context.texParameteri( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST ); this.m_context.texParameteri( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); this.m_context.texParameteri( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAX_LEVEL, this.m_numLevels - 1 ); } for (var levelNdx = 0; levelNdx < this.m_numLevels; levelNdx++) { var levelSize = Math.max(1, this.m_size >> levelNdx); var isOk = true; for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; /** @type {tcuSurface.Surface} */ var reference = new tcuSurface.Surface(); /** @type {tcuSurface.Surface} */ var result = new tcuSurface.Surface(); if (levelSize <= 2) continue; // Fuzzy compare doesn't work for images this small. shader.setFace(face); for (var ndx = 0; ndx < 2; ndx++) { /** @type {tcuSurface.Surface} */ var dst = ndx ? reference : result; ctx = ndx ? refContext : webgl2Context; var shaderID = ndx ? shaderIDRef : shaderIDgles; this.m_context = ctx; shader.setUniforms(ctx, shaderID); this.renderTex(dst, shaderID, levelSize, levelSize); } var threshold = 0.02; var faceStr = face.toString(); var levelStr = levelNdx.toString(); var name = 'Level' + levelStr; var desc = 'Level ' + levelStr + ', face ' + faceStr; var isFaceOk = tcuImageCompare.fuzzyCompare( name, desc, reference.getAccess(), result.getAccess(), threshold, levelNdx == 0 ? tcuImageCompare.CompareLogMode.RESULT : tcuImageCompare.CompareLogMode.ON_ERROR ); if (!isFaceOk) { testFailed('Image comparison failed'); return false; } } } return true; }; /** * @constructor * @extends {es3fTextureSpecificationTests.TextureSpecCase} * @param {string} name * @param {string} desc * @param {tcuTexture.TextureFormat} format * @param {number} width * @param {number} height * @param {number} numLayers * @param {number} numLevels */ es3fTextureSpecificationTests.Texture2DArraySpecCase = function( name, desc, format, width, height, numLayers, numLevels ) { es3fTextureSpecificationTests.TextureSpecCase.call( this, name, desc ); this.m_texFormat = format; this.m_texFormatInfo = tcuTextureUtil.getTextureFormatInfo(format); this.m_width = width; this.m_height = height; this.m_numLayers = numLayers; this.m_numLevels = numLevels; }; es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype = Object.create(es3fTextureSpecificationTests.TextureSpecCase.prototype); es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype.constructor = es3fTextureSpecificationTests.Texture2DArraySpecCase; /** * @param {sglrGLContext.GLContext} webgl2Context * @param {sglrReferenceContext.ReferenceContext} refContext */ es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype.verifyTexture = function( webgl2Context, refContext ) { /** @type {es3fFboTestUtil.Texture2DArrayShader} */ var shader = new es3fFboTestUtil.Texture2DArrayShader( gluTextureUtil.getSampler2DArrayType(this.m_texFormat), gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderIDgles = webgl2Context.createProgram(shader); var shaderIDRef = refContext.createProgram(shader); shader.setTexScaleBias( this.m_texFormatInfo.lookupScale, this.m_texFormatInfo.lookupBias ); // Set state. for (var ndx = 0; ndx < 2; ndx++) { var ctx = ndx ? refContext : webgl2Context; this.m_context = ctx; this.m_context.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST ); this.m_context.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); this.m_context.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAX_LEVEL, this.m_numLevels - 1 ); } for (var layerNdx = 0; layerNdx < this.m_numLayers; layerNdx++) { var layerOk = true; shader.setLayer(layerNdx); for (var levelNdx = 0; levelNdx < this.m_numLevels; levelNdx++) { var levelW = Math.max(1, this.m_width >> levelNdx); var levelH = Math.max(1, this.m_height >> levelNdx); if (levelW == 1 || levelH == 1) { // Rendering to texture of size x1 is problematic in referencerenderer // due to its deviation from c++ code: crbug.com/613206 continue; } /** @type {tcuSurface.Surface} */ var reference = new tcuSurface.Surface(); /** @type {tcuSurface.Surface} */ var result = new tcuSurface.Surface(); var isOk = true; for (var ndx = 0; ndx < 2; ndx++) { /** @type {tcuSurface.Surface} */ var dst = ndx ? reference : result; ctx = ndx ? refContext : webgl2Context; var shaderID = ndx ? shaderIDRef : shaderIDgles; this.m_context = ctx; shader.setUniforms(ctx, shaderID); this.renderTex(dst, shaderID, levelW, levelH); } var threshold = es3fTextureSpecificationTests.computeCompareThreshold( tcuPixelFormat.PixelFormatFromContext(gl), this.m_texFormat ); var levelStr = levelNdx.toString(); var layerStr = layerNdx.toString(); var name = 'Layer' + layerStr + 'Level' + levelStr; var desc = 'Layer ' + layerStr + ', Level ' + levelStr; var depthOk = tcuImageCompare.intThresholdCompare( name, desc, reference.getAccess(), result.getAccess(), threshold, (levelNdx == 0 && layerNdx == 0) ? tcuImageCompare.CompareLogMode.RESULT : tcuImageCompare.CompareLogMode.ON_ERROR ); if (!depthOk) { testFailed('Image comparison failed'); return false; } } } return true; }; /** * @constructor * @extends {es3fTextureSpecificationTests.TextureSpecCase} * @param {string} name * @param {string} desc * @param {tcuTexture.TextureFormat} format * @param {number} width * @param {number} height * @param {number} depth * @param {number} numLevels */ es3fTextureSpecificationTests.Texture3DSpecCase = function( name, desc, format, width, height, depth, numLevels ) { es3fTextureSpecificationTests.TextureSpecCase.call( this, name, desc ); this.m_texFormat = format; this.m_texFormatInfo = tcuTextureUtil.getTextureFormatInfo(format); this.m_width = width; this.m_height = height; this.m_depth = depth; this.m_numLevels = numLevels; }; es3fTextureSpecificationTests.Texture3DSpecCase.prototype = Object.create(es3fTextureSpecificationTests.TextureSpecCase.prototype); es3fTextureSpecificationTests.Texture3DSpecCase.prototype.constructor = es3fTextureSpecificationTests.Texture3DSpecCase; /** * @param {sglrGLContext.GLContext} webgl2Context * @param {sglrReferenceContext.ReferenceContext} refContext */ es3fTextureSpecificationTests.Texture3DSpecCase.prototype.verifyTexture = function( webgl2Context, refContext ) { /** @type {es3fFboTestUtil.Texture3DShader} */ var shader = new es3fFboTestUtil.Texture3DShader( gluTextureUtil.getSampler3D(this.m_texFormat), gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderIDgles = webgl2Context.createProgram(shader); var shaderIDRef = refContext.createProgram(shader); shader.setTexScaleBias( this.m_texFormatInfo.lookupScale, this.m_texFormatInfo.lookupBias ); // Set state. for (var ndx = 0; ndx < 2; ndx++) { var ctx = ndx ? refContext : webgl2Context; this.m_context = ctx; this.m_context.texParameteri( gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_NEAREST ); this.m_context.texParameteri( gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); this.m_context.texParameteri( gl.TEXTURE_3D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_3D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_3D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE ); this.m_context.texParameteri( gl.TEXTURE_3D, gl.TEXTURE_MAX_LEVEL, this.m_numLevels - 1 ); } for (var levelNdx = 0; levelNdx < this.m_numLevels; levelNdx++) { var levelW = Math.max(1, this.m_width >> levelNdx); var levelH = Math.max(1, this.m_height >> levelNdx); var levelD = Math.max(1, this.m_depth >> levelNdx); var levelOk = true; if (levelW == 1 || levelH == 1) { // Rendering to texture of size x1 is problematic in referencerenderer // due to its deviation from c++ code: crbug.com/613206 continue; } for (var depth = 0; depth < levelD; depth++) { /** @type {tcuSurface.Surface} */ var reference = new tcuSurface.Surface(); /** @type {tcuSurface.Surface} */ var result = new tcuSurface.Surface(); shader.setDepth((depth + 0.5) / levelD); for (var ndx = 0; ndx < 2; ndx++) { /** @type {tcuSurface.Surface} */ var dst = ndx ? reference : result; ctx = ndx ? refContext : webgl2Context; var shaderID = ndx ? shaderIDRef : shaderIDgles; this.m_context = ctx; shader.setUniforms(ctx, shaderID); this.renderTex(dst, shaderID, levelW, levelH); } var threshold = es3fTextureSpecificationTests.computeCompareThreshold( tcuPixelFormat.PixelFormatFromContext(gl), this.m_texFormat ); var levelStr = levelNdx.toString(); var sliceStr = depth.toString(); var name = 'Layer' + levelStr + 'Slice' + sliceStr; var desc = 'Layer ' + levelStr + ', Slice ' + sliceStr; var depthOk = tcuImageCompare.intThresholdCompare( name, desc, reference.getAccess(), result.getAccess(), threshold, (levelNdx == 0 && depth == 0) ? tcuImageCompare.CompareLogMode.RESULT : tcuImageCompare.CompareLogMode.ON_ERROR ); if (!depthOk) { testFailed('Image comparison failed'); return false; } } } return true; }; // Basic TexImage2D() with 2D texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.BasicTexImage2DCase = function( name, desc, format, dataType, width, height ) { // Unsized internal format. es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), width, height, es3fTextureSpecificationTests.maxLevelCount( width, height ) ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.BasicTexImage2DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests.BasicTexImage2DCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexImage2DCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @return {es3fTextureSpecificationTests.BasicTexImage2DCase} */ es3fTextureSpecificationTests.newBasicTexImage2DCaseInternal = function( name, desc, internalFormat, width, height ) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.BasicTexImage2DCase( name, desc, fmt.format, fmt.dataType, width, height ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests.BasicTexImage2DCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelW, levelH); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage2D( gl.TEXTURE_2D, ndx, this.m_internalFormat, levelW, levelH, 0, this.m_format, this.m_dataType, levelData.getAccess().getDataPtr() ); } }; // Basic TexImage2D() with cubemap usage /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} size */ es3fTextureSpecificationTests.BasicTexImageCubeCase = function( name, desc, format, dataType, size ) { // Unsized internal format. es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), size, deMath.logToFloor(size) + 1 ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.BasicTexImageCubeCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. BasicTexImageCubeCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexImageCubeCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @return {es3fTextureSpecificationTests.BasicTexImageCubeCase} */ es3fTextureSpecificationTests.newBasicTexImageCubeCaseInternal = function( name, desc, internalFormat, size ) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.BasicTexImageCubeCase( name, desc, fmt.format, fmt.dataType, size ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. BasicTexImageCubeCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_size, this.m_size ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); levelData.setSize(levelSize, levelSize); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, this.m_internalFormat, levelSize, levelSize, 0, this.m_format, this.m_dataType, levelData.getAccess().getDataPtr() ); } } }; // Basic TexImage3D() with 2D array texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DArraySpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} numLayers */ es3fTextureSpecificationTests.BasicTexImage2DArrayCase = function( name, desc, internalFormat, width, height, numLayers ) { es3fTextureSpecificationTests.Texture2DArraySpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat(internalFormat), width, height, numLayers, es3fTextureSpecificationTests.maxLevelCount( width, height ) ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicTexImage2DArrayCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype ); es3fTextureSpecificationTests. BasicTexImage2DArrayCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexImage2DArrayCase; /** * createTexture */ es3fTextureSpecificationTests. BasicTexImage2DArrayCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D_ARRAY, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelW, levelH, this.m_numLayers); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage3D( gl.TEXTURE_2D_ARRAY, ndx, this.m_internalFormat, levelW, levelH, this.m_numLayers, 0, transferFmt.format, transferFmt.dataType, levelData.getAccess().getDataPtr() ); } }; // Basic TexImage3D() with 3D texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture3DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth */ es3fTextureSpecificationTests.BasicTexImage3DCase = function( name, desc, internalFormat, width, height, depth ) { es3fTextureSpecificationTests.Texture3DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat(internalFormat), width, height, depth, es3fTextureSpecificationTests.maxLevelCount( width, height, depth ) ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicTexImage3DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture3DSpecCase.prototype ); es3fTextureSpecificationTests. BasicTexImage3DCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexImage3DCase; /** * createTexture */ es3fTextureSpecificationTests. BasicTexImage3DCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_3D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var levelD = Math.max(1, this.m_depth >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelW, levelH, levelD); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage3D( gl.TEXTURE_3D, ndx, this.m_internalFormat, levelW, levelH, levelD, 0, transferFmt.format, transferFmt.dataType, levelData.getAccess().getDataPtr() ); } }; // Randomized 2D texture specification using TexImage2D /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.RandomOrderTexImage2DCase = function( name, desc, format, dataType, width, height ) { // Unsized internal format. es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), width, height, es3fTextureSpecificationTests.maxLevelCount( width, height ) ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.RandomOrderTexImage2DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. RandomOrderTexImage2DCase.prototype.constructor = es3fTextureSpecificationTests.RandomOrderTexImage2DCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @return {es3fTextureSpecificationTests.RandomOrderTexImage2DCase} */ es3fTextureSpecificationTests.newRandomOrderTexImage2DCaseInternal = function(name, desc, internalFormat, width, height) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.RandomOrderTexImage2DCase( name, desc, fmt.format, fmt.dataType, width, height ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. RandomOrderTexImage2DCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); var levels = []; for (var i = 0; i < this.m_numLevels; i++) levels[i] = i; levels = rnd.shuffle(levels); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelNdx = levels[ndx]; var levelW = Math.max(1, this.m_width >> levelNdx); var levelH = Math.max(1, this.m_height >> levelNdx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelW, levelH); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage2D( gl.TEXTURE_2D, levelNdx, this.m_internalFormat, levelW, levelH, 0, this.m_format, this.m_dataType, levelData.getAccess().getDataPtr() ); } }; // Randomized cubemap texture specification using TexImage2D /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} size */ es3fTextureSpecificationTests.RandomOrderTexImageCubeCase = function( name, desc, format, dataType, size ) { // Unsized internal format. es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), size, deMath.logToFloor(size) + 1 ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.RandomOrderTexImageCubeCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. RandomOrderTexImageCubeCase.prototype.constructor = es3fTextureSpecificationTests.RandomOrderTexImageCubeCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @return {es3fTextureSpecificationTests.RandomOrderTexImageCubeCase} */ es3fTextureSpecificationTests.newRandomOrderTexImageCubeCaseInternal = function(name, desc, internalFormat, size) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.RandomOrderTexImageCubeCase( name, desc, fmt.format, fmt.dataType, size ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. RandomOrderTexImageCubeCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_size, this.m_size ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); // Level-face pairs. var images = []; for (var ndx = 0; ndx < this.m_numLevels; ndx++) for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; images[ndx * 6 + face] = {ndx: ndx, face: face}; } images = rnd.shuffle(images); for (var ndx = 0; ndx < images.length; ndx++) { var levelNdx = images[ndx].ndx; /** @type {framework.common.tcuTexture.CubeFace} */ var face = images[ndx].face; var levelSize = Math.max(1, this.m_size >> levelNdx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelSize, levelSize); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], levelNdx, this.m_internalFormat, levelSize, levelSize, 0, this.m_format, this.m_dataType, levelData.getAccess().getDataPtr() ); } }; // TexImage2D() unpack alignment case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} width * @param {number} height * @param {number} numLevels * @param {number} alignment */ es3fTextureSpecificationTests.TexImage2DAlignCase = function( name, desc, format, dataType, width, height, numLevels, alignment ) { // Unsized internal format. es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), width, height, numLevels ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexImage2DAlignCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexImage2DAlignCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DAlignCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} numLevels * @param {number} alignment * @return {es3fTextureSpecificationTests.TexImage2DAlignCase} */ es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal = function( name, desc, internalFormat, width, height, numLevels, alignment ) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.TexImage2DAlignCase( name, desc, fmt.format, fmt.dataType, width, height, numLevels, alignment ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests.TexImage2DAlignCase.prototype.createTexture = function() { var tex = null; /** @type {ArrayBuffer} */ var data; tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var colorA = deMath.add( deMath.multiply( [1.0, 0.0, 0.0, 1.0], deMath.subtract( this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin ) ), this.m_texFormatInfo.valueMin ); var colorB = deMath.add( deMath.multiply( [0.0, 1.0, 0.0, 1.0], deMath.subtract( this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin ) ), this.m_texFormatInfo.valueMin ); var rowPitch = deMath.deAlign32( levelW * this.m_texFormat.getPixelSize(), this.m_alignment ); var cellSize = Math.max(1, Math.min(levelW >> 2, levelH >> 2)); data = new ArrayBuffer(rowPitch * levelH); var access = new tcuTexture.PixelBufferAccess({format: this.m_texFormat, width: levelW, height: levelH, rowPitch: rowPitch, data: data} ); tcuTextureUtil.fillWithGrid(access, cellSize, colorA, colorB ); this.m_context.texImage2D( gl.TEXTURE_2D, ndx, this.m_internalFormat, levelW, levelH, 0, this.m_format, this.m_dataType, access.getDataPtr() ); } }; // TexImageCube unpack alignment case. /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} size * @param {number} numLevels * @param {number} alignment */ es3fTextureSpecificationTests.TexImageCubeAlignCase = function( name, desc, format, dataType, size, numLevels, alignment ) { // Unsized internal format. es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), size, numLevels ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexImageCubeAlignCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. TexImageCubeAlignCase.prototype.constructor = es3fTextureSpecificationTests.TexImageCubeAlignCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @param {number} numLevels * @param {number} alignment * @return {es3fTextureSpecificationTests.TexImageCubeAlignCase} */ es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal = function(name, desc, internalFormat, size, numLevels, alignment) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.TexImageCubeAlignCase( name, desc, fmt.format, fmt.dataType, size, numLevels, alignment ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. TexImageCubeAlignCase.prototype.createTexture = function() { var tex = null; var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); /** @type {ArrayBuffer} */ var data; tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); var cellSize = Math.max(1, levelSize >> 2); var rowPitch = deMath.deAlign32( this.m_texFormat.getPixelSize() * levelSize, this.m_alignment ); var colorA = deMath.add(deMath.multiply( [1.0, 0.0, 0.0, 1.0], deMath.subtract( this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin )), this.m_texFormatInfo.valueMin ); var colorB = deMath.add(deMath.multiply( [0.0, 1.0, 0.0, 1.0], deMath.subtract( this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin )), this.m_texFormatInfo.valueMin ); data = new ArrayBuffer(rowPitch * levelSize); var access = new tcuTexture.PixelBufferAccess({format: this.m_texFormat, width: levelSize, height: levelSize, rowPitch: rowPitch, data: data} ); tcuTextureUtil.fillWithGrid(access, cellSize, colorA, colorB ); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, this.m_internalFormat, levelSize, levelSize, 0, this.m_format, this.m_dataType, access.getDataPtr() ); } } }; // TexImage2D() unpack parameters case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} rowLength * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment */ es3fTextureSpecificationTests.TexImage2DParamsCase = function( name, desc, internalFormat, width, height, rowLength, skipRows, skipPixels, alignment ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat(internalFormat), width, height, 1 ); this.m_internalFormat = internalFormat; this.m_rowLength = rowLength; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexImage2DParamsCase.prototype = Object.create(es3fTextureSpecificationTests.Texture2DSpecCase.prototype); es3fTextureSpecificationTests.TexImage2DParamsCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DParamsCase; /** * createTexture */ es3fTextureSpecificationTests.TexImage2DParamsCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_width; var rowPitch = deMath.deAlign32(rowLength * pixelSize, this.m_alignment); var height = this.m_height + this.m_skipRows; var tex = null; /** @type {ArrayBuffer} */ var data; assertMsgOptions( this.m_numLevels == 1, 'Number of levels different to 1', false, true ); // Fill data with grid. data = new ArrayBuffer(rowPitch * height + this.m_skipPixels * pixelSize); var cScale = deMath.subtract( this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin ); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply( [1.0, 0.0, 0.0, 1.0], cScale ), cBias ); var colorB = deMath.add( deMath.multiply( [0.0, 1.0, 0.0, 1.0], cScale ), cBias ); var accessWithOffset = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, rowPitch: rowPitch, data: data, offset: this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize }); tcuTextureUtil.fillWithGrid(accessWithOffset, 4, colorA, colorB ); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, rowPitch: rowPitch, data: data, }); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.texImage2D( gl.TEXTURE_2D, 0, this.m_internalFormat, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); }; // TexImage3D() unpack parameters case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture3DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth * @param {number} imageHeight * @param {number} rowLength * @param {number} skipImages * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment */ es3fTextureSpecificationTests.TexImage3DParamsCase = function( name, desc, internalFormat, width, height, depth, imageHeight, rowLength, skipImages, skipRows, skipPixels, alignment ) { es3fTextureSpecificationTests.Texture3DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat(internalFormat), width, height, depth, 1 ); this.m_internalFormat = internalFormat; this.m_imageHeight = imageHeight; this.m_rowLength = rowLength; this.m_skipImages = skipImages; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexImage3DParamsCase.prototype = Object.create(es3fTextureSpecificationTests.Texture3DSpecCase.prototype); es3fTextureSpecificationTests.TexImage3DParamsCase.prototype.constructor = es3fTextureSpecificationTests.Texture3DSpecCase; /** * createTexture */ es3fTextureSpecificationTests.TexImage3DParamsCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_width; var rowPitch = deMath.deAlign32(rowLength * pixelSize, this.m_alignment); var imageHeight = this.m_imageHeight > 0 ? this.m_imageHeight : this.m_height; var slicePitch = imageHeight * rowPitch; var tex = null; /** @type {ArrayBuffer} */ var data; assertMsgOptions( this.m_numLevels == 1, 'Number of levels different to 1', false, true ); // Fill data with grid. data = new ArrayBuffer(slicePitch * (this.m_depth + this.m_skipImages) + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize); var cScale = deMath.subtract( this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin ); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply( [1.0, 0.0, 0.0, 1.0], cScale ), cBias ); var colorB = deMath.add( deMath.multiply( [0.0, 1.0, 0.0, 1.0], cScale ), cBias ); var accessWithOffset = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_depth, rowPitch: rowPitch, slicePitch: slicePitch, data: data, offset: this.m_skipImages * slicePitch + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize }); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_depth, rowPitch: rowPitch, slicePitch: slicePitch, data: data }); tcuTextureUtil.fillWithGrid( accessWithOffset, 4, colorA, colorB ); this.m_context.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, this.m_imageHeight); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_IMAGES, this.m_skipImages); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_3D, tex); this.m_context.texImage3D( gl.TEXTURE_3D, 0, this.m_internalFormat, this.m_width, this.m_height, this.m_depth, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); }; /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.BasicTexSubImage2DCase = function( name, desc, format, dataType, width, height ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), width, height, es3fTextureSpecificationTests.maxLevelCount( width, height ) ); this.m_format = format; this.m_internalFormat = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.BasicTexSubImage2DCase.prototype = Object.create(es3fTextureSpecificationTests.Texture2DSpecCase.prototype); es3fTextureSpecificationTests.BasicTexSubImage2DCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexSubImage2DCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @return {es3fTextureSpecificationTests.BasicTexSubImage2DCase} */ es3fTextureSpecificationTests.newBasicTexSubImage2DCaseInternal = function(name, desc, internalFormat, width, height) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.BasicTexSubImage2DCase( name, desc, fmt.format, fmt.dataType, width, height ); testcase.m_internalFormat = internalFormat; return testcase; }; /** */ es3fTextureSpecificationTests. BasicTexSubImage2DCase.prototype.createTexture = function() { var tex = null; var data = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); data.setSize(levelW, levelH); tcuTextureUtil.fillWithComponentGradients( data.getAccess(), gMin, gMax ); this.m_context.texImage2D( gl.TEXTURE_2D, ndx, this.m_internalFormat, levelW, levelH, 0, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var w = rnd.getInt(1, levelW); var h = rnd.getInt(1, levelH); var x = rnd.getInt(0, levelW - w); var y = rnd.getInt(0, levelH - h); var colorA = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var colorB = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var cellSize = rnd.getInt(2, 16); data.setSize(w, h); tcuTextureUtil.fillWithGrid( data.getAccess(), cellSize, colorA, colorB ); this.m_context.texSubImage2D( gl.TEXTURE_2D, ndx, x, y, w, h, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } }; /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} size */ es3fTextureSpecificationTests.BasicTexSubImageCubeCase = function( name, desc, format, dataType, size ) { es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), size, deMath.logToFloor(size) + 1 ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.BasicTexSubImageCubeCase.prototype = Object.create(es3fTextureSpecificationTests.TextureCubeSpecCase.prototype); es3fTextureSpecificationTests. BasicTexSubImageCubeCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexSubImageCubeCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size */ es3fTextureSpecificationTests.newBasicTexSubImageCubeCaseInternal = function(name, desc, internalFormat, size) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.BasicTexSubImageCubeCase( name, desc, fmt.format, fmt.dataType, size); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. BasicTexSubImageCubeCase.prototype.createTexture = function() { var tex = null; var data = new tcuTexture.TextureLevel( this.m_texFormat, this.m_size, this.m_size ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); data.setSize(levelSize, levelSize); for (var face = /** @type {tcuTexture.CubeFace} */ (0); face < es3fTextureSpecificationTests.s_cubeMapFaces.length; face++) { var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); tcuTextureUtil.fillWithComponentGradients( data.getAccess(), gMin, gMax ); this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, this.m_internalFormat, levelSize, levelSize, 0, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } } // Re-specify parts of each face and level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var w = rnd.getInt(1, levelSize); var h = rnd.getInt(1, levelSize); var x = rnd.getInt(0, levelSize - w); var y = rnd.getInt(0, levelSize - h); var colorA = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var colorB = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var cellSize = rnd.getInt(2, 16); data.setSize(w, h); tcuTextureUtil.fillWithGrid( data.getAccess(), cellSize, colorA, colorB ); this.m_context.texSubImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, x, y, w, h, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } } }; // TexSubImage2D() unpack parameters case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} subX * @param {number} subY * @param {number} subW * @param {number} subH * @param {number} rowLength * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment */ es3fTextureSpecificationTests.TexSubImage2DParamsCase = function( name, desc, internalFormat, width, height, subX, subY, subW, subH, rowLength, skipRows, skipPixels, alignment ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat(internalFormat), width, height, 1 ); this.m_internalFormat = internalFormat; this.m_subX = subX; this.m_subY = subY; this.m_subW = subW; this.m_subH = subH; this.m_rowLength = rowLength; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexSubImage2DParamsCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage2DParamsCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage2DParamsCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage2DParamsCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var tex = null; /** @type {ArrayBuffer} */ var data; assertMsgOptions( this.m_numLevels == 1, 'Number of levels different to 1', false, true ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); // First fill texture with gradient. data = new ArrayBuffer( deMath.deAlign32(this.m_width * pixelSize, 4) * this.m_height ); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, rowPitch: deMath.deAlign32(this.m_width * pixelSize, 4), data: data }); tcuTextureUtil.fillWithComponentGradients(access, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax ); this.m_context.texImage2D( gl.TEXTURE_2D, 0, this.m_internalFormat, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); // Fill data with grid. var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_subW; var rowPitch = deMath.deAlign32(rowLength * pixelSize, this.m_alignment); var height = this.m_subH + this.m_skipRows; var cScale = deMath.subtract( this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin ); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply( [1.0, 0.0, 0.0, 1.0], cScale ), cBias ); var colorB = deMath.add( deMath.multiply( [0.0, 1.0, 0.0, 1.0], cScale ), cBias ); data = new ArrayBuffer(rowPitch * height + this.m_skipPixels * pixelSize); tcuTextureUtil.fillWithGrid( new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, rowPitch: rowPitch, data: data, offset: this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize }) , 4, colorA, colorB ); access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, rowPitch: rowPitch, data: data }); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); this.m_context.texSubImage2D( gl.TEXTURE_2D, 0, this.m_subX, this.m_subY, this.m_subW, this.m_subH, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); }; // Basic TexSubImage3D() with 3D texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture3DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth */ es3fTextureSpecificationTests.BasicTexSubImage3DCase = function( name, desc, internalFormat, width, height, depth ) { es3fTextureSpecificationTests.Texture3DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat(internalFormat), width, height, depth, es3fTextureSpecificationTests.maxLevelCount( width, height, depth ) ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicTexSubImage3DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture3DSpecCase.prototype ); es3fTextureSpecificationTests.BasicTexSubImage3DCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexSubImage3DCase; /** * createTexture */ es3fTextureSpecificationTests. BasicTexSubImage3DCase.prototype.createTexture = function() { var tex = null; var data = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_3D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); // First specify full texture. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var levelD = Math.max(1, this.m_depth >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); data.setSize(levelW, levelH, levelD); tcuTextureUtil.fillWithComponentGradients( data.getAccess(), gMin, gMax ); this.m_context.texImage3D( gl.TEXTURE_3D, ndx, this.m_internalFormat, levelW, levelH, levelD, 0, transferFmt.format, transferFmt.dataType, data.getAccess().getDataPtr() ); } // Re-specify parts of each level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var levelD = Math.max(1, this.m_depth >> ndx); var w = rnd.getInt(1, levelW); var h = rnd.getInt(1, levelH); var d = rnd.getInt(1, levelD); var x = rnd.getInt(0, levelW - w); var y = rnd.getInt(0, levelH - h); var z = rnd.getInt(0, levelD - d); var colorA = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var colorB = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var cellSize = rnd.getInt(2, 16); data.setSize(w, h, d); tcuTextureUtil.fillWithGrid( data.getAccess(), cellSize, colorA, colorB ); this.m_context.texSubImage3D( gl.TEXTURE_3D, ndx, x, y, z, w, h, d, transferFmt.format, transferFmt.dataType, data.getAccess().getDataPtr() ); } }; // TexSubImage2D() to texture initialized with empty data /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.TexSubImage2DEmptyTexCase = function( name, desc, format, dataType, width, height ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), width, height, es3fTextureSpecificationTests.maxLevelCount( width, height ) ); this.m_format = format; this.m_internalFormat = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.TexSubImage2DEmptyTexCase.prototype = Object.create(es3fTextureSpecificationTests.Texture2DSpecCase.prototype); es3fTextureSpecificationTests. TexSubImage2DEmptyTexCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage2DEmptyTexCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.newTexSubImage2DEmptyTexCaseInternal = function(name, desc, internalFormat, width, height) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.TexSubImage2DEmptyTexCase( name, desc, fmt.format, fmt.dataType, width, height ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage2DEmptyTexCase.prototype.createTexture = function() { var tex = null; var data = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); // First allocate storage for each level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); this.m_context.texImage2D( gl.TEXTURE_2D, ndx, this.m_internalFormat, levelW, levelH, 0, this.m_format, this.m_dataType, null ); } // Specify pixel data to all levels using glTexSubImage2D() for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); data.setSize(levelW, levelH); tcuTextureUtil.fillWithComponentGradients( data.getAccess(), gMin, gMax ); this.m_context.texSubImage2D( gl.TEXTURE_2D, ndx, 0, 0, levelW, levelH, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } }; // TexSubImage2D() to empty cubemap texture /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} size */ es3fTextureSpecificationTests.TexSubImageCubeEmptyTexCase = function( name, desc, format, dataType, size ) { // Unsized internal format. es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), size, deMath.logToFloor(size) + 1 ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.TexSubImageCubeEmptyTexCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImageCubeEmptyTexCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImageCubeEmptyTexCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @return {es3fTextureSpecificationTests.TexSubImageCubeEmptyTexCase} */ es3fTextureSpecificationTests.newTexSubImageCubeEmptyTexCaseInternal = function(name, desc, internalFormat, size) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.TexSubImageCubeEmptyTexCase( name, desc, fmt.format, fmt.dataType, size ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. TexSubImageCubeEmptyTexCase.prototype.createTexture = function() { var tex = null; var data = new tcuTexture.TextureLevel( this.m_texFormat, this.m_size, this.m_size ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); // Specify storage for each level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, this.m_internalFormat, levelSize, levelSize, 0, this.m_format, this.m_dataType, null ); } } // Specify data using glTexSubImage2D() for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); data.setSize(levelSize, levelSize); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); tcuTextureUtil.fillWithComponentGradients( data.getAccess(), gMin, gMax ); this.m_context.texSubImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, 0, 0, levelSize, levelSize, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } } }; // TexSubImage2D() unpack alignment with 2D texture /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} width * @param {number} height * @param {number} subX * @param {number} subY * @param {number} subW * @param {number} subH * @param {number} alignment */ es3fTextureSpecificationTests.TexSubImage2DAlignCase = function( name, desc, format, dataType, width, height, subX, subY, subW, subH, alignment ) { // Unsized internal format. es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), width, height, 1 ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; this.m_subX = subX; this.m_subY = subY; this.m_subW = subW; this.m_subH = subH; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexSubImage2DAlignCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage2DAlignCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage2DAlignCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} subX * @param {number} subY * @param {number} subW * @param {number} subH * @param {number} alignment * @return {es3fTextureSpecificationTests.TexSubImage2DAlignCase} */ es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal = function( name, desc, internalFormat, width, height, subX, subY, subW, subH, alignment ) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.TexSubImage2DAlignCase( name, desc, fmt.format, fmt.dataType, width, height, subX, subY, subW, subH, alignment ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage2DAlignCase.prototype.createTexture = function() { var tex = null; /** @type {ArrayBuffer} */ var data; tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); // Specify base level. data = new ArrayBuffer(this.m_texFormat.getPixelSize() * this.m_width * this.m_height ); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, data: data }); tcuTextureUtil.fillWithComponentGradients(access, [0, 0, 0, 0], [1, 1, 1, 1]); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); this.m_context.texImage2D(gl.TEXTURE_2D, 0, this.m_internalFormat, this.m_width, this.m_height, 0, this.m_format, this.m_dataType, access.getDataPtr() ); // Re-specify subrectangle. var rowPitch = deMath.deAlign32( this.m_texFormat.getPixelSize() * this.m_subW, this.m_alignment ); data = new ArrayBuffer(rowPitch * this.m_subH); access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, rowPitch: rowPitch, data: data }); tcuTextureUtil.fillWithGrid(access, 4, [1, 0, 0, 1], [0, 1, 0, 1] ); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); this.m_context.texSubImage2D( gl.TEXTURE_2D, 0, this.m_subX, this.m_subY, this.m_subW, this.m_subH, this.m_format, this.m_dataType, access.getDataPtr() ); }; // TexSubImage2D() unpack alignment with cubemap texture /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} size * @param {number} subX * @param {number} subY * @param {number} subW * @param {number} subH * @param {number} alignment */ es3fTextureSpecificationTests.TexSubImageCubeAlignCase = function( name, desc, format, dataType, size, subX, subY, subW, subH, alignment ) { // Unsized internal format. es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), size, 1 ); this.m_internalFormat = format; this.m_format = format; this.m_dataType = dataType; this.m_subX = subX; this.m_subY = subY; this.m_subW = subW; this.m_subH = subH; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexSubImageCubeAlignCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImageCubeAlignCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImageCubeAlignCase; /** * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @param {number} subX * @param {number} subY * @param {number} subW * @param {number} subH * @param {number} alignment * @return {es3fTextureSpecificationTests.TexSubImageCubeAlignCase} */ es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal = function( name, desc, internalFormat, size, subX, subY, subW, subH, alignment ) { // Sized internal format. var fmt = gluTextureUtil.getTransferFormat( gluTextureUtil.mapGLInternalFormat(internalFormat) ); var testcase = new es3fTextureSpecificationTests.TexSubImageCubeAlignCase( name, desc, fmt.format, fmt.dataType, size, subX, subY, subW, subH, alignment ); testcase.m_internalFormat = internalFormat; return testcase; }; /** * createTexture */ es3fTextureSpecificationTests. TexSubImageCubeAlignCase.prototype.createTexture = function() { var tex = null; tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); var data = new ArrayBuffer(this.m_texFormat.getPixelSize() * this.m_size * this.m_size); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_size, height: this.m_size, data: data }); tcuTextureUtil.fillWithComponentGradients(access, [0, 0, 0, 0], [1, 1, 1, 1] ); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], 0, this.m_internalFormat, this.m_size, this.m_size, 0, this.m_format, this.m_dataType, access.getDataPtr() ); } // Re-specify subrectangle. var rowPitch = deMath.deAlign32( this.m_texFormat.getPixelSize() * this.m_subW, this.m_alignment ); data = new ArrayBuffer(rowPitch * this.m_subH); access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, rowPitch: rowPitch, data: data }); tcuTextureUtil.fillWithGrid(access, 4, [1, 0, 0, 1], [0, 1, 0, 1] ); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; this.m_context.texSubImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], 0, this.m_subX, this.m_subY, this.m_subW, this.m_subH, this.m_format, this.m_dataType, access.getDataPtr() ); } }; // TexSubImage3D() unpack parameters case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture3DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth * @param {number} subX , * @param {number} subY , * @param {number} subZ , * @param {number} subW , * @param {number} subH , * @param {number} subD , * @param {number} imageHeight , * @param {number} rowLength , * @param {number} skipImages , * @param {number} skipRows , * @param {number} skipPixels , * @param {number} alignment */ es3fTextureSpecificationTests.TexSubImage3DParamsCase = function( name, desc, internalFormat, width, height, depth, subX, subY, subZ, subW, subH, subD, imageHeight, rowLength, skipImages, skipRows, skipPixels, alignment ) { es3fTextureSpecificationTests.Texture3DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat(internalFormat), width, height, depth, 1 ); this.m_internalFormat = internalFormat; this.m_subX = subX; this.m_subY = subY; this.m_subZ = subZ; this.m_subW = subW; this.m_subH = subH; this.m_subD = subD; this.m_imageHeight = imageHeight; this.m_rowLength = rowLength; this.m_skipImages = skipImages; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; }; es3fTextureSpecificationTests.TexSubImage3DParamsCase.prototype = Object.create( es3fTextureSpecificationTests.Texture3DSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage3DParamsCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage3DParamsCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage3DParamsCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var tex = null; var rowPitch = deMath.deAlign32(pixelSize * this.m_width, 4); var slicePitch = rowPitch * this.m_height; assertMsgOptions( this.m_numLevels == 1, 'Numbel of levels different than 1', false, true ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_3D, tex); // Fill with gradient. var data = new ArrayBuffer(slicePitch * this.m_depth); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_depth, rowPitch: rowPitch, slicePitch: slicePitch, data: data }); tcuTextureUtil.fillWithComponentGradients(access, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax); this.m_context.texImage3D( gl.TEXTURE_3D, 0, this.m_internalFormat, this.m_width, this.m_height, this.m_depth, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); // Fill data with grid. var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_subW; rowPitch = deMath.deAlign32(rowLength * pixelSize, this.m_alignment); var imageHeight = this.m_imageHeight > 0 ? this.m_imageHeight : this.m_subH; slicePitch = imageHeight * rowPitch; var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); data = new ArrayBuffer(slicePitch * (this.m_depth + this.m_skipImages) + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize); var accessWithOffset = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, depth: this.m_subD, rowPitch: rowPitch, slicePitch: slicePitch, data: data, offset: this.m_skipImages * slicePitch + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize }); access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, depth: this.m_subD, rowPitch: rowPitch, slicePitch: slicePitch, data: data }); tcuTextureUtil.fillWithGrid(accessWithOffset, 4, colorA, colorB); this.m_context.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, this.m_imageHeight); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_IMAGES, this.m_skipImages); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); this.m_context.texSubImage3D( gl.TEXTURE_3D, 0, this.m_subX, this.m_subY, this.m_subZ, this.m_subW, this.m_subH, this.m_subD, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); }; // Basic CopyTexImage2D() with 2D texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.BasicCopyTexImage2DCase = function( name, desc, internalFormat, width, height ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( internalFormat, gl.UNSIGNED_BYTE ), width, height, es3fTextureSpecificationTests.maxLevelCount( width, height ) ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicCopyTexImage2DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. BasicCopyTexImage2DCase.prototype.constructor = es3fTextureSpecificationTests.BasicCopyTexImage2DCase; /** * createTexture */ es3fTextureSpecificationTests. BasicCopyTexImage2DCase.prototype.createTexture = function() { var pixelFormat = tcuPixelFormat.PixelFormatFromContext(gl); var targetHasRGB = pixelFormat.redBits > 0 && pixelFormat.greenBits > 0 && pixelFormat.blueBits > 0; var targetHasAlpha = pixelFormat.alphaBits > 0; var fmt = es3fTextureSpecificationTests.mapGLUnsizedInternalFormat( this.m_internalFormat ); var texHasRGB = fmt.order != tcuTexture.ChannelOrder.A; var texHasAlpha = fmt.order == tcuTexture.ChannelOrder.RGBA || fmt.order == tcuTexture.ChannelOrder.LA || fmt.order == tcuTexture.ChannelOrder.A; var tex = null; var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); /** @type {es3fFboTestUtil.GradientShader} */ var shader = new es3fFboTestUtil.GradientShader( gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderID = this.m_context.createProgram(shader); if ((texHasRGB && !targetHasRGB) || (texHasAlpha && !targetHasAlpha)) throw new Error( 'Copying from current framebuffer is not supported' ); // Fill render target with gradient. shader.setGradient( this.m_context, shaderID, [0, 0, 0, 0], [1, 1, 1, 1] ); rrUtil.drawQuad( this.m_context, shaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0] ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var x = rnd.getInt(0, this.m_width - levelW); var y = rnd.getInt(0, this.m_height - levelH); this.m_context.copyTexImage2D( gl.TEXTURE_2D, ndx, this.m_internalFormat, x, y, levelW, levelH, 0 ); } }; // Basic CopyTexImage2D() with cubemap usage /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size */ es3fTextureSpecificationTests.BasicCopyTexImageCubeCase = function( name, desc, internalFormat, size ) { es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( internalFormat, gl.UNSIGNED_BYTE ), size, deMath.logToFloor(size) + 1 ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicCopyTexImageCubeCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. BasicCopyTexImageCubeCase.prototype.constructor = es3fTextureSpecificationTests.BasicCopyTexImageCubeCase; es3fTextureSpecificationTests. BasicCopyTexImageCubeCase.prototype.createTexture = function() { var pixelFormat = tcuPixelFormat.PixelFormatFromContext(gl); var targetHasRGB = pixelFormat.redBits > 0 && pixelFormat.greenBits > 0 && pixelFormat.blueBits > 0; var targetHasAlpha = pixelFormat.alphaBits > 0; var fmt = es3fTextureSpecificationTests.mapGLUnsizedInternalFormat( this.m_internalFormat ); var texHasRGB = fmt.order != tcuTexture.ChannelOrder.A; var texHasAlpha = fmt.order == tcuTexture.ChannelOrder.RGBA || fmt.order == tcuTexture.ChannelOrder.LA || fmt.order == tcuTexture.ChannelOrder.A; var tex = null; var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); /** @type {es3fFboTestUtil.GradientShader} */ var shader = new es3fFboTestUtil.GradientShader( gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderID = this.m_context.createProgram(shader); if ((texHasRGB && !targetHasRGB) || (texHasAlpha && !targetHasAlpha)) throw new Error( 'Copying from current framebuffer is not supported' ); // Fill render target with gradient. shader.setGradient( this.m_context, shaderID, [0, 0, 0, 0], [1, 1, 1, 1] ); rrUtil.drawQuad( this.m_context, shaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0] ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var x = rnd.getInt(0, this.m_size - levelSize); var y = rnd.getInt(0, this.m_size - levelSize); this.m_context.copyTexImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, this.m_internalFormat, x, y, levelSize, levelSize, 0 ); } } }; // Basic CopyTexSubImage2D() with 2D texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} width * @param {number} height */ es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase = function( name, desc, format, dataType, width, height ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), width, height, es3fTextureSpecificationTests.maxLevelCount( width, height ) ); this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. BasicCopyTexSubImage2DCase.prototype.constructor = es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase; /** * createTexture */ es3fTextureSpecificationTests. BasicCopyTexSubImage2DCase.prototype.createTexture = function() { var pixelFormat = tcuPixelFormat.PixelFormatFromContext(gl); var targetHasRGB = pixelFormat.redBits > 0 && pixelFormat.greenBits > 0 && pixelFormat.blueBits > 0; var targetHasAlpha = pixelFormat.alphaBits > 0; var fmt = gluTextureUtil.mapGLTransferFormat( this.m_format, this.m_dataType ); var texHasRGB = fmt.order != tcuTexture.ChannelOrder.A; var texHasAlpha = fmt.order == tcuTexture.ChannelOrder.RGBA || fmt.order == tcuTexture.ChannelOrder.LA || fmt.order == tcuTexture.ChannelOrder.A; var tex = null; var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); /** @type {es3fFboTestUtil.GradientShader} */ var shader = new es3fFboTestUtil.GradientShader( gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderID = this.m_context.createProgram(shader); if ((texHasRGB && !targetHasRGB) || (texHasAlpha && !targetHasAlpha)) throw new Error( 'Copying from current framebuffer is not supported' ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); // First specify full texture. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var colorA = es3fTextureSpecificationTests.randomVector( rnd, [0, 0, 0, 0], [1, 1, 1, 1], 4 ); var colorB = es3fTextureSpecificationTests.randomVector( rnd, [0, 0, 0, 0], [1, 1, 1, 1], 4 ); var cellSize = rnd.getInt(2, 16); var data = new tcuTexture.TextureLevel(fmt, levelW, levelH); tcuTextureUtil.fillWithGrid( data.getAccess(), cellSize, colorA, colorB ); this.m_context.texImage2D( gl.TEXTURE_2D, ndx, this.m_format, levelW, levelH, 0, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } // Fill render target with gradient. shader.setGradient( this.m_context, shaderID, [0, 0, 0, 0], [1, 1, 1, 1] ); rrUtil.drawQuad( this.m_context, shaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0] ); // Re-specify parts of each level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var w = rnd.getInt(1, levelW); var h = rnd.getInt(1, levelH); var xo = rnd.getInt(0, levelW - w); var yo = rnd.getInt(0, levelH - h); var x = rnd.getInt(0, this.m_width - w); var y = rnd.getInt(0, this.m_height - h); this.m_context.copyTexSubImage2D( gl.TEXTURE_2D, ndx, xo, yo, x, y, w, h ); } }; // Basic CopyTexSubImage2D() with cubemap usage /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} format * @param {number} dataType * @param {number} size */ es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase = function( name, desc, format, dataType, size ) { es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLTransferFormat( format, dataType ), size, deMath.logToFloor(size) + 1 ); this.m_format = format; this.m_dataType = dataType; }; es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. BasicCopyTexSubImageCubeCase.prototype.constructor = es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase; es3fTextureSpecificationTests. BasicCopyTexSubImageCubeCase.prototype.createTexture = function() { var pixelFormat = tcuPixelFormat.PixelFormatFromContext(gl); var targetHasRGB = pixelFormat.redBits > 0 && pixelFormat.greenBits > 0 && pixelFormat.blueBits > 0; var targetHasAlpha = pixelFormat.alphaBits > 0; var fmt = gluTextureUtil.mapGLTransferFormat(this.m_format, this.m_dataType); var texHasRGB = fmt.order != tcuTexture.ChannelOrder.A; var texHasAlpha = fmt.order == tcuTexture.ChannelOrder.RGBA || fmt.order == tcuTexture.ChannelOrder.LA || fmt.order == tcuTexture.ChannelOrder.A; var tex = null; var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); /** @type {es3fFboTestUtil.GradientShader} */ var shader = new es3fFboTestUtil.GradientShader( gluShaderUtil.DataType.FLOAT_VEC4 ); var shaderID = this.m_context.createProgram(shader); if ((texHasRGB && !targetHasRGB) || (texHasAlpha && !targetHasAlpha)) throw new Error( 'Copying from current framebuffer is not supported' ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); var data = new tcuTexture.TextureLevel(fmt); // First specify full texture. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); data.setSize(levelSize, levelSize); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var colorA = es3fTextureSpecificationTests.randomVector( rnd, [0, 0, 0, 0], [1, 1, 1, 1], 4 ); var colorB = es3fTextureSpecificationTests.randomVector( rnd, [0, 0, 0, 0], [1, 1, 1, 1], 4 ); var cellSize = rnd.getInt(2, 16); tcuTextureUtil.fillWithGrid( data.getAccess(), cellSize, colorA, colorB ); this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, this.m_format, levelSize, levelSize, 0, this.m_format, this.m_dataType, data.getAccess().getDataPtr() ); } } // Fill render target with gradient. shader.setGradient( this.m_context, shaderID, [0, 0, 0, 0], [1, 1, 1, 1] ); rrUtil.drawQuad( this.m_context, shaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0] ); // Re-specify parts of each face and level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); for (var f in es3fTextureSpecificationTests.s_cubeMapFaces) { var w = rnd.getInt(1, levelSize); var h = rnd.getInt(1, levelSize); var xo = rnd.getInt(0, levelSize - w); var yo = rnd.getInt(0, levelSize - h); var x = rnd.getInt(0, this.m_size - w); var y = rnd.getInt(0, this.m_size - h); this.m_context.copyTexSubImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[f], ndx, xo, yo, x, y, w, h ); } } }; // Basic glTexStorage2D() with 2D texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} numLevels */ es3fTextureSpecificationTests.BasicTexStorage2DCase = function( name, desc, internalFormat, width, height, numLevels ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, numLevels ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicTexStorage2DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests.BasicTexStorage2DCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexStorage2DCase; /** * createTexture */ es3fTextureSpecificationTests. BasicTexStorage2DCase.prototype.createTexture = function() { var fmt = gluTextureUtil.mapGLInternalFormat(this.m_internalFormat); var transferFmt = gluTextureUtil.getTransferFormat(fmt); var tex = null; var levelData = new tcuTexture.TextureLevel( fmt, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.texStorage2D( gl.TEXTURE_2D, this.m_numLevels, this.m_internalFormat, this.m_width, this.m_height ); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelW, levelH); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texSubImage2D( gl.TEXTURE_2D, ndx, 0, 0, levelW, levelH, transferFmt.format, transferFmt.dataType, levelData.getAccess().getDataPtr() ); } }; // Basic glTexStorage2D() with cubemap usage /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @param {number} numLevels */ es3fTextureSpecificationTests.BasicTexStorageCubeCase = function( name, desc, internalFormat, size, numLevels ) { es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), size, numLevels ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicTexStorageCubeCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests.BasicTexStorageCubeCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexStorageCubeCase; /** * createTexture */ es3fTextureSpecificationTests.BasicTexStorageCubeCase.prototype.createTexture = function() { var fmt = gluTextureUtil.mapGLInternalFormat(this.m_internalFormat); var transferFmt = gluTextureUtil.getTransferFormat(fmt); var tex = null; var levelData = new tcuTexture.TextureLevel( fmt, this.m_size, this.m_size ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.texStorage2D( gl.TEXTURE_CUBE_MAP, this.m_numLevels, this.m_internalFormat, this.m_size, this.m_size ); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelSize = Math.max(1, this.m_size >> ndx); levelData.setSize(levelSize, levelSize); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texSubImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], ndx, 0, 0, levelSize, levelSize, transferFmt.format, transferFmt.dataType, levelData.getAccess().getDataPtr() ); } } }; // Basic glTexStorage3D() with 2D array texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DArraySpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} numLayers * @param {number} numLevels */ es3fTextureSpecificationTests.BasicTexStorage2DArrayCase = function( name, desc, internalFormat, width, height, numLayers, numLevels ) { es3fTextureSpecificationTests.Texture2DArraySpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, numLayers, numLevels ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicTexStorage2DArrayCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype ); es3fTextureSpecificationTests. BasicTexStorage2DArrayCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexStorage2DArrayCase; /** * createTexture */ es3fTextureSpecificationTests.BasicTexStorage2DArrayCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D_ARRAY, tex); this.m_context.texStorage3D( gl.TEXTURE_2D_ARRAY, this.m_numLevels, this.m_internalFormat, this.m_width, this.m_height, this.m_numLayers ); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelW, levelH, this.m_numLayers); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texSubImage3D( gl.TEXTURE_2D_ARRAY, ndx, 0, 0, 0, levelW, levelH, this.m_numLayers, transferFmt.format, transferFmt.dataType, levelData.getAccess().getDataPtr() ); } }; // Basic TexStorage3D() with 3D texture usage /** * @constructor * @extends {es3fTextureSpecificationTests.Texture3DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth * @param {number} numLevels */ es3fTextureSpecificationTests.BasicTexStorage3DCase = function( name, desc, internalFormat, width, height, depth, numLevels ) { es3fTextureSpecificationTests.Texture3DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, depth, numLevels ); this.m_internalFormat = internalFormat; }; es3fTextureSpecificationTests.BasicTexStorage3DCase.prototype = Object.create( es3fTextureSpecificationTests.Texture3DSpecCase.prototype ); es3fTextureSpecificationTests. BasicTexStorage3DCase.prototype.constructor = es3fTextureSpecificationTests.BasicTexStorage3DCase; /** * createTexture */ es3fTextureSpecificationTests. BasicTexStorage3DCase.prototype.createTexture = function() { var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_3D, tex); this.m_context.texStorage3D( gl.TEXTURE_3D, this.m_numLevels, this.m_internalFormat, this.m_width, this.m_height, this.m_depth ); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var levelD = Math.max(1, this.m_depth >> ndx); var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); levelData.setSize(levelW, levelH, levelD); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texSubImage3D( gl.TEXTURE_3D, ndx, 0, 0, 0, levelW, levelH, levelD, transferFmt.format, transferFmt.dataType, levelData.getAccess().getDataPtr() ); } }; // Pixel buffer object cases. // TexImage2D() from pixel buffer object. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} rowLength * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexImage2DBufferCase = function( name, desc, internalFormat, width, height, rowLength, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, 1 ); this.m_internalFormat = internalFormat; this.m_rowLength = rowLength; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexImage2DBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexImage2DBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DBufferCase; /** * createTexture */ es3fTextureSpecificationTests.TexImage2DBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_width + this.m_skipPixels; var rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var height = this.m_height + this.m_skipRows; var buf = null; var tex = null; var data = new ArrayBuffer(rowPitch * height + this.m_skipPixels * pixelSize + this.m_offset); assertMsgOptions( this.m_numLevels == 1, 'Number of levels different than 1', false, true ); // Fill data with grid. var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, rowPitch: rowPitch, data: data, offset: this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); tcuTextureUtil.fillWithGrid(access, 4, colorA, colorB); // Create buffer and upload. buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData(gl.PIXEL_UNPACK_BUFFER, data, gl.STATIC_DRAW ); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.texImage2D(gl.TEXTURE_2D, 0, this.m_internalFormat, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, this.m_offset ); }; // TexImage2D() cubemap from pixel buffer object case /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @param {number} rowLength * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexImageCubeBufferCase = function( name, desc, internalFormat, size, rowLength, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), size, 1 ); this.m_internalFormat = internalFormat; this.m_rowLength = rowLength; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexImageCubeBufferCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. TexImageCubeBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexImageCubeBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexImageCubeBufferCase.prototype.createTexture = function() { var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var tex = null; var fmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_size + this.m_skipPixels; var rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var height = this.m_size + this.m_skipRows; var data = new ArrayBuffer(rowPitch * height + this.m_skipPixels * pixelSize + this.m_offset); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_size, height: this.m_size, rowPitch: rowPitch, data: data, offset: this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var buf = null; var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); tcuTextureUtil.fillWithComponentGradients(access, gMin, gMax); // Create buffer and upload. buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData(gl.PIXEL_UNPACK_BUFFER, data, gl.STATIC_DRAW); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], 0, this.m_internalFormat, this.m_size, this.m_size, 0, fmt.format, fmt.dataType, this.m_offset); } }; // TexImage3D() 2D array from pixel buffer object. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DArraySpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth * @param {number} imageHeight * @param {number} rowLength * @param {number} skipImages * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexImage2DArrayBufferCase = function( name, desc, internalFormat, width, height, depth, imageHeight, rowLength, skipImages, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.Texture2DArraySpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, depth, 1 ); this.m_internalFormat = internalFormat; this.m_imageHeight = imageHeight; this.m_rowLength = rowLength; this.m_skipImages = skipImages; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexImage2DArrayBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype ); es3fTextureSpecificationTests. TexImage2DArrayBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DArrayBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexImage2DArrayBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_width; var rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var imageHeight = this.m_imageHeight > 0 ? this.m_imageHeight : this.m_height; var slicePitch = imageHeight * rowPitch; var tex = null; var buf = null; var data = new ArrayBuffer( slicePitch * (this.m_numLayers + this.m_skipImages) + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset ); assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); // Fill data with grid. var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_numLayers, rowPitch: rowPitch, slicePitch: slicePitch, data: data, offset: this.m_skipImages * slicePitch + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); tcuTextureUtil.fillWithGrid(access, 4, colorA, colorB); // Create buffer and upload. buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData(gl.PIXEL_UNPACK_BUFFER, data, gl.STATIC_DRAW); this.m_context.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, this.m_imageHeight); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_IMAGES, this.m_skipImages); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D_ARRAY, tex); this.m_context.texImage3D( gl.TEXTURE_2D_ARRAY, 0, this.m_internalFormat, this.m_width, this.m_height, this.m_numLayers, 0, transferFmt.format, transferFmt.dataType, this.m_offset ); }; // TexImage3D() from pixel buffer object. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture3DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth * @param {number} imageHeight * @param {number} rowLength * @param {number} skipImages * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexImage3DBufferCase = function( name, desc, internalFormat, width, height, depth, imageHeight, rowLength, skipImages, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.Texture3DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, depth, 1 ); this.m_internalFormat = internalFormat; this.m_imageHeight = imageHeight; this.m_rowLength = rowLength; this.m_skipImages = skipImages; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexImage3DBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture3DSpecCase.prototype ); es3fTextureSpecificationTests. TexImage3DBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexImage3DBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexImage3DBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_width; var rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var imageHeight = this.m_imageHeight > 0 ? this.m_imageHeight : this.m_height; var slicePitch = imageHeight * rowPitch; var tex = null; var buf = null; var data = new ArrayBuffer( slicePitch * (this.m_depth + this.m_skipImages) + rowPitch * this.m_skipRows + pixelSize * this.m_skipPixels + this.m_offset ); assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); // Fill data with grid. var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_depth, rowPitch: rowPitch, slicePitch: slicePitch, data: data, offset: this.m_skipImages * slicePitch + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); tcuTextureUtil.fillWithGrid(access, 4, colorA, colorB); // Create buffer and upload. buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData(gl.PIXEL_UNPACK_BUFFER, data, gl.STATIC_DRAW); this.m_context.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, this.m_imageHeight); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_IMAGES, this.m_skipImages); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_3D, tex); this.m_context.texImage3D( gl.TEXTURE_3D, 0, this.m_internalFormat, this.m_width, this.m_height, this.m_depth, 0, transferFmt.format, transferFmt.dataType, this.m_offset ); }; // TexSubImage2D() PBO case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} subX * @param {number} subY * @param {number} subW * @param {number} subH * @param {number} rowLength * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexSubImage2DBufferCase = function( name, desc, internalFormat, width, height, subX, subY, subW, subH, rowLength, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, 1 ); this.m_internalFormat = internalFormat; this.m_subX = subX; this.m_subY = subY; this.m_subW = subW; this.m_subH = subH; this.m_rowLength = rowLength; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexSubImage2DBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage2DBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage2DBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage2DBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); var pixelSize = this.m_texFormat.getPixelSize(); var tex = null; var buf = null; var data = new ArrayBuffer( deMath.deAlign32(this.m_width * pixelSize, 4) * this.m_height ); assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, rowPitch: deMath.deAlign32(this.m_width * pixelSize, 4), data: data }); // First fill texture with gradient. tcuTextureUtil.fillWithComponentGradients(access, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax); this.m_context.texImage2D( gl.TEXTURE_2D, 0, this.m_internalFormat, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); // Fill data with grid. var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_subW; var rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var height = this.m_subH + this.m_skipRows; var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, rowPitch: rowPitch, data: new ArrayBuffer(rowPitch * height + this.m_offset), offset: this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); tcuTextureUtil.fillWithGrid(access, 4, colorA, colorB); buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData(gl.PIXEL_UNPACK_BUFFER, access.getBuffer(), gl.STATIC_DRAW); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); this.m_context.texSubImage2D( gl.TEXTURE_2D, 0, this.m_subX, this.m_subY, this.m_subW, this.m_subH, transferFmt.format, transferFmt.dataType, this.m_offset ); }; // TexSubImage2D() cubemap PBO case. /** * @constructor * @extends {es3fTextureSpecificationTests.TextureCubeSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} size * @param {number} subX * @param {number} subY * @param {number} subW * @param {number} subH * @param {number} rowLength * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexSubImageCubeBufferCase = function( name, desc, internalFormat, size, subX, subY, subW, subH, rowLength, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.TextureCubeSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), size, 1 ); this.m_internalFormat = internalFormat; this.m_subX = subX; this.m_subY = subY; this.m_subW = subW; this.m_subH = subH; this.m_rowLength = rowLength; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexSubImageCubeBufferCase.prototype = Object.create( es3fTextureSpecificationTests.TextureCubeSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImageCubeBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImageCubeBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImageCubeBufferCase.prototype.createTexture = function() { var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); var pixelSize = this.m_texFormat.getPixelSize(); var tex = null; var buf = null; var data = new ArrayBuffer( deMath.deAlign32(this.m_size * pixelSize, 4) * this.m_size ); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_size, height: this.m_size, rowPitch: deMath.deAlign32(this.m_size * pixelSize, 4), data: data }); assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_CUBE_MAP, tex); // Fill faces with different gradients. this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; var gMin = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); var gMax = es3fTextureSpecificationTests.randomVector( rnd, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax, 4 ); tcuTextureUtil.fillWithComponentGradients(access, gMin, gMax); this.m_context.texImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], 0, this.m_internalFormat, this.m_size, this.m_size, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); } // Fill data with grid. var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_subW; var rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var height = this.m_subH + this.m_skipRows; var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); data = new ArrayBuffer(rowPitch * height + this.m_skipPixels * pixelSize + this.m_offset); var accessSub = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, rowPitch: rowPitch, data: data, offset: this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); tcuTextureUtil.fillWithGrid(accessSub, 4, colorA, colorB); buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData( gl.PIXEL_UNPACK_BUFFER, data, gl.STATIC_DRAW ); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); for (var f in tcuTexture.CubeFace) { var face = tcuTexture.CubeFace[f]; this.m_context.texSubImage2D( es3fTextureSpecificationTests.s_cubeMapFaces[face], 0, this.m_subX, this.m_subY, this.m_subW, this.m_subH, transferFmt.format, transferFmt.dataType, this.m_offset ); } }; // TexSubImage3D() 2D array PBO case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DArraySpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth * @param {number} subX * @param {number} subY * @param {number} subZ * @param {number} subW * @param {number} subH * @param {number} subD * @param {number} imageHeight * @param {number} rowLength * @param {number} skipImages * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexSubImage2DArrayBufferCase = function( name, desc, internalFormat, width, height, depth, subX, subY, subZ, subW, subH, subD, imageHeight, rowLength, skipImages, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.Texture2DArraySpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, depth, 1 ); this.m_internalFormat = internalFormat; this.m_subX = subX; this.m_subY = subY; this.m_subZ = subZ; this.m_subW = subW; this.m_subH = subH; this.m_subD = subD; this.m_imageHeight = imageHeight; this.m_rowLength = rowLength; this.m_skipImages = skipImages; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexSubImage2DArrayBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage2DArrayBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage2DArrayBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage2DArrayBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); var pixelSize = this.m_texFormat.getPixelSize(); var tex = null; var buf = null; /** @type {ArrayBuffer} */ var data; assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D_ARRAY, tex); // Fill with gradient. var rowPitch = deMath.deAlign32(pixelSize * this.m_width, 4); var slicePitch = rowPitch * this.m_height; data = new ArrayBuffer(slicePitch * this.m_numLayers); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_numLayers, rowPitch: rowPitch, slicePitch: slicePitch, data: data }); tcuTextureUtil.fillWithComponentGradients(access, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax ); this.m_context.texImage3D(gl.TEXTURE_2D_ARRAY, 0, this.m_internalFormat, this.m_width, this.m_height, this.m_numLayers, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr()); // Fill data with grid. var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_subW; rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var height = this.m_subH + this.m_skipRows; var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); var accessSub = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, rowPitch: rowPitch, data: new ArrayBuffer(rowPitch * height + this.m_offset), offset: this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); tcuTextureUtil.fillWithGrid(accessSub, 4, colorA, colorB); buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData( gl.PIXEL_UNPACK_BUFFER, accessSub.getBuffer(), gl.STATIC_DRAW ); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); }; // TexSubImage3D() PBO case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture3DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} width * @param {number} height * @param {number} depth * @param {number} subX * @param {number} subY * @param {number} subZ * @param {number} subW * @param {number} subH * @param {number} subD * @param {number} imageHeight * @param {number} rowLength * @param {number} skipImages * @param {number} skipRows * @param {number} skipPixels * @param {number} alignment * @param {number} offset */ es3fTextureSpecificationTests.TexSubImage3DBufferCase = function( name, desc, internalFormat, width, height, depth, subX, subY, subZ, subW, subH, subD, imageHeight, rowLength, skipImages, skipRows, skipPixels, alignment, offset ) { es3fTextureSpecificationTests.Texture3DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), width, height, depth, 1 ); this.m_internalFormat = internalFormat; this.m_subX = subX; this.m_subY = subY; this.m_subZ = subZ; this.m_subW = subW; this.m_subH = subH; this.m_subD = subD; this.m_imageHeight = imageHeight; this.m_rowLength = rowLength; this.m_skipImages = skipImages; this.m_skipRows = skipRows; this.m_skipPixels = skipPixels; this.m_alignment = alignment; this.m_offset = offset; }; es3fTextureSpecificationTests.TexSubImage3DBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture3DSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage3DBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage3DBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage3DBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat( this.m_texFormat ); var pixelSize = this.m_texFormat.getPixelSize(); var tex = null; var buf = null; /** @type {ArrayBuffer} */ var data; assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_3D, tex); // Fill with gradient. var rowPitch = deMath.deAlign32(pixelSize * this.m_width, 4); var slicePitch = rowPitch * this.m_height; data = new ArrayBuffer(slicePitch * this.m_depth); var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_depth, rowPitch: rowPitch, slicePitch: slicePitch, data: data}); tcuTextureUtil.fillWithComponentGradients(access, this.m_texFormatInfo.valueMin, this.m_texFormatInfo.valueMax ); this.m_context.texImage3D( gl.TEXTURE_3D, 0, this.m_internalFormat, this.m_width, this.m_height, this.m_depth, 0, transferFmt.format, transferFmt.dataType, access.getDataPtr() ); // Fill data with grid. var rowLength = this.m_rowLength > 0 ? this.m_rowLength : this.m_subW; rowPitch = deMath.deAlign32( rowLength * pixelSize, this.m_alignment ); var imageHeight = this.m_imageHeight > 0 ? this.m_imageHeight : this.m_subH; slicePitch = imageHeight * rowPitch; var cScale = deMath.subtract(this.m_texFormatInfo.valueMax, this.m_texFormatInfo.valueMin); var cBias = this.m_texFormatInfo.valueMin; var colorA = deMath.add( deMath.multiply([1.0, 0.0, 0.0, 1.0], cScale), cBias ); var colorB = deMath.add( deMath.multiply([0.0, 1.0, 0.0, 1.0], cScale), cBias ); data = new ArrayBuffer(slicePitch * (this.m_subD + this.m_skipImages) + rowPitch * this.m_skipRows + pixelSize * this.m_skipPixels + this.m_offset); var accessSub = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_subW, height: this.m_subH, depth: this.m_subD, rowPitch: rowPitch, slicePitch: slicePitch, data: data, offset: this.m_skipImages * slicePitch + this.m_skipRows * rowPitch + this.m_skipPixels * pixelSize + this.m_offset }); tcuTextureUtil.fillWithGrid(accessSub, 4, colorA, colorB ); buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData( gl.PIXEL_UNPACK_BUFFER, data, gl.STATIC_DRAW ); this.m_context.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, this.m_imageHeight); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, this.m_rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_IMAGES, this.m_skipImages); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, this.m_skipRows); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, this.m_skipPixels); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, this.m_alignment); this.m_context.texSubImage3D( gl.TEXTURE_3D, 0, this.m_subX, this.m_subY, this.m_subZ, this.m_subW, this.m_subH, this.m_subD, transferFmt.format, transferFmt.dataType, this.m_offset ); }; // TexImage2D() depth case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} imageWidth * @param {number} imageHeight */ es3fTextureSpecificationTests.TexImage2DDepthCase = function( name, desc, internalFormat, imageWidth, imageHeight ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), imageWidth, imageHeight, es3fTextureSpecificationTests.maxLevelCount( imageWidth, imageHeight ) ); this.m_internalFormat = internalFormat; // we are interested in the behavior near [-2, 2], map it to visible range [0, 1] this.m_texFormatInfo.lookupBias = [0.25, 0.0, 0.0, 1.0]; this.m_texFormatInfo.lookupScale = [0.5, 1.0, 1.0, 0.0]; }; es3fTextureSpecificationTests.TexImage2DDepthCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexImage2DDepthCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DDepthCase; /** * createTexture */ es3fTextureSpecificationTests.TexImage2DDepthCase.prototype.createTexture = function() { var fmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = [-1.5, -2.0, 1.7, -1.5]; var gMax = [2.0, 1.5, -1.0, 2.0]; levelData.setSize(levelW, levelH); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage2D( gl.TEXTURE_2D, ndx, this.m_internalFormat, levelW, levelH, 0, fmt.format, fmt.dataType, levelData.getAccess().getDataPtr() ); } }; // TexImage3D() depth case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DArraySpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} imageWidth * @param {number} imageHeight * @param {number} numLayers */ es3fTextureSpecificationTests.TexImage2DArrayDepthCase = function( name, desc, internalFormat, imageWidth, imageHeight, numLayers ) { es3fTextureSpecificationTests.Texture2DArraySpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), imageWidth, imageHeight, numLayers, es3fTextureSpecificationTests.maxLevelCount( imageWidth, imageHeight ) ); this.m_internalFormat = internalFormat; // we are interested in the behavior near [-2, 2], map it to visible range [0, 1] this.m_texFormatInfo.lookupBias = [0.25, 0.0, 0.0, 1.0]; this.m_texFormatInfo.lookupScale = [0.5, 1.0, 1.0, 0.0]; }; es3fTextureSpecificationTests.TexImage2DArrayDepthCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype ); es3fTextureSpecificationTests. TexImage2DArrayDepthCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DArrayDepthCase; /** * createTexture */ es3fTextureSpecificationTests. TexImage2DArrayDepthCase.prototype.createTexture = function() { var fmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D_ARRAY, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = [-1.5, -2.0, 1.7, -1.5]; var gMax = [2.0, 1.5, -1.0, 2.0]; levelData.setSize(levelW, levelH, this.m_numLayers); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage3D( gl.TEXTURE_2D_ARRAY, ndx, this.m_internalFormat, levelW, levelH, this.m_numLayers, 0, fmt.format, fmt.dataType, levelData.getAccess().getDataPtr() ); } }; // TexSubImage2D() depth case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} imageWidth * @param {number} imageHeight */ es3fTextureSpecificationTests.TexSubImage2DDepthCase = function( name, desc, internalFormat, imageWidth, imageHeight ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), imageWidth, imageHeight, es3fTextureSpecificationTests.maxLevelCount( imageWidth, imageHeight ) ); this.m_internalFormat = internalFormat; // we are interested in the behavior near [-2, 2], map it to visible range [0, 1] this.m_texFormatInfo.lookupBias = [0.25, 0.0, 0.0, 1.0]; this.m_texFormatInfo.lookupScale = [0.5, 1.0, 1.0, 0.0]; }; es3fTextureSpecificationTests.TexSubImage2DDepthCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage2DDepthCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage2DDepthCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage2DDepthCase.prototype.createTexture = function() { var fmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); // First specify full texture. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = [-1.5, -2.0, 1.7, -1.5]; var gMax = [2.0, 1.5, -1.0, 2.0]; levelData.setSize(levelW, levelH); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage2D( gl.TEXTURE_2D, ndx, this.m_internalFormat, levelW, levelH, 0, fmt.format, fmt.dataType, levelData.getAccess().getDataPtr() ); } // Re-specify parts of each level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var w = rnd.getInt(1, levelW); var h = rnd.getInt(1, levelH); var x = rnd.getInt(0, levelW - w); var y = rnd.getInt(0, levelH - h); var colorA = [2.0, 1.5, -1.0, 2.0]; var colorB = [-1.5, -2.0, 1.7, -1.5]; var cellSize = rnd.getInt(2, 16); levelData.setSize(w, h); tcuTextureUtil.fillWithGrid( levelData.getAccess(), cellSize, colorA, colorB ); this.m_context.texSubImage2D( gl.TEXTURE_2D, ndx, x, y, w, h, fmt.format, fmt.dataType, levelData.getAccess().getDataPtr() ); } }; // TexSubImage3D() depth case. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DArraySpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} imageWidth * @param {number} imageHeight * @param {number} numLayers */ es3fTextureSpecificationTests.TexSubImage2DArrayDepthCase = function( name, desc, internalFormat, imageWidth, imageHeight, numLayers ) { es3fTextureSpecificationTests.Texture2DArraySpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), imageWidth, imageHeight, numLayers, es3fTextureSpecificationTests.maxLevelCount( imageWidth, imageHeight ) ); this.m_internalFormat = internalFormat; // we are interested in the behavior near [-2, 2], map it to visible range [0, 1] this.m_texFormatInfo.lookupBias = [0.25, 0.0, 0.0, 1.0]; this.m_texFormatInfo.lookupScale = [0.5, 1.0, 1.0, 0.0]; }; es3fTextureSpecificationTests.TexSubImage2DArrayDepthCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype ); es3fTextureSpecificationTests. TexSubImage2DArrayDepthCase.prototype.constructor = es3fTextureSpecificationTests.TexSubImage2DArrayDepthCase; /** * createTexture */ es3fTextureSpecificationTests. TexSubImage2DArrayDepthCase.prototype.createTexture = function() { var fmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var rnd = new deRandom.Random(deString.deStringHash(this.fullName())); var tex = null; var levelData = new tcuTexture.TextureLevel( this.m_texFormat, this.m_width, this.m_height ); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D_ARRAY, tex); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, 1); // First specify full texture. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var gMin = [-1.5, -2.0, 1.7, -1.5]; var gMax = [2.0, 1.5, -1.0, 2.0]; levelData.setSize(levelW, levelH, this.m_numLayers); tcuTextureUtil.fillWithComponentGradients( levelData.getAccess(), gMin, gMax ); this.m_context.texImage3D( gl.TEXTURE_2D_ARRAY, ndx, this.m_internalFormat, levelW, levelH, this.m_numLayers, 0, fmt.format, fmt.dataType, levelData.getAccess().getDataPtr() ); } // Re-specify parts of each level. for (var ndx = 0; ndx < this.m_numLevels; ndx++) { var levelW = Math.max(1, this.m_width >> ndx); var levelH = Math.max(1, this.m_height >> ndx); var w = rnd.getInt(1, levelW); var h = rnd.getInt(1, levelH); var d = rnd.getInt(1, this.m_numLayers); var x = rnd.getInt(0, levelW - w); var y = rnd.getInt(0, levelH - h); var z = rnd.getInt(0, this.m_numLayers - d); var colorA = [2.0, 1.5, -1.0, 2.0]; var colorB = [-1.5, -2.0, 1.7, -1.5]; var cellSize = rnd.getInt(2, 16); levelData.setSize(w, h, d); tcuTextureUtil.fillWithGrid( levelData.getAccess(), cellSize, colorA, colorB ); this.m_context.texSubImage3D( gl.TEXTURE_2D_ARRAY, ndx, x, y, z, w, h, d, fmt.format, fmt.dataType, levelData.getAccess().getDataPtr() ); } }; // TexImage2D() depth case with pbo. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DSpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} imageWidth * @param {number} imageHeight */ es3fTextureSpecificationTests.TexImage2DDepthBufferCase = function( name, desc, internalFormat, imageWidth, imageHeight ) { es3fTextureSpecificationTests.Texture2DSpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), imageWidth, imageHeight, 1 ); this.m_internalFormat = internalFormat; // we are interested in the behavior near [-2, 2], map it to visible range [0, 1] this.m_texFormatInfo.lookupBias = [0.25, 0.0, 0.0, 1.0]; this.m_texFormatInfo.lookupScale = [0.5, 1.0, 1.0, 0.0]; }; es3fTextureSpecificationTests.TexImage2DDepthBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DSpecCase.prototype ); es3fTextureSpecificationTests. TexImage2DDepthBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DDepthBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexImage2DDepthBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_width; var alignment = 4; var rowPitch = deMath.deAlign32(rowLength * pixelSize, alignment); var height = this.m_height; var buf = null; var tex = null; var data = new ArrayBuffer(rowPitch * height); assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); // Fill data with gradient var gMin = [-1.5, -2.0, 1.7, -1.5]; var gMax = [2.0, 1.5, -1.0, 2.0]; var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, rowPitch: rowPitch, data: data }); tcuTextureUtil.fillWithComponentGradients(access, gMin, gMax); // Create buffer and upload. buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData( gl.PIXEL_UNPACK_BUFFER, access.getBuffer(), gl.STATIC_DRAW ); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, 0); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, 0); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, alignment); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D, tex); this.m_context.texImage2D( gl.TEXTURE_2D, 0, this.m_internalFormat, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, 0 ); this.m_context.deleteBuffer(buf); }; // TexImage3D() depth case with pbo. /** * @constructor * @extends {es3fTextureSpecificationTests.Texture2DArraySpecCase} * @param {string} name * @param {string} desc * @param {number} internalFormat * @param {number} imageWidth * @param {number} imageHeight */ es3fTextureSpecificationTests.TexImage2DArrayDepthBufferCase = function( name, desc, internalFormat, imageWidth, imageHeight, numLayers ) { es3fTextureSpecificationTests.Texture2DArraySpecCase.call( this, name, desc, gluTextureUtil.mapGLInternalFormat( internalFormat ), imageWidth, imageHeight, numLayers, 1 ); this.m_internalFormat = internalFormat; // we are interested in the behavior near [-2, 2], map it to visible range [0, 1] this.m_texFormatInfo.lookupBias = [0.25, 0.0, 0.0, 1.0]; this.m_texFormatInfo.lookupScale = [0.5, 1.0, 1.0, 0.0]; }; es3fTextureSpecificationTests.TexImage2DArrayDepthBufferCase.prototype = Object.create( es3fTextureSpecificationTests.Texture2DArraySpecCase.prototype ); es3fTextureSpecificationTests. TexImage2DArrayDepthBufferCase.prototype.constructor = es3fTextureSpecificationTests.TexImage2DArrayDepthBufferCase; /** * createTexture */ es3fTextureSpecificationTests. TexImage2DArrayDepthBufferCase.prototype.createTexture = function() { var transferFmt = gluTextureUtil.getTransferFormat(this.m_texFormat); var pixelSize = this.m_texFormat.getPixelSize(); var rowLength = this.m_width; var alignment = 4; var rowPitch = deMath.deAlign32(rowLength * pixelSize, alignment); var imageHeight = this.m_height; var slicePitch = imageHeight * rowPitch; var tex = null; var buf = null; var data = new ArrayBuffer(slicePitch * this.m_numLayers); assertMsgOptions( this.m_numLevels == 1, 'Number of levels is different than 1', false, true ); // Fill data with gradient var gMin = [-1.5, -2.0, 1.7, -1.5]; var gMax = [2.0, 1.5, -1.0, 2.0]; var access = new tcuTexture.PixelBufferAccess({ format: this.m_texFormat, width: this.m_width, height: this.m_height, depth: this.m_numLayers, rowPitch: rowPitch, slicePitch: slicePitch, data: data }); tcuTextureUtil.fillWithComponentGradients(access, gMin, gMax); buf = this.m_context.createBuffer(); this.m_context.bindBuffer(gl.PIXEL_UNPACK_BUFFER, buf); this.m_context.bufferData( gl.PIXEL_UNPACK_BUFFER, access.getBuffer(), gl.STATIC_DRAW ); this.m_context.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, rowLength); this.m_context.pixelStorei(gl.UNPACK_ROW_LENGTH, rowLength); this.m_context.pixelStorei(gl.UNPACK_SKIP_IMAGES, 0); this.m_context.pixelStorei(gl.UNPACK_SKIP_ROWS, 0); this.m_context.pixelStorei(gl.UNPACK_SKIP_PIXELS, 0); this.m_context.pixelStorei(gl.UNPACK_ALIGNMENT, alignment); tex = this.m_context.createTexture(); this.m_context.bindTexture(gl.TEXTURE_2D_ARRAY, tex); this.m_context.texImage3D( gl.TEXTURE_2D_ARRAY, 0, this.m_internalFormat, this.m_width, this.m_height, this.m_numLayers, 0, transferFmt.format, transferFmt.dataType, 0 ); this.m_context.deleteBuffer(buf); }; /** * @constructor * @extends {tcuTestCase.DeqpTest} */ es3fTextureSpecificationTests.TextureSpecificationTests = function() { tcuTestCase.DeqpTest.call( this, 'specification', 'Texture Specification Tests' ); }; es3fTextureSpecificationTests.TextureSpecificationTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype); es3fTextureSpecificationTests.TextureSpecificationTests.prototype.constructor = es3fTextureSpecificationTests.TextureSpecificationTests; es3fTextureSpecificationTests.TextureSpecificationTests.prototype.init = function() { /** * @type {Array} */ es3fTextureSpecificationTests.s_cubeMapFaces = [ gl.TEXTURE_CUBE_MAP_NEGATIVE_X, gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, gl.TEXTURE_CUBE_MAP_POSITIVE_Z ]; /** @type {Array<{name: string, format: number, dataType: number}>} */ var unsizedFormats = [{ name: 'alpha_unsigned_byte', format: gl.ALPHA, dataType: gl.UNSIGNED_BYTE }, { name: 'luminance_unsigned_byte', format: gl.LUMINANCE, dataType: gl.UNSIGNED_BYTE }, { name: 'luminance_alpha_unsigned_byte', format: gl.LUMINANCE_ALPHA, dataType: gl.UNSIGNED_BYTE }, { name: 'rgb_unsigned_short_5_6_5', format: gl.RGB, dataType: gl.UNSIGNED_SHORT_5_6_5 }, { name: 'rgb_unsigned_byte', format: gl.RGB, dataType: gl.UNSIGNED_BYTE }, { name: 'rgba_unsigned_short_4_4_4_4', format: gl.RGBA, dataType: gl.UNSIGNED_SHORT_4_4_4_4 }, { name: 'rgba_unsigned_short_5_5_5_1', format: gl.RGBA, dataType: gl.UNSIGNED_SHORT_5_5_5_1 }, { name: 'rgba_unsigned_byte', format: gl.RGBA, dataType: gl.UNSIGNED_BYTE } ]; /** @type {Array<{name: string, internalFormat: number}>} */ var colorFormats = [{ name: 'rgba32f', internalFormat: gl.RGBA32F }, { name: 'rgba32i', internalFormat: gl.RGBA32I }, { name: 'rgba32ui', internalFormat: gl.RGBA32UI }, { name: 'rgba16f', internalFormat: gl.RGBA16F }, { name: 'rgba16i', internalFormat: gl.RGBA16I }, { name: 'rgba16ui', internalFormat: gl.RGBA16UI }, { name: 'rgba8', internalFormat: gl.RGBA8 }, { name: 'rgba8i', internalFormat: gl.RGBA8I }, { name: 'rgba8ui', internalFormat: gl.RGBA8UI }, { name: 'srgb8_alpha8', internalFormat: gl.SRGB8_ALPHA8 }, { name: 'rgb10_a2', internalFormat: gl.RGB10_A2 }, { name: 'rgb10_a2ui', internalFormat: gl.RGB10_A2UI }, { name: 'rgba4', internalFormat: gl.RGBA4 }, { name: 'rgb5_a1', internalFormat: gl.RGB5_A1 }, { name: 'rgba8_snorm', internalFormat: gl.RGBA8_SNORM }, { name: 'rgb8', internalFormat: gl.RGB8 }, { name: 'rgb565', internalFormat: gl.RGB565 }, { name: 'r11f_g11f_b10f', internalFormat: gl.R11F_G11F_B10F }, { name: 'rgb32f', internalFormat: gl.RGB32F }, { name: 'rgb32i', internalFormat: gl.RGB32I }, { name: 'rgb32ui', internalFormat: gl.RGB32UI }, { name: 'rgb16f', internalFormat: gl.RGB16F }, { name: 'rgb16i', internalFormat: gl.RGB16I }, { name: 'rgb16ui', internalFormat: gl.RGB16UI }, { name: 'rgb8_snorm', internalFormat: gl.RGB8_SNORM }, { name: 'rgb8i', internalFormat: gl.RGB8I }, { name: 'rgb8ui', internalFormat: gl.RGB8UI }, { name: 'srgb8', internalFormat: gl.SRGB8 }, { name: 'rgb9_e5', internalFormat: gl.RGB9_E5 }, { name: 'rg32f', internalFormat: gl.RG32F }, { name: 'rg32i', internalFormat: gl.RG32I }, { name: 'rg32ui', internalFormat: gl.RG32UI }, { name: 'rg16f', internalFormat: gl.RG16F }, { name: 'rg16i', internalFormat: gl.RG16I }, { name: 'rg16ui', internalFormat: gl.RG16UI }, { name: 'rg8', internalFormat: gl.RG8 }, { name: 'rg8i', internalFormat: gl.RG8I }, { name: 'rg8ui', internalFormat: gl.RG8UI }, { name: 'rg8_snorm', internalFormat: gl.RG8_SNORM }, { name: 'r32f', internalFormat: gl.R32F }, { name: 'r32i', internalFormat: gl.R32I }, { name: 'r32ui', internalFormat: gl.R32UI }, { name: 'r16f', internalFormat: gl.R16F }, { name: 'r16i', internalFormat: gl.R16I }, { name: 'r16ui', internalFormat: gl.R16UI }, { name: 'r8', internalFormat: gl.R8 }, { name: 'r8i', internalFormat: gl.R8I }, { name: 'r8ui', internalFormat: gl.R8UI }, { name: 'r8_snorm', internalFormat: gl.R8_SNORM } ]; // Depth and stencil formats /** @type {Array<{name: string, internalFormat: number}>} */ var depthStencilFormats = [{ name: 'depth_component32f', internalFormat: gl.DEPTH_COMPONENT32F }, { name: 'depth_component24', internalFormat: gl.DEPTH_COMPONENT24 }, { name: 'depth_component16', internalFormat: gl.DEPTH_COMPONENT16 }, { name: 'depth32f_stencil8', internalFormat: gl.DEPTH32F_STENCIL8 }, { name: 'depth24_stencil8', internalFormat: gl.DEPTH24_STENCIL8 } ]; // Basic TexImage2D usage. var splitBasicTex2D = 2, splitBasicTexCube = 5; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var basicTexImageGroup2D = []; for (var ii = 0; ii < splitBasicTex2D; ++ii) { basicTexImageGroup2D.push( new tcuTestCase.DeqpTest('basic_teximage2d', 'Basic glTexImage2D() usage') ); this.addChild(basicTexImageGroup2D[ii]); } /** @type {Array<{tcuTestCase.DeqpTest}>} */ var basicTexImageGroupCube = []; for (var ii = 0; ii < splitBasicTexCube; ++ii) { basicTexImageGroupCube.push( new tcuTestCase.DeqpTest('basic_teximage2d', 'Basic glTexImage2D() usage') ); this.addChild(basicTexImageGroupCube[ii]); } for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { /** @type {string} */ var fmtName = colorFormats[formatNdx].name; /** @type {number} */ var format = colorFormats[formatNdx].internalFormat; /** @type {number} */ var tex2DWidth = 64; /** @type {number} */ var tex2DHeight = 128; /** @type {number} */ var texCubeSize = 64; basicTexImageGroup2D[formatNdx % splitBasicTex2D].addChild( es3fTextureSpecificationTests.newBasicTexImage2DCaseInternal( fmtName + '_2d', '', format, tex2DWidth, tex2DHeight ) ); basicTexImageGroupCube[formatNdx % splitBasicTexCube].addChild( es3fTextureSpecificationTests.newBasicTexImageCubeCaseInternal( fmtName + '_cube', '', format, texCubeSize ) ); } // Randomized TexImage2D order. /** @type {tcuTestCase.DeqpTest} */ var randomTexImageGroup = new tcuTestCase.DeqpTest( 'random_teximage2d', 'Randomized glTexImage2D() usage' ); this.addChild(randomTexImageGroup); var rnd = new deRandom.Random(9); // 2D cases. for (var ndx = 0; ndx < 10; ndx++) { var formatNdx = rnd.getInt(0, colorFormats.length - 1); var width = 1 << rnd.getInt(2, 8); var height = 1 << rnd.getInt(2, 8); randomTexImageGroup.addChild( es3fTextureSpecificationTests.newRandomOrderTexImage2DCaseInternal( '2d.' + colorFormats[formatNdx].name, '', colorFormats[formatNdx].internalFormat, width, height ) ); } // Cubemap cases. randomTexImageGroup = new tcuTestCase.DeqpTest( 'random_teximage2d', 'Randomized glTexImage2D() usage' ); this.addChild(randomTexImageGroup); for (var ndx = 0; ndx < 10; ndx++) { formatNdx = rnd.getInt(0, colorFormats.length - 1); /** @type {number} */ var size = 1 << rnd.getInt(2, 8); randomTexImageGroup.addChild( es3fTextureSpecificationTests.newRandomOrderTexImageCubeCaseInternal( 'cube.' + colorFormats[formatNdx].name, '', colorFormats[formatNdx].internalFormat, size ) ); } // TexImage2D unpack alignment. /** @type {tcuTestCase.DeqpTest} */ var alignGroup = new tcuTestCase.DeqpTest( 'teximage2d_align', 'glTexImage2D() unpack alignment tests' ); this.addChild(alignGroup); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_r8_4_8', '', gl.R8, 4, 8, 4, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_r8_63_1', '', gl.R8, 63, 30, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_r8_63_2', '', gl.R8, 63, 30, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_r8_63_4', '', gl.R8, 63, 30, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_r8_63_8', '', gl.R8, 63, 30, 1, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba4_51_1', '', gl.RGBA4, 51, 30, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba4_51_2', '', gl.RGBA4, 51, 30, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba4_51_4', '', gl.RGBA4, 51, 30, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba4_51_8', '', gl.RGBA4, 51, 30, 1, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgb8_39_1', '', gl.RGB8, 39, 43, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgb8_39_2', '', gl.RGB8, 39, 43, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgb8_39_4', '', gl.RGB8, 39, 43, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgb8_39_8', '', gl.RGB8, 39, 43, 1, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba8_47_1', '', gl.RGBA8, 47, 27, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba8_47_2', '', gl.RGBA8, 47, 27, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba8_47_4', '', gl.RGBA8, 47, 27, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImage2DAlignCaseInternal( '2d_rgba8_47_8', '', gl.RGBA8, 47, 27, 1, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_r8_4_8', '', gl.R8, 4, 3, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_r8_63_1', '', gl.R8, 63, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_r8_63_2', '', gl.R8, 63, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_r8_63_4', '', gl.R8, 63, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_r8_63_8', '', gl.R8, 63, 1, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba4_51_1', '', gl.RGBA4, 51, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba4_51_2', '', gl.RGBA4, 51, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba4_51_4', '', gl.RGBA4, 51, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba4_51_8', '', gl.RGBA4, 51, 1, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgb8_39_1', '', gl.RGB8, 39, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgb8_39_2', '', gl.RGB8, 39, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgb8_39_4', '', gl.RGB8, 39, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgb8_39_8', '', gl.RGB8, 39, 1, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba8_47_1', '', gl.RGBA8, 47, 1, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba8_47_2', '', gl.RGBA8, 47, 1, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba8_47_4', '', gl.RGBA8, 47, 1, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexImageCubeAlignCaseInternal( 'cube_rgba8_47_8', '', gl.RGBA8, 47, 1, 8 ) ); // glTexImage2D() unpack parameter cases. /** @type {tcuTestCase.DeqpTest} */ var paramGroup = new tcuTestCase.DeqpTest( 'teximage2d_unpack_params', 'glTexImage2D() pixel transfer mode cases' ); this.addChild(paramGroup); var cases = [{ name: 'rgb8_alignment', format: gl.RGB8, width: 31, height: 30, rowLength: 0, skipRows: 0, skipPixels: 0, alignment: 2 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 31, height: 30, rowLength: 50, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 31, height: 30, rowLength: 0, skipRows: 3, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 31, height: 30, rowLength: 36, skipRows: 0, skipPixels: 5, alignment: 4 }, { name: 'r8_complex1', format: gl.R8, width: 31, height: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 1 }, { name: 'r8_complex2', format: gl.R8, width: 31, height: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 2 }, { name: 'r8_complex3', format: gl.R8, width: 31, height: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 4 }, { name: 'r8_complex4', format: gl.R8, width: 31, height: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 8 }, { name: 'rgba8_complex1', format: gl.RGBA8, width: 56, height: 61, rowLength: 69, skipRows: 0, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex2', format: gl.RGBA8, width: 56, height: 61, rowLength: 69, skipRows: 0, skipPixels: 7, alignment: 8 }, { name: 'rgba8_complex3', format: gl.RGBA8, width: 56, height: 61, rowLength: 69, skipRows: 3, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex4', format: gl.RGBA8, width: 56, height: 61, rowLength: 69, skipRows: 3, skipPixels: 7, alignment: 8 }, { name: 'rgba32f_complex', format: gl.RGBA32F, width: 19, height: 10, rowLength: 27, skipRows: 1, skipPixels: 7, alignment: 8 } ]; for (var ndx = 0; ndx < cases.length; ndx++) paramGroup.addChild( new es3fTextureSpecificationTests.TexImage2DParamsCase( cases[ndx].name, '', cases[ndx].format, cases[ndx].width, cases[ndx].height, cases[ndx].rowLength, cases[ndx].skipRows, cases[ndx].skipPixels, cases[ndx].alignment ) ); // glTexImage2D() pbo cases. var splitPboTex2D = 2, splitPboTexCube = 5; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var pboGroup2D = []; for (var ii = 0; ii < splitPboTex2D; ++ii) { pboGroup2D.push(new tcuTestCase.DeqpTest('teximage2d_pbo', 'glTexImage2D() from PBO')); this.addChild(pboGroup2D[ii]); } /** @type {Array<{tcuTestCase.DeqpTest}>} */ var pboGroupCube = []; for (var ii = 0; ii < splitPboTexCube; ++ii) { pboGroupCube.push(new tcuTestCase.DeqpTest('teximage2d_pbo', 'glTexImage2D() from PBO')); this.addChild(pboGroupCube[ii]); } for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { fmtName = colorFormats[formatNdx].name; format = colorFormats[formatNdx].internalFormat; tex2DWidth = 65; tex2DHeight = 37; texCubeSize = 64; pboGroup2D[formatNdx % splitPboTex2D].addChild( new es3fTextureSpecificationTests.TexImage2DBufferCase( fmtName + '_2d', '', format, tex2DWidth, tex2DHeight, 0, 0, 0, 4, 0 ) ); pboGroupCube[formatNdx % splitPboTexCube].addChild( new es3fTextureSpecificationTests.TexImageCubeBufferCase( fmtName + '_cube', '', format, texCubeSize, 0, 0, 0, 4, 0 ) ); } // Parameter cases var pboGroupParams = new tcuTestCase.DeqpTest( 'teximage2d_pbo', 'glTexImage2D() from PBO' ); this.addChild(pboGroupParams); /** * @type {Array<{name: string, format: number, width: number, * height: number, rowLength: number, skipRows: number, * skipPixels: number, alignment: number, offset: number}>} */ var parameterCases = [{ name: 'rgb8_offset', format: gl.RGB8, width: 31, height: 30, rowLength: 0, skipRows: 0, skipPixels: 0, alignment: 4, offset: 67 }, { name: 'rgb8_alignment', format: gl.RGB8, width: 31, height: 30, rowLength: 0, skipRows: 0, skipPixels: 0, alignment: 2, offset: 0 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 31, height: 30, rowLength: 50, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 31, height: 30, rowLength: 0, skipRows: 3, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 31, height: 30, rowLength: 36, skipRows: 0, skipPixels: 5, alignment: 4, offset: 0 } ]; for (var ndx = 0; ndx < parameterCases.length; ndx++) { pboGroupParams.addChild( new es3fTextureSpecificationTests.TexImage2DBufferCase( parameterCases[ndx].name + '_2d', '', parameterCases[ndx].format, parameterCases[ndx].width, parameterCases[ndx].height, parameterCases[ndx].rowLength, parameterCases[ndx].skipRows, parameterCases[ndx].skipPixels, parameterCases[ndx].alignment, parameterCases[ndx].offset ) ); pboGroupParams.addChild( new es3fTextureSpecificationTests.TexImageCubeBufferCase( parameterCases[ndx].name + '_cube', '', parameterCases[ndx].format, parameterCases[ndx].width, parameterCases[ndx].rowLength, parameterCases[ndx].skipRows, parameterCases[ndx].skipPixels, parameterCases[ndx].alignment, parameterCases[ndx].offset ) ); } // glTexImage2D() depth cases. /** @type {tcuTestCase.DeqpTest} */ var shadow2dGroup = new tcuTestCase.DeqpTest( 'teximage2d_depth', 'glTexImage2D() with depth or depth/stencil format' ); this.addChild(shadow2dGroup); for (var ndx = 0; ndx < depthStencilFormats.length; ndx++) { // WebGL 2 specific constraint. if (depthStencilFormats[ndx].internalFormat == gl.DEPTH32F_STENCIL8) continue; var tex2DWidth = 64; var tex2DHeight = 128; shadow2dGroup.addChild( new es3fTextureSpecificationTests.TexImage2DDepthCase( depthStencilFormats[ndx].name, '', depthStencilFormats[ndx].internalFormat, tex2DWidth, tex2DHeight ) ); } // glTexImage2D() depth cases with pbo. shadow2dGroup = new tcuTestCase.DeqpTest( 'teximage2d_depth_pbo', 'glTexImage2D() with depth or depth/stencil format with pbo' ); this.addChild(shadow2dGroup); for (var ndx = 0; ndx < depthStencilFormats.length; ndx++) { tex2DWidth = 64; tex2DHeight = 128; shadow2dGroup.addChild( new es3fTextureSpecificationTests.TexImage2DDepthBufferCase( depthStencilFormats[ndx].name, '', depthStencilFormats[ndx].internalFormat, tex2DWidth, tex2DHeight ) ); } // Basic TexSubImage2D usage. splitBasicTex2D = 3; splitBasicTexCube = 5; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var basicTexSubImageGroup2D = []; for (var ii = 0; ii < splitBasicTex2D; ++ii) { basicTexSubImageGroup2D.push( new tcuTestCase.DeqpTest('basic_texsubimage2d', 'Basic glTexSubImage2D() usage') ); this.addChild(basicTexSubImageGroup2D[ii]); } /** @type {Array<{tcuTestCase.DeqpTest}>} */ var basicTexSubImageGroupCube = []; for (var ii = 0; ii < splitBasicTexCube; ++ii) { basicTexSubImageGroupCube.push( new tcuTestCase.DeqpTest('basic_texsubimage2d', 'Basic glTexSubImage2D() usage') ); this.addChild(basicTexSubImageGroupCube[ii]); } for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { fmtName = colorFormats[formatNdx].name; format = colorFormats[formatNdx].internalFormat; tex2DWidth = 64; tex2DHeight = 128; texCubeSize = 64; basicTexSubImageGroup2D[formatNdx % splitBasicTex2D].addChild( es3fTextureSpecificationTests.newBasicTexSubImage2DCaseInternal( fmtName + '_2d', '', format, tex2DWidth, tex2DHeight ) ); basicTexSubImageGroupCube[formatNdx % splitBasicTexCube].addChild( es3fTextureSpecificationTests.newBasicTexImageCubeCaseInternal( fmtName + '_cube', '', format, texCubeSize ) ); } // TexSubImage2D to empty texture. /** @type {tcuTestCase.DeqpTest} */ var texSubImageEmptyTexGroup = new tcuTestCase.DeqpTest( 'texsubimage2d_empty_tex', 'glTexSubImage2D() to texture that has storage but no data' ); this.addChild(texSubImageEmptyTexGroup); for (var formatNdx = 0; formatNdx < unsizedFormats.length; formatNdx++) { fmtName = unsizedFormats[formatNdx].name; format = unsizedFormats[formatNdx].format; /** @type {number} */ var dataType = unsizedFormats[formatNdx].dataType; tex2DWidth = 64; tex2DHeight = 32; texCubeSize = 32; texSubImageEmptyTexGroup.addChild( new es3fTextureSpecificationTests.TexSubImage2DEmptyTexCase( fmtName + '_2d', '', format, dataType, tex2DWidth, tex2DHeight ) ); texSubImageEmptyTexGroup.addChild( new es3fTextureSpecificationTests.TexSubImageCubeEmptyTexCase( fmtName + '_cube', '', format, dataType, texCubeSize ) ); } // TexSubImage2D alignment cases. alignGroup = new tcuTestCase.DeqpTest( 'texsubimage2d_align', 'glTexSubImage2D() unpack alignment tests' ); this.addChild(alignGroup); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_1_1', '', gl.R8, 64, 64, 13, 17, 1, 6, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_1_2', '', gl.R8, 64, 64, 13, 17, 1, 6, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_1_4', '', gl.R8, 64, 64, 13, 17, 1, 6, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_1_8', '', gl.R8, 64, 64, 13, 17, 1, 6, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_63_1', '', gl.R8, 64, 64, 1, 9, 63, 30, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_63_2', '', gl.R8, 64, 64, 1, 9, 63, 30, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_63_4', '', gl.R8, 64, 64, 1, 9, 63, 30, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_r8_63_8', '', gl.R8, 64, 64, 1, 9, 63, 30, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba4_51_1', '', gl.RGBA4, 64, 64, 7, 29, 51, 30, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba4_51_2', '', gl.RGBA4, 64, 64, 7, 29, 51, 30, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba4_51_4', '', gl.RGBA4, 64, 64, 7, 29, 51, 30, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba4_51_8', '', gl.RGBA4, 64, 64, 7, 29, 51, 30, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgb8_39_1', '', gl.RGB8, 64, 64, 11, 8, 39, 43, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgb8_39_2', '', gl.RGB8, 64, 64, 11, 8, 39, 43, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgb8_39_4', '', gl.RGB8, 64, 64, 11, 8, 39, 43, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgb8_39_8', '', gl.RGB8, 64, 64, 11, 8, 39, 43, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba8_47_1', '', gl.RGBA8, 64, 64, 10, 1, 47, 27, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba8_47_2', '', gl.RGBA8, 64, 64, 10, 1, 47, 27, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba8_47_4', '', gl.RGBA8, 64, 64, 10, 1, 47, 27, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImage2DAlignCaseInternal( '2d_rgba8_47_8', '', gl.RGBA8, 64, 64, 10, 1, 47, 27, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_1_1', '', gl.R8, 64, 13, 17, 1, 6, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_1_2', '', gl.R8, 64, 13, 17, 1, 6, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_1_4', '', gl.R8, 64, 13, 17, 1, 6, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_1_8', '', gl.R8, 64, 13, 17, 1, 6, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_63_1', '', gl.R8, 64, 1, 9, 63, 30, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_63_2', '', gl.R8, 64, 1, 9, 63, 30, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_63_4', '', gl.R8, 64, 1, 9, 63, 30, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_r8_63_8', '', gl.R8, 64, 1, 9, 63, 30, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba4_51_1', '', gl.RGBA4, 64, 7, 29, 51, 30, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba4_51_2', '', gl.RGBA4, 64, 7, 29, 51, 30, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba4_51_4', '', gl.RGBA4, 64, 7, 29, 51, 30, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba4_51_8', '', gl.RGBA4, 64, 7, 29, 51, 30, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgb8_39_1', '', gl.RGB8, 64, 11, 8, 39, 43, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgb8_39_2', '', gl.RGB8, 64, 11, 8, 39, 43, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgb8_39_4', '', gl.RGB8, 64, 11, 8, 39, 43, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgb8_39_8', '', gl.RGB8, 64, 11, 8, 39, 43, 8 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba8_47_1', '', gl.RGBA8, 64, 10, 1, 47, 27, 1 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba8_47_2', '', gl.RGBA8, 64, 10, 1, 47, 27, 2 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba8_47_4', '', gl.RGBA8, 64, 10, 1, 47, 27, 4 ) ); alignGroup.addChild( es3fTextureSpecificationTests.newTexSubImageCubeAlignCaseInternal( 'cube_rgba8_47_8', '', gl.RGBA8, 64, 10, 1, 47, 27, 8 ) ); // glTexSubImage2D() pixel transfer mode cases. paramGroup = new tcuTestCase.DeqpTest( 'texsubimage2d_unpack_params', 'glTexSubImage2D() pixel transfer mode cases' ); this.addChild(paramGroup); cases = [{ name: 'rgb8_alignment', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 0, skipRows: 0, skipPixels: 0, alignment: 2 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 50, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 0, skipRows: 3, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 36, skipRows: 0, skipPixels: 5, alignment: 4 }, { name: 'r8_complex1', format: gl.R8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 1 }, { name: 'r8_complex2', format: gl.R8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 2 }, { name: 'r8_complex3', format: gl.R8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 4 }, { name: 'r8_complex4', format: gl.R8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 64, skipRows: 1, skipPixels: 3, alignment: 8 }, { name: 'rgba8_complex1', format: gl.RGBA8, width: 92, height: 84, subX: 13, subY: 19, subW: 56, subH: 61, rowLength: 69, skipRows: 0, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex2', format: gl.RGBA8, width: 92, height: 84, subX: 13, subY: 19, subW: 56, subH: 61, rowLength: 69, skipRows: 0, skipPixels: 7, alignment: 8 }, { name: 'rgba8_complex3', format: gl.RGBA8, width: 92, height: 84, subX: 13, subY: 19, subW: 56, subH: 61, rowLength: 69, skipRows: 3, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex4', format: gl.RGBA8, width: 92, height: 84, subX: 13, subY: 19, subW: 56, subH: 61, rowLength: 69, skipRows: 3, skipPixels: 7, alignment: 8 }, { name: 'rgba32f_complex', format: gl.RGBA32F, width: 92, height: 84, subX: 13, subY: 19, subW: 56, subH: 61, rowLength: 69, skipRows: 3, skipPixels: 7, alignment: 8 } ]; for (var ndx = 0; ndx < cases.length; ndx++) paramGroup.addChild( new es3fTextureSpecificationTests.TexSubImage2DParamsCase( cases[ndx].name, '', cases[ndx].format, cases[ndx].width, cases[ndx].height, cases[ndx].subX, cases[ndx].subY, cases[ndx].subW, cases[ndx].subH, cases[ndx].rowLength, cases[ndx].skipRows, cases[ndx].skipPixels, cases[ndx].alignment ) ); // glTexSubImage2D() PBO cases. splitPboTex2D = 2; splitPboTexCube = 5; pboGroup2D = []; for (var ii = 0; ii < splitPboTex2D; ++ii) { pboGroup2D.push(new tcuTestCase.DeqpTest( 'texsubimage2d_pbo', 'glTexSubImage2D() pixel buffer object tests' )); this.addChild(pboGroup2D[ii]); } pboGroupCube = []; for (var ii = 0; ii < splitPboTexCube; ++ii) { pboGroupCube.push(new tcuTestCase.DeqpTest( 'texsubimage2d_pbo', 'glTexSubImage2D() pixel buffer object tests' )); this.addChild(pboGroupCube[ii]); } for (var ndx = 0; ndx < colorFormats.length; ndx++) { pboGroup2D[ndx % splitPboTex2D].addChild( new es3fTextureSpecificationTests.TexSubImage2DBufferCase( colorFormats[ndx].name + '_2d', '', colorFormats[ndx].internalFormat, 54, // Width 60, // Height 11, // Sub X 7, // Sub Y 31, // Sub W 30, // Sub H 0, // Row len 0, // Skip rows 0, // Skip pixels 4, // Alignment 0 /* offset */ ) ); pboGroupCube[ndx % splitPboTexCube].addChild( new es3fTextureSpecificationTests.TexSubImageCubeBufferCase( colorFormats[ndx].name + '_cube', '', colorFormats[ndx].internalFormat, 64, // Size 11, // Sub X 7, // Sub Y 31, // Sub W 30, // Sub H 0, // Row len 0, // Skip rows 0, // Skip pixels 4, // Alignment 0 /* offset */ ) ); } pboGroupParams = new tcuTestCase.DeqpTest( 'texsubimage2d_pbo', 'glTexSubImage2D() pixel buffer object tests' ); this.addChild(pboGroupParams); /** @type {Array<{name: string, format: number, width: number, * height: number, subX: number, subY: number, * subW: number, subH: number, rowLength: number, skipRows: number, * skipPixels: number, alignment: number, offset: number}>} */ var paramCases = [{ name: 'rgb8_offset', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 0, skipRows: 0, skipPixels: 0, alignment: 4, offset: 67 }, { name: 'rgb8_alignment', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 0, skipRows: 0, skipPixels: 0, alignment: 2, offset: 0 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 50, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 0, skipRows: 3, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 54, height: 60, subX: 11, subY: 7, subW: 31, subH: 30, rowLength: 36, skipRows: 0, skipPixels: 5, alignment: 4, offset: 0 } ]; for (var ndx = 0; ndx < paramCases.length; ndx++) { pboGroupParams.addChild( new es3fTextureSpecificationTests.TexSubImage2DBufferCase( paramCases[ndx].name + '_2d', '', paramCases[ndx].format, paramCases[ndx].width, paramCases[ndx].height, paramCases[ndx].subX, paramCases[ndx].subY, paramCases[ndx].subW, paramCases[ndx].subH, paramCases[ndx].rowLength, paramCases[ndx].skipRows, paramCases[ndx].skipPixels, paramCases[ndx].alignment, paramCases[ndx].offset)); pboGroupParams.addChild( new es3fTextureSpecificationTests.TexSubImageCubeBufferCase( paramCases[ndx].name + '_cube', '', paramCases[ndx].format, paramCases[ndx].width, paramCases[ndx].subX, paramCases[ndx].subY, paramCases[ndx].subW, paramCases[ndx].subH, paramCases[ndx].rowLength, paramCases[ndx].skipRows, paramCases[ndx].skipPixels, paramCases[ndx].alignment, paramCases[ndx].offset ) ); } // glTexSubImage2D() depth cases. shadow2dGroup = new tcuTestCase.DeqpTest( 'texsubimage2d_depth', 'glTexSubImage2D() with depth or depth/stencil format' ); this.addChild(shadow2dGroup); for (var ndx = 0; ndx < depthStencilFormats.length; ndx++) { // WebGL 2 specific constraint. if (depthStencilFormats[ndx].internalFormat == gl.DEPTH32F_STENCIL8) continue; tex2DWidth = 64; tex2DHeight = 32; shadow2dGroup.addChild( new es3fTextureSpecificationTests.TexSubImage2DDepthCase( depthStencilFormats[ndx].name, '', depthStencilFormats[ndx].internalFormat, tex2DWidth, tex2DHeight ) ); } // Basic glCopyTexImage2D() cases /** @type {tcuTestCase.DeqpTest} */ var copyTexImageGroup = new tcuTestCase.DeqpTest( 'basic_copyteximage2d', 'Basic glCopyTexImage2D() usage' ); this.addChild(copyTexImageGroup); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImage2DCase( '2d_alpha', '', gl.ALPHA, 128, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImage2DCase( '2d_luminance', '', gl.LUMINANCE, 128, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImage2DCase( '2d_luminance_alpha', '', gl.LUMINANCE_ALPHA, 128, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImage2DCase( '2d_rgb', '', gl.RGB, 128, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImage2DCase( '2d_rgba', '', gl.RGBA, 128, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImageCubeCase( 'cube_alpha', '', gl.ALPHA, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImageCubeCase( 'cube_luminance', '', gl.LUMINANCE, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImageCubeCase( 'cube_luminance_alpha', '', gl.LUMINANCE_ALPHA, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImageCubeCase( 'cube_rgb', '', gl.RGB, 64 ) ); copyTexImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexImageCubeCase( 'cube_rgba', '', gl.RGBA, 64 ) ); // Basic glCopyTexSubImage2D() cases /** @type {tcuTestCase.DeqpTest} */ var copyTexSubImageGroup = new tcuTestCase.DeqpTest( 'basic_copytexsubimage2d', 'Basic glCopyTexSubImage2D() usage' ); this.addChild(copyTexSubImageGroup); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase( '2d_alpha', '', gl.ALPHA, gl.UNSIGNED_BYTE, 128, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase( '2d_luminance', '', gl.LUMINANCE, gl.UNSIGNED_BYTE, 128, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase( '2d_luminance_alpha', '', gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE, 128, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase( '2d_rgb', '', gl.RGB, gl.UNSIGNED_BYTE, 128, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImage2DCase( '2d_rgba', '', gl.RGBA, gl.UNSIGNED_BYTE, 128, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase( 'cube_alpha', '', gl.ALPHA, gl.UNSIGNED_BYTE, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase( 'cube_luminance', '', gl.LUMINANCE, gl.UNSIGNED_BYTE, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase( 'cube_luminance_alpha', '', gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase( 'cube_rgb', '', gl.RGB, gl.UNSIGNED_BYTE, 64 ) ); copyTexSubImageGroup.addChild( new es3fTextureSpecificationTests.BasicCopyTexSubImageCubeCase( 'cube_rgba', '', gl.RGBA, gl.UNSIGNED_BYTE, 64 ) ); // Basic TexImage3D usage. var splitBasicTex2DArray = 3, splitBasicTex3D = 5; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var basicTexImageGroup2DArray = []; for (var ii = 0; ii < splitBasicTex2DArray; ++ii) { basicTexImageGroup2DArray.push( new tcuTestCase.DeqpTest('basic_teximage3d', 'Basic glTexImage3D() usage') ); this.addChild(basicTexImageGroup2DArray[ii]); } /** @type {Array<{tcuTestCase.DeqpTest}>} */ var basicTexImageGroup3D = []; for (var ii = 0; ii < splitBasicTex3D; ++ii) { basicTexImageGroup3D.push( new tcuTestCase.DeqpTest('basic_teximage3d', 'Basic glTexImage3D() usage') ); this.addChild(basicTexImageGroup3D[ii]); } for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { fmtName = colorFormats[formatNdx].name; format = colorFormats[formatNdx].internalFormat; /** @type {number} */ var tex2DArrayWidth = 57; /** @type {number} */ var tex2DArrayHeight = 44; /** @type {number} */ var tex2DArrayLevels = 5; /** @type {number} */ var tex3DWidth = 63; /** @type {number} */ var tex3DHeight = 29; /** @type {number} */ var tex3DDepth = 11; basicTexImageGroup2DArray[formatNdx % splitBasicTex2DArray].addChild( new es3fTextureSpecificationTests.BasicTexImage2DArrayCase( fmtName + '_2d_array', '', format, tex2DArrayWidth, tex2DArrayHeight, tex2DArrayLevels ) ); basicTexImageGroup3D[formatNdx % splitBasicTex3D].addChild( new es3fTextureSpecificationTests.BasicTexImage3DCase( fmtName + '_3d', '', format, tex3DWidth, tex3DHeight, tex3DDepth ) ); } // glTexImage3D() unpack params cases. paramGroup = new tcuTestCase.DeqpTest( 'teximage3d_unpack_params', 'glTexImage3D() unpack parameters' ); this.addChild(paramGroup); cases = [{ name: 'rgb8_image_height', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 26, rowLength: 0, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 27, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_images', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 0, skipImages: 3, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 22, rowLength: 0, skipImages: 0, skipRows: 3, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 25, skipImages: 0, skipRows: 0, skipPixels: 2, alignment: 4 }, { name: 'r8_complex1', format: gl.R8, width: 13, height: 17, depth: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 1 }, { name: 'r8_complex2', format: gl.R8, width: 13, height: 17, depth: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 2 }, { name: 'r8_complex3', format: gl.R8, width: 13, height: 17, depth: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 4 }, { name: 'r8_complex4', format: gl.R8, width: 13, height: 17, depth: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 8 }, { name: 'rgba8_complex1', format: gl.RGBA8, width: 11, height: 20, depth: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex2', format: gl.RGBA8, width: 11, height: 20, depth: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 2, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex3', format: gl.RGBA8, width: 11, height: 20, depth: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 0, skipPixels: 3, alignment: 8 }, { name: 'rgba8_complex4', format: gl.RGBA8, width: 11, height: 20, depth: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 2, skipPixels: 3, alignment: 8 }, { name: 'rgba32f_complex', format: gl.RGBA32F, width: 11, height: 20, depth: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 2, skipPixels: 3, alignment: 8 } ]; for (var ndx = 0; ndx < cases.length; ndx++) paramGroup.addChild( new es3fTextureSpecificationTests.TexImage3DParamsCase( cases[ndx].name, '', cases[ndx].format, cases[ndx].width, cases[ndx].height, cases[ndx].depth, cases[ndx].imageHeight, cases[ndx].rowLength, cases[ndx].skipImages, cases[ndx].skipRows, cases[ndx].skipPixels, cases[ndx].alignment ) ); // glTexImage3D() pbo cases. var splitTex2DArray = 2, splitTex3D = 2; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var pboGroup2DArray = []; for (var ii = 0; ii < splitTex2DArray; ++ii) { pboGroup2DArray.push( new tcuTestCase.DeqpTest('teximage3d_pbo', 'glTexImage3D() from PBO') ); this.addChild(pboGroup2DArray[ii]); } /** @type {Array<{tcuTestCase.DeqpTest}>} */ var pboGroup3D = []; for (var ii = 0; ii < splitTex3D; ++ii) { pboGroup3D.push( new tcuTestCase.DeqpTest('teximage3d_pbo', 'glTexImage3D() from PBO') ); this.addChild(pboGroup3D[ii]); } for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { fmtName = colorFormats[formatNdx].name; format = colorFormats[formatNdx].internalFormat; tex3DWidth = 11; tex3DHeight = 20; tex3DDepth = 8; pboGroup2DArray[formatNdx % splitTex2DArray].addChild( new es3fTextureSpecificationTests.TexImage2DArrayBufferCase( fmtName + '_2d_array', '', format, tex3DWidth, tex3DHeight, tex3DDepth, 0, 0, 0, 0, 0, 4, 0 ) ); pboGroup3D[formatNdx % splitTex3D].addChild( new es3fTextureSpecificationTests.TexImage3DBufferCase( fmtName + '_3d', '', format, tex3DWidth, tex3DHeight, tex3DDepth, 0, 0, 0, 0, 0, 4, 0 ) ); } // Parameter cases parameterCases = [{ name: 'rgb8_offset', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 0, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 1, offset: 67 }, { name: 'rgb8_alignment', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 0, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 2, offset: 0 }, { name: 'rgb8_image_height', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 26, rowLength: 0, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 27, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_images', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 0, skipImages: 3, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 22, rowLength: 0, skipImages: 0, skipRows: 3, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 23, height: 19, depth: 8, imageHeight: 0, rowLength: 25, skipImages: 0, skipRows: 0, skipPixels: 2, alignment: 4, offset: 0 } ]; pboGroupParams = new tcuTestCase.DeqpTest('teximage3d_pbo', 'glTexImage3D() from PBO'); this.addChild(pboGroupParams); for (var ndx = 0; ndx < parameterCases.length; ndx++) { pboGroupParams.addChild( new es3fTextureSpecificationTests.TexImage2DArrayBufferCase( parameterCases[ndx].name + '_2d_array', '', parameterCases[ndx].format, parameterCases[ndx].width, parameterCases[ndx].height, parameterCases[ndx].depth, parameterCases[ndx].imageHeight, parameterCases[ndx].rowLength, parameterCases[ndx].skipImages, parameterCases[ndx].skipRows, parameterCases[ndx].skipPixels, parameterCases[ndx].alignment, parameterCases[ndx].offset ) ); pboGroupParams.addChild( new es3fTextureSpecificationTests.TexImage3DBufferCase( parameterCases[ndx].name + '_3d', '', parameterCases[ndx].format, parameterCases[ndx].width, parameterCases[ndx].height, parameterCases[ndx].depth, parameterCases[ndx].imageHeight, parameterCases[ndx].rowLength, parameterCases[ndx].skipImages, parameterCases[ndx].skipRows, parameterCases[ndx].skipPixels, parameterCases[ndx].alignment, parameterCases[ndx].offset ) ); } // glTexImage3D() depth cases. /** @type {tcuTestCase.DeqpTest} */ var shadow3dGroup = new tcuTestCase.DeqpTest( 'teximage3d_depth', 'glTexImage3D() with depth or depth/stencil format' ); this.addChild(shadow3dGroup); for (var ndx = 0; ndx < depthStencilFormats.length; ndx++) { // WebGL 2 specific constraint. if (depthStencilFormats[ndx].internalFormat == gl.DEPTH32F_STENCIL8) continue; tex3DWidth = 32; tex3DHeight = 64; tex3DDepth = 8; shadow3dGroup.addChild( new es3fTextureSpecificationTests.TexImage2DArrayDepthCase( depthStencilFormats[ndx].name + '_2d_array', '', depthStencilFormats[ndx].internalFormat, tex3DWidth, tex3DHeight, tex3DDepth ) ); } // glTexImage3D() depth cases with pbo. shadow3dGroup = new tcuTestCase.DeqpTest( 'teximage3d_depth_pbo', 'glTexImage3D() with depth or depth/stencil format with pbo' ); this.addChild(shadow3dGroup); for (var ndx = 0; ndx < depthStencilFormats.length; ndx++) { tex3DWidth = 32; tex3DHeight = 64; tex3DDepth = 8; shadow3dGroup.addChild( new es3fTextureSpecificationTests.TexImage2DArrayDepthBufferCase( depthStencilFormats[ndx].name + '_2d_array', '', depthStencilFormats[ndx].internalFormat, tex3DWidth, tex3DHeight, tex3DDepth ) ); } // Basic TexSubImage3D usage. splitTex3D = 5; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var basicTexSubImageGroup = []; for (var ii = 0; ii < splitTex3D; ++ii) { basicTexSubImageGroup.push( new tcuTestCase.DeqpTest('basic_texsubimage3d', 'Basic glTexSubImage3D() usage') ); this.addChild(basicTexSubImageGroup[ii]); } for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { fmtName = colorFormats[formatNdx].name; format = colorFormats[formatNdx].internalFormat; tex3DWidth = 32; tex3DHeight = 64; tex3DDepth = 8; basicTexSubImageGroup[formatNdx % splitTex3D].addChild( new es3fTextureSpecificationTests.BasicTexSubImage3DCase( fmtName + '_3d', '', format, tex3DWidth, tex3DHeight, tex3DDepth ) ); } // glTexSubImage3D() unpack params cases. paramGroup = new tcuTestCase.DeqpTest( 'texsubimage3d_unpack_params', 'glTexSubImage3D() unpack parameters' ); this.addChild(paramGroup); /** @type {Array<{name: string, format: number, width: number, * height: number, depth: number, subX: number, subY: number, * subZ: number, subW: number, subH: number, subD: number, * imageHeight: number, rowLength: number, skipImages: number, * skipRows: number, skipPixels: number, alignment: number}>} */ var casesSubImage3D = [{ name: 'rgb8_image_height', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 26, rowLength: 0, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 0, rowLength: 27, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_images', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 0, rowLength: 0, skipImages: 3, skipRows: 0, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 22, rowLength: 0, skipImages: 0, skipRows: 3, skipPixels: 0, alignment: 4 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 0, rowLength: 25, skipImages: 0, skipRows: 0, skipPixels: 2, alignment: 4 }, { name: 'r8_complex1', format: gl.R8, width: 15, height: 20, depth: 11, subX: 1, subY: 1, subZ: 0, subW: 13, subH: 17, subD: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 1 }, { name: 'r8_complex2', format: gl.R8, width: 15, height: 20, depth: 11, subX: 1, subY: 1, subZ: 0, subW: 13, subH: 17, subD: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 2 }, { name: 'r8_complex3', format: gl.R8, width: 15, height: 20, depth: 11, subX: 1, subY: 1, subZ: 0, subW: 13, subH: 17, subD: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 4 }, { name: 'r8_complex4', format: gl.R8, width: 15, height: 20, depth: 11, subX: 1, subY: 1, subZ: 0, subW: 13, subH: 17, subD: 11, imageHeight: 23, rowLength: 15, skipImages: 2, skipRows: 3, skipPixels: 1, alignment: 8 }, { name: 'rgba8_complex1', format: gl.RGBA8, width: 15, height: 25, depth: 10, subX: 0, subY: 5, subZ: 1, subW: 11, subH: 20, subD: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex2', format: gl.RGBA8, width: 15, height: 25, depth: 10, subX: 0, subY: 5, subZ: 1, subW: 11, subH: 20, subD: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 2, skipPixels: 0, alignment: 8 }, { name: 'rgba8_complex3', format: gl.RGBA8, width: 15, height: 25, depth: 10, subX: 0, subY: 5, subZ: 1, subW: 11, subH: 20, subD: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 0, skipPixels: 3, alignment: 8 }, { name: 'rgba8_complex4', format: gl.RGBA8, width: 15, height: 25, depth: 10, subX: 0, subY: 5, subZ: 1, subW: 11, subH: 20, subD: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 2, skipPixels: 3, alignment: 8 }, { name: 'rgba32f_complex', format: gl.RGBA32F, width: 15, height: 25, depth: 10, subX: 0, subY: 5, subZ: 1, subW: 11, subH: 20, subD: 8, imageHeight: 25, rowLength: 14, skipImages: 0, skipRows: 2, skipPixels: 3, alignment: 8 } ]; for (var ndx = 0; ndx < casesSubImage3D.length; ndx++) paramGroup.addChild( new es3fTextureSpecificationTests.TexSubImage3DParamsCase( casesSubImage3D[ndx].name, '', casesSubImage3D[ndx].format, casesSubImage3D[ndx].width, casesSubImage3D[ndx].height, casesSubImage3D[ndx].depth, casesSubImage3D[ndx].subX, casesSubImage3D[ndx].subY, casesSubImage3D[ndx].subZ, casesSubImage3D[ndx].subW, casesSubImage3D[ndx].subH, casesSubImage3D[ndx].subD, casesSubImage3D[ndx].imageHeight, casesSubImage3D[ndx].rowLength, casesSubImage3D[ndx].skipImages, casesSubImage3D[ndx].skipRows, casesSubImage3D[ndx].skipPixels, casesSubImage3D[ndx].alignment ) ); // glTexSubImage3D() PBO cases. splitTex2DArray = 2; pboGroup2DArray = []; for (var ii = 0; ii < splitTex2DArray; ++ii) { pboGroup2DArray.push( new tcuTestCase.DeqpTest('texsubimage3d_pbo', 'glTexSubImage3D() pixel buffer object tests') ); this.addChild(pboGroup2DArray[ii]); } splitTex3D = 2; pboGroup3D = []; for (var ii = 0; ii < splitTex3D; ++ii) { pboGroup3D.push( new tcuTestCase.DeqpTest('texsubimage3d_pbo', 'glTexSubImage3D() pixel buffer object tests') ); this.addChild(pboGroup3D[ii]); } for (var ndx = 0; ndx < colorFormats.length; ndx++) { pboGroup2DArray[ndx % splitTex2DArray].addChild( new es3fTextureSpecificationTests.TexSubImage2DArrayBufferCase( colorFormats[ndx].name + '_2d_array', '', colorFormats[ndx].internalFormat, 26, // Width 25, // Height 10, // Depth 1, // Sub X 2, // Sub Y 0, // Sub Z 23, // Sub W 19, // Sub H 8, // Sub D 0, // Image height 0, // Row length 0, // Skip images 0, // Skip rows 0, // Skip pixels 4, // Alignment 0 // offset ) ); pboGroup3D[ndx % splitTex3D].addChild( new es3fTextureSpecificationTests.TexSubImage3DBufferCase( colorFormats[ndx].name + '_3d', '', colorFormats[ndx].internalFormat, 26, // Width 25, // Height 10, // Depth 1, // Sub X 2, // Sub Y 0, // Sub Z 23, // Sub W 19, // Sub H 8, // Sub D 0, // Image height 0, // Row length 0, // Skip images 0, // Skip rows 0, // Skip pixels 4, // Alignment 0 // offset ) ); } paramCases = [{ name: 'rgb8_offset', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 0, rowLength: 0, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4, offset: 67 }, { name: 'rgb8_image_height', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 26, rowLength: 0, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_row_length', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 0, rowLength: 27, skipImages: 0, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_images', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 0, rowLength: 0, skipImages: 3, skipRows: 0, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_rows', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 22, rowLength: 0, skipImages: 0, skipRows: 3, skipPixels: 0, alignment: 4, offset: 0 }, { name: 'rgb8_skip_pixels', format: gl.RGB8, width: 26, height: 25, depth: 10, subX: 1, subY: 2, subZ: 1, subW: 23, subH: 19, subD: 8, imageHeight: 0, rowLength: 25, skipImages: 0, skipRows: 0, skipPixels: 2, alignment: 4, offset: 0 } ]; pboGroupParams = new tcuTestCase.DeqpTest( 'texsubimage3d_pbo', 'glTexSubImage3D() pixel buffer object tests' ); this.addChild(pboGroupParams); for (var ndx = 0; ndx < paramCases.length; ndx++) { pboGroupParams.addChild( new es3fTextureSpecificationTests.TexSubImage2DArrayBufferCase( paramCases[ndx].name + '_2d_array', '', paramCases[ndx].format, paramCases[ndx].width, paramCases[ndx].height, paramCases[ndx].depth, paramCases[ndx].subX, paramCases[ndx].subY, paramCases[ndx].subZ, paramCases[ndx].subW, paramCases[ndx].subH, paramCases[ndx].subD, paramCases[ndx].imageHeight, paramCases[ndx].rowLength, paramCases[ndx].skipImages, paramCases[ndx].skipRows, paramCases[ndx].skipPixels, paramCases[ndx].alignment, paramCases[ndx].offset ) ); pboGroupParams.addChild( new es3fTextureSpecificationTests.TexSubImage3DBufferCase( paramCases[ndx].name + '_3d', '', paramCases[ndx].format, paramCases[ndx].width, paramCases[ndx].height, paramCases[ndx].depth, paramCases[ndx].subX, paramCases[ndx].subY, paramCases[ndx].subZ, paramCases[ndx].subW, paramCases[ndx].subH, paramCases[ndx].subD, paramCases[ndx].imageHeight, paramCases[ndx].rowLength, paramCases[ndx].skipImages, paramCases[ndx].skipRows, paramCases[ndx].skipPixels, paramCases[ndx].alignment, paramCases[ndx].offset ) ); } // glTexSubImage3D() depth cases. shadow3dGroup = new tcuTestCase.DeqpTest( 'texsubimage3d_depth', 'glTexSubImage3D() with depth or depth/stencil format' ); this.addChild(shadow3dGroup); for (var ndx = 0; ndx < depthStencilFormats.length; ndx++) { // WebGL 2 specific constraint. if (depthStencilFormats[ndx].internalFormat == gl.DEPTH32F_STENCIL8) continue; tex2DArrayWidth = 57; tex2DArrayHeight = 44; tex2DArrayLevels = 5; shadow3dGroup.addChild( new es3fTextureSpecificationTests.TexSubImage2DArrayDepthCase( depthStencilFormats[ndx].name + '_2d_array', '', depthStencilFormats[ndx].internalFormat, tex2DArrayWidth, tex2DArrayHeight, tex2DArrayLevels ) ); } // glTexStorage2D() cases. // Color formats var splitStorage2D = 3, splitStorageCube = 5; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var colorFormatGroup2D = []; for (var ii = 0; ii < splitStorage2D; ++ii) { colorFormatGroup2D.push( new tcuTestCase.DeqpTest('texstorage2d.format', 'glTexStorage2D() with all formats') ); this.addChild(colorFormatGroup2D[ii]); } /** @type {Array<{tcuTestCase.DeqpTest}>} */ var colorFormatGroupCube = []; for (var ii = 0; ii < splitStorageCube; ++ii) { colorFormatGroupCube.push( new tcuTestCase.DeqpTest('texstorage2d.format', 'glTexStorage2D() with all formats') ); this.addChild(colorFormatGroupCube[ii]); } for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { fmtName = colorFormats[formatNdx].name; /** @type {number} */ var internalFormat = colorFormats[formatNdx].internalFormat; var tex2DWidth = 117; var tex2DHeight = 97; var tex2DLevels = es3fTextureSpecificationTests.maxLevelCount(tex2DWidth, tex2DHeight); /** @type {number} */ var cubeSize = 57; /** @type {number} */ var cubeLevels = es3fTextureSpecificationTests.maxLevelCount( cubeSize, cubeSize ); colorFormatGroup2D[formatNdx % splitStorage2D].addChild( new es3fTextureSpecificationTests.BasicTexStorage2DCase( fmtName + '_2d', '', internalFormat, tex2DWidth, tex2DHeight, tex2DLevels ) ); colorFormatGroupCube[formatNdx % splitStorageCube].addChild( new es3fTextureSpecificationTests.BasicTexStorageCubeCase( fmtName + '_cube', '', internalFormat, cubeSize, cubeLevels ) ); } // Depth / stencil formats. /** @type {tcuTestCase.DeqpTest} */ var storageGroup = new tcuTestCase.DeqpTest( 'texstorage2d.format', 'glTexStorage2D() with all formats' ); this.addChild(storageGroup); for (var formatNdx = 0; formatNdx < depthStencilFormats.length; formatNdx++) { fmtName = depthStencilFormats[formatNdx].name; internalFormat = depthStencilFormats[formatNdx].internalFormat; // WebGL 2 specific constraint. if (internalFormat == gl.DEPTH32F_STENCIL8) continue; tex2DWidth = 117; tex2DHeight = 97; tex2DLevels = es3fTextureSpecificationTests.maxLevelCount( tex2DWidth, tex2DHeight ); cubeSize = 57; cubeLevels = es3fTextureSpecificationTests.maxLevelCount( cubeSize, cubeSize ); storageGroup.addChild( new es3fTextureSpecificationTests.BasicTexStorage2DCase( fmtName + '_2d', '', internalFormat, tex2DWidth, tex2DHeight, tex2DLevels ) ); storageGroup.addChild( new es3fTextureSpecificationTests.BasicTexStorageCubeCase( fmtName + '_cube', '', internalFormat, cubeSize, cubeLevels ) ); } // Sizes. storageGroup = new tcuTestCase.DeqpTest( 'texstorage2d.size', 'glTexStorage2D() with various sizes' ); this.addChild(storageGroup); // W H L /** @type {Array<{width: number, height: number, levels: number}>} */ var tex2DSizes = [{ width: 1, height: 1, levels: 1 }, { width: 2, height: 2, levels: 2 }, { width: 64, height: 32, levels: 7 }, { width: 32, height: 64, levels: 4 }, { width: 57, height: 63, levels: 1 }, { width: 57, height: 63, levels: 2 }, { width: 57, height: 63, levels: 6 } ]; // S L /** @type {Array<{sizes: number, levels: number}>} */ var cubeSizes = [{ sizes: 1, levels: 1 }, { sizes: 2, levels: 2 }, { sizes: 57, levels: 1 }, { sizes: 57, levels: 2 }, { sizes: 57, levels: 6 }, { sizes: 64, levels: 4 }, { sizes: 64, levels: 7 } ]; for (var ndx = 0; ndx < tex2DSizes.length; ndx++) { format = gl.RGBA8; /** @type {number} */ var width = tex2DSizes[ndx].width; /** @type {number} */ var height = tex2DSizes[ndx].height; /** @type {number} */ var levels = tex2DSizes[ndx].levels; /** @type {string} */ var name = '2d_' + width + 'x' + height + '_' + levels + '_levels'; storageGroup.addChild( new es3fTextureSpecificationTests.BasicTexStorage2DCase( name, '', format, width, height, levels ) ); } for (var ndx = 0; ndx < cubeSizes.length; ndx++) { format = gl.RGBA8; size = cubeSizes[ndx].sizes; levels = cubeSizes[ndx].levels; name = 'cube_' + size + 'x' + size + '_' + levels + '_levels'; storageGroup.addChild( new es3fTextureSpecificationTests.BasicTexStorageCubeCase( name, '', format, size, levels ) ); } // glTexStorage3D() cases. // Color formats. var splitStorage2DArray = 3, splitStorage3D = 4; /** @type {Array<{tcuTestCase.DeqpTest}>} */ var colorFormatGroup2DArray = []; for (var ii = 0; ii < splitStorage2DArray; ++ii) { colorFormatGroup2DArray.push( new tcuTestCase.DeqpTest('texstorage3d.format', 'glTexStorage3D() with all formats') ); this.addChild(colorFormatGroup2DArray[ii]); } /** @type {Array<{tcuTestCase.DeqpTest}>} */ var colorFormatGroup3D = []; for (var ii = 0; ii < splitStorage3D; ++ii) { colorFormatGroup3D.push( new tcuTestCase.DeqpTest('texstorage3d.format', 'glTexStorage3D() with all formats') ); this.addChild(colorFormatGroup3D[ii]); } // Color formats. for (var formatNdx = 0; formatNdx < colorFormats.length; formatNdx++) { fmtName = colorFormats[formatNdx].name; internalFormat = colorFormats[formatNdx].internalFormat; tex2DArrayWidth = 57; tex2DArrayHeight = 13; var tex2DArrayLayers = 7; tex2DArrayLevels = es3fTextureSpecificationTests.maxLevelCount( tex2DArrayWidth, tex2DArrayHeight ); tex3DWidth = 59; tex3DHeight = 37; tex3DDepth = 11; var tex3DLevels = es3fTextureSpecificationTests.maxLevelCount( tex3DWidth, tex3DHeight, tex3DDepth ); colorFormatGroup2DArray[formatNdx % splitStorage2DArray].addChild( new es3fTextureSpecificationTests.BasicTexStorage2DArrayCase( fmtName + '_2d_array', '', internalFormat, tex2DArrayWidth, tex2DArrayHeight, tex2DArrayLayers, tex2DArrayLevels ) ); colorFormatGroup3D[formatNdx % splitStorage3D].addChild( new es3fTextureSpecificationTests.BasicTexStorage3DCase( fmtName + '_3d', '', internalFormat, tex3DWidth, tex3DHeight, tex3DDepth, tex3DLevels ) ); } storageGroup = new tcuTestCase.DeqpTest( 'texstorage3d.format', 'glTexStorage3D() with all formats' ); this.addChild(storageGroup); // Depth/stencil formats (only 2D texture array is supported). for (var formatNdx = 0; formatNdx < depthStencilFormats.length; formatNdx++) { fmtName = depthStencilFormats[formatNdx].name; internalFormat = depthStencilFormats[formatNdx].internalFormat; // WebGL 2 specific constraint. if (internalFormat == gl.DEPTH32F_STENCIL8) continue; tex2DArrayWidth = 57; tex2DArrayHeight = 13; tex2DArrayLayers = 7; tex2DArrayLevels = es3fTextureSpecificationTests.maxLevelCount( tex2DArrayWidth, tex2DArrayHeight ); storageGroup.addChild( new es3fTextureSpecificationTests.BasicTexStorage2DArrayCase( fmtName + '_2d_array', '', internalFormat, tex2DArrayWidth, tex2DArrayHeight, tex2DArrayLayers, tex2DArrayLevels ) ); } // Sizes. // W H La Le /** * @type {Array<{width: number, height: number, * layers: number, levels: number}>} */ var tex2DArraySizes = [{ width: 1, height: 1, layers: 1, levels: 1 }, { width: 2, height: 2, layers: 2, levels: 2 }, { width: 64, height: 32, layers: 3, levels: 7 }, { width: 32, height: 64, layers: 3, levels: 4 }, { width: 57, height: 63, layers: 5, levels: 1 }, { width: 57, height: 63, layers: 5, levels: 2 }, { width: 57, height: 63, layers: 5, levels: 6 } ]; // W H D L /** * @type {Array<{width: number, height: number, * depth: number, levels: number}>} */ var tex3DSizes = [{ width: 1, height: 1, depth: 1, levels: 1 }, { width: 2, height: 2, depth: 2, levels: 2 }, { width: 64, height: 32, depth: 16, levels: 7 }, { width: 32, height: 64, depth: 16, levels: 4 }, { width: 32, height: 16, depth: 64, levels: 4 }, { width: 57, height: 63, depth: 11, levels: 1 }, { width: 57, height: 63, depth: 11, levels: 2 }, { width: 57, height: 63, depth: 11, levels: 6 } ]; storageGroup = new tcuTestCase.DeqpTest( 'texstorage3d.size', 'glTexStorage3D() with various sizes' ); this.addChild(storageGroup); for (var ndx = 0; ndx < tex2DArraySizes.length; ndx++) { format = gl.RGBA8; width = tex2DArraySizes[ndx].width; height = tex2DArraySizes[ndx].height; /** @type {number} */ var layers = tex2DArraySizes[ndx].layers; levels = tex2DArraySizes[ndx].levels; name = '2d_array_' + width + 'x' + height + 'x' + layers + '_' + levels + '_levels'; storageGroup.addChild( new es3fTextureSpecificationTests.BasicTexStorage2DArrayCase( name, '', format, width, height, layers, levels ) ); } for (var ndx = 0; ndx < tex3DSizes.length; ndx++) { format = gl.RGBA8; width = tex3DSizes[ndx].width; height = tex3DSizes[ndx].height; var depth = tex3DSizes[ndx].depth; levels = tex3DSizes[ndx].levels; name = '3d_' + width + 'x' + height + 'x' + depth + '_' + levels + '_levels'; storageGroup.addChild( new es3fTextureSpecificationTests.BasicTexStorage3DCase( name, '', format, width, height, depth, levels ) ); } }; /** * Run test * @param {WebGL2RenderingContext} context * @param {Array=} range Test range */ es3fTextureSpecificationTests.run = function(context, range) { gl = context; //Set up Test Root parameters var state = tcuTestCase.runner; state.setRoot(new es3fTextureSpecificationTests.TextureSpecificationTests()); if (range) state.setRange(range); //Set up name and description of this test series. setCurrentTestName(state.testCases.fullName()); description(state.testCases.getDescription()); try { //Run test cases tcuTestCase.runTestCases(); } catch (err) { testFailedOptions('Failed to es3fTextureSpecificationTests.run tests', false); tcuTestCase.runner.terminate(); } }; });