/*------------------------------------------------------------------------- * drawElements Quality Program OpenGL ES 2.0 Module * ------------------------------------------------- * * Copyright 2015 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 GL_EXT_debug_marker tests *//*--------------------------------------------------------------------*/ #include "es2fDebugMarkerTests.hpp" #include "gluContextInfo.hpp" #include "gluRenderContext.hpp" #include "glwFunctions.hpp" #include "glwEnums.hpp" #include "tcuTestLog.hpp" #include "deRandom.hpp" #include "deUniquePtr.hpp" namespace deqp { namespace gles2 { namespace Functional { namespace { using std::vector; using tcu::TestLog; void checkSupport (const glu::ContextInfo& ctxInfo) { if (!ctxInfo.isExtensionSupported("GL_EXT_debug_marker")) { #if (DE_OS == DE_OS_ANDROID) TCU_THROW(TestError, "Support for GL_EXT_debug_marker is mandatory on Android"); #else TCU_THROW(NotSupportedError, "GL_EXT_debug_marker is not supported"); #endif } // else no exception thrown } class IsSupportedCase : public TestCase { public: IsSupportedCase (Context& context) : TestCase(context, "supported", "Is GL_EXT_debug_marker supported") { } IterateResult iterate (void) { checkSupport(m_context.getContextInfo()); m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "GL_EXT_debug_marker is supported"); return STOP; } }; void getSimpleRndString (vector& dst, de::Random& rnd, int maxLen) { const char s_chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ -_"; dst.resize(rnd.getInt(0, (int)maxLen)); for (size_t ndx = 0; ndx < dst.size(); ndx++) dst[ndx] = rnd.choose(DE_ARRAY_BEGIN(s_chars), DE_ARRAY_END(s_chars)); } void getComplexRndString (vector& dst, de::Random& rnd, int maxLen) { dst.resize(rnd.getInt(0, (int)maxLen)); for (size_t ndx = 0; ndx < dst.size(); ndx++) dst[ndx] = (char)rnd.getUint8(); } enum CallType { CALL_TYPE_PUSH_GROUP = 0, CALL_TYPE_POP_GROUP, CALL_TYPE_INSERT_MARKER, CALL_TYPE_LAST }; class RandomCase : public TestCase { public: RandomCase (Context& context) : TestCase(context, "random", "Random GL_EXT_debug_marker usage") { } void init (void) { checkSupport(m_context.getContextInfo()); } IterateResult iterate (void) { const glw::Functions& gl = m_context.getRenderContext().getFunctions(); const int numIters = 1000; const int maxMsgLen = 4096; de::Random rnd (0xaf829c0); for (int iterNdx = 0; iterNdx < numIters; iterNdx++) { const CallType callType = CallType(rnd.getInt(0, CALL_TYPE_LAST-1)); if (callType == CALL_TYPE_PUSH_GROUP || callType == CALL_TYPE_INSERT_MARKER) { const bool nullTerminate = rnd.getBool(); const bool passLength = rnd.getBool(); const bool complexMsg = rnd.getBool(); vector message; if (complexMsg) getComplexRndString(message, rnd, maxMsgLen); else getSimpleRndString(message, rnd, maxMsgLen); if (nullTerminate) message.push_back(char(0)); { const glw::GLsizei length = passLength ? glw::GLsizei(nullTerminate ? message.size()-1 : message.size()) : 0; if (callType == CALL_TYPE_PUSH_GROUP) gl.pushGroupMarkerEXT(length, &message[0]); else gl.insertEventMarkerEXT(length, &message[0]); } } else gl.popGroupMarkerEXT(); } GLU_EXPECT_NO_ERROR(gl.getError(), "Debug marker calls must not set error state"); m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "All calls passed"); return STOP; } }; class InvalidCase : public TestCase { public: InvalidCase (Context& context) : TestCase(context, "invalid", "Invalid GL_EXT_debug_marker usage") { } void init (void) { checkSupport(m_context.getContextInfo()); } IterateResult iterate (void) { const glw::Functions& gl = m_context.getRenderContext().getFunctions(); m_testCtx.getLog() << TestLog::Message << "Note: GL_EXT_debug_marker calls must not report an error even if invalid arguments are supplied." << TestLog::EndMessage; gl.pushGroupMarkerEXT(-1, "foo"); gl.insertEventMarkerEXT(-1, "foo"); gl.pushGroupMarkerEXT(0, DE_NULL); gl.insertEventMarkerEXT(0, DE_NULL); gl.pushGroupMarkerEXT(-1, DE_NULL); gl.insertEventMarkerEXT(-1, DE_NULL); GLU_EXPECT_NO_ERROR(gl.getError(), "Debug marker calls must not set error state"); m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "All calls passed"); return STOP; } }; } // anonymous tcu::TestCaseGroup* createDebugMarkerTests (Context& context) { de::MovePtr debugMarkerGroup (new tcu::TestCaseGroup(context.getTestContext(), "debug_marker", "GL_EXT_debug_marker tests")); debugMarkerGroup->addChild(new IsSupportedCase (context)); debugMarkerGroup->addChild(new RandomCase (context)); debugMarkerGroup->addChild(new InvalidCase (context)); return debugMarkerGroup.release(); } } // Functional } // gles2 } // deqp