| /*------------------------------------------------------------------------- |
| * drawElements Quality Program OpenGL ES 3.0 Module |
| * ------------------------------------------------- |
| * |
| * 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. |
| * |
| *//*! |
| * \file |
| * \brief Rasterizer discard tests. |
| *//*--------------------------------------------------------------------*/ |
| |
| goog.provide('functional.gles3.es3fRasterizerDiscardTests'); |
| goog.require('framework.common.tcuLogImage'); |
| goog.require('framework.common.tcuSurface'); |
| goog.require('framework.common.tcuTestCase'); |
| goog.require('framework.delibs.debase.deRandom'); |
| goog.require('framework.delibs.debase.deString'); |
| goog.require('framework.opengl.gluDrawUtil'); |
| goog.require('framework.opengl.gluShaderProgram'); |
| |
| goog.scope(function() { |
| var es3fRasterizerDiscardTests = functional.gles3.es3fRasterizerDiscardTests; |
| var deString = framework.delibs.debase.deString; |
| var tcuTestCase = framework.common.tcuTestCase; |
| var deRandom = framework.delibs.debase.deRandom; |
| var gluShaderProgram = framework.opengl.gluShaderProgram; |
| var tcuSurface = framework.common.tcuSurface; |
| var gluDrawUtil = framework.opengl.gluDrawUtil; |
| var tcuLogImage = framework.common.tcuLogImage; |
| |
| /** @const */ var NUM_CASE_ITERATIONS = 1; |
| /** @const */ var FAIL_COLOR_RED = [1, 0, 0.0, 1]; |
| /** @const */ var PASS_COLOR_BLUE = [0, 0, 0.5, 1]; |
| /** @const */ var BLACK_COLOR = [0, 0, 0.0, 1]; |
| /** @const */ var FAIL_DEPTH = 0; |
| /** @const */ var FAIL_STENCIL = 1; |
| /** @const */ var UNIT_SQUARE = [ |
| 1, 1, 0.05, 1, |
| 1, -1, 0.05, 1, |
| -1, 1, 0.05, 1, |
| -1, -1, 0.05, 1 |
| ]; |
| |
| /** @type {WebGL2RenderingContext} */ var gl; |
| |
| /** |
| * @enum |
| */ |
| es3fRasterizerDiscardTests.CaseType = { |
| WRITE_DEPTH: 0, |
| WRITE_STENCIL: 1, |
| CLEAR_COLOR: 2, |
| CLEAR_DEPTH: 3, |
| CLEAR_STENCIL: 4 |
| }; |
| |
| /** |
| * @enum {{useFBO: boolean, useScissor: boolean}} |
| */ |
| es3fRasterizerDiscardTests.CaseOptions = { |
| FBO: {useFBO: true, useScissor: false}, |
| SCISSOR: {useFBO: false, useScissor: true} |
| }; |
| |
| /** |
| * @constructor |
| * @extends {tcuTestCase.DeqpTest} |
| * @param {string} name |
| * @param {string} description |
| * @param {number} numPrimitives |
| * @param {es3fRasterizerDiscardTests.CaseType} caseType |
| * @param {?es3fRasterizerDiscardTests.CaseOptions} caseOptions |
| * @param {gluDrawUtil.primitiveType=} drawMode |
| */ |
| es3fRasterizerDiscardTests.RasterizerDiscardCase = function(name, description, numPrimitives, caseType, caseOptions, drawMode) { |
| tcuTestCase.DeqpTest.call(this, name, description); |
| this.m_numPrimitives = numPrimitives; |
| this.m_caseType = caseType; |
| this.m_caseOptions = caseOptions || {useFBO: false, useScissor: false}; |
| this.m_drawMode = drawMode || gluDrawUtil.primitiveType.TRIANGLES; |
| this.m_program = null; |
| this.m_fbo = null; |
| this.m_colorBuf = null; |
| this.m_depthStencilBuf = null; |
| this.m_iterNdx = 0; |
| this.m_rnd = new deRandom.Random(deString.deStringHash(name)); |
| }; |
| |
| es3fRasterizerDiscardTests.RasterizerDiscardCase.prototype = Object.create(tcuTestCase.DeqpTest.prototype); |
| es3fRasterizerDiscardTests.RasterizerDiscardCase.prototype.constructor = es3fRasterizerDiscardTests.RasterizerDiscardCase; |
| |
| /** |
| * @param {number} numPrimitives |
| * @param {deRandom.Random} rnd |
| * @param {gluDrawUtil.primitiveType} drawMode |
| * @return {Array<number>} |
| */ |
| es3fRasterizerDiscardTests.generateVertices = function(numPrimitives, rnd, drawMode) { |
| var dst = []; |
| var numVertices; |
| |
| switch (drawMode) { |
| case gl.POINTS: numVertices = numPrimitives; break; |
| case gl.LINES: numVertices = 2 * numPrimitives; break; |
| case gl.LINE_STRIP: numVertices = numPrimitives + 1; break; |
| case gl.LINE_LOOP: numVertices = numPrimitives + 2; break; |
| case gl.TRIANGLES: numVertices = 3 * numPrimitives; break; |
| case gl.TRIANGLE_STRIP: numVertices = numPrimitives + 2; break; |
| case gl.TRIANGLE_FAN: numVertices = numPrimitives + 2; break; |
| default: |
| throw new Error('Invalid drawMode: ' + drawMode); |
| } |
| |
| for (var i = 0; i < numVertices; i++) { |
| dst[i * 4] = rnd.getFloat(-1.0, 1.0); // x |
| dst[i * 4 + 1] = rnd.getFloat(-1.0, 1.0); // y |
| dst[i * 4 + 2] = rnd.getFloat(0.1, 0.9); // z |
| dst[i * 4 + 3] = 1.0; // w |
| } |
| |
| return dst; |
| }; |
| |
| es3fRasterizerDiscardTests.RasterizerDiscardCase.prototype.setupFramebufferObject = function() { |
| var width = gl.drawingBufferWidth; |
| var height = gl.drawingBufferHeight; |
| |
| // Create framebuffer object |
| |
| this.m_fbo = gl.createFramebuffer(); |
| this.m_colorBuf = gl.createTexture(); |
| this.m_depthStencilBuf = gl.createRenderbuffer(); |
| |
| // Create color texture |
| |
| gl.bindTexture(gl.TEXTURE_2D, this.m_colorBuf); |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); |
| gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); |
| |
| // Create depth and stencil buffers |
| |
| gl.bindRenderbuffer(gl.RENDERBUFFER, this.m_depthStencilBuf); |
| gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH24_STENCIL8, width, height); |
| |
| // Attach texture and buffers to FBO |
| |
| gl.bindFramebuffer(gl.FRAMEBUFFER, this.m_fbo); |
| gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.m_colorBuf, 0); |
| gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.m_depthStencilBuf); |
| gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, this.m_depthStencilBuf); |
| |
| var fboStatus = gl.checkFramebufferStatus(gl.FRAMEBUFFER); |
| |
| if (fboStatus == gl.FRAMEBUFFER_UNSUPPORTED) |
| throw new Error('Framebuffer unsupported'); |
| else if (fboStatus != gl.FRAMEBUFFER_COMPLETE) |
| throw new Error('Failed to create framebuffer object: ' + deString.enumToString(gl, fboStatus)); |
| }; |
| |
| es3fRasterizerDiscardTests.RasterizerDiscardCase.prototype.deleteFramebufferObject = function() { |
| gl.deleteTexture(this.m_colorBuf); |
| gl.deleteRenderbuffer(this.m_depthStencilBuf); |
| gl.deleteFramebuffer(this.m_fbo); |
| }; |
| |
| es3fRasterizerDiscardTests.RasterizerDiscardCase.prototype.init = function() { |
| var vertShaderSource = |
| '#version 300 es\n' + |
| 'layout(location = 0) in mediump vec4 a_position;\n' + |
| '\n' + |
| 'void main (void)\n' + |
| '{\n' + |
| ' gl_Position = a_position;\n' + |
| '}\n'; |
| |
| var fragShaderSource = |
| '#version 300 es\n' + |
| 'layout(location = 0) out mediump vec4 dEQP_FragColor;\n' + |
| 'uniform mediump vec4 u_color;\n' + |
| '\n' + |
| 'void main (void)\n' + |
| '{\n' + |
| ' mediump float depth_gradient = gl_FragCoord.z;\n' + |
| ' mediump float bias = 0.1;\n' + |
| ' dEQP_FragColor = vec4(u_color.xyz * (depth_gradient + bias), 1.0);\n' + |
| '}\n'; |
| |
| this.m_program = new gluShaderProgram.ShaderProgram(gl, gluShaderProgram.makeVtxFragSources(vertShaderSource, fragShaderSource)); |
| |
| if (!this.m_program.isOk()) { |
| bufferedLogToConsole(this.m_program); |
| testFailedOptions('Failed to compile shader program', true); |
| } |
| }; |
| |
| es3fRasterizerDiscardTests.RasterizerDiscardCase.prototype.deinit = function() { |
| this.deleteFramebufferObject(); |
| this.m_program = null; |
| }; |
| |
| es3fRasterizerDiscardTests.RasterizerDiscardCase.prototype.iterate = function() { |
| var program = this.m_program.getProgram(); |
| var colorUnif = gl.getUniformLocation(program, 'u_color'); |
| var failColorFound = false; |
| var passColorFound = false; |
| var vertices; |
| |
| bufferedLogToConsole('Case iteration ' + (this.m_iterNdx + 1) + ' / ' + NUM_CASE_ITERATIONS); |
| |
| // Create and bind FBO if needed |
| |
| if (this.m_caseOptions.useFBO) { |
| this.setupFramebufferObject(); |
| } |
| |
| if (this.m_caseOptions.useScissor) { |
| gl.enable(gl.SCISSOR_TEST); |
| gl.scissor(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); |
| bufferedLogToConsole('Scissor test enabled: glScissor(0, 0, ' + gl.drawingBufferWidth + ', ' + gl.drawingBufferHeight + ')'); |
| } |
| |
| gl.useProgram(this.m_program.getProgram()); |
| |
| gl.enable(gl.DEPTH_TEST); |
| gl.depthRange(0, 1); |
| gl.depthFunc(gl.LEQUAL); |
| |
| gl.enable(gl.STENCIL_TEST); |
| gl.stencilFunc(gl.NOTEQUAL, 1, 0xFF); |
| gl.stencilOp(gl.REPLACE, gl.KEEP, gl.KEEP); |
| |
| gl.clearColor(PASS_COLOR_BLUE[0], PASS_COLOR_BLUE[1], PASS_COLOR_BLUE[2], PASS_COLOR_BLUE[3]); |
| gl.clearDepth(1); |
| gl.clearStencil(0); |
| gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); |
| |
| // Generate vertices |
| vertices = es3fRasterizerDiscardTests.generateVertices(this.m_numPrimitives, this.m_rnd, this.m_drawMode); |
| var posLoc = gl.getAttribLocation(program, 'a_position'); |
| var vertexArrays = []; |
| vertexArrays.push(new gluDrawUtil.VertexArrayBinding(gl.FLOAT, posLoc, 4, vertices.length / 4, vertices)); |
| // Clear color to black for depth and stencil clear cases |
| |
| if (this.m_caseType == es3fRasterizerDiscardTests.CaseType.CLEAR_DEPTH || this.m_caseType == es3fRasterizerDiscardTests.CaseType.CLEAR_STENCIL) { |
| gl.clearColor(BLACK_COLOR[0], BLACK_COLOR[1], BLACK_COLOR[2], BLACK_COLOR[3]); |
| gl.clear(gl.COLOR_BUFFER_BIT); |
| } |
| |
| // Set fail values for color, depth and stencil |
| |
| gl.uniform4fv(colorUnif, FAIL_COLOR_RED); |
| gl.clearColor(FAIL_COLOR_RED[0], FAIL_COLOR_RED[1], FAIL_COLOR_RED[2], FAIL_COLOR_RED[3]); |
| gl.clearDepth(FAIL_DEPTH); |
| gl.clearStencil(FAIL_STENCIL); |
| |
| // Enable rasterizer discard |
| |
| gl.enable(gl.RASTERIZER_DISCARD); |
| bufferedLogToConsole('Rasterizer discard enabled'); |
| |
| // Do to-be-discarded primitive draws and buffer clears |
| |
| switch (this.m_caseType) { |
| case es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH: |
| gluDrawUtil.draw(gl, program, vertexArrays, new gluDrawUtil.PrimitiveList(this.m_drawMode, vertices.length / 4)); |
| break; |
| case es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL: |
| gluDrawUtil.draw(gl, program, vertexArrays, new gluDrawUtil.PrimitiveList(this.m_drawMode, vertices.length / 4)); |
| break; |
| case es3fRasterizerDiscardTests.CaseType.CLEAR_COLOR: |
| if (this.m_caseOptions.useFBO) |
| gl.clearBufferfv(gl.COLOR, 0, FAIL_COLOR_RED); |
| else |
| gl.clear(gl.COLOR_BUFFER_BIT); |
| break; |
| case es3fRasterizerDiscardTests.CaseType.CLEAR_DEPTH: |
| if (this.m_caseOptions.useFBO) |
| gl.clearBufferfv(gl.DEPTH, 0, [FAIL_DEPTH]); |
| else |
| gl.clear(gl.DEPTH_BUFFER_BIT); |
| break; |
| case es3fRasterizerDiscardTests.CaseType.CLEAR_STENCIL: |
| if (this.m_caseOptions.useFBO) |
| gl.clearBufferiv(gl.STENCIL, 0, [FAIL_STENCIL]); |
| else |
| gl.clear(gl.STENCIL_BUFFER_BIT); |
| break; |
| default: |
| throw new Error('Invalid case type ' + this.m_caseType); |
| } |
| |
| // Disable rasterizer discard |
| |
| gl.disable(gl.RASTERIZER_DISCARD); |
| bufferedLogToConsole('Rasterizer discard disabled'); |
| |
| if (this.m_caseType == es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL) { |
| if (this.m_caseOptions.useFBO || gl.getContextAttributes().stencil) { |
| // Draw a full-screen square that colors all pixels red if they have stencil value 1. |
| var square = [new gluDrawUtil.VertexArrayBinding(gl.FLOAT, posLoc, 4, UNIT_SQUARE.length / 4, UNIT_SQUARE)]; |
| |
| gl.stencilFunc(gl.EQUAL, 1, 0xFF); |
| gluDrawUtil.draw(gl, program, square, |
| new gluDrawUtil.PrimitiveList(gluDrawUtil.primitiveType.TRIANGLE_STRIP, UNIT_SQUARE.length / 4)); |
| } |
| // \note If no stencil buffers are present and test is rendering to default framebuffer, test will always pass. |
| } else if (this.m_caseType == es3fRasterizerDiscardTests.CaseType.CLEAR_DEPTH || this.m_caseType == es3fRasterizerDiscardTests.CaseType.CLEAR_STENCIL) { |
| // Draw pass-indicating primitives for depth and stencil clear cases |
| |
| gl.uniform4fv(colorUnif, PASS_COLOR_BLUE); |
| gluDrawUtil.draw(gl, program, vertexArrays, new gluDrawUtil.PrimitiveList(this.m_drawMode, vertices.length / 4)); |
| } |
| |
| gl.finish(); |
| gl.disable(gl.STENCIL_TEST); |
| gl.disable(gl.DEPTH_TEST); |
| gl.disable(gl.SCISSOR_TEST); |
| |
| // Read and check pixel data |
| |
| var pixels = new tcuSurface.Surface(); |
| pixels.readViewport(gl); |
| |
| var width = pixels.getWidth(); |
| var height = pixels.getHeight(); |
| |
| for (var y = 0; y < height; y++) { |
| for (var x = 0; x < width; x++) { |
| var pixel = pixels.getPixel(x, y); |
| if (pixel[2] != 0) |
| passColorFound = true; |
| |
| if (pixel[0] != 0) { |
| failColorFound = true; |
| break; |
| } |
| } |
| if (failColorFound) break; |
| } |
| |
| // Delete FBO if created |
| |
| if (this.m_caseOptions.useFBO) |
| this.deleteFramebufferObject(); |
| |
| // Evaluate test result |
| |
| var testOk = passColorFound && !failColorFound; |
| |
| if (!testOk) { |
| tcuLogImage.logImage('Result image', '', pixels.getAccess()); |
| testFailed('Primitive or buffer clear was not discarded.'); |
| return tcuTestCase.IterateResult.STOP; |
| } |
| bufferedLogToConsole('Primitive or buffer clear was discarded correctly.'); |
| |
| if (++this.m_iterNdx < NUM_CASE_ITERATIONS) |
| return tcuTestCase.IterateResult.CONTINUE; |
| |
| testPassed(); |
| return tcuTestCase.IterateResult.STOP; |
| }; |
| |
| es3fRasterizerDiscardTests.init = function() { |
| var state = tcuTestCase.runner; |
| var testGroup = state.testCases; |
| |
| var basic = tcuTestCase.newTest('basic', 'Rasterizer discard test for default framebuffer'); |
| var scissor = tcuTestCase.newTest('scissor', 'Rasterizer discard test for default framebuffer with scissor test enabled'); |
| var fbo = tcuTestCase.newTest('fbo', 'Rasterizer discard test for framebuffer object'); |
| |
| testGroup.addChild(basic); |
| testGroup.addChild(scissor); |
| testGroup.addChild(fbo); |
| |
| // Default framebuffer cases |
| |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_points', 'points', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, null, gluDrawUtil.primitiveType.POINTS)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_lines', 'lines', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, null, gluDrawUtil.primitiveType.LINES)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_line_strip', 'line_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, null, gluDrawUtil.primitiveType.LINE_STRIP)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_line_loop', 'line_loop', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, null, gluDrawUtil.primitiveType.LINE_LOOP)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangles', 'triangles', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, null, gluDrawUtil.primitiveType.TRIANGLES)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangle_strip', 'triangle_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, null, gluDrawUtil.primitiveType.TRIANGLE_STRIP)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangle_fan', 'triangle_fan', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, null, gluDrawUtil.primitiveType.TRIANGLE_FAN)); |
| |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_points', 'points', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, null, gluDrawUtil.primitiveType.POINTS)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_lines', 'lines', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, null, gluDrawUtil.primitiveType.LINES)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_line_strip', 'line_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, null, gluDrawUtil.primitiveType.LINE_STRIP)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_line_loop', 'line_loop', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, null, gluDrawUtil.primitiveType.LINE_LOOP)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangles', 'triangles', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, null, gluDrawUtil.primitiveType.TRIANGLES)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangle_strip', 'triangle_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, null, gluDrawUtil.primitiveType.TRIANGLE_STRIP)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangle_fan', 'triangle_fan', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, null, gluDrawUtil.primitiveType.TRIANGLE_FAN)); |
| |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_color', 'clear_color', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_COLOR, null)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_depth', 'clear_depth', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_DEPTH, null)); |
| basic.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_stencil', 'clear_stencil', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_STENCIL, null)); |
| |
| // Default framebuffer cases with scissor test enabled |
| |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_points', 'points', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.POINTS)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_lines', 'lines', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.LINES)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_line_strip', 'line_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.LINE_STRIP)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_line_loop', 'line_loop', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.LINE_LOOP)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangles', 'triangles', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.TRIANGLES)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangle_strip', 'triangle_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.TRIANGLE_STRIP)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangle_fan', 'triangle_fan', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.TRIANGLE_FAN)); |
| |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_points', 'points', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.POINTS)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_lines', 'lines', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.LINES)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_line_strip', 'line_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.LINE_STRIP)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_line_loop', 'line_loop', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.LINE_LOOP)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangles', 'triangles', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.TRIANGLES)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangle_strip', 'triangle_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.TRIANGLE_STRIP)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangle_fan', 'triangle_fan', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR, gluDrawUtil.primitiveType.TRIANGLE_FAN)); |
| |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_color', 'clear_color', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_COLOR, es3fRasterizerDiscardTests.CaseOptions.SCISSOR)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_depth', 'clear_depth', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_DEPTH, es3fRasterizerDiscardTests.CaseOptions.SCISSOR)); |
| scissor.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_stencil', 'clear_stencil', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_STENCIL, es3fRasterizerDiscardTests.CaseOptions.SCISSOR)); |
| |
| // FBO cases |
| |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_points', 'points', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.POINTS)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_lines', 'lines', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.LINES)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_line_strip', 'line_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.LINE_STRIP)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_line_loop', 'line_loop', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.LINE_LOOP)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangles', 'triangles', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.TRIANGLES)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangle_strip', 'triangle_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.TRIANGLE_STRIP)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_depth_triangle_fan', 'triangle_fan', 4, es3fRasterizerDiscardTests.CaseType.WRITE_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.TRIANGLE_FAN)); |
| |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_points', 'points', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.POINTS)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_lines', 'lines', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.LINES)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_line_strip', 'line_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.LINE_STRIP)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_line_loop', 'line_loop', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.LINE_LOOP)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangles', 'triangles', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.TRIANGLES)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangle_strip', 'triangle_strip', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.TRIANGLE_STRIP)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('write_stencil_triangle_fan', 'triangle_fan', 4, es3fRasterizerDiscardTests.CaseType.WRITE_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO, gluDrawUtil.primitiveType.TRIANGLE_FAN)); |
| |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_color', 'clear_color', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_COLOR, es3fRasterizerDiscardTests.CaseOptions.FBO)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_depth', 'clear_depth', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_DEPTH, es3fRasterizerDiscardTests.CaseOptions.FBO)); |
| fbo.addChild(new es3fRasterizerDiscardTests.RasterizerDiscardCase('clear_stencil', 'clear_stencil', 4, es3fRasterizerDiscardTests.CaseType.CLEAR_STENCIL, es3fRasterizerDiscardTests.CaseOptions.FBO)); |
| }; |
| |
| /** |
| * Create and execute the test cases |
| */ |
| es3fRasterizerDiscardTests.run = function(context) { |
| gl = context; |
| //Set up Test Root parameters |
| var testName = 'rasterizer_discard'; |
| var testDescription = 'Rasterizer Discard Tests'; |
| var state = tcuTestCase.runner; |
| |
| state.testName = testName; |
| state.testCases = tcuTestCase.newTest(testName, testDescription, null); |
| |
| //Set up name and description of this test series. |
| setCurrentTestName(testName); |
| description(testDescription); |
| |
| try { |
| es3fRasterizerDiscardTests.init(); |
| tcuTestCase.runTestCases(); |
| } catch (err) { |
| testFailedOptions('Failed to run tests', false); |
| bufferedLogToConsole(err); |
| tcuTestCase.runner.terminate(); |
| } |
| }; |
| |
| }); |