blob: e24816c8d0280eb237191b5af5ba9cda4bac99ff [file] [log] [blame] [edit]
/*-------------------------------------------------------------------------
* 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 Redundant state change performance tests.
*//*--------------------------------------------------------------------*/
#include "es3pRedundantStateChangeTests.hpp"
#include "glsStateChangePerfTestCases.hpp"
#include "gluShaderProgram.hpp"
#include "glwFunctions.hpp"
#include "glwEnums.hpp"
namespace deqp
{
namespace gles3
{
namespace Performance
{
using namespace glw; // GL types
namespace
{
enum
{
VIEWPORT_WIDTH = 24,
VIEWPORT_HEIGHT = 24
};
class RedundantStateChangeCase : public gls::StateChangePerformanceCase
{
public:
RedundantStateChangeCase(Context &context, int drawCallCount, int triangleCount, bool drawArrays,
bool useIndexBuffer, const char *name, const char *description);
~RedundantStateChangeCase(void);
protected:
virtual void renderTest(const glw::Functions &gl);
virtual void renderReference(const glw::Functions &gl);
virtual void changeState(const glw::Functions &gl) = 0;
};
RedundantStateChangeCase::RedundantStateChangeCase(Context &context, int drawCallCount, int triangleCount,
bool drawArrays, bool useIndexBuffer, const char *name,
const char *description)
: gls::StateChangePerformanceCase(context.getTestContext(), context.getRenderContext(), name, description,
(useIndexBuffer ? DRAWTYPE_INDEXED_BUFFER :
drawArrays ? DRAWTYPE_NOT_INDEXED :
DRAWTYPE_INDEXED_USER_PTR),
drawCallCount, triangleCount)
{
DE_ASSERT(!useIndexBuffer || !drawArrays);
}
RedundantStateChangeCase::~RedundantStateChangeCase(void)
{
}
void RedundantStateChangeCase::renderTest(const glw::Functions &gl)
{
for (int callNdx = 0; callNdx < m_callCount; callNdx++)
{
changeState(gl);
callDraw(gl);
}
}
void RedundantStateChangeCase::renderReference(const glw::Functions &gl)
{
changeState(gl);
for (int callNdx = 0; callNdx < m_callCount; callNdx++)
callDraw(gl);
}
} // namespace
RedundantStateChangeTests::RedundantStateChangeTests(Context &context)
: TestCaseGroup(context, "redundant_state_change_draw",
"Test performance with redundant sate changes between rendering.")
{
}
RedundantStateChangeTests::~RedundantStateChangeTests(void)
{
}
#define MACRO_BLOCK(...) __VA_ARGS__
#define ADD_TESTCASE(NAME, DESC, DRAWARRAYS, INDEXBUFFER, INIT_FUNC, CHANGE_FUNC) \
do \
{ \
class RedundantStateChangeCase_##NAME : public RedundantStateChangeCase \
{ \
public: \
RedundantStateChangeCase_##NAME(Context &context, int drawCallCount, int triangleCount, const char *name, \
const char *description) \
: RedundantStateChangeCase(context, drawCallCount, triangleCount, (DRAWARRAYS), (INDEXBUFFER), name, \
description) \
{ \
} \
virtual void setupInitialState(const glw::Functions &gl) \
{ \
INIT_FUNC \
} \
virtual void changeState(const glw::Functions &gl) \
{ \
CHANGE_FUNC \
} \
}; \
manySmallCallsGroup->addChild(new RedundantStateChangeCase_##NAME(m_context, 1000, 2, #NAME, (DESC))); \
fewBigCallsGroup->addChild(new RedundantStateChangeCase_##NAME(m_context, 10, 200, #NAME, (DESC))); \
} while (0);
void RedundantStateChangeTests::init(void)
{
tcu::TestCaseGroup *const manySmallCallsGroup =
new tcu::TestCaseGroup(m_testCtx, "many_small_calls", "1000 calls, 2 triangles in each");
tcu::TestCaseGroup *const fewBigCallsGroup =
new tcu::TestCaseGroup(m_testCtx, "few_big_calls", "10 calls, 200 triangles in each");
addChild(manySmallCallsGroup);
addChild(fewBigCallsGroup);
ADD_TESTCASE(blend, "Enable/Disable blending.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.enable(GL_BLEND); }))
ADD_TESTCASE(depth_test, "Enable/Disable depth test.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.depthFunc(GL_LEQUAL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()");
}),
MACRO_BLOCK({ gl.enable(GL_DEPTH_TEST); }))
ADD_TESTCASE(stencil_test, "Enable/Disable stencil test.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.stencilFunc(GL_LEQUAL, 0, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
gl.clearStencil(0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
gl.clear(GL_STENCIL_BUFFER_BIT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
}),
MACRO_BLOCK({ gl.enable(GL_STENCIL_TEST); }))
ADD_TESTCASE(scissor_test, "Enable/Disable scissor test.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.scissor(2, 3, 12, 13);
GLU_EXPECT_NO_ERROR(gl.getError(), "glScissor()");
}),
MACRO_BLOCK({ gl.enable(GL_SCISSOR_TEST); }))
ADD_TESTCASE(dither, "Enable/Disable dithering.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.enable(GL_DITHER); }))
ADD_TESTCASE(culling, "Enable/Disable culling.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.frontFace(GL_CW);
GLU_EXPECT_NO_ERROR(gl.getError(), "glFrontFace()");
gl.cullFace(GL_FRONT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glCullFace()");
}),
MACRO_BLOCK({ gl.enable(GL_CULL_FACE); }))
ADD_TESTCASE(rasterizer_discard, "Disable RASTERIZER_DISCARD.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.disable(GL_RASTERIZER_DISCARD); }))
ADD_TESTCASE(primitive_restart_fixed_index, "Enable PRIMITIVE_RESTART_FIXED_INDEX.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.enable(GL_PRIMITIVE_RESTART_FIXED_INDEX); }))
ADD_TESTCASE(depth_func, "Change depth func.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_DEPTH_TEST);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
}),
MACRO_BLOCK({ gl.depthFunc(GL_GEQUAL); }))
ADD_TESTCASE(depth_mask, "Toggle depth mask.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_DEPTH_TEST);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
gl.depthFunc(GL_LEQUAL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glDepthFunc()");
}),
MACRO_BLOCK({ gl.depthMask(GL_FALSE); }))
ADD_TESTCASE(depth_rangef, "Change depth range.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.depthRangef(0.0f, 1.0f); }))
ADD_TESTCASE(blend_equation, "Change blend equation.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_BLEND);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
}),
MACRO_BLOCK({ gl.blendEquation(GL_FUNC_SUBTRACT); }))
ADD_TESTCASE(blend_func, "Change blend function.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_BLEND);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
}),
MACRO_BLOCK({ gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }))
ADD_TESTCASE(polygon_offset, "Change polygon offset.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_POLYGON_OFFSET_FILL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
}),
MACRO_BLOCK({ gl.polygonOffset(0.0f, 0.0f); }))
ADD_TESTCASE(sample_coverage, "Sample coverage.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.sampleCoverage(0.25f, GL_TRUE); }))
ADD_TESTCASE(viewport, "Change viewport.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.viewport(10, 11, 5, 6); }))
ADD_TESTCASE(scissor, "Change scissor box.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_SCISSOR_TEST);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
}),
MACRO_BLOCK({ gl.scissor(17, 13, 5, 8); }))
ADD_TESTCASE(color_mask, "Change color mask.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.colorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_FALSE); }))
ADD_TESTCASE(cull_face, "Change culling mode.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_CULL_FACE);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
}),
MACRO_BLOCK({ gl.cullFace(GL_FRONT); }))
ADD_TESTCASE(front_face, "Change front face.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_CULL_FACE);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
}),
MACRO_BLOCK({ gl.frontFace(GL_CCW); }))
ADD_TESTCASE(stencil_mask, "Change stencil mask.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_STENCIL_TEST);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
gl.stencilFunc(GL_LEQUAL, 0, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
gl.clearStencil(0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
gl.clear(GL_STENCIL_BUFFER_BIT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
}),
MACRO_BLOCK({ gl.stencilMask(0xDD); }))
ADD_TESTCASE(stencil_func, "Change stencil func.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_STENCIL_TEST);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilOp()");
gl.clearStencil(0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
gl.clear(GL_STENCIL_BUFFER_BIT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
}),
MACRO_BLOCK({ gl.stencilFunc(GL_LEQUAL, 0, 0xFF); }))
ADD_TESTCASE(stencil_op, "Change stencil op.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_STENCIL_TEST);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
gl.stencilFunc(GL_LEQUAL, 0, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glStencilFunc()");
gl.clearStencil(0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClearStencil()");
gl.clear(GL_STENCIL_BUFFER_BIT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glClear()");
}),
MACRO_BLOCK({ gl.stencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); }))
ADD_TESTCASE(bind_array_buffer, "Change array buffer and refresh vertex attrib pointer.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
gl.linkProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
gl.enableVertexAttribArray(0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
}))
ADD_TESTCASE(element_array_buffer, "Change element array buffer.", false, true, MACRO_BLOCK({
requireCoordBuffers(1);
requireIndexBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
}),
MACRO_BLOCK({ gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffers[0]); }))
ADD_TESTCASE(bind_texture, "Change texture binding.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.bindTexture(GL_TEXTURE_2D, m_textures[0]); }))
ADD_TESTCASE(use_program, "Change used program.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.useProgram(m_programs[0]->getProgram()); }))
ADD_TESTCASE(tex_parameter_min_filter, "Change texture parameter min filter.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); }))
ADD_TESTCASE(tex_parameter_mag_filter, "Change texture parameter mag filter.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); }))
ADD_TESTCASE(tex_parameter_wrap, "Change texture parameter wrap filter.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); }))
ADD_TESTCASE(bind_framebuffer, "Change framebuffer.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requireFramebuffers(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer()");
}),
MACRO_BLOCK({ gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffers[0]); }))
ADD_TESTCASE(blend_color, "Change blend color.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.enable(GL_BLEND);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable()");
gl.blendFunc(GL_CONSTANT_COLOR, GL_CONSTANT_COLOR);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBlendFunc()");
}),
MACRO_BLOCK({ gl.blendColor(0.75f, 0.75f, 0.75f, 0.75f); }))
ADD_TESTCASE(sampler, "Change sampler binding.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
requireSamplers(1);
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
GLint coordLoc = gl.getAttribLocation(m_programs[0]->getProgram(), "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
gl.enableVertexAttribArray(coordLoc);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
gl.bindSampler(0, m_samplers[0]);
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
GLU_EXPECT_NO_ERROR(gl.getError(), "Sampler setup");
}),
MACRO_BLOCK({ gl.bindSampler(0, m_samplers[0]); }))
ADD_TESTCASE(bind_vertex_array, "Change vertex array binding.", true, false, MACRO_BLOCK({
requireCoordBuffers(1);
requireTextures(1);
requirePrograms(1);
requireVertexArrays(1);
gl.bindAttribLocation(m_programs[0]->getProgram(), 0, "a_coord");
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
gl.linkProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
gl.useProgram(m_programs[0]->getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
gl.bindVertexArray(m_vertexArrays[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray()");
gl.enableVertexAttribArray(0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray()");
gl.bindBuffer(GL_ARRAY_BUFFER, m_coordBuffers[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
gl.vertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer()");
GLint samplerLoc = gl.getUniformLocation(m_programs[0]->getProgram(), "u_sampler");
GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation()");
gl.bindTexture(GL_TEXTURE_2D, m_textures[0]);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture()");
gl.uniform1i(samplerLoc, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i()");
gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport()");
}),
MACRO_BLOCK({ gl.bindVertexArray(m_vertexArrays[0]); }))
}
} // namespace Performance
} // namespace gles3
} // namespace deqp