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 Shader return statement tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fShaderReturnTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsShaderRenderCase.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuStringTemplate.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <map>
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <sstream>
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string>
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::StringTemplate;
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::map;
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::ostringstream;
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glu;
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls;
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum ReturnMode
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RETURNMODE_ALWAYS = 0,
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RETURNMODE_NEVER,
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RETURNMODE_DYNAMIC,
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	RETURNMODE_LAST
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Evaluation functions
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void evalReturnAlways	(ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); }
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void evalReturnNever		(ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(3,2,1); }
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void evalReturnDynamic	(ShaderEvalContext& c) { c.color.xyz() = (c.coords.x()+c.coords.y() >= 0.0f) ? c.coords.swizzle(0,1,2) : c.coords.swizzle(3,2,1); }
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic ShaderEvalFunc getEvalFunc (ReturnMode mode)
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (mode)
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_ALWAYS:		return evalReturnAlways;
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_NEVER:		return evalReturnNever;
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_DYNAMIC:	return evalReturnDynamic;
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return (ShaderEvalFunc)DE_NULL;
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderReturnCase : public ShaderRenderCase
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						ShaderReturnCase			(Context& context, const char* name, const char* description, bool isVertexCase, const char* shaderSource, ShaderEvalFunc evalFunc);
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual				~ShaderReturnCase			(void);
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
823c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderReturnCase::ShaderReturnCase (Context& context, const char* name, const char* description, bool isVertexCase, const char* shaderSource, ShaderEvalFunc evalFunc)
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, description, isVertexCase, evalFunc)
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isVertexCase)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_vertShaderSource = shaderSource;
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_fragShaderSource =
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"#version 300 es\n"
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"in mediump vec4 v_color;\n"
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"layout(location = 0) out mediump vec4 o_color;\n\n"
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"void main (void)\n"
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"{\n"
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    o_color = v_color;\n"
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"}\n";
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_fragShaderSource = shaderSource;
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_vertShaderSource =
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"#version 300 es\n"
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"in  highp   vec4 a_position;\n"
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"in  highp   vec4 a_coords;\n"
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"out mediump vec4 v_coords;\n\n"
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"void main (void)\n"
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"{\n"
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    gl_Position = a_position;\n"
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    v_coords = a_coords;\n"
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"}\n";
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1133c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderReturnCase::~ShaderReturnCase (void)
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderReturnTests::ShaderReturnTests (Context& context)
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "return", "Return Statement Tests")
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderReturnTests::~ShaderReturnTests (void)
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderReturnCase* makeConditionalReturnInFuncCase (Context& context, const char* name, const char* description, ReturnMode returnMode, bool isVertex)
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Template
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StringTemplate tmpl(
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in ${COORDPREC} vec4 ${COORDS};\n"
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"${EXTRADECL}\n"
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"${COORDPREC} vec4 getColor (void)\n"
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    if (${RETURNCOND})\n"
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"        return vec4(${COORDS}.xyz, 1.0);\n"
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return vec4(${COORDS}.wzy, 1.0);\n"
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"${POSITIONWRITE}"
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    ${OUTPUT} = getColor();\n"
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n");
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* coords = isVertex ? "a_coords" : "v_coords";
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	map<string, string> params;
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["COORDPREC"]		= isVertex ? "highp"		: "mediump";
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["OUTPUT"]		= isVertex ? "v_color"		: "o_color";
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["COORDS"]		= coords;
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["EXTRADECL"]		= isVertex ? "in highp vec4 a_position;\nout mediump vec4 v_color;\n" : "layout(location = 0) out mediump vec4 o_color;\n";
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["POSITIONWRITE"]	= isVertex ? "    gl_Position = a_position;\n" : "";
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (returnMode)
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_ALWAYS:		params["RETURNCOND"] = "true";											break;
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_NEVER:		params["RETURNCOND"] = "false";											break;
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_DYNAMIC:	params["RETURNCOND"] = string(coords) + ".x+" + coords + ".y >= 0.0";	break;
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:					DE_ASSERT(DE_FALSE);
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new ShaderReturnCase(context, name, description, isVertex, tmpl.specialize(params).c_str(), getEvalFunc(returnMode));
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1663c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderReturnCase* makeOutputWriteReturnCase (Context& context, const char* name, const char* description, bool inFunction, ReturnMode returnMode, bool isVertex)
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Template
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StringTemplate tmpl(
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inFunction
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		?
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"#version 300 es\n"
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"in ${COORDPREC} vec4 ${COORDS};\n"
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"${EXTRADECL}\n"
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"void myfunc (void)\n"
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"{\n"
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    ${OUTPUT} = vec4(${COORDS}.xyz, 1.0);\n"
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    if (${RETURNCOND})\n"
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"        return;\n"
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    ${OUTPUT} = vec4(${COORDS}.wzy, 1.0);\n"
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"}\n\n"
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"void main (void)\n"
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"{\n"
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"${POSITIONWRITE}"
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    myfunc();\n"
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"}\n"
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		:
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"#version 300 es\n"
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"in ${COORDPREC} vec4 ${COORDS};\n"
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"uniform mediump int ui_one;\n"
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"${EXTRADECL}\n"
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"void main ()\n"
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"{\n"
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"${POSITIONWRITE}"
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    ${OUTPUT} = vec4(${COORDS}.xyz, 1.0);\n"
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    if (${RETURNCOND})\n"
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"        return;\n"
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"    ${OUTPUT} = vec4(${COORDS}.wzy, 1.0);\n"
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"}\n");
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* coords = isVertex ? "a_coords" : "v_coords";
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	map<string, string> params;
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["COORDPREC"]		= isVertex ? "highp"		: "mediump";
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["COORDS"]		= coords;
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["OUTPUT"]		= isVertex ? "v_color"			: "o_color";
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["EXTRADECL"]		= isVertex ? "in highp vec4 a_position;\nout mediump vec4 v_color;\n" : "layout(location = 0) out mediump vec4 o_color;\n";
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["POSITIONWRITE"]	= isVertex ? "    gl_Position = a_position;\n" : "";
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (returnMode)
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_ALWAYS:		params["RETURNCOND"] = "true";											break;
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_NEVER:		params["RETURNCOND"] = "false";											break;
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_DYNAMIC:	params["RETURNCOND"] = string(coords) + ".x+" + coords + ".y >= 0.0";	break;
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:					DE_ASSERT(DE_FALSE);
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new ShaderReturnCase(context, name, description, isVertex, tmpl.specialize(params).c_str(), getEvalFunc(returnMode));
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderReturnCase* makeReturnInLoopCase (Context& context, const char* name, const char* description, bool isDynamicLoop, ReturnMode returnMode, bool isVertex)
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Template
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	StringTemplate tmpl(
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in ${COORDPREC} vec4 ${COORDS};\n"
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"uniform mediump int ui_one;\n"
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"${EXTRADECL}\n"
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"${COORDPREC} vec4 getCoords (void)\n"
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    ${COORDPREC} vec4 coords = ${COORDS};\n"
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    for (int i = 0; i < ${ITERLIMIT}; i++)\n"
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    {\n"
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"        if (${RETURNCOND})\n"
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"            return coords;\n"
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"        coords = coords.wzyx;\n"
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    }\n"
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return coords;\n"
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"${POSITIONWRITE}"
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    ${OUTPUT} = vec4(getCoords().xyz, 1.0);\n"
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n");
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* coords = isVertex ? "a_coords" : "v_coords";
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	map<string, string> params;
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["COORDPREC"]		= isVertex ? "highp"		: "mediump";
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["OUTPUT"]		= isVertex ? "v_color"		: "o_color";
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["COORDS"]		= coords;
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["EXTRADECL"]		= isVertex ? "in highp vec4 a_position;\nout mediump vec4 v_color;\n" : "layout(location = 0) out mediump vec4 o_color;\n";
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["POSITIONWRITE"]	= isVertex ? "    gl_Position = a_position;\n" : "";
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	params["ITERLIMIT"]		= isDynamicLoop ? "ui_one" : "1";
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (returnMode)
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_ALWAYS:		params["RETURNCOND"] = "true";											break;
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_NEVER:		params["RETURNCOND"] = "false";											break;
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_DYNAMIC:	params["RETURNCOND"] = string(coords) + ".x+" + coords + ".y >= 0.0";	break;
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:					DE_ASSERT(DE_FALSE);
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new ShaderReturnCase(context, name, description, isVertex, tmpl.specialize(params).c_str(), getEvalFunc(returnMode));
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* getReturnModeName (ReturnMode mode)
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (mode)
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_ALWAYS:		return "always";
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_NEVER:		return "never";
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_DYNAMIC:	return "dynamic";
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return DE_NULL;
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* getReturnModeDesc (ReturnMode mode)
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (mode)
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_ALWAYS:		return "Always return";
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_NEVER:		return "Never return";
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RETURNMODE_DYNAMIC:	return "Return based on coords";
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return DE_NULL;
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderReturnTests::init (void)
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Single return statement in function.
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "single_return_vertex", "Single return statement in function", true,
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_position;\n"
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_coords;\n"
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"out highp vec4 v_color;\n\n"
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"vec4 getColor (void)\n"
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return vec4(a_coords.xyz, 1.0);\n"
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    gl_Position = a_position;\n"
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    v_color = getColor();\n"
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "single_return_fragment", "Single return statement in function", false,
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in mediump vec4 v_coords;\n"
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"layout(location = 0) out mediump vec4 o_color;\n"
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"mediump vec4 getColor (void)\n"
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return vec4(v_coords.xyz, 1.0);\n"
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    o_color = getColor();\n"
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Conditional return statement in function.
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int returnMode = 0; returnMode < RETURNMODE_LAST; returnMode++)
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int isFragment = 0; isFragment < 2; isFragment++)
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			string name			= string("conditional_return_") + getReturnModeName((ReturnMode)returnMode) + (isFragment ? "_fragment" : "_vertex");
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			string description	= string(getReturnModeDesc((ReturnMode)returnMode)) + " in function";
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addChild(makeConditionalReturnInFuncCase(m_context, name.c_str(), description.c_str(), (ReturnMode)returnMode, isFragment == 0));
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Unconditional double return in function.
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "double_return_vertex", "Unconditional double return in function", true,
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_position;\n"
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_coords;\n"
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"out highp vec4 v_color;\n\n"
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"vec4 getColor (void)\n"
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return vec4(a_coords.xyz, 1.0);\n"
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return vec4(a_coords.wzy, 1.0);\n"
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    gl_Position = a_position;\n"
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    v_color = getColor();\n"
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "double_return_fragment", "Unconditional double return in function", false,
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in mediump vec4 v_coords;\n"
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"layout(location = 0) out mediump vec4 o_color;\n\n"
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"mediump vec4 getColor (void)\n"
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return vec4(v_coords.xyz, 1.0);\n"
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return vec4(v_coords.wzy, 1.0);\n"
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    o_color = getColor();\n"
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Last statement in main.
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "last_statement_in_main_vertex", "Return as a final statement in main()", true,
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_position;\n"
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_coords;\n"
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"out highp vec4 v_color;\n\n"
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    gl_Position = a_position;\n"
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    v_color = vec4(a_coords.xyz, 1.0);\n"
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return;\n"
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "last_statement_in_main_fragment", "Return as a final statement in main()", false,
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in mediump vec4 v_coords;\n"
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"layout(location = 0) out mediump vec4 o_color;\n\n"
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    o_color = vec4(v_coords.xyz, 1.0);\n"
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return;\n"
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Return between output variable writes.
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int inFunc = 0; inFunc < 2; inFunc++)
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int returnMode = 0; returnMode < RETURNMODE_LAST; returnMode++)
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int isFragment = 0; isFragment < 2; isFragment++)
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string name = string("output_write_") + (inFunc ? "in_func_" : "") + getReturnModeName((ReturnMode)returnMode) + (isFragment ? "_fragment" : "_vertex");
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string desc = string(getReturnModeDesc((ReturnMode)returnMode)) + (inFunc ? " in user-defined function" : " in main()") + " between output writes";
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				addChild(makeOutputWriteReturnCase(m_context, name.c_str(), desc.c_str(), inFunc != 0, (ReturnMode)returnMode, isFragment == 0));
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Conditional return statement in loop.
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int isDynamicLoop = 0; isDynamicLoop < 2; isDynamicLoop++)
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int returnMode = 0; returnMode < RETURNMODE_LAST; returnMode++)
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int isFragment = 0; isFragment < 2; isFragment++)
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string name			= string("return_in_") + (isDynamicLoop ? "dynamic" : "static") + "_loop_" + getReturnModeName((ReturnMode)returnMode) + (isFragment ? "_fragment" : "_vertex");
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string description	= string(getReturnModeDesc((ReturnMode)returnMode)) + " in loop";
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				addChild(makeReturnInLoopCase(m_context, name.c_str(), description.c_str(), isDynamicLoop != 0, (ReturnMode)returnMode, isFragment == 0));
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Unconditional return in infinite loop.
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "return_in_infinite_loop_vertex", "Return in infinite loop", true,
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_position;\n"
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in highp vec4 a_coords;\n"
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"out highp vec4 v_color;\n"
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"uniform int ui_zero;\n\n"
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"highp vec4 getCoords (void)\n"
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"	for (int i = 1; i < 10; i += ui_zero)\n"
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"		return a_coords;\n"
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"	return a_coords.wzyx;\n"
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    gl_Position = a_position;\n"
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    v_color = vec4(getCoords().xyz, 1.0);\n"
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return;\n"
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new ShaderReturnCase(m_context, "return_in_infinite_loop_fragment", "Return in infinite loop", false,
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"#version 300 es\n"
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"in mediump vec4 v_coords;\n"
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"layout(location = 0) out mediump vec4 o_color;\n"
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"uniform int ui_zero;\n\n"
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"mediump vec4 getCoords (void)\n"
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"	for (int i = 1; i < 10; i += ui_zero)\n"
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"		return v_coords;\n"
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"	return v_coords.wzyx;\n"
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n\n"
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    o_color = vec4(getCoords().xyz, 1.0);\n"
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"    return;\n"
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n", evalReturnAlways));
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
457