| /*------------------------------------------------------------------------- |
| * drawElements Quality Program OpenGL ES 2.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 "es2pRedundantStateChangeTests.hpp" |
| #include "glsStateChangePerfTestCases.hpp" |
| #include "gluShaderProgram.hpp" |
| #include "glwFunctions.hpp" |
| #include "glwEnums.hpp" |
| |
| namespace deqp |
| { |
| namespace gles2 |
| { |
| 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); |
| } |
| |
| } // anonymous |
| |
| 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(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); |
| }) |
| ) |
| } |
| |
| } // Performance |
| } // gles2 |
| } // deqp |