13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Long running shader stress tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3sLongRunningShaderTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderUtil.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluDrawUtil.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp"
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Stress
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec2;
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum LoopType
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOOPTYPE_FOR = 0,
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOOPTYPE_WHILE,
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOOPTYPE_DO_WHILE,
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOOPTYPE_LAST
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum IterCountType
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ITERCOUNTTYPE_STATIC = 0,
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ITERCOUNTTYPE_UNIFORM,
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ITERCOUNTTYPE_DYNAMIC,
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ITERCOUNTTYPE_LAST
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass LongRunningShaderCase : public TestCase
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	struct Params
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*			name;
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*			description;
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glu::ShaderType		shaderType;
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LoopType			loopType;
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		IterCountType		iterCountType;
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int					numInvocations;
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int					minLoopIterCount;
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int					maxLoopIterCount;
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								LongRunningShaderCase		(Context& context, const Params* params);
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								~LongRunningShaderCase		(void);
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						init						(void);
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						deinit						(void);
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult				iterate						(void);
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								LongRunningShaderCase		(const LongRunningShaderCase&);
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LongRunningShaderCase&		operator=					(const LongRunningShaderCase&);
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static glu::ProgramSources	genSources					(const Params& params);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static deUint32				getSeed						(const Params& params);
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const Params* const			m_params;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int					m_numCaseIters;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*			m_program;
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							m_caseIterNdx;
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1093c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderCase::LongRunningShaderCase (Context& context, const Params* params)
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(context, params->name, params->description)
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_params			(params)
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_numCaseIters	(5)
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_program			(DE_NULL)
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_caseIterNdx		(0)
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderCase::~LongRunningShaderCase (void)
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deinit();
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ProgramSources LongRunningShaderCase::genSources (const Params& params)
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const bool			isVertCase		= params.shaderType == glu::SHADERTYPE_VERTEX;
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::ostringstream	vert, frag;
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vert << "#version 300 es\n"
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 << "in highp vec2 a_position;\n";
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "#version 300 es\n";
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (params.iterCountType == ITERCOUNTTYPE_DYNAMIC)
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vert << "in highp int a_iterCount;\n";
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!isVertCase)
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vert << "flat out highp int v_iterCount;\n";
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			frag << "flat in highp int v_iterCount;\n";
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (params.iterCountType == ITERCOUNTTYPE_UNIFORM)
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		(isVertCase ? vert : frag) << "uniform highp int u_iterCount;\n";
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isVertCase)
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vert << "out mediump vec4 v_color;\n";
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		frag << "in mediump vec4 v_color;\n";
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "out mediump vec4 o_color;\n";
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vert << "\nvoid main (void)\n{\n"
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 << "	gl_Position = vec4(a_position, 0.0, 1.0);\n"
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 << "	gl_PointSize = 1.0;\n";
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!isVertCase && params.iterCountType == ITERCOUNTTYPE_DYNAMIC)
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vert << "	v_iterCount = a_iterCount;\n";
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "\nvoid main (void)\n{\n";
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const std::string	iterCount	= params.iterCountType == ITERCOUNTTYPE_DYNAMIC ? (isVertCase ? "a_iterCount" : "v_iterCount")	:
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										  params.iterCountType == ITERCOUNTTYPE_UNIFORM ? "u_iterCount"									:
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										  params.iterCountType == ITERCOUNTTYPE_STATIC	? de::toString(params.maxLoopIterCount)			: "<invalid>";
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* const	body		= "color = cos(sin(color*1.25)*0.8);";
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::ostringstream&	op			= isVertCase ? vert : frag;
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << "	mediump vec4 color = " << (isVertCase ? "a_position.xyxy" : "gl_FragCoord") << ";\n";
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (params.loopType == LOOPTYPE_FOR)
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			op << "	for (highp int i = 0; i < " << iterCount << " || " << iterCount << " < 0; ++i)\n"
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "		" << body << "\n";
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (params.loopType == LOOPTYPE_WHILE)
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			op << "	highp int i = 0;\n"
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "	while (i < " << iterCount << " || " << iterCount << " < 0) {\n"
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "		i += 1;\n"
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "		" << body << "\n"
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "	}\n";
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(params.loopType == LOOPTYPE_DO_WHILE);
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			op << "	highp int i = 0;\n"
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "	do {\n"
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "		i += 1;\n"
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "		" << body << "\n"
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			   << "	} while (i <= " << iterCount << " || " << iterCount << " < 0);\n";
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isVertCase)
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vert << "	v_color = color;\n";
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		frag << "	o_color = v_color;\n";
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		frag << "	o_color = color;\n";
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vert << "}\n";
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "}\n";
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return glu::ProgramSources() << glu::VertexSource(vert.str()) << glu::FragmentSource(frag.str());
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LongRunningShaderCase::init (void)
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(!m_program);
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_program = new glu::ShaderProgram(m_context.getRenderContext(), genSources(*m_params));
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_testCtx.getLog() << *m_program;
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_program->isOk())
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deinit();
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_FAIL("Failed to compile shader program");
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_caseIterNdx = 0;
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_params->iterCountType != ITERCOUNTTYPE_STATIC)
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.getLog() << TestLog::Message << "Loop iteration counts in range: [" << m_params->minLoopIterCount
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											   << ", " << m_params->maxLoopIterCount << "]"
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						   << TestLog::EndMessage;
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_testCtx.getLog() << TestLog::Message << "Number of vertices and fragments: " << m_params->numInvocations << TestLog::EndMessage;
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); // Test will pass or timeout, unless driver/device crashes.
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LongRunningShaderCase::deinit (void)
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_program;
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_program = DE_NULL;
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid genPositions (const tcu::RenderTarget& renderTarget, int numPoints, Vec2* positions)
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	width		= renderTarget.getWidth();
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	height		= renderTarget.getHeight();
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (width*height < numPoints)
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw tcu::NotSupportedError("Too small viewport to fit all test points");
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int pointNdx = 0; pointNdx < numPoints; pointNdx++)
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int		xi		= pointNdx % width;
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int		yi		= pointNdx / height;
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const float		xf		= 2.0f * ((float(xi) + 0.5f) / float(width)) - 1.0f;
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const float		yf		= 2.0f * ((float(yi) + 0.5f) / float(height)) - 1.0f;
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		positions[pointNdx] = Vec2(xf, yf);
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2613c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint32 LongRunningShaderCase::getSeed (const Params& params)
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const deUint32	seed	= deStringHash(params.name)
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							^ deInt32Hash(params.shaderType)
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							^ deInt32Hash(params.loopType)
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							^ deInt32Hash(params.iterCountType)
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							^ deInt32Hash(params.minLoopIterCount)
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							^ deInt32Hash(params.maxLoopIterCount)
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							^ deInt32Hash(params.numInvocations);
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return seed;
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2733c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderCase::IterateResult LongRunningShaderCase::iterate (void)
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glw::Functions&			gl				= m_context.getRenderContext().getFunctions();
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Random						rnd				(getSeed(*m_params));
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<Vec2>					positions		(m_params->numInvocations);
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<int>						iterCounts		(m_params->iterCountType == ITERCOUNTTYPE_DYNAMIC ? m_params->numInvocations : 1);
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<glu::VertexArrayBinding>	vertexArrays;
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vertexArrays.push_back(glu::va::Float("a_position", 2, (int)positions.size(), 0, positions[0].getPtr()));
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_params->iterCountType == ITERCOUNTTYPE_DYNAMIC)
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vertexArrays.push_back(glu::va::Int32("a_iterCount", 1, (int)iterCounts.size(), 0, &iterCounts[0]));
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	genPositions(m_context.getRenderTarget(), (int)positions.size(), &positions[0]);
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (vector<int>::iterator i = iterCounts.begin(); i != iterCounts.end(); ++i)
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		*i = rnd.getInt(m_params->minLoopIterCount, m_params->maxLoopIterCount);
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.useProgram(m_program->getProgram());
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_params->iterCountType == ITERCOUNTTYPE_UNIFORM)
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		gl.uniform1i(gl.getUniformLocation(m_program->getProgram(), "u_iterCount"), iterCounts[0]);
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::draw(m_context.getRenderContext(), m_program->getProgram(),
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			  (int)vertexArrays.size(), &vertexArrays[0],
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			  glu::pr::Points(m_params->numInvocations));
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_caseIterNdx += 1;
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (m_caseIterNdx < m_numCaseIters) ? CONTINUE : STOP;
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderTests::LongRunningShaderTests (Context& context)
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "long_running_shaders",	"Long-running shader stress tests")
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3103c827367444ee418f129b2c238299f49d3264554Jarkko PoyryLongRunningShaderTests::~LongRunningShaderTests (void)
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LongRunningShaderTests::init (void)
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	numInvocations	= 4096;
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	shortLoopMin	= 5;
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	shortLoopMax	= 10;
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	mediumLoopMin	= 10000;
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	mediumLoopMax	= 50000;
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	longLoopMin		= 100000;
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	longLoopMax		= 500000;
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const LongRunningShaderCase::Params s_cases[] =
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "short_for_vertex",					"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	shortLoopMin,	shortLoopMax	},
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "short_for_fragment",					"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	shortLoopMin,	shortLoopMax	},
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "short_while_vertex",					"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	shortLoopMin,	shortLoopMax	},
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "short_while_fragment",				"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	shortLoopMin,	shortLoopMax	},
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "short_do_while_vertex",				"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	shortLoopMin,	shortLoopMax	},
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "short_do_while_fragment",			"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	shortLoopMin,	shortLoopMax	},
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_static_for_vertex",			"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_FOR,		ITERCOUNTTYPE_STATIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_static_while_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_WHILE,		ITERCOUNTTYPE_STATIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_uniform_do_while_vertex",		"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_UNIFORM,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_uniform_for_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_FOR,		ITERCOUNTTYPE_UNIFORM,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_dynamic_for_vertex",			"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_dynamic_for_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_dynamic_while_vertex",		"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_dynamic_while_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_dynamic_do_while_vertex",		"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "medium_dynamic_do_while_fragment",	"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	mediumLoopMin,	mediumLoopMax	},
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_static_while_vertex",			"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_WHILE,		ITERCOUNTTYPE_STATIC,	numInvocations,	longLoopMin,	longLoopMax		},
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_static_do_while_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_STATIC,	numInvocations,	longLoopMin,	longLoopMax		},
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_uniform_for_vertex",			"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_FOR,		ITERCOUNTTYPE_UNIFORM,	numInvocations,	longLoopMin,	longLoopMax		},
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_uniform_do_while_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_UNIFORM,	numInvocations,	longLoopMin,	longLoopMax		},
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_dynamic_for_vertex",			"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	longLoopMin,	longLoopMax		},
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_dynamic_for_fragment",			"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	longLoopMin,	longLoopMax		},
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_dynamic_while_vertex",			"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	longLoopMin,	longLoopMax		},
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_dynamic_while_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	longLoopMin,	longLoopMax		},
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_dynamic_do_while_vertex",		"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	longLoopMin,	longLoopMax		},
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "long_dynamic_do_while_fragment",		"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	longLoopMin,	longLoopMax		},
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "infinite_for_vertex",				"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	-1,				-1				},
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "infinite_for_fragment",				"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_FOR,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	-1,				-1				},
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "infinite_while_vertex",				"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	-1,				-1				},
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "infinite_while_fragment",			"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_WHILE,		ITERCOUNTTYPE_DYNAMIC,	numInvocations,	-1,				-1				},
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "infinite_do_while_vertex",			"",	glu::SHADERTYPE_VERTEX,		LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	-1,				-1				},
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ "infinite_do_while_fragment",			"",	glu::SHADERTYPE_FRAGMENT,	LOOPTYPE_DO_WHILE,	ITERCOUNTTYPE_DYNAMIC,	numInvocations,	-1,				-1				},
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_cases); ndx++)
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new LongRunningShaderCase(m_context, &s_cases[ndx]));
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Stress
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
372