diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /dom/canvas/test/webgl-conf/checkout/deqp/modules/shared/glsSamplerObjectTest.js | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/deqp/modules/shared/glsSamplerObjectTest.js')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/deqp/modules/shared/glsSamplerObjectTest.js | 1148 |
1 files changed, 1148 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/modules/shared/glsSamplerObjectTest.js b/dom/canvas/test/webgl-conf/checkout/deqp/modules/shared/glsSamplerObjectTest.js new file mode 100644 index 000000000..0d4030bd9 --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/deqp/modules/shared/glsSamplerObjectTest.js @@ -0,0 +1,1148 @@ +/*------------------------------------------------------------------------- + * 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('modules.shared.glsSamplerObjectTest'); +goog.require('framework.common.tcuImageCompare'); +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.deRandom'); +goog.require('framework.delibs.debase.deString'); +goog.require('framework.opengl.gluDrawUtil'); +goog.require('framework.opengl.gluShaderProgram'); +goog.require('framework.opengl.gluTextureUtil'); + +goog.scope(function() { + +var glsSamplerObjectTest = modules.shared.glsSamplerObjectTest; +var tcuTestCase = framework.common.tcuTestCase; +var deRandom = framework.delibs.debase.deRandom; +var gluShaderProgram = framework.opengl.gluShaderProgram; +var tcuTexture = framework.common.tcuTexture; +var tcuSurface = framework.common.tcuSurface; +var tcuTextureUtil = framework.common.tcuTextureUtil; +var tcuImageCompare = framework.common.tcuImageCompare; +var gluDrawUtil = framework.opengl.gluDrawUtil; +var gluTextureUtil = framework.opengl.gluTextureUtil; +var deString = framework.delibs.debase.deString; + + var DE_ASSERT = function(expression) { + if (!expression) throw new Error('Assert failed'); + }; + + // glsSamplerObjectTest.TextureSamplerTest + + /** @const @type {number} */ glsSamplerObjectTest.VIEWPORT_WIDTH = 128; + /** @const @type {number} */ glsSamplerObjectTest.VIEWPORT_HEIGHT = 128; + + /** @const @type {number} */ glsSamplerObjectTest.TEXTURE2D_WIDTH = 32; + /** @const @type {number} */ glsSamplerObjectTest.TEXTURE2D_HEIGHT = 32; + + /** @const @type {number} */ glsSamplerObjectTest.TEXTURE3D_WIDTH = 32; + /** @const @type {number} */ glsSamplerObjectTest.TEXTURE3D_HEIGHT = 32; + /** @const @type {number} */ glsSamplerObjectTest.TEXTURE3D_DEPTH = 32; + + /** @const @type {number} */ glsSamplerObjectTest.CUBEMAP_SIZE = 32; + + /** @const @type {Array<number>} */ glsSamplerObjectTest.s_positions = [ + -1.0, -1.0, + 1.0, -1.0, + 1.0, 1.0, + 1.0, 1.0, + -1.0, 1.0, + -1.0, -1.0 + ]; + + /** @const @type {Array<number>} */ glsSamplerObjectTest.s_positions3D = [ + -1.0, -1.0, -1.0, + 1.0, -1.0, 1.0, + 1.0, 1.0, -1.0, + 1.0, 1.0, -1.0, + -1.0, 1.0, 1.0, + -1.0, -1.0, -1.0 + ]; + + /** @const @type {Array<number>} */ glsSamplerObjectTest.s_positionsCube = [ + -1.0, -1.0, -1.0, -0.5, + 1.0, -1.0, 1.0, -0.5, + 1.0, 1.0, 1.0, 0.5, + 1.0, 1.0, 1.0, 0.5, + -1.0, 1.0, -1.0, 0.5, + -1.0, -1.0, -1.0, -0.5 + ]; + + /** + * @struct + * @constructor + */ + glsSamplerObjectTest.SamplingState = function(minFilter, magFilter, wrapT, wrapS, wrapR, minLod, maxLod) { + /** @type {number} */ this.minFilter = minFilter; + /** @type {number} */ this.magFilter = magFilter; + /** @type {number} */ this.wrapT = wrapT; + /** @type {number} */ this.wrapS = wrapS; + /** @type {number} */ this.wrapR = wrapR; + /** @type {number} */ this.minLod = minLod; + /** @type {number} */ this.maxLod = maxLod; + }; + + /** + * @struct + * @param {string} name + * @param {string} desc + * @param {number} target + * @param {glsSamplerObjectTest.SamplingState} state1 + * @param {glsSamplerObjectTest.SamplingState} state2 + * @param {glsSamplerObjectTest.SamplingState=} state3 + * @constructor + */ + glsSamplerObjectTest.TestSpec = function(name, desc, target, state1, state2, state3) { + /** @type {string} */ this.name = name; + /** @type {string} */ this.desc = desc; + /** @type {number} */ this.target = target; + /** @type {glsSamplerObjectTest.SamplingState} */ this.textureState = state1; + /** @type {glsSamplerObjectTest.SamplingState} */ this.textureState2 = state3 !== undefined ? state2 : null; // merging TST and MTST structs + /** @type {glsSamplerObjectTest.SamplingState} */ this.samplerState = state3 !== undefined ? state3 : state2; + }; + + /** + * @constructor + * @extends {tcuTestCase.DeqpTest} + * @const @param {glsSamplerObjectTest.TestSpec} spec + */ + glsSamplerObjectTest.TextureSamplerTest = function(spec) { + tcuTestCase.DeqpTest.call(this, spec.name, spec.desc); + /** @type {gluShaderProgram.ShaderProgram} */ this.m_program = null; + /** @type {number} */ this.m_target = spec.target; + /** @type {glsSamplerObjectTest.SamplingState} */ this.m_textureState = spec.textureState; + /** @type {glsSamplerObjectTest.SamplingState} */ this.m_samplerState = spec.samplerState; + /** @type {deRandom.Random} */ this.m_random = new deRandom.Random(deString.deStringHash(spec.name)); + }; + + glsSamplerObjectTest.TextureSamplerTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype); + glsSamplerObjectTest.TextureSamplerTest.prototype.constructor = glsSamplerObjectTest.TextureSamplerTest; + + /** + * @private + * @param {tcuSurface.Surface} textureRef + * @param {tcuSurface.Surface} samplerRef + * @param {number} x + * @param {number} y + */ + glsSamplerObjectTest.TextureSamplerTest.prototype.renderReferences = function(textureRef, samplerRef, x, y) { + /** @type {WebGLTexture} */ var texture = glsSamplerObjectTest.TextureSamplerTest.createTexture(this.m_target); + + gl.viewport(x, y, glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + gl.bindTexture(this.m_target, texture); + + glsSamplerObjectTest.TextureSamplerTest.setTextureState(this.m_target, this.m_textureState); + this.render(); + var texRef = textureRef.getAccess(); + var texRefTransferFormat = gluTextureUtil.getTransferFormat(texRef.getFormat()); + gl.readPixels(x, y, texRef.m_width, texRef.m_height, texRefTransferFormat.format, texRefTransferFormat.dataType, textureRef.m_pixels); + + glsSamplerObjectTest.TextureSamplerTest.setTextureState(this.m_target, this.m_samplerState); + this.render(); + var sampRef = samplerRef.getAccess(); + var sampRefTransferFormat = gluTextureUtil.getTransferFormat(sampRef.getFormat()); + gl.readPixels(x, y, sampRef.m_width, sampRef.m_height, sampRefTransferFormat.format, sampRefTransferFormat.dataType, samplerRef.m_pixels); + + gl.deleteTexture(texture); + }; + + /** + * @private + * @param {tcuSurface.Surface} textureResult + * @param {tcuSurface.Surface} samplerResult + * @param {number} x + * @param {number} y + */ + glsSamplerObjectTest.TextureSamplerTest.prototype.renderResults = function(textureResult, samplerResult, x, y) { + /** @type {WebGLTexture} */ var texture = glsSamplerObjectTest.TextureSamplerTest.createTexture(this.m_target); + + gl.viewport(x, y, glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + var sampler = gl.createSampler(); + DE_ASSERT(sampler != -1); + + gl.bindSampler(0, sampler); + + // First set sampler state + glsSamplerObjectTest.TextureSamplerTest.setSamplerState(this.m_samplerState, sampler); + + // Set texture state + gl.bindTexture(this.m_target, texture); + + glsSamplerObjectTest.TextureSamplerTest.setTextureState(this.m_target, this.m_textureState); + // Render using sampler + this.render(); + var sampRes = samplerResult.getAccess(); + var sampResTransferFormat = gluTextureUtil.getTransferFormat(sampRes.getFormat()); + gl.readPixels(x, y, sampRes.m_width, sampRes.m_height, sampResTransferFormat.format, sampResTransferFormat.dataType, samplerResult.m_pixels); + + // Render without sampler + gl.bindSampler(0, null); + gl.deleteSampler(sampler); + + this.render(); + var texRes = textureResult.getAccess(); + var texResTransferFormat = gluTextureUtil.getTransferFormat(texRes.getFormat()); + gl.readPixels(x, y, texRes.m_width, texRes.m_height, texResTransferFormat.format, texResTransferFormat.dataType, textureResult.m_pixels); + + gl.deleteSampler(sampler); + gl.deleteTexture(texture); + }; + + /** + * @private + */ + glsSamplerObjectTest.TextureSamplerTest.prototype.render = function() { + /** @type {WebGLUniformLocation} */ var samplerLoc; + /** @type {WebGLUniformLocation} */ var scaleLoc; + + gl.useProgram(this.m_program.getProgram()); + + samplerLoc = gl.getUniformLocation(this.m_program.getProgram(), 'u_sampler'); + DE_ASSERT(samplerLoc != null); + + scaleLoc = gl.getUniformLocation(this.m_program.getProgram(), 'u_posScale'); + DE_ASSERT(scaleLoc != null); + + gl.clearColor(0.5, 0.5, 0.5, 1.0); + + gl.clear(gl.COLOR_BUFFER_BIT); + + gl.uniform1i(samplerLoc, 0); + + gl.uniform1f(scaleLoc, 1.0); + + /** @type {Array<gluDrawUtil.VertexArrayBinding>} */ var vertexArrays; + switch (this.m_target) { + case gl.TEXTURE_2D: { + vertexArrays = [ + gluDrawUtil.vabFromBindingPointAndArrayPointer( + gluDrawUtil.bindingPointFromName('a_position'), + new gluDrawUtil.VertexArrayPointer( + gluDrawUtil.VertexComponentType.VTX_COMP_FLOAT, + gluDrawUtil.VertexComponentConversion.VTX_COMP_CONVERT_NONE, + 2, + 6, + 0, + glsSamplerObjectTest.s_positions)) + ]; + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + gl.uniform1f(scaleLoc, 0.25); + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + break; + } + + case gl.TEXTURE_3D: { + vertexArrays = [ + gluDrawUtil.vabFromBindingPointAndArrayPointer( + gluDrawUtil.bindingPointFromName('a_position'), + new gluDrawUtil.VertexArrayPointer( + gluDrawUtil.VertexComponentType.VTX_COMP_FLOAT, + gluDrawUtil.VertexComponentConversion.VTX_COMP_CONVERT_NONE, + 3, + 6, + 0, + glsSamplerObjectTest.s_positions3D)) + ]; + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + gl.uniform1f(scaleLoc, 0.25); + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + break; + } + + case gl.TEXTURE_CUBE_MAP: { + vertexArrays = [ + gluDrawUtil.vabFromBindingPointAndArrayPointer( + gluDrawUtil.bindingPointFromName('a_position'), + new gluDrawUtil.VertexArrayPointer( + gluDrawUtil.VertexComponentType.VTX_COMP_FLOAT, + gluDrawUtil.VertexComponentConversion.VTX_COMP_CONVERT_NONE, + 4, + 6, + 0, + glsSamplerObjectTest.s_positionsCube)) + ]; + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + gl.uniform1f(scaleLoc, 0.25); + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + break; + } + + default: + DE_ASSERT(false); + } + }; + + /** + * @private + * @param {number} target + * @param {glsSamplerObjectTest.SamplingState} state + */ + glsSamplerObjectTest.TextureSamplerTest.setTextureState = function(target, state) { + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, state.minFilter); + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, state.magFilter); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, state.wrapS); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, state.wrapT); + gl.texParameteri(target, gl.TEXTURE_WRAP_R, state.wrapR); + gl.texParameterf(target, gl.TEXTURE_MAX_LOD, state.maxLod); + gl.texParameterf(target, gl.TEXTURE_MIN_LOD, state.minLod); + }; + + /** + * @private + * @param {glsSamplerObjectTest.SamplingState} state + * @param {WebGLSampler} sampler + */ + glsSamplerObjectTest.TextureSamplerTest.setSamplerState = function(state, sampler) { + gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, state.minFilter); + gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, state.magFilter); + gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, state.wrapS); + gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, state.wrapT); + gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, state.wrapR); + gl.samplerParameterf(sampler, gl.TEXTURE_MAX_LOD, state.maxLod); + gl.samplerParameterf(sampler, gl.TEXTURE_MIN_LOD, state.minLod); + }; + + /** + * @private + * @return {WebGLTexture} + */ + glsSamplerObjectTest.TextureSamplerTest.createTexture2D = function() { + /** @type {WebGLTexture} */ var texture = null; + /** @type {tcuTexture.Texture2D} */ var refTexture = new tcuTexture.Texture2D( + new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, + tcuTexture.ChannelType.UNORM_INT8), + glsSamplerObjectTest.TEXTURE2D_WIDTH, + glsSamplerObjectTest.TEXTURE2D_HEIGHT); + + refTexture.allocLevel(0); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevel(0), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + + texture = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_2D, texture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, refTexture.getWidth(), refTexture.getHeight(), 0, gl.RGBA, gl.UNSIGNED_BYTE, refTexture.getLevel(0).getDataPtr()); + + gl.generateMipmap(gl.TEXTURE_2D); + + gl.bindTexture(gl.TEXTURE_2D, null); + + return texture; + }; + + /** + * @private + * @return {WebGLTexture} + */ + glsSamplerObjectTest.TextureSamplerTest.createTexture3D = function() { + /** @type {WebGLTexture} */ var texture = null; + /** @type {tcuTexture.Texture3D} */ var refTexture = new tcuTexture.Texture3D( + new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, + tcuTexture.ChannelType.UNORM_INT8), + glsSamplerObjectTest.TEXTURE3D_WIDTH, + glsSamplerObjectTest.TEXTURE3D_HEIGHT, + glsSamplerObjectTest.TEXTURE3D_DEPTH); + + refTexture.allocLevel(0); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevel(0), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + + texture = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_3D, texture); + + gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA, refTexture.getWidth(), refTexture.getHeight(), refTexture.getDepth(), 0, gl.RGBA, gl.UNSIGNED_BYTE, refTexture.getLevel(0).getDataPtr()); + + gl.generateMipmap(gl.TEXTURE_3D); + + gl.bindTexture(gl.TEXTURE_3D, null); + + return texture; + }; + + /** + * @private + * @return {WebGLTexture} + */ + glsSamplerObjectTest.TextureSamplerTest.createTextureCube = function() { + /** @type {WebGLTexture} */ var texture = null; + /** @type {tcuTexture.TextureCube} */ var refTexture = new tcuTexture.TextureCube( + new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, + tcuTexture.ChannelType.UNORM_INT8), + glsSamplerObjectTest.CUBEMAP_SIZE); + + texture = gl.createTexture(); + + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_POSITIVE_X, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_POSITIVE_Y, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_POSITIVE_Z, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Y, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Z, 0); + + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_X), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_Y), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_Z), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Y), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Z), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 1.0, 1.0]); + + gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture); + // TODO: check internalFormat / format parameters in texImage2D (were RGBA8 and RGBA respectively) + for (var face in tcuTexture.CubeFace) { + /** @const @type {number} */ var target = gluTextureUtil.getGLCubeFace(tcuTexture.CubeFace[face]); + gl.texImage2D(target, 0, gl.RGBA, refTexture.getSize(), refTexture.getSize(), 0, gl.RGBA, gl.UNSIGNED_BYTE, refTexture.getLevelFace(0, tcuTexture.CubeFace[face]).getDataPtr()); + } + + gl.generateMipmap(gl.TEXTURE_CUBE_MAP); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, null); + + return texture; + }; + + /** + * @private + * @param {number} target + * @return {WebGLTexture} + */ + glsSamplerObjectTest.TextureSamplerTest.createTexture = function(target) { + /** @type {WebGLTexture} */ var texture; + switch (target) { + case gl.TEXTURE_2D: + texture = glsSamplerObjectTest.TextureSamplerTest.createTexture2D(); + break; + + case gl.TEXTURE_3D: + texture = glsSamplerObjectTest.TextureSamplerTest.createTexture3D(); + break; + + case gl.TEXTURE_CUBE_MAP: + texture = glsSamplerObjectTest.TextureSamplerTest.createTextureCube(); + break; + + default: + throw new Error('Unsupported target: ' + WebGLTestUtils.glEnumToString(gl, target)); + } + + return texture; + }; + + /** + * @private + * @param {number} target + * @return {string} + */ + glsSamplerObjectTest.TextureSamplerTest.selectVertexShader = function(target) { + switch (target) { + case gl.TEXTURE_2D: + return '#version 300 es\n' + + 'in highp vec2 a_position;\n' + + 'uniform highp float u_posScale;\n' + + 'out mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\tv_texCoord = a_position;\n' + + '\tgl_Position = vec4(u_posScale * a_position, 0.0, 1.0);\n' + + '}'; + + case gl.TEXTURE_3D: + return '#version 300 es\n' + + 'in highp vec3 a_position;\n' + + 'uniform highp float u_posScale;\n' + + 'out mediump vec3 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\tv_texCoord = a_position;\n' + + '\tgl_Position = vec4(u_posScale * a_position.xy, 0.0, 1.0);\n' + + '}'; + + case gl.TEXTURE_CUBE_MAP: + return '#version 300 es\n' + + 'in highp vec4 a_position;\n' + + 'uniform highp float u_posScale;\n' + + 'out mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\tv_texCoord = a_position.zw;\n' + + '\tgl_Position = vec4(u_posScale * a_position.xy, 0.0, 1.0);\n' + + '}'; + + default: + DE_ASSERT(false); + return ''; + } + }; + + /** + * @private + * @param {number} target + * @return {string} + */ + glsSamplerObjectTest.TextureSamplerTest.selectFragmentShader = function(target) { + switch (target) { + case gl.TEXTURE_2D: + return '#version 300 es\nlayout(location = 0) out mediump vec4 o_color;\n' + + 'uniform lowp sampler2D u_sampler;\n' + + 'in mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\to_color = texture(u_sampler, v_texCoord);\n' + + '}'; + + case gl.TEXTURE_3D: + return '#version 300 es\nlayout(location = 0) out mediump vec4 o_color;\n' + + 'uniform lowp sampler3D u_sampler;\n' + + 'in mediump vec3 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\to_color = texture(u_sampler, v_texCoord);\n' + + '}'; + + case gl.TEXTURE_CUBE_MAP: + return '#version 300 es\nlayout(location = 0) out mediump vec4 o_color;\n' + + 'uniform lowp samplerCube u_sampler;\n' + + 'in mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\to_color = texture(u_sampler, vec3(cos(3.14 * v_texCoord.y) * sin(3.14 * v_texCoord.x), sin(3.14 * v_texCoord.y), cos(3.14 * v_texCoord.y) * cos(3.14 * v_texCoord.x)));\n' + + '}'; + + default: + DE_ASSERT(false); + return ''; + } + }; + + glsSamplerObjectTest.TextureSamplerTest.prototype.init = function() { + /** @const @type {string} */ var vertexShaderTemplate = glsSamplerObjectTest.TextureSamplerTest.selectVertexShader(this.m_target); + /** @const @type {string} */ var fragmentShaderTemplate = glsSamplerObjectTest.TextureSamplerTest.selectFragmentShader(this.m_target); + + DE_ASSERT(!this.m_program); + this.m_program = new gluShaderProgram.ShaderProgram(gl, + gluShaderProgram.makeVtxFragSources( + vertexShaderTemplate, + fragmentShaderTemplate)); + + if (!this.m_program.isOk()) { + // tcu::TestLog& log = m_testCtx.getLog(); + // log << *m_program; + throw new Error('Failed to compile shaders'); + } + }; + + glsSamplerObjectTest.TextureSamplerTest.prototype.iterate = function() { + //tcu::TestLog& log = m_testCtx.getLog(); + + /** @type {tcuSurface.Surface} */ var textureRef = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + /** @type {tcuSurface.Surface} */ var samplerRef = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + /** @type {tcuSurface.Surface} */ var textureResult = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + /** @type {tcuSurface.Surface} */ var samplerResult = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + /** @type {number} */ var x = this.m_random.getInt(0, gl.drawingBufferWidth - glsSamplerObjectTest.VIEWPORT_WIDTH); + /** @type {number} */ var y = this.m_random.getInt(0, gl.drawingBufferHeight - glsSamplerObjectTest.VIEWPORT_HEIGHT); + + this.renderReferences(textureRef, samplerRef, x, y); + this.renderResults(textureResult, samplerResult, x, y); + + /** @type {boolean} */ var isOk = tcuImageCompare.pixelThresholdCompare('Sampler render result', 'Result from rendering with sampler', samplerRef, samplerResult, [0, 0, 0, 0]); + + if (!tcuImageCompare.pixelThresholdCompare('Texture render result', 'Result from rendering with texture state', textureRef, textureResult, [0, 0, 0, 0])) + isOk = false; + + assertMsgOptions(isOk, '', true, false); + + return tcuTestCase.IterateResult.STOP; + }; + + // glsSamplerObjectTest.MultiTextureSamplerTest + + /** + * @constructor + * @extends {tcuTestCase.DeqpTest} + * @const @param {glsSamplerObjectTest.TestSpec} spec + */ + glsSamplerObjectTest.MultiTextureSamplerTest = function(spec) { + tcuTestCase.DeqpTest.call(this, spec.name, spec.desc); + /** @type {gluShaderProgram.ShaderProgram} */ this.m_program = null; + /** @type {number} */ this.m_target = spec.target; + /** @type {glsSamplerObjectTest.SamplingState} */ this.m_textureState1 = spec.textureState; + /** @type {glsSamplerObjectTest.SamplingState} */ this.m_textureState2 = spec.textureState2; + /** @type {glsSamplerObjectTest.SamplingState} */ this.m_samplerState = spec.samplerState; + /** @type {deRandom.Random} */ this.m_random = new deRandom.Random(deString.deStringHash(spec.name)); + }; + + glsSamplerObjectTest.MultiTextureSamplerTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype); + glsSamplerObjectTest.MultiTextureSamplerTest.prototype.constructor = glsSamplerObjectTest.MultiTextureSamplerTest; + + glsSamplerObjectTest.MultiTextureSamplerTest.prototype.init = function() { + /** @type {string} */ var vertexShaderTemplate = glsSamplerObjectTest.MultiTextureSamplerTest.selectVertexShader(this.m_target); + /** @type {string} */ var fragmentShaderTemplate = glsSamplerObjectTest.MultiTextureSamplerTest.selectFragmentShader(this.m_target); + + DE_ASSERT(!this.m_program); + this.m_program = new gluShaderProgram.ShaderProgram(gl, + gluShaderProgram.makeVtxFragSources( + vertexShaderTemplate, + fragmentShaderTemplate)); + if (!this.m_program.isOk()) { + // tcu::TestLog& log = m_testCtx.getLog(); + // + // log << *m_program; + throw new Error('Failed to compile shaders'); + } + }; + + glsSamplerObjectTest.MultiTextureSamplerTest.prototype.deinit = function() { + gl.activeTexture(gl.TEXTURE0); + } + + glsSamplerObjectTest.MultiTextureSamplerTest.prototype.iterate = function() { + //tcu::TestLog& log = m_testCtx.getLog(); + + /** @type {tcuSurface.Surface} */ var textureRef = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + /** @type {tcuSurface.Surface} */ var samplerRef = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + /** @type {tcuSurface.Surface} */ var textureResult = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + /** @type {tcuSurface.Surface} */ var samplerResult = new tcuSurface.Surface(glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + /** @type {number} */ var x = this.m_random.getInt(0, gl.drawingBufferWidth - glsSamplerObjectTest.VIEWPORT_WIDTH); + /** @type {number} */ var y = this.m_random.getInt(0, gl.drawingBufferHeight - glsSamplerObjectTest.VIEWPORT_HEIGHT); + + this.renderReferences(textureRef, samplerRef, x, y); + this.renderResults(textureResult, samplerResult, x, y); + + /** @type {boolean} */ var isOk = tcuImageCompare.pixelThresholdCompare('Sampler render result', 'Result from rendering with sampler', samplerRef, samplerResult, [0, 0, 0, 0]); + + if (!tcuImageCompare.pixelThresholdCompare('Texture render result', 'Result from rendering with texture state', textureRef, textureResult, [0, 0, 0, 0])) + isOk = false; + + assertMsgOptions(isOk, '', true, false); + + return tcuTestCase.IterateResult.STOP; + }; + + /** + * @private + * @param {tcuSurface.Surface} textureRef + * @param {tcuSurface.Surface} samplerRef + * @param {number} x + * @param {number} y + */ + glsSamplerObjectTest.MultiTextureSamplerTest.prototype.renderReferences = function(textureRef, samplerRef, x, y) { + /** @type {WebGLTexture} */ var texture1 = glsSamplerObjectTest.MultiTextureSamplerTest.createTexture(this.m_target, 0); + /** @type {WebGLTexture} */ var texture2 = glsSamplerObjectTest.MultiTextureSamplerTest.createTexture(this.m_target, 1); + + gl.viewport(x, y, glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + // Generate texture rendering reference + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(this.m_target, texture1); + glsSamplerObjectTest.MultiTextureSamplerTest.setTextureState(this.m_target, this.m_textureState1); + + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(this.m_target, texture2); + glsSamplerObjectTest.MultiTextureSamplerTest.setTextureState(this.m_target, this.m_textureState2); + + this.render(); + var texRef = textureRef.getAccess(); + var texRefTransferFormat = gluTextureUtil.getTransferFormat(texRef.getFormat()); + gl.readPixels(x, y, texRef.m_width, texRef.m_height, texRefTransferFormat.format, texRefTransferFormat.dataType, textureRef.m_pixels); + + // Generate sampler rendering reference + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(this.m_target, texture1); + glsSamplerObjectTest.MultiTextureSamplerTest.setTextureState(this.m_target, this.m_samplerState); + + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(this.m_target, texture2); + glsSamplerObjectTest.MultiTextureSamplerTest.setTextureState(this.m_target, this.m_samplerState); + + this.render(); + var sampRef = samplerRef.getAccess(); + var sampRefTransferFormat = gluTextureUtil.getTransferFormat(sampRef.getFormat()); + gl.readPixels(x, y, sampRef.m_width, sampRef.m_height, sampRefTransferFormat.format, sampRefTransferFormat.dataType, samplerRef.m_pixels); + }; + + /** + * @private + * @param {tcuSurface.Surface} textureResult + * @param {tcuSurface.Surface} samplerResult + * @param {number} x + * @param {number} y + */ + glsSamplerObjectTest.MultiTextureSamplerTest.prototype.renderResults = function(textureResult, samplerResult, x, y) { + /** @type {WebGLTexture} */ var texture1 = glsSamplerObjectTest.MultiTextureSamplerTest.createTexture(this.m_target, 0); + /** @type {WebGLTexture} */ var texture2 = glsSamplerObjectTest.MultiTextureSamplerTest.createTexture(this.m_target, 1); + + gl.viewport(x, y, glsSamplerObjectTest.VIEWPORT_WIDTH, glsSamplerObjectTest.VIEWPORT_HEIGHT); + + /** @type {WebGLSampler} */ var sampler = gl.createSampler(); + DE_ASSERT(sampler != -1); + + gl.bindSampler(0, sampler); + gl.bindSampler(1, sampler); + + // First set sampler state + glsSamplerObjectTest.MultiTextureSamplerTest.setSamplerState(this.m_samplerState, sampler); + + // Set texture state + gl.bindTexture(this.m_target, texture1); + glsSamplerObjectTest.MultiTextureSamplerTest.setTextureState(this.m_target, this.m_textureState1); + + gl.bindTexture(this.m_target, texture2); + glsSamplerObjectTest.MultiTextureSamplerTest.setTextureState(this. m_target, this.m_textureState2); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(this.m_target, texture1); + + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(this.m_target, texture2); + + // Render using sampler + this.render(); + var sampRes = samplerResult.getAccess(); + var sampResTransferFormat = gluTextureUtil.getTransferFormat(sampRes.getFormat()); + gl.readPixels(x, y, sampRes.m_width, sampRes.m_height, sampResTransferFormat.format, sampResTransferFormat.dataType, samplerResult.m_pixels); + + gl.bindSampler(0, null); + gl.bindSampler(1, null); + + this.render(); + var texRes = textureResult.getAccess(); + var texResTransferFormat = gluTextureUtil.getTransferFormat(texRes.getFormat()); + gl.readPixels(x, y, texRes.m_width, texRes.m_height, texResTransferFormat.format, texResTransferFormat.dataType, textureResult.m_pixels); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(this.m_target, null); + + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(this.m_target, null); + + gl.deleteSampler(sampler); + gl.deleteTexture(texture1); + gl.deleteTexture(texture2); + }; + + glsSamplerObjectTest.MultiTextureSamplerTest.prototype.render = function() { + + gl.useProgram(this.m_program.getProgram()); + + /** @type {WebGLUniformLocation} */ var samplerLoc1 = gl.getUniformLocation(this.m_program.getProgram(), 'u_sampler1'); + DE_ASSERT(samplerLoc1 != -1); + + /** @type {WebGLUniformLocation} */ var samplerLoc2 = gl.getUniformLocation(this.m_program.getProgram(), 'u_sampler2'); + DE_ASSERT(samplerLoc2 != -1); + + /** @type {WebGLUniformLocation} */ var scaleLoc = gl.getUniformLocation(this.m_program.getProgram(), 'u_posScale'); + DE_ASSERT(scaleLoc != -1); + + gl.clearColor(0.5, 0.5, 0.5, 1.0); + + gl.clear(gl.COLOR_BUFFER_BIT); + + gl.uniform1i(samplerLoc1, 0); + + gl.uniform1i(samplerLoc2, 1); + + gl.uniform1f(scaleLoc, 1.0); + + /** @type {Array<gluDrawUtil.VertexArrayBinding>} */ var vertexArrays; + switch (this.m_target) { + case gl.TEXTURE_2D: { + vertexArrays = [ + gluDrawUtil.vabFromBindingPointAndArrayPointer( + gluDrawUtil.bindingPointFromName('a_position'), + new gluDrawUtil.VertexArrayPointer( + gluDrawUtil.VertexComponentType.VTX_COMP_FLOAT, + gluDrawUtil.VertexComponentConversion.VTX_COMP_CONVERT_NONE, + 2, + 6, + 0, + glsSamplerObjectTest.s_positions)) + ]; + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + gl.uniform1f(scaleLoc, 0.25); + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + break; + } + + case gl.TEXTURE_3D: { + vertexArrays = [ + gluDrawUtil.vabFromBindingPointAndArrayPointer( + gluDrawUtil.bindingPointFromName('a_position'), + new gluDrawUtil.VertexArrayPointer( + gluDrawUtil.VertexComponentType.VTX_COMP_FLOAT, + gluDrawUtil.VertexComponentConversion.VTX_COMP_CONVERT_NONE, + 3, + 6, + 0, + glsSamplerObjectTest.s_positions3D)) + ]; + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + gl.uniform1f(scaleLoc, 0.25); + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + break; + } + + case gl.TEXTURE_CUBE_MAP: { + vertexArrays = [ + gluDrawUtil.vabFromBindingPointAndArrayPointer( + gluDrawUtil.bindingPointFromName('a_position'), + new gluDrawUtil.VertexArrayPointer( + gluDrawUtil.VertexComponentType.VTX_COMP_FLOAT, + gluDrawUtil.VertexComponentConversion.VTX_COMP_CONVERT_NONE, + 4, + 6, + 0, + glsSamplerObjectTest.s_positionsCube)) + ]; + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + gl.uniform1f(scaleLoc, 0.25); + + gluDrawUtil.draw(gl, this.m_program.getProgram(), vertexArrays, new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLES, 6)); + + break; + } + + default: + DE_ASSERT(false); + } + + }; + + /** + * @private + * @param {number} target + * @param {glsSamplerObjectTest.SamplingState} state + */ + glsSamplerObjectTest.MultiTextureSamplerTest.setTextureState = function(target, state) { + gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, state.minFilter); + gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, state.magFilter); + gl.texParameteri(target, gl.TEXTURE_WRAP_S, state.wrapS); + gl.texParameteri(target, gl.TEXTURE_WRAP_T, state.wrapT); + gl.texParameteri(target, gl.TEXTURE_WRAP_R, state.wrapR); + gl.texParameterf(target, gl.TEXTURE_MAX_LOD, state.maxLod); + gl.texParameterf(target, gl.TEXTURE_MIN_LOD, state.minLod); + }; + + /** + * @private + * @param {glsSamplerObjectTest.SamplingState} state + * @param {WebGLSampler} sampler + */ + glsSamplerObjectTest.MultiTextureSamplerTest.setSamplerState = function(state, sampler) { + gl.samplerParameteri(sampler, gl.TEXTURE_MIN_FILTER, state.minFilter); + gl.samplerParameteri(sampler, gl.TEXTURE_MAG_FILTER, state.magFilter); + gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_S, state.wrapS); + gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_T, state.wrapT); + gl.samplerParameteri(sampler, gl.TEXTURE_WRAP_R, state.wrapR); + gl.samplerParameterf(sampler, gl.TEXTURE_MAX_LOD, state.maxLod); + gl.samplerParameterf(sampler, gl.TEXTURE_MIN_LOD, state.minLod); + }; + + /** + * @private + * @param {number} id + * @return {WebGLTexture } + */ + glsSamplerObjectTest.MultiTextureSamplerTest.createTexture2D = function(id) { + /** @type {WebGLTexture} */ var texture = null; + /** @type {tcuTexture.Texture2D} */ var refTexture = new tcuTexture.Texture2D( + new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, + tcuTexture.ChannelType.UNORM_INT8), + glsSamplerObjectTest.TEXTURE2D_WIDTH, + glsSamplerObjectTest.TEXTURE2D_HEIGHT); + + refTexture.allocLevel(0); + + texture = gl.createTexture(); + + switch (id) { + case 0: + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevel(0), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.5, 0.5]); + break; + + case 1: + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevel(0), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 1.0, 1.0]); + break; + + default: + DE_ASSERT(false); + } + + gl.bindTexture(gl.TEXTURE_2D, texture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, refTexture.getWidth(), refTexture.getHeight(), 0, gl.RGBA, gl.UNSIGNED_BYTE, refTexture.getLevel(0).getDataPtr()); + + gl.generateMipmap(gl.TEXTURE_2D); + + gl.bindTexture(gl.TEXTURE_2D, null); + + return texture; + }; + + /** + * @private + * @param {number} id + * @return {WebGLTexture} + */ + glsSamplerObjectTest.MultiTextureSamplerTest.createTexture3D = function(id) { + /** @type {WebGLTexture} */ var texture = null; + /** @type {tcuTexture.Texture3D} */ var refTexture = new tcuTexture.Texture3D( + new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, + tcuTexture.ChannelType.UNORM_INT8), + glsSamplerObjectTest.TEXTURE3D_WIDTH, + glsSamplerObjectTest.TEXTURE3D_HEIGHT, + glsSamplerObjectTest.TEXTURE3D_DEPTH); + + refTexture.allocLevel(0); + + texture = gl.createTexture(); + + switch (id) { + case 0: + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevel(0), [0.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.5, 0.5]); + break; + + case 1: + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevel(0), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 1.0, 1.0]); + break; + + default: + DE_ASSERT(false); + } + + gl.bindTexture(gl.TEXTURE_3D, texture); + // TODO: check internalFormat and format in texImage3D + gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA, refTexture.getWidth(), refTexture.getHeight(), refTexture.getDepth(), 0, gl.RGBA, gl.UNSIGNED_BYTE, refTexture.getLevel(0).getDataPtr()); + + gl.generateMipmap(gl.TEXTURE_3D); + + gl.bindTexture(gl.TEXTURE_3D, null); + + return texture; + }; + + /** + * @private + * @param {number} id + * @return {WebGLTexture} + */ + glsSamplerObjectTest.MultiTextureSamplerTest.createTextureCube = function(id) { + /** @type {WebGLTexture} */ var texture = null; + /** @type {tcuTexture.TextureCube} */ var refTexture = new tcuTexture.TextureCube( + new tcuTexture.TextureFormat(tcuTexture.ChannelOrder.RGBA, + tcuTexture.ChannelType.UNORM_INT8), + glsSamplerObjectTest.CUBEMAP_SIZE); + + texture = gl.createTexture(); + + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_POSITIVE_X, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_POSITIVE_Y, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_POSITIVE_Z, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Y, 0); + refTexture.allocLevel(tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Z, 0); + + switch (id) { + case 0: + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_X), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 0.5, 0.5]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_Y), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 0.5, 0.5]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_Z), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 0.5, 0.5]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 0.5, 0.5]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Y), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 0.5, 0.5]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Z), [0.0, 0.0, 0.0, 0.0], [0.5, 0.5, 0.5, 0.5]); + break; + + case 1: + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_X), [0.5, 0.5, 0.5, 0.5], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_Y), [0.5, 0.5, 0.5, 0.5], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_POSITIVE_Z), [0.5, 0.5, 0.5, 0.5], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_X), [0.5, 0.5, 0.5, 0.5], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Y), [0.5, 0.5, 0.5, 0.5], [1.0, 1.0, 1.0, 1.0]); + tcuTextureUtil.fillWithComponentGradients(refTexture.getLevelFace(0, tcuTexture.CubeFace.CUBEFACE_NEGATIVE_Z), [0.5, 0.5, 0.5, 0.5], [1.0, 1.0, 1.0, 1.0]); + break; + + default: + DE_ASSERT(false); + } + + gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture); + + for (var face in tcuTexture.CubeFace) { + /** @const @type {number} */ var target = gluTextureUtil.getGLCubeFace(tcuTexture.CubeFace[face]); + gl.texImage2D(target, 0, gl.RGBA, refTexture.getSize(), refTexture.getSize(), 0, gl.RGBA, gl.UNSIGNED_BYTE, refTexture.getLevelFace(0, tcuTexture.CubeFace[face]).getDataPtr()); + } + + gl.generateMipmap(gl.TEXTURE_CUBE_MAP); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, null); + + return texture; + }; + + /** + * @private + * @param {number} target + * @param {number} id + * @return {WebGLTexture} + */ + glsSamplerObjectTest.MultiTextureSamplerTest.createTexture = function(target, id) { + /** @type {WebGLTexture} */ var texture; + switch (target) { + case gl.TEXTURE_2D: + texture = glsSamplerObjectTest.MultiTextureSamplerTest.createTexture2D(id); + break; + + case gl.TEXTURE_3D: + texture = glsSamplerObjectTest.MultiTextureSamplerTest.createTexture3D(id); + break; + + case gl.TEXTURE_CUBE_MAP: + texture = glsSamplerObjectTest.MultiTextureSamplerTest.createTextureCube(id); + break; + + default: + DE_ASSERT(false); + } + + return texture; + }; + + /** + * @private + * @param {number} target + * @return {string} + */ + glsSamplerObjectTest.MultiTextureSamplerTest.selectVertexShader = function(target) { + switch (target) { + case gl.TEXTURE_2D: + return '#version 300 es\n' + + 'in highp vec2 a_position;\n' + + 'uniform highp float u_posScale;\n' + + 'out mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\tv_texCoord = a_position;\n' + + '\tgl_Position = vec4(u_posScale * a_position, 0.0, 1.0);\n' + + '}'; + + case gl.TEXTURE_3D: + return '#version 300 es\n' + + 'in highp vec3 a_position;\n' + + 'uniform highp float u_posScale;\n' + + 'out mediump vec3 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\tv_texCoord = a_position;\n' + + '\tgl_Position = vec4(u_posScale * a_position.xy, 0.0, 1.0);\n' + + '}'; + + case gl.TEXTURE_CUBE_MAP: + return '#version 300 es\n' + + 'in highp vec4 a_position;\n' + + 'uniform highp float u_posScale;\n' + + 'out mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\tv_texCoord = a_position.zw;\n' + + '\tgl_Position = vec4(u_posScale * a_position.xy, 0.0, 1.0);\n' + + '}'; + + default: + DE_ASSERT(false); + return ''; + } + }; + + /** + * @private + * @param {number} target + * @return {string} + */ + glsSamplerObjectTest.MultiTextureSamplerTest.selectFragmentShader = function(target) { + switch (target) { + case gl.TEXTURE_2D: + return '#version 300 es\nlayout(location = 0) out mediump vec4 o_color;\n' + + 'uniform lowp sampler2D u_sampler1;\n' + + 'uniform lowp sampler2D u_sampler2;\n' + + 'in mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\to_color = vec4(0.75, 0.75, 0.75, 1.0) * (texture(u_sampler1, v_texCoord) + texture(u_sampler2, v_texCoord));\n' + + '}'; + + break; + + case gl.TEXTURE_3D: + return '#version 300 es\nlayout(location = 0) out mediump vec4 o_color;\n' + + 'uniform lowp sampler3D u_sampler1;\n' + + 'uniform lowp sampler3D u_sampler2;\n' + + 'in mediump vec3 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\to_color = vec4(0.75, 0.75, 0.75, 1.0) * (texture(u_sampler1, v_texCoord) + texture(u_sampler2, v_texCoord));\n' + + '}'; + + case gl.TEXTURE_CUBE_MAP: + return '#version 300 es\nlayout(location = 0) out mediump vec4 o_color;\n' + + 'uniform lowp samplerCube u_sampler1;\n' + + 'uniform lowp samplerCube u_sampler2;\n' + + 'in mediump vec2 v_texCoord;\n' + + 'void main (void)\n' + + ' {\n' + + '\to_color = vec4(0.5, 0.5, 0.5, 1.0) * (texture(u_sampler1, vec3(cos(3.14 * v_texCoord.y) * sin(3.14 * v_texCoord.x), sin(3.14 * v_texCoord.y), cos(3.14 * v_texCoord.y) * cos(3.14 * v_texCoord.x)))' + + '+ texture(u_sampler2, vec3(cos(3.14 * v_texCoord.y) * sin(3.14 * v_texCoord.x), sin(3.14 * v_texCoord.y), cos(3.14 * v_texCoord.y) * cos(3.14 * v_texCoord.x))));\n' + + '}'; + + default: + DE_ASSERT(false); + return ''; + } + }; + +}); |