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