diff options
Diffstat (limited to '')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboTestCase.js | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboTestCase.js b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboTestCase.js new file mode 100644 index 0000000000..cdaa7d352f --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fFboTestCase.js @@ -0,0 +1,483 @@ +/*------------------------------------------------------------------------- + * 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.es3fFboTestCase'); +goog.require('framework.common.tcuImageCompare'); +goog.require('framework.common.tcuPixelFormat'); +goog.require('framework.common.tcuSurface'); +goog.require('framework.common.tcuTestCase'); +goog.require('framework.common.tcuTexture'); +goog.require('framework.delibs.debase.deMath'); +goog.require('framework.delibs.debase.deRandom'); +goog.require('framework.delibs.debase.deString'); +goog.require('framework.opengl.simplereference.sglrGLContext'); +goog.require('framework.opengl.simplereference.sglrReferenceContext'); +goog.require('framework.referencerenderer.rrRenderer'); +goog.require('functional.gles3.es3fFboTestUtil'); + +goog.scope(function() { + +var es3fFboTestCase = functional.gles3.es3fFboTestCase; +var tcuTestCase = framework.common.tcuTestCase; +var deMath = framework.delibs.debase.deMath; +var tcuSurface = framework.common.tcuSurface; +var tcuTexture = framework.common.tcuTexture; +var rrRenderer = framework.referencerenderer.rrRenderer; +var sglrReferenceContext = framework.opengl.simplereference.sglrReferenceContext; +var tcuPixelFormat = framework.common.tcuPixelFormat; +var tcuImageCompare = framework.common.tcuImageCompare; +var deString = framework.delibs.debase.deString; +var sglrGLContext = framework.opengl.simplereference.sglrGLContext; +var es3fFboTestUtil = functional.gles3.es3fFboTestUtil; +var deRandom = framework.delibs.debase.deRandom; + +/** @typedef {(sglrGLContext.GLContext | WebGL2RenderingContext | sglrReferenceContext.ReferenceContext)} */ +es3fFboTestCase.Context; + +var DE_ASSERT = function(x) { + if (!x) + throw new Error('Assert failed'); +}; + + /** + * es3fFboTestCase.FboTestCase class, inherits from TestCase and sglrContextWrapper + * @constructor + * @extends {tcuTestCase.DeqpTest} + * @param {string} name + * @param {string} description + * @param {boolean=} useScreenSizedViewport + */ + es3fFboTestCase.FboTestCase = function(name, description, useScreenSizedViewport /*= false */) { + tcuTestCase.DeqpTest.call(this, name, description); + /** @type {number} */ this.m_viewportWidth = useScreenSizedViewport === undefined ? gl.drawingBufferWidth : 128; + /** @type {number} */ this.m_viewportHeight = useScreenSizedViewport === undefined ? gl.drawingBufferHeight : 128; + /** @type {es3fFboTestCase.Context} */ this.m_curCtx = null; + }; + + es3fFboTestCase.FboTestCase.prototype = Object.create(tcuTestCase.DeqpTest.prototype); + es3fFboTestCase.FboTestCase.prototype.constructor = es3fFboTestCase.FboTestCase; + + es3fFboTestCase.FboTestCase.prototype.getWidth = function() { + return Math.min(gl.drawingBufferWidth, this.m_viewportWidth); + }; + + es3fFboTestCase.FboTestCase.prototype.getHeight = function() { + return Math.min(gl.drawingBufferHeight, this.m_viewportHeight); + }; + + /** + * Sets the current context (inherited from sglrContextWrapper) + * @param {es3fFboTestCase.Context} context + */ + es3fFboTestCase.FboTestCase.prototype.setContext = function(context) { + this.m_curCtx = context; + }; + + /** + * Gets the current context (inherited from sglrContextWrapper) + * @return {es3fFboTestCase.Context} + */ + es3fFboTestCase.FboTestCase.prototype.getCurrentContext = function() { + return this.m_curCtx; + }; + + /** + * @param {tcuSurface.Surface} reference + * @param {tcuSurface.Surface} result + */ + es3fFboTestCase.FboTestCase.prototype.compare = function(reference, result) { + return tcuImageCompare.fuzzyCompare('Result', 'Image comparison result', reference.getAccess(), result.getAccess(), 0.05, tcuImageCompare.CompareLogMode.RESULT); + }; + + /** + * @param {number} sizedFormat + */ + es3fFboTestCase.FboTestCase.prototype.checkFormatSupport = function(sizedFormat) { + /** @const @type {boolean} */ var isCoreFormat = es3fFboTestCase.isRequiredFormat(sizedFormat); + /** @const @type {Array<string>} */ var requiredExts = (!isCoreFormat) ? es3fFboTestCase.getEnablingExtensions(sizedFormat) : []; + + // Check that we don't try to use invalid formats. + DE_ASSERT(isCoreFormat || requiredExts); + if (requiredExts.length > 0 && !es3fFboTestCase.isAnyExtensionSupported(gl, requiredExts)) { + var msg = 'SKIP: Format ' + WebGLTestUtils.glEnumToString(gl, sizedFormat) + ' not supported'; + debug(msg); + throw new TestFailedException(msg); + } + }; + + /** + * @param {number} sizedFormat deUint32 + * @param {number} numSamples + */ + es3fFboTestCase.FboTestCase.prototype.checkSampleCount = function(sizedFormat, numSamples) { + /** @const @type {number} */ var minSampleCount = es3fFboTestCase.getMinimumSampleCount(sizedFormat); + + if (numSamples > minSampleCount) { + // Exceeds spec-mandated minimum - need to check. + /** @const @type {goog.NumberArray} */ var supportedSampleCounts = es3fFboTestCase.querySampleCounts(sizedFormat); + var supported = Array.prototype.slice.call(supportedSampleCounts); + if (supported.indexOf(numSamples) == -1) { + if (minSampleCount == 0 || numSamples > gl.getParameter(gl.MAX_SAMPLES)) { + checkMessage(false, "Sample count not supported, but it is allowed."); + return false; + } else { + throw new Error('Sample count not supported'); + } + } + return true; + } + return true; + }; + + /** + * @param {tcuSurface.Surface} dst + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + * @param {tcuTexture.TextureFormat} format + * @param {Array<number>} scale Vec4 + * @param {Array<number>} bias Vec4 + */ + es3fFboTestCase.FboTestCase.prototype.readPixelsUsingFormat = function(dst, x, y, width, height, format, scale, bias) { + dst.setSize(width, height); + es3fFboTestUtil.readPixels(this.getCurrentContext(), dst, x, y, width, height, format, scale, bias); + }; + + /** + * @param {tcuSurface.Surface} dst + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + es3fFboTestCase.FboTestCase.prototype.readPixels = function(dst, x, y, width, height) { + dst.readViewport(this.getCurrentContext(), [x, y, width, height]); + }; + + /** + * @param {number} target + */ + es3fFboTestCase.FboTestCase.prototype.checkFramebufferStatus = function(target) { + /** @type {number} */ var status = this.getCurrentContext().checkFramebufferStatus(target); + if (status != gl.FRAMEBUFFER_COMPLETE) + throw new Error('Framebuffer Status: ' + WebGLTestUtils.glEnumToString(gl, status)); + }; + + es3fFboTestCase.FboTestCase.prototype.checkError = function() { + /** @type {number} */ var err = this.getCurrentContext().getError(); + if (err != gl.NO_ERROR) + throw new Error('glError: ' + WebGLTestUtils.glEnumToString(gl, err)); + }; + + /** + * @param {tcuTexture.TextureFormat} format + * @param {Array<number>=} value Vec4 + */ + es3fFboTestCase.FboTestCase.prototype.clearColorBuffer = function(format, value) { + if (value === undefined) value = [0.0, 0.0, 0.0, 0.0]; + es3fFboTestUtil.clearColorBuffer(this.getCurrentContext(), format, value); + }; + + es3fFboTestCase.FboTestCase.prototype.iterate = function() { + // Viewport. + /** @type {deRandom.Random} */ var rnd = new deRandom.Random(deString.deStringHash(this.name)); + /** @type {number} */ var width = Math.min(gl.drawingBufferWidth, this.m_viewportWidth); + /** @type {number} */ var height = Math.min(gl.drawingBufferHeight, this.m_viewportHeight); + /** @type {number} */ var x = rnd.getInt(0, gl.drawingBufferWidth - width); + /** @type {number} */ var y = rnd.getInt(0, gl.drawingBufferHeight - height); + + // Surface format and storage is choosen by render(). + /** @type {tcuSurface.Surface} */ var reference = new tcuSurface.Surface(width, height); + /** @type {tcuSurface.Surface} */ var result = new tcuSurface.Surface(width, height); + + // Call preCheck() that can throw exception if some requirement is not met. + if (this.preCheck && !this.preCheck()) + return tcuTestCase.IterateResult.STOP; + + // Render using GLES3. + try { + /** @type {sglrGLContext.GLContext} */ var context = new sglrGLContext.GLContext( + gl, + [x, y, width, height]); + + this.setContext(context); + this.render(result); + + // Check error. + /** @type {number} */ var err = context.getError(); + if (err != gl.NO_ERROR) + throw new Error('glError: ' + context); + + this.setContext(null); + } catch (e) { + if (e instanceof es3fFboTestUtil.FboIncompleteException) + if (e.getReason() == gl.FRAMEBUFFER_UNSUPPORTED) { + // log << e; + // m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, 'Not supported'); + assertMsgOptions(false, 'Not supported', true, false); + return tcuTestCase.IterateResult.STOP; + } + throw e; + } + + // Render reference. + var alphaBits = /** @type {number} */ (gl.getParameter(gl.ALPHA_BITS)); + /** @type {sglrReferenceContext.ReferenceContextBuffers} */ + var buffers = new sglrReferenceContext.ReferenceContextBuffers(new tcuPixelFormat.PixelFormat( + 8, + 8, + 8, + alphaBits > 0 ? 8 : 0), + /** @type {number} */ (gl.getParameter(gl.DEPTH_BITS)), + /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS)), + width, + height); + /** @type {sglrReferenceContext.ReferenceContext} */ + var refContext = new sglrReferenceContext.ReferenceContext(new sglrReferenceContext.ReferenceContextLimits(gl), + buffers.getColorbuffer(), + buffers.getDepthbuffer(), + buffers.getStencilbuffer()); + refContext.getError(); + this.setContext(refContext); + this.render(reference); + this.setContext(null); + + /** @type {boolean} */ var isOk = this.compare(reference, result); + + assertMsgOptions(isOk, '', true, false); + + return tcuTestCase.IterateResult.STOP; + }; + + /** + * Deinit. Clear some GL state variables + */ + es3fFboTestCase.FboTestCase.prototype.deinit = function () { + // Pixel operations + { + gl.disable(gl.SCISSOR_TEST); + + gl.disable(gl.STENCIL_TEST); + gl.stencilFunc(gl.ALWAYS, 0, 0xffff); + gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP); + + gl.disable(gl.DEPTH_TEST); + gl.depthFunc(gl.LESS); + + gl.disable(gl.BLEND); + gl.blendFunc(gl.ONE, gl.ZERO); + gl.blendEquation(gl.FUNC_ADD); + gl.blendColor(0.0, 0.0, 0.0, 0.0); + + gl.enable(gl.DITHER); + } + + // Framebuffer control + { + gl.colorMask(true, true, true, true); + gl.depthMask(true); + gl.stencilMask(0xffff); + + gl.clearColor(0.0, 0.0, 0.0, 0.0); + gl.clearDepth(1.0); + gl.clearStencil(0.0); + // Do not call clear() here because it might generate an INVALID_OPERATION if + // some color buffers are of integer formats due to WebGL2 specific constraint. + // The tests do not rely on clear() here. + } + }; + + /** + * @param {number} format + * @return {boolean} + */ + es3fFboTestCase.isRequiredFormat = function(format) { + switch (format) { + // Color-renderable formats + case gl.RGBA32I: + case gl.RGBA32UI: + case gl.RGBA16I: + case gl.RGBA16UI: + case gl.RGBA8: + case gl.RGBA8I: + case gl.RGBA8UI: + case gl.SRGB8_ALPHA8: + case gl.RGB10_A2: + case gl.RGB10_A2UI: + case gl.RGBA4: + case gl.RGB5_A1: + case gl.RGB8: + case gl.RGB565: + case gl.RG32I: + case gl.RG32UI: + case gl.RG16I: + case gl.RG16UI: + case gl.RG8: + case gl.RG8I: + case gl.RG8UI: + case gl.R32I: + case gl.R32UI: + case gl.R16I: + case gl.R16UI: + case gl.R8: + case gl.R8I: + case gl.R8UI: + return true; + + // Depth formats + case gl.DEPTH_COMPONENT32F: + case gl.DEPTH_COMPONENT24: + case gl.DEPTH_COMPONENT16: + return true; + + // Depth+stencil formats + case gl.DEPTH32F_STENCIL8: + case gl.DEPTH24_STENCIL8: + return true; + + // Stencil formats + case gl.STENCIL_INDEX8: + return true; + + default: + return false; + } + }; + + /** + * @param {number} format deUint32 + * @return {Array<string>} + */ + es3fFboTestCase.getEnablingExtensions = function(format) { + /** @return {Array<string>} */ var out = []; + + DE_ASSERT(!es3fFboTestCase.isRequiredFormat(format)); + + switch (format) { + case gl.RGBA16F: + case gl.RG16F: + case gl.R16F: + case gl.RGBA32F: + case gl.RGB32F: + case gl.R11F_G11F_B10F: + case gl.RG32F: + case gl.R32F: + out.push('EXT_color_buffer_float'); + break; + case gl.RGB16F: + // EXT_color_buffer_half_float is not exposed in WebGL 2.0. + break; + default: + break; + } + + return out; + }; + + /** + * @param {es3fFboTestCase.Context} context + * @param {Array<string>} requiredExts + * @return {boolean} + */ + es3fFboTestCase.isAnyExtensionSupported = function(context, requiredExts) { + for (var iter in requiredExts) { + /** @const @type {string} */ var extension = requiredExts[iter]; + + if (sglrGLContext.isExtensionSupported(gl, extension)) { + // enable the extension + gl.getExtension(extension); + return true; + } + } + + return false; + }; + +/** + * @param {number} format GL format + * @return {number} + */ +es3fFboTestCase.getMinimumSampleCount = function(format) { + switch (format) { + // Core formats + case gl.RGBA32I: + case gl.RGBA32UI: + case gl.RGBA16I: + case gl.RGBA16UI: + case gl.RGBA8: + case gl.RGBA8I: + case gl.RGBA8UI: + case gl.SRGB8_ALPHA8: + case gl.RGB10_A2: + case gl.RGB10_A2UI: + case gl.RGBA4: + case gl.RGB5_A1: + case gl.RGB8: + case gl.RGB565: + case gl.RG32I: + case gl.RG32UI: + case gl.RG16I: + case gl.RG16UI: + case gl.RG8: + case gl.RG8I: + case gl.RG8UI: + case gl.R32I: + case gl.R32UI: + case gl.R16I: + case gl.R16UI: + case gl.R8: + case gl.R8I: + case gl.R8UI: + case gl.DEPTH_COMPONENT32F: + case gl.DEPTH_COMPONENT24: + case gl.DEPTH_COMPONENT16: + case gl.DEPTH32F_STENCIL8: + case gl.DEPTH24_STENCIL8: + case gl.STENCIL_INDEX8: + return 4; + + // gl.EXT_color_buffer_float + case gl.R11F_G11F_B10F: + case gl.RG16F: + case gl.R16F: + return 4; + + case gl.RGBA32F: + case gl.RGBA16F: + case gl.RG32F: + case gl.R32F: + return 0; + + // gl.EXT_color_buffer_half_float + case gl.RGB16F: + return 0; + + default: + throw new Error('Unknown format:' + format); + } +}; + +es3fFboTestCase.querySampleCounts = function(format) { + return gl.getInternalformatParameter(gl.RENDERBUFFER, format, gl.SAMPLES); +}; + +}); |