/*------------------------------------------------------------------------- * 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 State change call performance tests. *//*--------------------------------------------------------------------*/ #include "es2pStateChangeCallTests.hpp" #include "glsStateChangePerfTestCases.hpp" #include "glwFunctions.hpp" #include "glwEnums.hpp" namespace deqp { namespace gles2 { namespace Performance { using namespace glw; StateChangeCallTests::StateChangeCallTests (Context& context) : TestCaseGroup(context, "state_change_only", "Test cost of state change calls without rendering anything") { } StateChangeCallTests::~StateChangeCallTests (void) { } #define ARG_LIST(...) __VA_ARGS__ #define ADD_ARG_CASE1(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0)\ do {\ class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\ {\ public:\ StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\ : gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\ {\ }\ virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\ {\ const TYPE0 args0[] = ARGS0;\ for (int callNdx = 0; callNdx < callCount; callNdx++)\ {\ const int baseNdx = iterNdx*callCount + callNdx;\ const TYPE0 arg0 = args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\ gl.FUNCNAME(arg0);\ }\ }\ };\ addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\ }while (0); #define ADD_ARG_CASE2(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1)\ do {\ class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\ {\ public:\ StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\ : gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\ {\ }\ virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\ {\ const TYPE0 args0[] = ARGS0;\ const TYPE1 args1[] = ARGS1;\ for (int callNdx = 0; callNdx < callCount; callNdx++)\ {\ const int baseNdx = iterNdx*callCount + callNdx;\ const TYPE0 arg0 = args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\ const TYPE1 arg1 = args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\ gl.FUNCNAME(arg0, arg1);\ }\ }\ };\ addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\ }while (0); #define ADD_ARG_CASE3(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2)\ do {\ class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\ {\ public:\ StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\ : gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\ {\ }\ virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\ {\ const TYPE0 args0[] = ARGS0;\ const TYPE1 args1[] = ARGS1;\ const TYPE2 args2[] = ARGS2;\ for (int callNdx = 0; callNdx < callCount; callNdx++)\ {\ const int baseNdx = iterNdx*callCount + callNdx;\ const TYPE0 arg0 = args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\ const TYPE1 arg1 = args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\ const TYPE2 arg2 = args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\ gl.FUNCNAME(arg0, arg1, arg2);\ }\ }\ };\ addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\ }while (0); #define ADD_ARG_CASE4(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2, TYPE3, ARGS3)\ do {\ class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\ {\ public:\ StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\ : gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\ {\ }\ virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\ {\ const TYPE0 args0[] = ARGS0;\ const TYPE1 args1[] = ARGS1;\ const TYPE2 args2[] = ARGS2;\ const TYPE3 args3[] = ARGS3;\ for (int callNdx = 0; callNdx < callCount; callNdx++)\ {\ const int baseNdx = iterNdx*callCount + callNdx;\ const TYPE0 arg0 = args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\ const TYPE1 arg1 = args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\ const TYPE2 arg2 = args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\ const TYPE3 arg3 = args3[baseNdx%DE_LENGTH_OF_ARRAY(args3)];\ gl.FUNCNAME(arg0, arg1, arg2, arg3);\ }\ }\ };\ addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\ }while (0); #define ADD_ARG_CASE6(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2, TYPE3, ARGS3, TYPE4, ARGS4, TYPE5, ARGS5)\ do {\ class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\ {\ public:\ StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\ : gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\ {\ }\ virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\ {\ const TYPE0 args0[] = ARGS0;\ const TYPE1 args1[] = ARGS1;\ const TYPE2 args2[] = ARGS2;\ const TYPE3 args3[] = ARGS3;\ const TYPE4 args4[] = ARGS4;\ const TYPE5 args5[] = ARGS5;\ for (int callNdx = 0; callNdx < callCount; callNdx++)\ {\ const int baseNdx = iterNdx*callCount + callNdx;\ const TYPE0 arg0 = args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\ const TYPE1 arg1 = args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\ const TYPE2 arg2 = args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\ const TYPE3 arg3 = args3[baseNdx%DE_LENGTH_OF_ARRAY(args3)];\ const TYPE4 arg4 = args4[baseNdx%DE_LENGTH_OF_ARRAY(args4)];\ const TYPE5 arg5 = args5[baseNdx%DE_LENGTH_OF_ARRAY(args5)];\ gl.FUNCNAME(arg0, arg1, arg2, arg3, arg4, arg5);\ }\ }\ };\ addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\ }while (0); void StateChangeCallTests::init (void) { ADD_ARG_CASE1(enable, "Test cost of glEnable() calls", enable, GLenum, ARG_LIST({ GL_CULL_FACE, GL_POLYGON_OFFSET_FILL, GL_SAMPLE_ALPHA_TO_COVERAGE, GL_SAMPLE_COVERAGE, GL_SCISSOR_TEST, GL_STENCIL_TEST, GL_DEPTH_TEST, GL_BLEND, GL_DITHER }) ); ADD_ARG_CASE1(disable, "Test cost of glDisable() calls", disable, GLenum, ARG_LIST({ GL_CULL_FACE, GL_POLYGON_OFFSET_FILL, GL_SAMPLE_ALPHA_TO_COVERAGE, GL_SAMPLE_COVERAGE, GL_SCISSOR_TEST, GL_STENCIL_TEST, GL_DEPTH_TEST, GL_BLEND, GL_DITHER }) ); ADD_ARG_CASE1(depth_func, "Test cost of glDepthFunc() calls", depthFunc, GLenum, ARG_LIST({ GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GREATER, GL_GEQUAL, GL_NOTEQUAL }) ); ADD_ARG_CASE1(depth_mask, "Test cost of glDepthMask() calls", depthMask, GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }) ); ADD_ARG_CASE1(stencil_mask, "Test cost of glStencilMask() calls", stencilMask, GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }) ); ADD_ARG_CASE1(clear_depth, "Test cost of glClearDepth() calls", clearDepthf, GLclampf, ARG_LIST({ 0.0f, 0.5f, 1.0f }) ); ADD_ARG_CASE1(clear_stencil, "Test cost of glClearStencil() calls", clearStencil, GLint, ARG_LIST({ 0, 128, 28 }) ); ADD_ARG_CASE1(line_width, "Test cost of glLineWidth() calls", lineWidth, GLfloat, ARG_LIST({ 1.0f, 0.5f, 10.0f }) ); ADD_ARG_CASE1(cull_face, "Test cost of glCullFace() calls", cullFace, GLenum, ARG_LIST({ GL_FRONT, GL_BACK, GL_FRONT_AND_BACK }) ); ADD_ARG_CASE1(front_face, "Test cost of glFrontFace() calls", frontFace, GLenum, ARG_LIST({ GL_CCW, GL_CW }) ); ADD_ARG_CASE1(blend_equation, "Test cost of glBlendEquation() calls", blendEquation, GLenum, ARG_LIST({ GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT }) ); ADD_ARG_CASE1(enable_vertex_attrib_array, "Test cost of glEnableVertexAttribArray() calls", enableVertexAttribArray, GLuint, ARG_LIST({ 0, 1, 2, 3, 4, 5, 6, 7, }) ); ADD_ARG_CASE1(disable_vertex_attrib_array, "Test cost of glDisableVertexAttribArray() calls", disableVertexAttribArray, GLuint, ARG_LIST({ 0, 1, 2, 3, 4, 5, 6, 7, }) ); ADD_ARG_CASE1(use_program, "Test cost of glUseProgram() calls. Note: Uses only program 0.", useProgram, GLuint, ARG_LIST({ 0, }) ); ADD_ARG_CASE1(active_texture, "Test cost of glActiveTexture() calls", activeTexture, GLenum, ARG_LIST({ GL_TEXTURE0, GL_TEXTURE1, GL_TEXTURE2, GL_TEXTURE3, GL_TEXTURE4, GL_TEXTURE5, GL_TEXTURE6, GL_TEXTURE7 }) ); ADD_ARG_CASE2(depth_range, "Test cost of glDepthRangef() calls", depthRangef, GLclampf, ARG_LIST({ 0.0f, 1.0f, 0.5f }), GLclampf, ARG_LIST({ 0.0f, 1.0f, 0.5f }) ); ADD_ARG_CASE2(polygon_offset, "Test cost of glPolygonOffset() calls", polygonOffset, GLfloat, ARG_LIST({ 0.0f, 1.0f, 0.5f, 10.0f }), GLfloat, ARG_LIST({ 0.0f, 1.0f, 0.5f, 1000.0f }) ); ADD_ARG_CASE2(sample_coverage, "Test cost of glSampleCoverage() calls", sampleCoverage, GLclampf, ARG_LIST({ 0.0f, 1.0f, 0.5f, 0.67f }), GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }) ); ADD_ARG_CASE2(blend_func, "Test cost of glBlendFunc() calls", blendFunc, GLenum, ARG_LIST({ GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA }), GLenum, ARG_LIST({ GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA }) ); ADD_ARG_CASE2(blend_equation_separate, "Test cost of glBlendEquationSeparate() calls", blendEquationSeparate, GLenum, ARG_LIST({ GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT }), GLenum, ARG_LIST({ GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT }) ); ADD_ARG_CASE2(stencil_mask_separate, "Test cost of glStencilMaskSeparate() calls", stencilMaskSeparate, GLenum, ARG_LIST({ GL_FRONT, GL_BACK, GL_FRONT_AND_BACK }), GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }) ); ADD_ARG_CASE2(bind_buffer, "Test cost of glBindBuffer() calls. Note: Uses only buffer 0", bindBuffer, GLenum, ARG_LIST({ GL_ELEMENT_ARRAY_BUFFER, GL_ARRAY_BUFFER }), GLuint, ARG_LIST({ 0 }) ); ADD_ARG_CASE2(bind_texture, "Test cost of glBindTexture() calls. Note: Uses only texture 0", bindTexture, GLenum, ARG_LIST({ GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP }), GLuint, ARG_LIST({ 0 }) ); ADD_ARG_CASE2(hint, "Test cost of glHint() calls", hint, GLenum, ARG_LIST({ GL_GENERATE_MIPMAP_HINT }), GLenum, ARG_LIST({ GL_FASTEST, GL_NICEST, GL_DONT_CARE }) ); ADD_ARG_CASE3(stencil_func, "Test cost of glStencilFunc() calls", stencilFunc, GLenum, ARG_LIST({ GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL }), GLint, ARG_LIST({ 0, 1, 255, 128, 7 }), GLuint, ARG_LIST({ 0, 1, 255, 128, 7, 0xFFFFFFFF }) ); ADD_ARG_CASE3(stencil_op, "Test cost of glStencilOp() calls", stencilOp, GLenum, ARG_LIST({ GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP }), GLenum, ARG_LIST({ GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP }), GLenum, ARG_LIST({ GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP }) ); ADD_ARG_CASE4(viewport, "Test cost of glViewport() calls", viewport, GLint, ARG_LIST({ 0, 1, 100, 1145235 }), GLint, ARG_LIST({ 0, 1, 100, 1145235 }), GLint, ARG_LIST({ 0, 1, 100, 1145235 }), GLint, ARG_LIST({ 0, 1, 100, 1145235 }) ); ADD_ARG_CASE4(scissor, "Test cost of glScissor() calls", scissor, GLint, ARG_LIST({ 0, 1, 100, 1145235 }), GLint, ARG_LIST({ 0, 1, 100, 1145235 }), GLint, ARG_LIST({ 0, 1, 100, 1145235 }), GLint, ARG_LIST({ 0, 1, 100, 1145235 }) ); ADD_ARG_CASE4(stencil_func_separate, "Test cost of glStencilFuncSeparate() calls", stencilFuncSeparate, GLenum, ARG_LIST({ GL_FRONT, GL_BACK, GL_FRONT_AND_BACK }), GLenum, ARG_LIST({ GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL }), GLint, ARG_LIST({ 0, 1, 255, 128, 7 }), GLuint, ARG_LIST({ 0, 1, 255, 128, 7, 0xFFFFFFFF }) ); ADD_ARG_CASE4(stencil_op_separatae, "Test cost of glStencilOpSeparate() calls", stencilOpSeparate, GLenum, ARG_LIST({ GL_FRONT, GL_BACK, GL_FRONT_AND_BACK }), GLenum, ARG_LIST({ GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP }), GLenum, ARG_LIST({ GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP }), GLenum, ARG_LIST({ GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP }) ); ADD_ARG_CASE4(blend_func_separate, "Test cost of glBlendFuncSeparate() calls", blendFuncSeparate, GLenum, ARG_LIST({ GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA }), GLenum, ARG_LIST({ GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA }), GLenum, ARG_LIST({ GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA }), GLenum, ARG_LIST({ GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA }) ); ADD_ARG_CASE4(color_mask, "Test cost of glColorMask() calls", colorMask, GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }), GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }), GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }), GLboolean, ARG_LIST({ GL_TRUE, GL_FALSE }) ); ADD_ARG_CASE4(clear_color, "Test cost of glClearColor() calls", clearColor, GLclampf, ARG_LIST({ 0.0f, 1.0f, 0.5f, 0.33f }), GLclampf, ARG_LIST({ 0.0f, 1.0f, 0.5f, 0.33f }), GLclampf, ARG_LIST({ 0.0f, 1.0f, 0.5f, 0.33f }), GLclampf, ARG_LIST({ 0.0f, 1.0f, 0.5f, 0.33f }) ); ADD_ARG_CASE6(vertex_attrib_pointer, "Test cost of glVertexAttribPointer() calls", vertexAttribPointer, GLuint, ARG_LIST({ 0, 1, 2, 3, 4, 5, 6, 7 }), GLint, ARG_LIST({ 1, 2, 3, 4 }), GLenum, ARG_LIST({ GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, GL_SHORT, GL_FLOAT }), GLboolean, ARG_LIST({ GL_FALSE, GL_TRUE }), GLsizei, ARG_LIST({ 0, 2, 4 }), void*, ARG_LIST({ (void*)(deUintptr)(0x0FF), (void*)(deUintptr)(0x0EF) }) ); } } // Performance } // gles2 } // deqp