11a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos/*-------------------------------------------------------------------------
21a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * drawElements Quality Program OpenGL ES 2.0 Module
31a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * -------------------------------------------------
41a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *
51a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * Copyright 2015 The Android Open Source Project
61a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *
71a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
81a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * you may not use this file except in compliance with the License.
91a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * You may obtain a copy of the License at
101a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *
111a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
121a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *
131a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * Unless required by applicable law or agreed to in writing, software
141a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
151a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
161a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * See the License for the specific language governing permissions and
171a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * limitations under the License.
181a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *
191a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *//*!
201a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * \file
211a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos * \brief GL_EXT_debug_marker tests
221a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos *//*--------------------------------------------------------------------*/
231a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
241a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "es2fDebugMarkerTests.hpp"
251a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "gluContextInfo.hpp"
261a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "gluRenderContext.hpp"
271a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "glwFunctions.hpp"
281a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "glwEnums.hpp"
291a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "tcuTestLog.hpp"
301a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "deRandom.hpp"
311a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#include "deUniquePtr.hpp"
321a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
331a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosnamespace deqp
341a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
351a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosnamespace gles2
361a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
371a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosnamespace Functional
381a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
391a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
401a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosnamespace
411a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
421a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
431a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosusing std::vector;
441a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosusing tcu::TestLog;
451a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
461a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosvoid checkSupport (const glu::ContextInfo& ctxInfo)
471a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
481a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	if (!ctxInfo.isExtensionSupported("GL_EXT_debug_marker"))
491a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
501a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#if (DE_OS == DE_OS_ANDROID)
511a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		TCU_THROW(TestError, "Support for GL_EXT_debug_marker is mandatory on Android");
521a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#else
531a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		TCU_THROW(NotSupportedError, "GL_EXT_debug_marker is not supported");
541a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos#endif
551a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
561a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	// else no exception thrown
571a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos}
581a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
591a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosclass IsSupportedCase : public TestCase
601a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
611a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulospublic:
621a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	IsSupportedCase (Context& context)
631a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		: TestCase(context, "supported", "Is GL_EXT_debug_marker supported")
641a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
651a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
661a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
671a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	IterateResult iterate (void)
681a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
691a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		checkSupport(m_context.getContextInfo());
701a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "GL_EXT_debug_marker is supported");
711a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		return STOP;
721a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
731a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos};
741a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
751a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosvoid getSimpleRndString (vector<char>& dst, de::Random& rnd, int maxLen)
761a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
771a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	const char s_chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ -_";
781a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
791a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	dst.resize(rnd.getInt(0, (int)maxLen));
801a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
811a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	for (size_t ndx = 0; ndx < dst.size(); ndx++)
821a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		dst[ndx] = rnd.choose<char>(DE_ARRAY_BEGIN(s_chars), DE_ARRAY_END(s_chars));
831a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos}
841a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
851a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosvoid getComplexRndString (vector<char>& dst, de::Random& rnd, int maxLen)
861a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
871a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	dst.resize(rnd.getInt(0, (int)maxLen));
881a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
891a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	for (size_t ndx = 0; ndx < dst.size(); ndx++)
901a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		dst[ndx] = (char)rnd.getUint8();
911a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos}
921a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
931a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosenum CallType
941a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
951a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	CALL_TYPE_PUSH_GROUP	= 0,
961a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	CALL_TYPE_POP_GROUP,
971a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	CALL_TYPE_INSERT_MARKER,
981a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
991a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	CALL_TYPE_LAST
1001a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos};
1011a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1021a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosclass RandomCase : public TestCase
1031a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
1041a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulospublic:
1051a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	RandomCase (Context& context)
1061a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		: TestCase(context, "random", "Random GL_EXT_debug_marker usage")
1071a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
1081a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
1091a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1101a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	void init (void)
1111a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
1121a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		checkSupport(m_context.getContextInfo());
1131a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
1141a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1151a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	IterateResult iterate (void)
1161a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
1171a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		const glw::Functions&	gl			= m_context.getRenderContext().getFunctions();
1181a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		const int				numIters	= 1000;
1191a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		const int				maxMsgLen	= 4096;
1201a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		de::Random				rnd			(0xaf829c0);
1211a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1221a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		for (int iterNdx = 0; iterNdx < numIters; iterNdx++)
1231a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		{
1241a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos			const CallType		callType	= CallType(rnd.getInt(0, CALL_TYPE_LAST-1));
1251a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1261a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos			if (callType == CALL_TYPE_PUSH_GROUP || callType == CALL_TYPE_INSERT_MARKER)
1271a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos			{
1281a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				const bool		nullTerminate	= rnd.getBool();
1291a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				const bool		passLength		= rnd.getBool();
1301a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				const bool		complexMsg		= rnd.getBool();
1311a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				vector<char>	message;
1321a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1331a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				if (complexMsg)
1341a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos					getComplexRndString(message, rnd, maxMsgLen);
1351a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				else
1361a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos					getSimpleRndString(message, rnd, maxMsgLen);
1371a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1381a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				if (nullTerminate)
1391a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos					message.push_back(char(0));
1401a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1411a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				{
1421a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos					const glw::GLsizei	length	= passLength ? glw::GLsizei(nullTerminate ? message.size()-1 : message.size()) : 0;
1431a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1441a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos					if (callType == CALL_TYPE_PUSH_GROUP)
1451a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos						gl.pushGroupMarkerEXT(length, &message[0]);
1461a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos					else
1471a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos						gl.insertEventMarkerEXT(length, &message[0]);
1481a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				}
1491a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos			}
1501a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos			else
1511a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos				gl.popGroupMarkerEXT();
1521a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		}
1531a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1541a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "Debug marker calls must not set error state");
1551a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1561a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "All calls passed");
1571a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		return STOP;
1581a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
1591a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos};
1601a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1611a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulosclass InvalidCase : public TestCase
1621a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
1631a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulospublic:
1641a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	InvalidCase (Context& context)
1651a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		: TestCase(context, "invalid", "Invalid GL_EXT_debug_marker usage")
1661a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
1671a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
1681a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1691a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	void init (void)
1701a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
1711a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		checkSupport(m_context.getContextInfo());
1721a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
1731a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1741a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	IterateResult iterate (void)
1751a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	{
1761a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		const glw::Functions&	gl	= m_context.getRenderContext().getFunctions();
1771a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1781a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		m_testCtx.getLog() << TestLog::Message << "Note: GL_EXT_debug_marker calls must not report an error even if invalid arguments are supplied." << TestLog::EndMessage;
1791a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1801a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		gl.pushGroupMarkerEXT(-1, "foo");
1811a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		gl.insertEventMarkerEXT(-1, "foo");
1821a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		gl.pushGroupMarkerEXT(0, DE_NULL);
1831a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		gl.insertEventMarkerEXT(0, DE_NULL);
1841a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		gl.pushGroupMarkerEXT(-1, DE_NULL);
1851a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		gl.insertEventMarkerEXT(-1, DE_NULL);
1861a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1871a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "Debug marker calls must not set error state");
1881a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1891a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "All calls passed");
1901a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos		return STOP;
1911a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	}
1921a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos};
1931a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1941a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos} // anonymous
1951a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
1961a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulostcu::TestCaseGroup* createDebugMarkerTests (Context& context)
1971a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos{
1981a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	de::MovePtr<tcu::TestCaseGroup>	debugMarkerGroup	(new tcu::TestCaseGroup(context.getTestContext(), "debug_marker", "GL_EXT_debug_marker tests"));
1991a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
2001a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	debugMarkerGroup->addChild(new IsSupportedCase	(context));
2011a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	debugMarkerGroup->addChild(new RandomCase		(context));
2021a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	debugMarkerGroup->addChild(new InvalidCase		(context));
2031a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
2041a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos	return debugMarkerGroup.release();
2051a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos}
2061a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos
2071a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos} // Functional
2081a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos} // gles2
2091a9576a710673363b2c0d9e5771451cebbfa6d10Pyry Haulos} // deqp
210