13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 2.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 struct tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es2fShaderStructTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsShaderRenderCase.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuStringTemplate.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluTexture.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::StringTemplate;
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::ostringstream;
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glu;
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls;
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles2
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TEXTURE_BRICK = 0 //!< Unit index for brick texture
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum CaseFlags
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FLAG_USES_TEXTURES				= (1<<0),
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FLAG_REQUIRES_DYNAMIC_LOOPS		= (1<<1),
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FLAG_REQUIRES_DYNAMIC_INDEXING	= (1<<2),
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef void (*SetupUniformsFunc) (const glw::Functions& gl, deUint32 programID, const tcu::Vec4& constCoords);
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderStructCase : public ShaderRenderCase
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ShaderStructCase		(Context& context, const char* name, const char* description, bool isVertexCase, deUint32 flags, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc, const char* vertShaderSource, const char* fragShaderSource);
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							~ShaderStructCase		(void);
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					init					(void);
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					deinit					(void);
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void			setupUniforms			(int programID, const tcu::Vec4& constCoords);
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ShaderStructCase		(const ShaderStructCase&);
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderStructCase&		operator=				(const ShaderStructCase&);
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const SetupUniformsFunc	m_setupUniforms;
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const deUint32			m_flags;
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::Texture2D*			m_brickTexture;
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
843c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructCase::ShaderStructCase (Context& context, const char* name, const char* description, bool isVertexCase, deUint32 flags, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc, const char* vertShaderSource, const char* fragShaderSource)
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: ShaderRenderCase	(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, description, isVertexCase, evalFunc)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_setupUniforms	(setupUniformsFunc)
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_flags			(flags)
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_brickTexture	(DE_NULL)
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_vertShaderSource	= vertShaderSource;
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_fragShaderSource	= fragShaderSource;
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructCase::~ShaderStructCase (void)
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_brickTexture;
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructCase::init (void)
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	try
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		gls::ShaderRenderCase::init();
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	catch (const CompileFailed&)
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_flags & FLAG_REQUIRES_DYNAMIC_LOOPS)
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const bool isSupported = m_isVertexCase ? m_ctxInfo.isVertexDynamicLoopSupported() : m_ctxInfo.isFragmentDynamicLoopSupported();
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!isSupported)
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				throw tcu::NotSupportedError("Dynamic loops not supported");
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if ((m_flags && FLAG_USES_TEXTURES) && m_isVertexCase)
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int numTextures = 0;
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_renderCtx.getFunctions().getIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &numTextures);
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (numTextures == 0)
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				throw tcu::NotSupportedError("Vertex shader texture access not supported");
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_flags & FLAG_REQUIRES_DYNAMIC_INDEXING)
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw tcu::NotSupportedError("Dynamic indexing not supported");
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw;
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_flags & FLAG_USES_TEXTURES)
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_brickTexture = glu::Texture2D::create(m_renderCtx, m_ctxInfo, m_testCtx.getArchive(), "data/brick.png");
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_textures.push_back(TextureBinding(m_brickTexture, tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE,
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																		 tcu::Sampler::LINEAR, tcu::Sampler::LINEAR)));
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(m_textures.size() == 1);
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructCase::deinit (void)
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gls::ShaderRenderCase::deinit();
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_brickTexture;
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_brickTexture = DE_NULL;
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructCase::setupUniforms (int programID, const tcu::Vec4& constCoords)
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderRenderCase::setupUniforms(programID, constCoords);
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_setupUniforms)
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_setupUniforms(m_renderCtx.getFunctions(), programID, constCoords);
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic ShaderStructCase* createStructCase (Context& context, const char* name, const char* description, bool isVertexCase, deUint32 flags, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniforms, const LineStream& shaderSrc)
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char* defaultVertSrc =
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec4 a_position;\n"
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"attribute highp vec4 a_coords;\n"
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec4 v_coords;\n\n"
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"	v_coords = a_coords;\n"
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"	gl_Position = a_position;\n"
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char* defaultFragSrc =
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"varying mediump vec4 v_color;\n\n"
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"void main (void)\n"
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"{\n"
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"	gl_FragColor = v_color;\n"
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		"}\n";
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Fill in specialization parameters.
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::map<std::string, std::string> spParams;
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isVertexCase)
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["DECLARATIONS"] =
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"attribute highp vec4 a_position;\n"
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"attribute highp vec4 a_coords;\n"
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			"varying mediump vec4 v_color;";
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["COORDS"]		= "a_coords";
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["DST"]			= "v_color";
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["ASSIGN_POS"]	= "gl_Position = a_position;";
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["DECLARATIONS"]	= "varying mediump vec4 v_coords;";
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["COORDS"]			= "v_coords";
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["DST"]				= "gl_FragColor";
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spParams["ASSIGN_POS"]		= "";
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isVertexCase)
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return new ShaderStructCase(context, name, description, isVertexCase, flags, evalFunc, setupUniforms, StringTemplate(shaderSrc.str()).specialize(spParams).c_str(), defaultFragSrc);
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return new ShaderStructCase(context, name, description, isVertexCase, flags, evalFunc, setupUniforms, defaultVertSrc, StringTemplate(shaderSrc.str()).specialize(spParams).c_str());
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass LocalStructTests : public TestCaseGroup
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LocalStructTests (Context& context)
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: TestCaseGroup(context, "local", "Local structs")
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	~LocalStructTests (void)
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void init (void);
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid LocalStructTests::init (void)
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define LOCAL_STRUCT_CASE(NAME, DESCRIPTION, FLAGS, SHADER_SRC, EVAL_FUNC_BODY)																\
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		do {																																	\
21401af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos			struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY };  /* NOLINT(EVAL_FUNC_BODY) */						\
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, FLAGS, &Eval_##NAME::eval, DE_NULL, SHADER_SRC));			\
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, FLAGS,&Eval_##NAME::eval, DE_NULL, SHADER_SRC));		\
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		} while (deGetFalse())
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(basic, "Basic struct usage", 0,
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, vec3(0.0), ui_one);"
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b = ${COORDS}.yzw;"
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,1,2);
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested, "Nested struct", 0,
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				a;"
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b = T(ui_zero, ${COORDS}.yz);"
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,1,2);
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(array_member, "Struct with array member", 0,
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	b[3];"
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s;"
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.a = ${COORDS}.w;"
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.c = ui_one;"
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b[0] = ${COORDS}.z;"
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b[1] = ${COORDS}.y;"
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b[2] = ${COORDS}.x;"
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b[0], s.b[1], s.c);"
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(3,2,1);
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING,
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	b[3];"
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s;"
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.a = ${COORDS}.w;"
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.c = ui_one;"
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b[0] = ${COORDS}.z;"
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b[1] = ${COORDS}.y;"
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b[2] = ${COORDS}.x;"
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);"
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(1,2,0);
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(struct_array, "Struct array", 0,
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[3];"
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0] = S(${COORDS}.x, ui_zero);"
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a = ${COORDS}.y;"
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b = ui_one;"
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[2] = S(${COORDS}.z, ui_two);"
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);"
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(2,1,0);
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING,
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[3];"
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0] = S(${COORDS}.x, ui_zero);"
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a = ${COORDS}.y;"
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b = ui_one;"
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[2] = S(${COORDS}.z, ui_two);"
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s[ui_two].a, s[ui_one].a, s[ui_zero].a, s[ui_two].b - s[ui_one].b + s[ui_zero].b);"
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(2,1,0);
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested_struct_array, "Nested struct array", 0,
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_two;"
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_three;"
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_four;"
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_half;"
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_third;"
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_fourth;"
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[2];"
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[0]"
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].a         = ${COORDS}.x;"
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].a    = uf_half;"
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[0] = ${COORDS}.xy;"
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[1] = ${COORDS}.zw;"
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].a    = uf_third;"
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[0] = ${COORDS}.zw;"
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[1] = ${COORDS}.xy;"
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].a    = uf_fourth;"
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[0] = ${COORDS}.xz;"
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[1] = ${COORDS}.yw;"
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].c         = ui_zero;"
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[1]"
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a         = ${COORDS}.w;"
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].a    = uf_two;"
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[0] = ${COORDS}.xx;"
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[1] = ${COORDS}.yy;"
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].a    = uf_three;"
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].a    = uf_four;"
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].c         = ui_one;"
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = (s[0].b[1].b[0].x + s[1].b[2].b[1].y) * s[0].b[0].a; // (z + z) * 0.5"
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4"
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = (s[0].b[2].b[1].y + s[0].b[1].b[0].y + s[1].a) * s[0].b[1].a; // (w + w + w) * 0.333"
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0"
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r, g, b, a);"
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(2,0,3);
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING,
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_two;"
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_three;"
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_four;"
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_half;"
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_third;"
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_fourth;"
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[2];"
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[0]"
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].a         = ${COORDS}.x;"
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].a    = uf_half;"
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[0] = ${COORDS}.xy;"
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[1] = ${COORDS}.zw;"
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].a    = uf_third;"
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[0] = ${COORDS}.zw;"
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[1] = ${COORDS}.xy;"
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].a    = uf_fourth;"
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[0] = ${COORDS}.xz;"
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[1] = ${COORDS}.yw;"
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].c         = ui_zero;"
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[1]"
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a         = ${COORDS}.w;"
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].a    = uf_two;"
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[0] = ${COORDS}.xx;"
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[1] = ${COORDS}.yy;"
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].a    = uf_three;"
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].a    = uf_four;"
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].c         = ui_one;"
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = (s[0].b[ui_one].b[ui_one-1].x + s[ui_one].b[ui_two].b[ui_zero+1].y) * s[0].b[0].a; // (z + z) * 0.5"
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = s[ui_two-1].b[ui_two-2].b[ui_zero].y * s[0].b[ui_two].a * s[ui_one].b[2].a; // x * 0.25 * 4"
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = (s[ui_zero].b[ui_one+1].b[1].y + s[0].b[ui_one*ui_one].b[0].y + s[ui_one].a) * s[0].b[ui_two-ui_one].a; // (w + w + w) * 0.333"
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = float(s[ui_zero].c) + s[ui_one-ui_zero].b[ui_two].a - s[ui_zero+ui_one].b[ui_two-ui_one].a; // 0 + 4.0 - 3.0"
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r, g, b, a);"
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(2,0,3);
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(parameter, "Struct as a function parameter", 0,
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "mediump vec4 myFunc (S s)"
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	return vec4(s.a, s.b.x, s.b.y, s.c);"
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}"
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, vec3(0.0), ui_one);"
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b = ${COORDS}.yzw;"
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = myFunc(s);"
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,1,2);
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(parameter_nested, "Nested struct as a function parameter", 0,
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				a;"
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "mediump vec4 myFunc (S s)"
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	return vec4(s.a, s.b.b, s.b.a + s.c);"
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}"
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b = T(ui_zero, ${COORDS}.yz);"
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = myFunc(s);"
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,1,2);
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(return, "Struct as a return value", 0,
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "S myFunc (void)"
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, vec3(0.0), ui_one);"
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b = ${COORDS}.yzw;"
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	return s;"
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}"
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = myFunc();"
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,1,2);
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(return_nested, "Nested struct", 0,
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				a;"
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "S myFunc (void)"
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s.b = T(ui_zero, ${COORDS}.yz);"
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	return s;"
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}"
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = myFunc();"
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,1,2);
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(conditional_assignment, "Conditional struct assignment", 0,
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_one;"
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (uf_one > 0.0)"
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.xy, s.c);"
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(3,2,1);
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(loop_assignment, "Struct assignment in loop", 0,
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < 3; i++)"
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		if (i == 1)"
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.xy, s.c);"
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(3,2,1);
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(dynamic_loop_assignment, "Struct assignment in loop", FLAG_REQUIRES_DYNAMIC_INDEXING,
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_three;"
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < ui_three; i++)"
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		if (i == ui_one)"
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.xy, s.c);"
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(3,2,1);
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested_conditional_assignment, "Conditional assignment of nested struct", 0,
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_one;"
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				a;"
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (uf_one > 0.0)"
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		s.b = T(ui_zero, ${COORDS}.zw);"
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,2,3);
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested_loop_assignment, "Nested struct assignment in loop", 0,
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_one;"
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				a;"
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < 3; i++)"
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		if (i == 1)"
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			s.b = T(ui_zero, ${COORDS}.zw);"
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,2,3);
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested_dynamic_loop_assignment, "Nested struct assignment in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING,
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_three;"
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_one;"
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				a;"
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < ui_three; i++)"
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		if (i == ui_one)"
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			s.b = T(ui_zero, ${COORDS}.zw);"
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(0,2,3);
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(loop_struct_array, "Struct array usage in loop", 0,
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[3];"
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0] = S(${COORDS}.x, ui_zero);"
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a = ${COORDS}.y;"
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b = -ui_one;"
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[2] = S(${COORDS}.z, ui_two);"
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float rgb[3];"
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int alpha = 0;"
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < 3; i++)"
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		rgb[i] = s[2-i].a;"
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		alpha += s[i].b;"
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(2,1,0);
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop", 0,
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_two;"
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_three;"
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_four;"
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_half;"
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_third;"
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_fourth;"
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_sixth;"
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[2];"
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[0]"
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].a         = ${COORDS}.x;"
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].a    = uf_half;"
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[0] = ${COORDS}.yx;"
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[1] = ${COORDS}.zx;"
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].a    = uf_third;"
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[0] = ${COORDS}.yy;"
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[1] = ${COORDS}.wy;"
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].a    = uf_fourth;"
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[0] = ${COORDS}.zx;"
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[1] = ${COORDS}.zy;"
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].c         = ui_zero;"
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[1]"
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a         = ${COORDS}.w;"
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].a    = uf_two;"
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[0] = ${COORDS}.zx;"
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[1] = ${COORDS}.zy;"
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].a    = uf_three;"
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].a    = uf_four;"
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].c         = ui_one;"
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = 1.0;"
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < 2; i++)"
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		for (int j = 0; j < 3; j++)"
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		{"
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			r += s[0].b[j].b[i].y;"
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			g += s[i].b[j].b[0].x;"
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			b += s[i].b[j].b[1].x;"
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			a *= s[i].b[j].a;"
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		}"
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = (c.coords.swizzle(0,1,2) + c.coords.swizzle(1,2,3)) * 0.5f;
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS,
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_three;"
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[3];"
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0] = S(${COORDS}.x, ui_zero);"
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a = ${COORDS}.y;"
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b = -ui_one;"
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[2] = S(${COORDS}.z, ui_two);"
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float rgb[3];"
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int alpha = 0;"
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < ui_three; i++)"
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		rgb[i] = s[2-i].a;"
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		alpha += s[i].b;"
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.coords.swizzle(2,1,0);
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS,
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_three;"
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_two;"
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_three;"
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_four;"
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_half;"
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_third;"
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_fourth;"
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_sixth;"
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S s[2];"
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[0]"
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].a         = ${COORDS}.x;"
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].a    = uf_half;"
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[0] = ${COORDS}.yx;"
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[0].b[1] = ${COORDS}.zx;"
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].a    = uf_third;"
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[0] = ${COORDS}.yy;"
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[1].b[1] = ${COORDS}.wy;"
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].a    = uf_fourth;"
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[0] = ${COORDS}.zx;"
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].b[2].b[1] = ${COORDS}.zy;"
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[0].c         = ui_zero;"
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	// S[1]"
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].a         = ${COORDS}.w;"
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].a    = uf_two;"
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[0] = ${COORDS}.zx;"
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[0].b[1] = ${COORDS}.zy;"
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].a    = uf_three;"
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].a    = uf_four;"
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	s[1].c         = ui_one;"
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = 1.0;"
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < ui_two; i++)"
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		for (int j = 0; j < ui_three; j++)"
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		{"
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			r += s[0].b[j].b[i].y;"
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			g += s[i].b[j].b[0].x;"
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			b += s[i].b[j].b[1].x;"
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			a *= s[i].b[j].a;"
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		}"
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = (c.coords.swizzle(0,1,2) + c.coords.swizzle(1,2,3)) * 0.5f;
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(basic_equal, "Basic struct equality", 0,
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);"
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);"
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == b) ${DST}.x = 1.0;"
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == c) ${DST}.y = 1.0;"
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == d) ${DST}.z = 1.0;"
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0]+0.5f))
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.x() = 1.0f;
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1]+0.5f))
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.y() = 1.0f;
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(basic_not_equal, "Basic struct equality", 0,
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);"
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);"
10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != b) ${DST}.x = 1.0;"
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != c) ${DST}.y = 1.0;"
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != d) ${DST}.z = 1.0;"
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0]+0.5f))
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.x() = 1.0f;
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1]+0.5f))
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.y() = 1.0f;
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.z() = 1.0f;
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested_equal, "Nested struct struct equality", 0,
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	a;"
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				b;"
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);"
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);"
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == b) ${DST}.x = 1.0;"
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == c) ${DST}.y = 1.0;"
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == d) ${DST}.z = 1.0;"
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0]+0.5f))
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.x() = 1.0f;
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1]+0.5f))
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.y() = 1.0f;
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	LOCAL_STRUCT_CASE(nested_not_equal, "Nested struct struct equality", 0,
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	a;"
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				b;"
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);"
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);"
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != b) ${DST}.x = 1.0;"
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != c) ${DST}.y = 1.0;"
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != d) ${DST}.z = 1.0;"
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0]+0.5f))
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.x() = 1.0f;
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1]+0.5f))
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.y() = 1.0f;
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.z() = 1.0f;
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UniformStructTests : public TestCaseGroup
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UniformStructTests (Context& context)
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: TestCaseGroup(context, "uniform", "Uniform structs")
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	~UniformStructTests (void)
11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void init (void);
11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1169dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh#define CHECK_SET_UNIFORM(NAME) GLU_EXPECT_NO_ERROR(gl.getError(), (string("Failed to set ") + (NAME)).c_str())
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define MAKE_SET_VEC_UNIFORM(VECTYPE, SETUNIFORM)															\
11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, const tcu::VECTYPE& vec)	\
11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{																											\
11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int loc = gl.getUniformLocation(programID, name);														\
11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SETUNIFORM(loc, 1, vec.getPtr());																		\
11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CHECK_SET_UNIFORM(name);																				\
11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}																											\
11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct SetUniform##VECTYPE##Dummy_s { int unused; }
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define MAKE_SET_VEC_UNIFORM_PTR(VECTYPE, SETUNIFORM)																		\
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, const tcu::VECTYPE* vec, int arraySize)	\
11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{																															\
11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int loc = gl.getUniformLocation(programID, name);																		\
11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SETUNIFORM(loc, arraySize, vec->getPtr());																				\
11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CHECK_SET_UNIFORM(name);																								\
11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}																															\
11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct SetUniformPtr##VECTYPE##Dummy_s { int unused; }
11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11893c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMAKE_SET_VEC_UNIFORM	(Vec2,	gl.uniform2fv);
11903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMAKE_SET_VEC_UNIFORM	(Vec3,	gl.uniform3fv);
11913c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMAKE_SET_VEC_UNIFORM_PTR(Vec2,	gl.uniform2fv);
11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, float value)
11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int loc = gl.getUniformLocation(programID, name);
11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.uniform1f(loc, value);
11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CHECK_SET_UNIFORM(name);
11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, int value)
12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int loc = gl.getUniformLocation(programID, name);
12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.uniform1i(loc, value);
12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CHECK_SET_UNIFORM(name);
12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid setUniform (const glw::Functions& gl, deUint32 programID, const char* name, const float* value, int arraySize)
12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int loc = gl.getUniformLocation(programID, name);
12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.uniform1fv(loc, arraySize, value);
12113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CHECK_SET_UNIFORM(name);
12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid UniformStructTests::init (void)
12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define UNIFORM_STRUCT_CASE(NAME, DESCRIPTION, FLAGS, SHADER_SRC, SET_UNIFORMS_BODY, EVAL_FUNC_BODY)																\
12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		do {																																							\
1220dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh			struct SetUniforms_##NAME {																																	\
1221dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh				 static void setUniforms (const glw::Functions& gl, deUint32 programID, const tcu::Vec4& constCoords) SET_UNIFORMS_BODY /* NOLINT(SET_UNIFORMS_BODY) */ \
1222dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh			};																																							\
122301af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos			struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY };	/* NOLINT(EVAL_FUNC_BODY) */												\
12243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, FLAGS, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC));			\
12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, FLAGS, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC));		\
12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		} while (deGetFalse())
12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(basic, "Basic struct usage", 0,
12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s;"
12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
12413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.a", constCoords.x());
12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b", constCoords.swizzle(1, 2, 3));
12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.c", 1);
12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(0,1,2);
12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(nested, "Nested struct", 0,
12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				a;"
12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s;"
12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.a",	constCoords.x());
12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b.a",	0);
12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b.b",	constCoords.swizzle(1,2));
12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.c",	1);
12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(0,1,2);
12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(array_member, "Struct with array member", 0,
12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	b[3];"
12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s;"
12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.a, s.b[0], s.b[1], s.c);"
13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.a",	constCoords.w());
13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.c",	1);
13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float b[3];
13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			b[0] = constCoords.z();
13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			b[1] = constCoords.y();
13103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			b[2] = constCoords.x();
13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b", b, DE_LENGTH_OF_ARRAY(b));
13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(3,2,1);
13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING,
13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
13253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	b[3];"
13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s;"
13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);"
13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.a",	constCoords.w());
13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.c",	1);
13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float b[3];
13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			b[0] = constCoords.z();
13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			b[1] = constCoords.y();
13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			b[2] = constCoords.x();
13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b", b, DE_LENGTH_OF_ARRAY(b));
13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(1,2,0);
13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(struct_array, "Struct array", 0,
13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[3];"
13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);"
13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",	constCoords.x());
13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b",	0);
13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",	constCoords.y());
13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b",	1);
13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].a",	constCoords.z());
13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].b",	2);
13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(2,1,0);
13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING,
13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[3];"
13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(s[ui_two].a, s[ui_one].a, s[ui_zero].a, s[ui_two].b - s[ui_one].b + s[ui_zero].b);"
13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",	constCoords.x());
14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b",	0);
14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",	constCoords.y());
14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b",	1);
14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].a",	constCoords.z());
14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].b",	2);
14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(2,1,0);
14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(nested_struct_array, "Nested struct array", 0,
14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[2];"
14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = (s[0].b[1].b[0].x + s[1].b[2].b[1].y) * s[0].b[0].a; // (z + z) * 0.5"
14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4"
14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = (s[0].b[2].b[1].y + s[0].b[1].b[0].y + s[1].a) * s[0].b[1].a; // (w + w + w) * 0.333"
14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0"
14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r, g, b, a);"
14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::Vec2 arr[2];
14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",			constCoords.x());
14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(0,1);
14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,3);
14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].a",	0.5f);
14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,3);
14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(0,1);
14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].a",	1.0f/3.0f);
14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(0,2);
14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(1,3);
14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].a",	1.0f/4.0f);
14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].c",			0);
14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",			constCoords.w());
14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(0,0);
14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(1,1);
14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].a",	2.0f);
14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,2);
14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,3);
14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].a",	3.0f);
14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,0);
14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,2);
14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].a",	4.0f);
14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].c",			1);
14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(2,0,3);
14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing", FLAG_REQUIRES_DYNAMIC_INDEXING,
14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[2];"
14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
14893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = (s[0].b[ui_one].b[ui_one-1].x + s[ui_one].b[ui_two].b[ui_zero+1].y) * s[0].b[0].a; // (z + z) * 0.5"
14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = s[ui_two-1].b[ui_two-2].b[ui_zero].y * s[0].b[ui_two].a * s[ui_one].b[2].a; // x * 0.25 * 4"
14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = (s[ui_zero].b[ui_one+1].b[1].y + s[0].b[ui_one*ui_one].b[0].y + s[ui_one].a) * s[0].b[ui_two-ui_one].a; // (w + w + w) * 0.333"
14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = float(s[ui_zero].c) + s[ui_one-ui_zero].b[ui_two].a - s[ui_zero+ui_one].b[ui_two-ui_one].a; // 0 + 4.0 - 3.0"
14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r, g, b, a);"
14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::Vec2 arr[2];
14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",			constCoords.x());
15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(0,1);
15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,3);
15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].a",	0.5f);
15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,3);
15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(0,1);
15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].a",	1.0f/3.0f);
15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(0,2);
15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(1,3);
15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].a",	1.0f/4.0f);
15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].c",			0);
15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",			constCoords.w());
15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(0,0);
15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(1,1);
15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].a",	2.0f);
15193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,2);
15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,3);
15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].a",	3.0f);
15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,0);
15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,2);
15263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].a",	4.0f);
15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
15283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].c",			1);
15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(2,0,3);
15323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(loop_struct_array, "Struct array usage in loop", 0,
15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[3];"
15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
15493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float rgb[3];"
15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int alpha = 0;"
15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < 3; i++)"
15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		rgb[i] = s[2-i].a;"
15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		alpha += s[i].b;"
15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",	constCoords.x());
15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b",	0);
15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",	constCoords.y());
15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b",	-1);
15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].a",	constCoords.z());
15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].b",	2);
15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(2,1,0);
15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop", 0,
15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_two;"
15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_three;"
15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_four;"
15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_half;"
15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_third;"
15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_fourth;"
15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_sixth;"
15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[2];"
15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = 1.0;"
16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < 2; i++)"
16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		for (int j = 0; j < 3; j++)"
16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		{"
16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			r += s[0].b[j].b[i].y;"
16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			g += s[i].b[j].b[0].x;"
16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			b += s[i].b[j].b[1].x;"
16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			a *= s[i].b[j].a;"
16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		}"
16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
16153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::Vec2 arr[2];
16173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",			constCoords.x());
16193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,0);
16203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,0);
16213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].a",	0.5f);
16223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
16233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,1);
16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,1);
16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].a",	1.0f/3.0f);
16263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
16273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,1);
16283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,1);
16293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].a",	1.0f/4.0f);
16303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
16313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].c",			0);
16323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",			constCoords.w());
16343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,0);
16353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,1);
16363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].a",	2.0f);
16373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
16383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,2);
16393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,3);
16403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].a",	3.0f);
16413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
16423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,0);
16433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,2);
16443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].a",	4.0f);
16453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
16463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].c",			1);
16473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
16483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = (c.constCoords.swizzle(0,1,2) + c.constCoords.swizzle(1,2,3)) * 0.5f;
16503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
16513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS,
16533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
16543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
16553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
16563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
16573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
16583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_three;"
16593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
16603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
16613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
16623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump int		b;"
16633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
16643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[3];"
16653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
16663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
16673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
16683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float rgb[3];"
16693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int alpha = 0;"
16703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < ui_three; i++)"
16713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
16723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		rgb[i] = s[2-i].a;"
16733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		alpha += s[i].b;"
16743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
16753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
16763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
16773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
16783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",	constCoords.x());
16803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b",	0);
16813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",	constCoords.y());
16823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b",	-1);
16833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].a",	constCoords.z());
16843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[2].b",	2);
16853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
16863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.constCoords.swizzle(2,1,0);
16883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
16893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop", FLAG_REQUIRES_DYNAMIC_INDEXING|FLAG_REQUIRES_DYNAMIC_LOOPS,
16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
16923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
16963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_three;"
16973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_two;"
16983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_three;"
16993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_four;"
17003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_half;"
17013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_third;"
17023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_fourth;"
17033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_sixth;"
17043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
17053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
17063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
17073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b[2];"
17083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
17093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
17103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b[3];"
17123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
17133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
17143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[2];"
17153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
17163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
17173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
17183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
17193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
17203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
17213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float a = 1.0;"
17223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	for (int i = 0; i < ui_two; i++)"
17233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	{"
17243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		for (int j = 0; j < ui_three; j++)"
17253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		{"
17263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			r += s[0].b[j].b[i].y;"
17273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			g += s[i].b[j].b[0].x;"
17283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			b += s[i].b[j].b[1].x;"
17293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "			a *= s[i].b[j].a;"
17303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "		}"
17313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	}"
17323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
17333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
17343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
17353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
17363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			tcu::Vec2 arr[2];
17373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a",			constCoords.x());
17393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,0);
17403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,0);
17413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].a",	0.5f);
17423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
17433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,1);
17443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,1);
17453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].a",	1.0f/3.0f);
17463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
17473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,1);
17483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,1);
17493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].a",	1.0f/4.0f);
17503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
17513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].c",			0);
17523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a",			constCoords.w());
17543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,0);
17553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(2,1);
17563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].a",	2.0f);
17573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[0].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
17583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(2,2);
17593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,3);
17603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].a",	3.0f);
17613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[1].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
17623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[0] = constCoords.swizzle(1,0);
17633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			arr[1] = constCoords.swizzle(3,2);
17643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].a",	4.0f);
17653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b[2].b",	&arr[0], DE_LENGTH_OF_ARRAY(arr));
17663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].c",			1);
17673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
17683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
17693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = (c.constCoords.swizzle(0,1,2) + c.constCoords.swizzle(1,2,3)) * 0.5f;
17703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
17713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(sampler, "Sampler in struct", FLAG_USES_TEXTURES,
17733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
17743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
17753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
17763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
17773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
17783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
17793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
17803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	sampler2D		c;"
17813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
17823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s;"
17833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
17843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
17853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
17863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(texture2D(s.c, ${COORDS}.xy * s.b.xy + s.b.z).rgb, s.a);"
17873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
17883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
17893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
17903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_UNREF(constCoords);
17913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.a", 1.0f);
17923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b", tcu::Vec3(0.25f, 0.25f, 0.5f));
17933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.c", 0);
17943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
17953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
17963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0,1) * 0.25f + 0.5f).swizzle(0,1,2);
17973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
17983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(sampler_nested, "Sampler in nested struct", FLAG_USES_TEXTURES,
18003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
18013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
18023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_zero;"
18033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
18043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
18053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct T {"
18063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	sampler2D		a;"
18073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec2	b;"
18083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
18093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
18103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
18113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	T				b;"
18123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
18133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
18143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s;"
18153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
18163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
18173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
18183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(texture2D(s.b.a, ${COORDS}.xy * s.b.b + s.a).rgb, s.c);"
18193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
18203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
18213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_UNREF(constCoords);
18233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.a",	0.5f);
18243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b.a",	0);
18253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.b.b",	tcu::Vec2(0.25f, 0.25f));
18263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s.c",	1);
18273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
18283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0,1) * 0.25f + 0.5f).swizzle(0,1,2);
18303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
18313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(sampler_array, "Sampler in struct array", FLAG_USES_TEXTURES,
18333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
18343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
18353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_one;"
18363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
18373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
18383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
18393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
18403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	sampler2D		c;"
18413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
18423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S s[2];"
18433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
18443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
18453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
18463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(texture2D(s[1].c, ${COORDS}.xy * s[0].b.xy + s[1].b.z).rgb, s[0].a);"
18473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
18483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
18493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_UNREF(constCoords);
18513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].a", 1.0f);
18523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].b", tcu::Vec3(0.25f, 0.25f, 0.25f));
18533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[0].c", 1);
18543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].a", 0.0f);
18553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].b", tcu::Vec3(0.5f, 0.5f, 0.5f));
18563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "s[1].c", 0);
18573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
18583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xyz() = c.texture2D(TEXTURE_BRICK, c.coords.swizzle(0,1) * 0.25f + 0.5f).swizzle(0,1,2);
18603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
18613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(equal, "Struct equality", 0,
18633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
18643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
18653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_one;"
18663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
18673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
18683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
18693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
18703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
18713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
18723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
18733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S a;"
18743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S b;"
18753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S c;"
18763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
18773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
18783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
18793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);"
18803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
18813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == b) ${DST}.x = 1.0;"
18823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == c) ${DST}.y = 1.0;"
18833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a == d) ${DST}.z = 1.0;"
18843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
18853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
18863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_UNREF(constCoords);
18883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "a.a", 1.0f);
18893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "a.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
18903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "a.c", 2);
18913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "b.a", 1.0f);
18923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "b.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
18933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "b.c", 2);
18943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "c.a", 1.0f);
18953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "c.b", tcu::Vec3(0.0f, 1.1f, 2.0f));
18963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "c.c", 2);
18973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
18983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xy() = tcu::Vec2(1.0f, 0.0f);
19003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[1]+1.0f) == deFloatFloor(1.1f))
19013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.z() = 1.0f;
19023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
19033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UNIFORM_STRUCT_CASE(not_equal, "Struct equality", 0,
19053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LineStream()
19063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "${DECLARATIONS}"
19073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform mediump float uf_one;"
19083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform int ui_two;"
19093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
19103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "struct S {"
19113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump float	a;"
19123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	mediump vec3	b;"
19133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	int				c;"
19143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "};"
19153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S a;"
19163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S b;"
19173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "uniform S c;"
19183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< ""
19193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)"
19203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{"
19213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);"
19223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
19233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != b) ${DST}.x = 1.0;"
19243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != c) ${DST}.y = 1.0;"
19253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	if (a != d) ${DST}.z = 1.0;"
19263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "	${ASSIGN_POS}"
19273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "}",
19283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
19293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_UNREF(constCoords);
19303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "a.a", 1.0f);
19313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "a.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
19323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "a.c", 2);
19333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "b.a", 1.0f);
19343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "b.b", tcu::Vec3(0.0f, 1.0f, 2.0f));
19353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "b.c", 2);
19363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "c.a", 1.0f);
19373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "c.b", tcu::Vec3(0.0f, 1.1f, 2.0f));
19383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			setUniform(gl, programID, "c.c", 2);
19393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		},
19403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
19413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			c.color.xy() = tcu::Vec2(0.0f, 1.0f);
19423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (deFloatFloor(c.coords[1]+1.0f) != deFloatFloor(1.1f))
19433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				c.color.z() = 1.0f;
19443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		});
19453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19473c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructTests::ShaderStructTests (Context& context)
19483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "struct", "Struct Tests")
19493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19523c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderStructTests::~ShaderStructTests (void)
19533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderStructTests::init (void)
19573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
19583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new LocalStructTests(m_context));
19593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new UniformStructTests(m_context));
19603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
19613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
19633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles2
19643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
1965