summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/deqp/modules/shared/glsSamplerObjectTest.js
diff options
context:
space:
mode:
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.js1148
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 0000000000..0d4030bd91
--- /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 '';
+ }
+ };
+
+});