diff options
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboDepthbufferTests.js')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboDepthbufferTests.js | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboDepthbufferTests.js b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboDepthbufferTests.js new file mode 100644 index 0000000000..c662a3764e --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboDepthbufferTests.js @@ -0,0 +1,385 @@ +/*------------------------------------------------------------------------- + * drawElements Quality Program OpenGL ES Utilities + * ------------------------------------------------ + * + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +'use strict'; +goog.provide('functional.gles3.es3fFboDepthbufferTests'); +goog.require('framework.common.tcuSurface'); +goog.require('framework.common.tcuTestCase'); +goog.require('framework.common.tcuTexture'); +goog.require('framework.opengl.gluTextureUtil'); +goog.require('functional.gles3.es3fFboTestCase'); +goog.require('functional.gles3.es3fFboTestUtil'); +goog.require('framework.common.tcuRGBA'); +goog.require('framework.delibs.debase.deRandom'); +goog.require('framework.common.tcuImageCompare'); +goog.require('framework.common.tcuTextureUtil'); +goog.require('framework.referencerenderer.rrUtil'); +goog.require('framework.delibs.debase.deMath'); +goog.require('framework.opengl.gluShaderUtil'); + +goog.scope(function() { +var es3fFboDepthbufferTests = functional.gles3.es3fFboDepthbufferTests; +var es3fFboTestCase = functional.gles3.es3fFboTestCase; +var es3fFboTestUtil = functional.gles3.es3fFboTestUtil; +var tcuTestCase = framework.common.tcuTestCase; +var tcuSurface = framework.common.tcuSurface; +var tcuTexture = framework.common.tcuTexture; +var gluTextureUtil = framework.opengl.gluTextureUtil; +var tcuRGBA = framework.common.tcuRGBA; +var deRandom = framework.delibs.debase.deRandom; +var tcuImageCompare = framework.common.tcuImageCompare; +var tcuTextureUtil = framework.common.tcuTextureUtil; +var rrUtil = framework.referencerenderer.rrUtil; +var deMath = framework.delibs.debase.deMath; +var gluShaderUtil = framework.opengl.gluShaderUtil; + +/** @type {WebGL2RenderingContext} */ var gl; + +var setParentClass = function(child, parent) { + child.prototype = Object.create(parent.prototype); + child.prototype.constructor = child; +}; + +/** + * @constructor + * @extends {es3fFboTestCase.FboTestCase} + * @param {string} name + * @param {string} desc + * @param {number} format + * @param {number} width + * @param {number} height + */ +es3fFboDepthbufferTests.BasicFboDepthCase = function(name, desc, format, width, height) { + es3fFboTestCase.FboTestCase.call(this, name, desc); + this.m_format = format; + this.m_width = width; + this.m_height = height; +}; + +setParentClass(es3fFboDepthbufferTests.BasicFboDepthCase, es3fFboTestCase.FboTestCase); + +es3fFboDepthbufferTests.BasicFboDepthCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + }; + +es3fFboDepthbufferTests.BasicFboDepthCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var colorFormat = gl.RGBA8; + /** @type {es3fFboTestUtil.GradientShader} */ + var gradShader = new es3fFboTestUtil.GradientShader(gluShaderUtil.DataType.FLOAT_VEC4); + + /** @type {es3fFboTestUtil.Texture2DShader} */ + var texShader = new es3fFboTestUtil.Texture2DShader( + [gluShaderUtil.DataType.SAMPLER_2D], gluShaderUtil.DataType.FLOAT_VEC4); + var texShaderID = ctx.createProgram(texShader); + var gradShaderID = ctx.createProgram(gradShader); + var clearDepth = 1; + + // Setup shaders + gradShader.setGradient(ctx, gradShaderID, [0, 0, 0, 0], [1, 1, 1, 1]); + texShader.setUniforms(ctx, texShaderID); + + // Setup FBO + + var fbo = ctx.createFramebuffer(); + var colorRbo = ctx.createRenderbuffer(); + var depthRbo = ctx.createRenderbuffer(); + + ctx.bindRenderbuffer(gl.RENDERBUFFER, colorRbo); + ctx.renderbufferStorage(gl.RENDERBUFFER, colorFormat, this.m_width, this.m_height); + + ctx.bindRenderbuffer(gl.RENDERBUFFER, depthRbo); + ctx.renderbufferStorage(gl.RENDERBUFFER, this.m_format, this.m_width, this.m_height); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorRbo); + ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRbo); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + ctx.viewport(0, 0, this.m_width, this.m_height); + + // Clear depth to 1 + ctx.clearBufferfv(gl.DEPTH, 0, [clearDepth]); + + // Render gradient with depth = [-1..1] + ctx.enable(gl.DEPTH_TEST); + rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]); + + // Render grid pattern with depth = 0 + var format = gl.RGBA; + var dataType = gl.UNSIGNED_BYTE; + var texW = 128; + var texH = 128; + var data = new tcuTexture.TextureLevel(gluTextureUtil.mapGLTransferFormat(format, dataType), texW, texH, 1); + + tcuTextureUtil.fillWithGrid(data.getAccess(), 8, [0.2, 0.7, 0.1, 1.0], [0.7, 0.1, 0.5, 0.8]); + + var gridTex = ctx.createTexture(); + ctx.bindTexture(gl.TEXTURE_2D, gridTex); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + ctx.texImage2D(gl.TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr()); + + rrUtil.drawQuad(ctx, texShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]); + this.checkError(); + + // Read results. + this.readPixelsUsingFormat(dst, 0, 0, this.m_width, this.m_height, + gluTextureUtil.mapGLInternalFormat(colorFormat), + [1, 1, 1, 1], [0, 0, 0, 0]); +}; + +/** + * @constructor + * @extends {es3fFboTestCase.FboTestCase} + * @param {string} name + * @param {string} desc + * @param {number} format + * @param {number} width + * @param {number} height + */ +es3fFboDepthbufferTests.DepthWriteClampCase = function(name, desc, format, width, height) { + es3fFboTestCase.FboTestCase.call(this, name, desc); + this.m_format = format; + this.m_width = width; + this.m_height = height; +}; + +setParentClass(es3fFboDepthbufferTests.DepthWriteClampCase, es3fFboTestCase.FboTestCase); + +es3fFboDepthbufferTests.DepthWriteClampCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + }; + +es3fFboDepthbufferTests.DepthWriteClampCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var colorFormat = gl.RGBA8; + var transferFmt = gluTextureUtil.getTransferFormat(gluTextureUtil.mapGLInternalFormat(this.m_format)); + /** @type {es3fFboTestUtil.DepthGradientShader} */ + var gradShader = new es3fFboTestUtil.DepthGradientShader(gluShaderUtil.DataType.FLOAT_VEC4); + + var gradShaderID = ctx.createProgram(gradShader); + var clearDepth = 1; + var red = [1, 0, 0, 1]; + var green = [0, 1, 0, 1]; + + // Setup FBO + + var fbo = ctx.createFramebuffer(); + var colorRbo = ctx.createRenderbuffer(); + var depthTexture = ctx.createTexture(); + + ctx.bindRenderbuffer(gl.RENDERBUFFER, colorRbo); + ctx.renderbufferStorage(gl.RENDERBUFFER, colorFormat, this.m_width, this.m_height); + + ctx.bindTexture(gl.TEXTURE_2D, depthTexture); + ctx.texImage2D(gl.TEXTURE_2D, 0, this.m_format, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, null); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorRbo); + ctx.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, 0); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + ctx.viewport(0, 0, this.m_width, this.m_height); + + // Clear depth to 1 + ctx.clearBufferfv(gl.DEPTH, 0, [clearDepth]); + + // Render gradient with depth = [-1..1] + ctx.enable(gl.DEPTH_TEST); + ctx.depthFunc(gl.ALWAYS); + gradShader.setUniforms(ctx, gradShaderID, -1, 2, green); + rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]); + ctx.depthMask(false); + + // Test if any fragment has greater depth than 1; there should be none + ctx.depthFunc(gl.LESS); // (1 < depth) ? + gradShader.setUniforms(ctx, gradShaderID, 1, 1, red); + rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]); + + // Test if any fragment has smaller depth than 0; there should be none + ctx.depthFunc(gl.GREATER); // (0 > depth) ? + gradShader.setUniforms(ctx, gradShaderID, 0, 0, red); + rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]); + + // Read results. + this.readPixelsUsingFormat(dst, 0, 0, this.m_width, this.m_height, + gluTextureUtil.mapGLInternalFormat(colorFormat), + [1, 1, 1, 1], [0, 0, 0, 0]); + + ctx.depthMask(true); +}; + +/** + * @constructor + * @extends {es3fFboTestCase.FboTestCase} + * @param {string} name + * @param {string} desc + * @param {number} format + * @param {number} width + * @param {number} height + */ +es3fFboDepthbufferTests.DepthTestClampCase = function(name, desc, format, width, height) { + es3fFboTestCase.FboTestCase.call(this, name, desc); + this.m_format = format; + this.m_width = width; + this.m_height = height; +}; + +setParentClass(es3fFboDepthbufferTests.DepthTestClampCase, es3fFboTestCase.FboTestCase); + +es3fFboDepthbufferTests.DepthTestClampCase.prototype.preCheck = function() { + this.checkFormatSupport(this.m_format); + return true; // No exception thrown + }; + +es3fFboDepthbufferTests.DepthTestClampCase.prototype.render = function(dst) { + var ctx = this.getCurrentContext(); + var colorFormat = gl.RGBA8; + var transferFmt = gluTextureUtil.getTransferFormat(gluTextureUtil.mapGLInternalFormat(this.m_format)); + /** @type {es3fFboTestUtil.DepthGradientShader} */ + var gradShader = new es3fFboTestUtil.DepthGradientShader(gluShaderUtil.DataType.FLOAT_VEC4); + + var gradShaderID = ctx.createProgram(gradShader); + var clearDepth = 1; + var yellow = [1, 1, 0, 1]; + var green = [0, 1, 0, 1]; + + // Setup FBO + + var fbo = ctx.createFramebuffer(); + var colorRbo = ctx.createRenderbuffer(); + var depthTexture = ctx.createTexture(); + + ctx.bindRenderbuffer(gl.RENDERBUFFER, colorRbo); + ctx.renderbufferStorage(gl.RENDERBUFFER, colorFormat, this.m_width, this.m_height); + + ctx.bindTexture(gl.TEXTURE_2D, depthTexture); + ctx.texImage2D(gl.TEXTURE_2D, 0, this.m_format, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, null); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + + ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo); + ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorRbo); + ctx.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, 0); + this.checkError(); + this.checkFramebufferStatus(gl.FRAMEBUFFER); + + ctx.viewport(0, 0, this.m_width, this.m_height); + + // Clear depth to 1 + ctx.clearBufferfv(gl.DEPTH, 0, [clearDepth]); + + // Test values used in depth test are clamped + + // Render green quad, depth gradient = [-1..2] + ctx.enable(gl.DEPTH_TEST); + ctx.depthFunc(gl.ALWAYS); + + gradShader.setUniforms(ctx, gradShaderID, -1, 2, green); + rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]); + + // Render yellow quad, depth gradient = [-0.5..3]. Gradients have equal values only outside [0, 1] range due to clamping + ctx.depthFunc(gl.EQUAL); + + gradShader.setUniforms(ctx, gradShaderID, -0.5, 3, yellow); + rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]); + + // Read results. + this.readPixelsUsingFormat(dst, 0, 0, this.m_width, this.m_height, + gluTextureUtil.mapGLInternalFormat(colorFormat), + [1, 1, 1, 1], [0, 0, 0, 0]); +}; + +/** + * @constructor + * @extends {tcuTestCase.DeqpTest} + */ +es3fFboDepthbufferTests.FboDepthbufferTests = function() { + tcuTestCase.DeqpTest.call(this, 'depth', 'depth tests'); +}; + +setParentClass(es3fFboDepthbufferTests.FboDepthbufferTests, tcuTestCase.DeqpTest); + +es3fFboDepthbufferTests.FboDepthbufferTests.prototype.init = function() { + var depthFormats = [ + gl.DEPTH_COMPONENT32F, + gl.DEPTH_COMPONENT24, + gl.DEPTH_COMPONENT16, + gl.DEPTH32F_STENCIL8, + gl.DEPTH24_STENCIL8 + ]; + + // .basic + var basicGroup = tcuTestCase.newTest('basic', 'Basic depth tests'); + this.addChild(basicGroup); + + for (var ndx = 0; ndx < depthFormats.length; ndx++) + basicGroup.addChild(new es3fFboDepthbufferTests.BasicFboDepthCase(es3fFboTestUtil.getFormatName(depthFormats[ndx]), '', depthFormats[ndx], 119, 127)); + + // .depth_write_clamp + var depthClampGroup = tcuTestCase.newTest('depth_write_clamp', 'Depth write clamping tests'); + this.addChild(depthClampGroup); + + for (var ndx = 0; ndx < depthFormats.length; ndx++) + depthClampGroup.addChild(new es3fFboDepthbufferTests.DepthWriteClampCase(es3fFboTestUtil.getFormatName(depthFormats[ndx]), '', depthFormats[ndx], 119, 127)); + + // .depth_test_clamp + var depthTestGroup = tcuTestCase.newTest('depth_test_clamp', 'Depth test value clamping tests'); + this.addChild(depthTestGroup); + + for (var ndx = 0; ndx < depthFormats.length; ndx++) + depthTestGroup.addChild(new es3fFboDepthbufferTests.DepthTestClampCase(es3fFboTestUtil.getFormatName(depthFormats[ndx]), '', depthFormats[ndx], 119, 127)); + +}; + +/** +* Run test +* @param {WebGL2RenderingContext} context +*/ +es3fFboDepthbufferTests.run = function(context) { + gl = context; + //Set up Test Root parameters + var state = tcuTestCase.runner; + state.setRoot(new es3fFboDepthbufferTests.FboDepthbufferTests()); + + //Set up name and description of this test series. + setCurrentTestName(state.testCases.fullName()); + description(state.testCases.getDescription()); + + try { + //Run test cases + tcuTestCase.runTestCases(); + } + catch (err) { + testFailedOptions('Failed to es3fFboDepthbufferTests.run tests', false); + tcuTestCase.runner.terminate(); + } +}; + +}); |