Source code

Revision control

Copy as Markdown

Other Tools

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