1d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal/*------------------------------------------------------------------------
2d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * Vulkan Conformance Tests
3d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * ------------------------
4d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *
5d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * Copyright (c) 2015 The Khronos Group Inc.
6d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7c05b7f1437e619205c96eaa31c0b79ec97a0d47dPyry Haulos * Copyright (c) 2016 The Android Open Source Project
8d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
12d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
14d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
20d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *
21d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *//*!
22d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * \file
23d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal * \brief Shader struct tests.
24d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal *//*--------------------------------------------------------------------*/
25d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
26d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "vktShaderRenderStructTests.hpp"
27d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "vktShaderRender.hpp"
28d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "tcuStringTemplate.hpp"
29d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal#include "deMath.h"
30d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
31d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galnamespace vkt
32d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
33d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galnamespace sr
34d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
35d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galnamespace
36d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
37d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
38d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass ShaderStructCase : public ShaderRenderCase
39d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
40d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic:
41d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal						ShaderStructCase		(tcu::TestContext&	testCtx,
42d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal												 const std::string&	name,
43d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal												 const std::string&	description,
44d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal												 bool				isVertexCase,
45d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal												 ShaderEvalFunc		evalFunc,
46d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal												 UniformSetupFunc	setupUniformsFunc,
47d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal												 const std::string&	vertShaderSource,
48d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal												 const std::string&	fragShaderSource);
49d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal						~ShaderStructCase		(void);
50d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
51d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galprivate:
52d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal						ShaderStructCase		(const ShaderStructCase&);
53d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	ShaderStructCase&	operator=				(const ShaderStructCase&);
54d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal};
55d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
56d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructCase::ShaderStructCase (tcu::TestContext&	testCtx,
57d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal									const std::string&	name,
58d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal									const std::string&	description,
59d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal									bool				isVertexCase,
60d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal									ShaderEvalFunc		evalFunc,
61d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal									UniformSetupFunc	setupUniformsFunc,
62d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal									const std::string&	vertShaderSource,
63d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal									const std::string&	fragShaderSource)
64d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	: ShaderRenderCase	(testCtx, name, description, isVertexCase, evalFunc, new UniformSetup(setupUniformsFunc), DE_NULL)
65d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
66d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	m_vertShaderSource	= vertShaderSource;
67d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	m_fragShaderSource	= fragShaderSource;
68d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
69d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
70d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructCase::~ShaderStructCase (void)
71d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
72d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
73d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
74d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galstatic de::MovePtr<ShaderStructCase> createStructCase (tcu::TestContext& testCtx, const std::string& name, const std::string& description, bool isVertexCase, ShaderEvalFunc evalFunc, UniformSetupFunc uniformFunc, const LineStream& shaderSrc)
75d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
76d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	static std::string defaultVertSrc =
77168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác		"#version 310 es\n"
78d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"layout(location = 0) in highp vec4 a_position;\n"
79d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"layout(location = 1) in highp vec4 a_coords;\n"
80d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"layout(location = 0) out mediump vec4 v_coords;\n\n"
81d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"void main (void)\n"
82d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"{\n"
83d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"	v_coords = a_coords;\n"
84d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"	gl_Position = a_position;\n"
85d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"}\n";
86d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	static std::string defaultFragSrc =
87168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác		"#version 310 es\n"
88d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"layout(location = 0) in mediump vec4 v_color;\n"
89d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"layout(location = 0) out mediump vec4 o_color;\n\n"
90d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"void main (void)\n"
91d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"{\n"
92d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"	o_color = v_color;\n"
93d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		"}\n";
94d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
95d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	// Fill in specialization parameters and build the shader source.
96d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	std::string vertSrc;
97d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	std::string fragSrc;
98d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	std::map<std::string, std::string> spParams;
99d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
100d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	if (isVertexCase)
101d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	{
102d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["HEADER"] =
103168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác			"#version 310 es\n"
104d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			"layout(location = 0) in highp vec4 a_position;\n"
105d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			"layout(location = 1) in highp vec4 a_coords;\n"
106d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			"layout(location = 0) out mediump vec4 v_color;";
107d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["COORDS"]		= "a_coords";
108d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["DST"]			= "v_color";
109d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["ASSIGN_POS"]	= "gl_Position = a_position;";
110d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
111d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		vertSrc = tcu::StringTemplate(shaderSrc.str()).specialize(spParams);
112d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		fragSrc = defaultFragSrc;
113d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	}
114d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	else
115d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	{
116d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["HEADER"]	=
117168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác			"#version 310 es\n"
118d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			"layout(location = 0) in mediump vec4 v_coords;\n"
119d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			"layout(location = 0) out mediump vec4 o_color;";
120d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["COORDS"]			= "v_coords";
121d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["DST"]				= "o_color";
122d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		spParams["ASSIGN_POS"]		= "";
123d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
124d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		vertSrc = defaultVertSrc;
125d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		fragSrc = tcu::StringTemplate(shaderSrc.str()).specialize(spParams);
126d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	}
127d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
128d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	return de::MovePtr<ShaderStructCase>(new ShaderStructCase(testCtx, name, description, isVertexCase, evalFunc, uniformFunc, vertSrc, fragSrc));
129d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
130d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
131d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass LocalStructTests : public tcu::TestCaseGroup
132d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
133d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic:
134d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LocalStructTests (tcu::TestContext& testCtx)
135d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		: TestCaseGroup(testCtx, "local", "Local structs")
136d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	{
137d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	}
138d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
139d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	~LocalStructTests (void)
140d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	{
141d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	}
142d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
143d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	virtual void init (void);
144d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal};
145d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
146d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galvoid LocalStructTests::init (void)
147d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
148dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh	#define LOCAL_STRUCT_CASE(NAME, DESCRIPTION, SHADER_SRC, SET_UNIFORMS_BODY, EVAL_FUNC_BODY)																				\
149dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh		do {																																								\
150dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh			struct SetUniforms_##NAME { static void setUniforms (ShaderRenderCaseInstance& instance, const tcu::Vec4&) SET_UNIFORMS_BODY }; /* NOLINT(SET_UNIFORMS_BODY) */ \
151dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh			struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY };	/* NOLINT(EVAL_FUNC_BODY) */													\
152d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			addChild(createStructCase(m_testCtx, #NAME "_vertex", DESCRIPTION, true, &Eval_##NAME::eval, &SetUniforms_##NAME::setUniforms, SHADER_SRC).release());			\
153d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			addChild(createStructCase(m_testCtx, #NAME "_fragment", DESCRIPTION, false, &Eval_##NAME::eval, &SetUniforms_##NAME::setUniforms, SHADER_SRC).release());		\
154d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		} while (deGetFalse())
155d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
156d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(basic, "Basic struct usage",
157d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
158d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
159d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
160d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
161d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
162d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
163d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
164d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
165d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
166d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
167d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
168d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
169d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, vec3(0.0), ui_one);"
170d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b = ${COORDS}.yzw;"
171d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
172d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
173d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
174d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
175d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
176d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
177d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
178d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 1, 2);
179d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
180d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
181d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested, "Nested struct",
182d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
183d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
184d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
185d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
186d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
187d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
188d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				a;"
189d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b;"
190d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
191d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
192d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
193d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
194d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
195d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
196d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
197d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
198d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
199d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
200d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b = T(ui_zero, ${COORDS}.yz);"
201d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
202d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
203d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
204d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
205d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
206d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
207d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
208d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
209d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 1, 2);
210d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
211d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
212d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(array_member, "Struct with array member",
213d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
214d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
215d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
216d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
217d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
218d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
219d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	b[3];"
220d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
221d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
222d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
223d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
224d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
225d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s;"
226d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.a = ${COORDS}.w;"
227d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.c = ui_one;"
228d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b[0] = ${COORDS}.z;"
229d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b[1] = ${COORDS}.y;"
230d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b[2] = ${COORDS}.x;"
231d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b[0], s.b[1], s.c);"
232d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
233d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
234d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
235d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
236d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
237d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
238d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(3, 2, 1);
239d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
240d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
241d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing",
242d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
243d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
244d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
245d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
246d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
247d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
248d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
249d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
250d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	b[3];"
251d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
252d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
253d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
254d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
255d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
256d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s;"
257d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.a = ${COORDS}.w;"
258d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.c = ui_one;"
259d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b[0] = ${COORDS}.z;"
260d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b[1] = ${COORDS}.y;"
261d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b[2] = ${COORDS}.x;"
262d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);"
263d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
264d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
265d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
266d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
267d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
268d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
269d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
270d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
271d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(1,2,0);
272d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
273d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
274d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(struct_array, "Struct array",
275d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
276d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
277d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
278d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
279d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
280d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
281d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
282d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
283d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
284d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
285d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
286d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
287d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
288d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[3];"
289d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0] = S(${COORDS}.x, ui_zero);"
290d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a = ${COORDS}.y;"
291d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b = ui_one;"
292d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[2] = S(${COORDS}.z, ui_two);"
293d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);"
294d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
295d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
296d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
297d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
298d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
299d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
300d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
301d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
302d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(2, 1, 0);
303d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
304d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
305d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing",
306d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
307d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
308d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
309d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
310d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
311d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
312d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
313d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
314d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
315d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
316d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
317d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
318d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
319d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[3];"
320d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0] = S(${COORDS}.x, ui_zero);"
321d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a = ${COORDS}.y;"
322d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b = ui_one;"
323d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[2] = S(${COORDS}.z, ui_two);"
324d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${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);"
325d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
326d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
327d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
328d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
329d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
330d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
331d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
332d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
333d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(2, 1, 0);
334d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
335d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
336d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested_struct_array, "Nested struct array",
337d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
338d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
339d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
340d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
341d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
342d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };"
343d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };"
344d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };"
345d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };"
346d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };"
347d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };"
348d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
349d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
350d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
351d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
352d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
353d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
354d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
355d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
356d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
357d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
358d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
359d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
360d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
361d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[2];"
362d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
363d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	// S[0]"
364d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].a         = ${COORDS}.x;"
365d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].a    = uf_half;"
366d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[0] = ${COORDS}.xy;"
367d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[1] = ${COORDS}.zw;"
368d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].a    = uf_third;"
369d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[0] = ${COORDS}.zw;"
370d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[1] = ${COORDS}.xy;"
371d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].a    = uf_fourth;"
372d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[0] = ${COORDS}.xz;"
373d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[1] = ${COORDS}.yw;"
374d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].c         = ui_zero;"
375d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
376d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	// S[1]"
377d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a         = ${COORDS}.w;"
378d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].a    = uf_two;"
379d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[0] = ${COORDS}.xx;"
380d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[1] = ${COORDS}.yy;"
381d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].a    = uf_three;"
382d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
383d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
384d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].a    = uf_four;"
385d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
386d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
387d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].c         = ui_one;"
388d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
389d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
390d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4"
391d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
392d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0"
393d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r, g, b, a);"
394d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
395d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
396d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
397d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
398d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
399d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
400d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UF_TWO);
401d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(4u, UF_THREE);
402d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(5u, UF_FOUR);
403d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(6u, UF_HALF);
404d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(7u, UF_THIRD);
405d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(8u, UF_FOURTH);
406d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
407d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
408d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(2, 0, 3);
409d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
410d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
411d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing",
412d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
413d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
414d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
415d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
416d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
417d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };"
418d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };"
419d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };"
420d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };"
421d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };"
422d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };"
423d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
424d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
425d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
426d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
427d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
428d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
429d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
430d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
431d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
432d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
433d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
434d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
435d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
436d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[2];"
437d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
438d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	// S[0]"
439d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].a         = ${COORDS}.x;"
440d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].a    = uf_half;"
441d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[0] = ${COORDS}.xy;"
442d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[1] = ${COORDS}.zw;"
443d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].a    = uf_third;"
444d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[0] = ${COORDS}.zw;"
445d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[1] = ${COORDS}.xy;"
446d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].a    = uf_fourth;"
447d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[0] = ${COORDS}.xz;"
448d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[1] = ${COORDS}.yw;"
449d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].c         = ui_zero;"
450d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
451d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	// S[1]"
452d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a         = ${COORDS}.w;"
453d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].a    = uf_two;"
454d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[0] = ${COORDS}.xx;"
455d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[1] = ${COORDS}.yy;"
456d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].a    = uf_three;"
457d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
458d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
459d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].a    = uf_four;"
460d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
461d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
462d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].c         = ui_one;"
463d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
464d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
465d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
466d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
467d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
468d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r, g, b, a);"
469d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
470d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
471d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
472d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
473d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
474d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
475d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UF_TWO);
476d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(4u, UF_THREE);
477d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(5u, UF_FOUR);
478d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(6u, UF_HALF);
479d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(7u, UF_THIRD);
480d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(8u, UF_FOURTH);
481d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
482d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
483d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(2, 0, 3);
484d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
485d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
486d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(parameter, "Struct as a function parameter",
487d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
488d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
489d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
490d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
491d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
492d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
493d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
494d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
495d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
496d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
497d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "mediump vec4 myFunc (S s)"
498d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
499d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	return vec4(s.a, s.b.x, s.b.y, s.c);"
500d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}"
501d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
502d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
503d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
504d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, vec3(0.0), ui_one);"
505d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b = ${COORDS}.yzw;"
506d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = myFunc(s);"
507d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
508d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
509d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
510d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
511d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
512d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
513d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 1, 2);
514d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
515d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
516d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(parameter_nested, "Nested struct as a function parameter",
517d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
518d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
519d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
520d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
521d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
522d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
523d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				a;"
524d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b;"
525d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
526d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
527d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
528d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
529d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
530d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
531d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
532d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "mediump vec4 myFunc (S s)"
533d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
534d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	return vec4(s.a, s.b.b, s.b.a + s.c);"
535d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}"
536d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
537d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
538d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
539d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
540d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b = T(ui_zero, ${COORDS}.yz);"
541d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = myFunc(s);"
542d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
543d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
544d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
545d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
546d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
547d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
548d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
549d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 1, 2);
550d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
551d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
552d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(return, "Struct as a return value",
553d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
554d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
555d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
556d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
557d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
558d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
559d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
560d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
561d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
562d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
563d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "S myFunc (void)"
564d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
565d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, vec3(0.0), ui_one);"
566d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b = ${COORDS}.yzw;"
567d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	return s;"
568d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}"
569d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
570d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
571d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
572d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = myFunc();"
573d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
574d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
575d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
576d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
577d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
578d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
579d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
580d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 1, 2);
581d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
582d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
583d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(return_nested, "Nested struct",
584d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
585d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
586d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
587d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
588d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
589d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
590d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				a;"
591d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b;"
592d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
593d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
594d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
595d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
596d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
597d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
598d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
599d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "S myFunc (void)"
600d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
601d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, T(0, vec2(0.0)), ui_one);"
602d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s.b = T(ui_zero, ${COORDS}.yz);"
603d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	return s;"
604d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}"
605d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
606d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
607d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
608d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = myFunc();"
609d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
610d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
611d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
612d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
613d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
614d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
615d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
616d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
617d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 1, 2);
618d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
619d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
620d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(conditional_assignment, "Conditional struct assignment",
621d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
622d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
623d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
624d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
625d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { mediump float uf_one; };"
626d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
627d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
628d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
629d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
630d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
631d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
632d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
633d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
634d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
635d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
636d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (uf_one > 0.0)"
637d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
638d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.xy, s.c);"
639d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
640d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
641d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
642d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
643d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
644d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UF_ONE);
645d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
646d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
647d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(3, 2, 1);
648d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
649d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
650d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(loop_assignment, "Struct assignment in loop",
651d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
652d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
653d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
654d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
655d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
656d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
657d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
658d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
659d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
660d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
661d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
662d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
663d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
664d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
665d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < 3; i++)"
666d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
667d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		if (i == 1)"
668d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
669d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
670d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.xy, s.c);"
671d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
672d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
673d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
674d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
675d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
676d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
677d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
678d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(3, 2, 1);
679d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
680d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
681d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(dynamic_loop_assignment, "Struct assignment in loop",
682d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
683d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
684d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
685d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
686d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_three; };"
687d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
688d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
689d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
690d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
691d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
692d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
693d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
694d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
695d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
696d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, ${COORDS}.yzw, ui_zero);"
697d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < ui_three; i++)"
698d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
699d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		if (i == ui_one)"
700d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			s = S(${COORDS}.w, ${COORDS}.zyx, ui_one);"
701d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
702d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.xy, s.c);"
703d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
704d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
705d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
706d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
707d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
708d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_THREE);
709d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
710d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
711d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(3, 2, 1);
712d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
713d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
714d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested_conditional_assignment, "Conditional assignment of nested struct",
715d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
716d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
717d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
718d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
719d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { mediump float uf_one; };"
720d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
721d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
722d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				a;"
723d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b;"
724d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
725d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
726d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
727d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
728d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
729d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
730d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
731d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
732d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
733d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
734d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (uf_one > 0.0)"
735d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		s.b = T(ui_zero, ${COORDS}.zw);"
736d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
737d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
738d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
739d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
740d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
741d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
742d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UF_ONE);
743d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
744d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
745d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 2, 3);
746d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
747d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
748d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested_loop_assignment, "Nested struct assignment in loop",
749d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
750d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
751d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
752d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
753d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { mediump float uf_one; };"
754d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
755d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
756d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				a;"
757d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b;"
758d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
759d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
760d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
761d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
762d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
763d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
764d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
765d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
766d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
767d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
768d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < 3; i++)"
769d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
770d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		if (i == 1)"
771d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			s.b = T(ui_zero, ${COORDS}.zw);"
772d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
773d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
774d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
775d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
776d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
777d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
778d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
779d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UF_ONE);
780d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
781d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
782d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 2, 3);
783d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
784d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
785d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested_dynamic_loop_assignment, "Nested struct assignment in dynamic loop",
786d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
787d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
788d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
789d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
790d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_three; };"
791d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_one; };"
792d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
793d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
794d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				a;"
795d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b;"
796d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
797d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
798d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
799d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
800d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
801d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
802d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
803d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
804d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
805d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s = S(${COORDS}.x, T(ui_one, ${COORDS}.yz), ui_one);"
806d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < ui_three; i++)"
807d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
808d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		if (i == ui_one)"
809d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			s.b = T(ui_zero, ${COORDS}.zw);"
810d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
811d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.b, s.c - s.b.a);"
812d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
813d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
814d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
815d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
816d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
817d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_THREE);
818d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UF_ONE);
819d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
820d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
821d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(0, 2, 3);
822d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
823d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
824d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(loop_struct_array, "Struct array usage in loop",
825d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
826d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
827d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
828d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
829d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
830d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
831d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
832d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
833d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
834d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
835d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
836d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
837d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
838d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[3];"
839d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0] = S(${COORDS}.x, ui_zero);"
840d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a = ${COORDS}.y;"
841d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b = -ui_one;"
842d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[2] = S(${COORDS}.z, ui_two);"
843d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
844d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float rgb[3];"
845d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int alpha = 0;"
846d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < 3; i++)"
847d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
848d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		rgb[i] = s[2-i].a;"
849d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		alpha += s[i].b;"
850d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
851d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
852d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
853d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
854d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
855d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
856d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
857d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
858d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
859d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
860d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(2, 1, 0);
861d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
862d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
863d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop",
864d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
865d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
866d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
867d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
868d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
869d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };"
870d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };"
871d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };"
872d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };"
873d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };"
874d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };"
875d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_sixth; };"
876d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
877d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
878d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
879d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
880d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
881d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
882d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
883d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
884d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
885d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
886d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
887d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
888d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
889d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[2];"
890d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
891d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	// S[0]"
892d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].a         = ${COORDS}.x;"
893d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].a    = uf_half;"
894d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[0] = ${COORDS}.yx;"
895d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[1] = ${COORDS}.zx;"
896d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].a    = uf_third;"
897d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[0] = ${COORDS}.yy;"
898d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[1] = ${COORDS}.wy;"
899d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].a    = uf_fourth;"
900d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[0] = ${COORDS}.zx;"
901d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[1] = ${COORDS}.zy;"
902d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].c         = ui_zero;"
903d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
904d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	// S[1]"
905d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a         = ${COORDS}.w;"
906d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].a    = uf_two;"
907d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[0] = ${COORDS}.zx;"
908d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[1] = ${COORDS}.zy;"
909d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].a    = uf_three;"
910d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
911d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
912d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].a    = uf_four;"
913d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
914d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
915d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].c         = ui_one;"
916d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
917d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
918d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
919d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
920d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float a = 1.0;"
921d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < 2; i++)"
922d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
923d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		for (int j = 0; j < 3; j++)"
924d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		{"
925d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			r += s[0].b[j].b[i].y;"
926d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			g += s[i].b[j].b[0].x;"
927d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			b += s[i].b[j].b[1].x;"
928d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			a *= s[i].b[j].a;"
929d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		}"
930d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
931d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
932d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
933d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
934d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
935d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
936d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
937d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
938d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UF_TWO);
939d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(4u, UF_THREE);
940d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(5u, UF_FOUR);
941d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(6u, UF_HALF);
942d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(7u, UF_THIRD);
943d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(8u, UF_FOURTH);
944d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(9u, UF_SIXTH);
945d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
946d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
947d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = (c.coords.swizzle(0, 1, 2) + c.coords.swizzle(1, 2, 3)) * 0.5f;
948d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
949d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
950d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop",
951d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
952d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
953d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
954d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
955d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
956d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };"
957d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
958d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
959d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
960d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
961d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
962d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
963d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
964d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
965d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[3];"
966d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0] = S(${COORDS}.x, ui_zero);"
967d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a = ${COORDS}.y;"
968d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b = -ui_one;"
969d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[2] = S(${COORDS}.z, ui_two);"
970d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
971d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float rgb[3];"
972d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int alpha = 0;"
973d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < ui_three; i++)"
974d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
975d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		rgb[i] = s[2-i].a;"
976d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		alpha += s[i].b;"
977d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
978d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
979d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
980d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
981d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
982d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
983d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
984d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
985d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UI_THREE);
986d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
987d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
988d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.coords.swizzle(2, 1, 0);
989d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
990d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
991d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop",
992d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
993d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
994d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
995d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
996d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
997d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };"
998d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_two; };"
999d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_three; };"
1000d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_four; };"
1001d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_half; };"
1002d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_third; };"
1003d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_fourth; };"
1004d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 10) uniform buffer10 { mediump float uf_sixth; };"
1005d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1006d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1007d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1008d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
1009d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1010d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1011d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1012d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
1013d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1014d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1015d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1016d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1017d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1018d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S s[2];"
1019d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1020d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].a         = ${COORDS}.x;"
1021d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].a    = uf_half;"
1022d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[0] = ${COORDS}.yx;"
1023d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[0].b[1] = ${COORDS}.zx;"
1024d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].a    = uf_third;"
1025d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[0] = ${COORDS}.yy;"
1026d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[1].b[1] = ${COORDS}.wy;"
1027d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].a    = uf_fourth;"
1028d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[0] = ${COORDS}.zx;"
1029d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].b[2].b[1] = ${COORDS}.zy;"
1030d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[0].c         = ui_zero;"
1031d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1032d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].a         = ${COORDS}.w;"
1033d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].a    = uf_two;"
1034d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[0] = ${COORDS}.zx;"
1035d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[0].b[1] = ${COORDS}.zy;"
1036d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].a    = uf_three;"
1037d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[0] = ${COORDS}.zz;"
1038d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[1].b[1] = ${COORDS}.ww;"
1039d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].a    = uf_four;"
1040d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[0] = ${COORDS}.yx;"
1041d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].b[2].b[1] = ${COORDS}.wz;"
1042d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	s[1].c         = ui_one;"
1043d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1044d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
1045d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
1046d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
1047d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float a = 1.0;"
1048d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < ui_two; i++)"
1049d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
1050d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		for (int j = 0; j < ui_three; j++)"
1051d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		{"
1052d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			r += s[0].b[j].b[i].y;"
1053d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			g += s[i].b[j].b[0].x;"
1054d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			b += s[i].b[j].b[1].x;"
1055d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			a *= s[i].b[j].a;"
1056d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		}"
1057d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
1058d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
1059d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1060d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1061d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1062d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1063d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1064d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1065d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UI_THREE);
1066d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(4u, UF_TWO);
1067d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(5u, UF_THREE);
1068d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(6u, UF_FOUR);
1069d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(7u, UF_HALF);
1070d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(8u, UF_THIRD);
1071d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(9u, UF_FOURTH);
1072d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(10u, UF_SIXTH);
1073d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1074d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1075d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = (c.coords.swizzle(0, 1, 2) + c.coords.swizzle(1, 2, 3)) * 0.5f;
1076d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1077d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1078d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(basic_equal, "Basic struct equality",
1079d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1080d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1081d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
1082d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };"
1083d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1084d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1085d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1086d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
1087d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1088d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1089d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1090d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1091d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1092d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1093d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1094d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);"
1095d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);"
1096d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1097d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == b) ${DST}.x = 1.0;"
1098d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == c) ${DST}.y = 1.0;"
1099d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == d) ${DST}.z = 1.0;"
1100d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1101d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1102d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1103d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
1104d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_TWO);
1105d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1106d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1107d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0] + 0.5f))
1108d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.x() = 1.0f;
1109d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1] + 0.5f))
1110d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.y() = 1.0f;
1111d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1112d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1113d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(basic_not_equal, "Basic struct equality",
1114d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1115d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1116d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
1117d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };"
1118d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1119d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1120d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1121d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
1122d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1123d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1124d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1125d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1126d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1127d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S a = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1128d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S b = S(floor(${COORDS}.x+0.5), vec3(0.0, floor(${COORDS}.y), 2.3), ui_one);"
1129d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S c = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one);"
1130d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S d = S(floor(${COORDS}.x), vec3(0.0, floor(${COORDS}.y), 2.3), ui_two);"
1131d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1132d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != b) ${DST}.x = 1.0;"
1133d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != c) ${DST}.y = 1.0;"
1134d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != d) ${DST}.z = 1.0;"
1135d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1136d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1137d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1138d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
1139d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_TWO);
1140d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1141d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1142d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0] + 0.5f))
1143d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.x() = 1.0f;
1144d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1] + 0.5f))
1145d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.y() = 1.0f;
1146d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.z() = 1.0f;
1147d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1148d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1149d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested_equal, "Nested struct struct equality",
1150d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1151d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1152d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
1153d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };"
1154d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1155d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1156d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	a;"
1157d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				b;"
1158d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1159d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1160d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1161d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
1162d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1163d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1164d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1165d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1166d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1167d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1168d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1169d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);"
1170d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);"
1171d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1172d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == b) ${DST}.x = 1.0;"
1173d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == c) ${DST}.y = 1.0;"
1174d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == d) ${DST}.z = 1.0;"
1175d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1176d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1177d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1178d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
1179d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_TWO);
1180d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1181d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1182d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[0]) == deFloatFloor(c.coords[0] + 0.5f))
1183d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.x() = 1.0f;
1184d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[1]) == deFloatFloor(c.coords[1] + 0.5f))
1185d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.y() = 1.0f;
1186d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1187d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1188d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	LOCAL_STRUCT_CASE(nested_not_equal, "Nested struct struct equality",
1189d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1190d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1191d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
1192d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };"
1193d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1194d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1195d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	a;"
1196d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				b;"
1197d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1198d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1199d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1200d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
1201d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1202d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1203d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1204d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1205d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1206d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S a = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1207d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S b = S(floor(${COORDS}.x+0.5), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_one), 1);"
1208d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S c = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y+0.5), 2.3), ui_one), 1);"
1209d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S d = S(floor(${COORDS}.x), T(vec3(0.0, floor(${COORDS}.y), 2.3), ui_two), 1);"
1210d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1211d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != b) ${DST}.x = 1.0;"
1212d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != c) ${DST}.y = 1.0;"
1213d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != d) ${DST}.z = 1.0;"
1214d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1215d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1216d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1217d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
1218d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_TWO);
1219d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1220d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1221d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[0]) != deFloatFloor(c.coords[0] + 0.5f))
1222d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.x() = 1.0f;
1223d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[1]) != deFloatFloor(c.coords[1] + 0.5f))
1224d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.y() = 1.0f;
1225d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.z() = 1.0f;
1226d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1227d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
1228d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1229d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass UniformStructTests : public tcu::TestCaseGroup
1230d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
1231d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic:
1232d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UniformStructTests (tcu::TestContext& testCtx)
1233d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		: TestCaseGroup(testCtx, "uniform", "Uniform structs")
1234d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	{
1235d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	}
1236d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1237d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	~UniformStructTests (void)
1238d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	{
1239d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	}
1240d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1241d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	virtual void init (void);
1242d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal};
1243d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1244d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galvoid UniformStructTests::init (void)
1245d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
1246d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	#define UNIFORM_STRUCT_CASE(NAME, DESCRIPTION, SHADER_SRC, SET_UNIFORMS_BODY, EVAL_FUNC_BODY)																\
1247d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		do {																																							\
1248dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh			struct SetUniforms_##NAME {																																	\
1249dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh				 static void setUniforms (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) SET_UNIFORMS_BODY  /* NOLINT(SET_UNIFORMS_BODY) */			\
1250dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh			};																																							\
1251dc795cd4f3d064cbbe2bf9899bf2088d206b7434Chih-Hung Hsieh			struct Eval_##NAME { static void eval (ShaderEvalContext& c) EVAL_FUNC_BODY };  /* NOLINT(EVAL_FUNC_BODY) */												\
1252d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			addChild(createStructCase(m_testCtx, #NAME "_vertex", DESCRIPTION, true, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC).release());		\
1253d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			addChild(createStructCase(m_testCtx, #NAME "_fragment", DESCRIPTION, false, Eval_##NAME::eval, SetUniforms_##NAME::setUniforms, SHADER_SRC).release());		\
1254d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		} while (deGetFalse())
1255d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1256d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(basic, "Basic struct usage",
1257d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1258d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1259d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
1260d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1261d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1262d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1263d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
1264d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1265d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1266d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { S s; };"
1267d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1268d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1269d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1270d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.x, s.b.y, s.c);"
1271d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1272d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1273d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1274d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
1275d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1276d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1277d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			a;
1278d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			_padding1[3];
1279d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				tcu::Vec3		b;
1280d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int				c;
1281d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1282d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1283d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s;
1284d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.a = constCoords.x();
1285d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b = constCoords.swizzle(1, 2, 3);
1286d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.c = 1;
1287d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(1u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &s);
1288d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1289d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1290d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(0, 1, 2);
1291d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1292d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1293d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(nested, "Nested struct",
1294d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1295d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1296d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1297d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1298d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1299d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1300d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				a;"
1301d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b;"
1302d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1303d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1304d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1305d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b;"
1306d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1307d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1308d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { S s; };"
1309d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1310d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1311d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1312d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b.b, s.b.a + s.c);"
1313d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1314d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1315d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1316d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1317d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1318d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1319d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct T {
1320d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int				a;
13211f7f0dcc9f99fef08f4dc493948d313578e1bbf6pflisiko				float			_padding1[1];
13225a2bbfbad4c3b87d44fa75188b53ff6fd56cf6c8pflisiko				tcu::Vec2		b;
1323d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1324d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1325d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1326d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			a;
1327d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			_padding1[3];
1328d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				T				b;
1329d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int				c;
13301f7f0dcc9f99fef08f4dc493948d313578e1bbf6pflisiko				float			_padding2[3];
1331d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1332d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1333d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s;
1334d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.a = constCoords.x();
1335d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b.a = 0;
1336d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b.b = constCoords.swizzle(1, 2);
1337d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.c = 1;
1338d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(2u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,sizeof(S), &s);
1339d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1340d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1341d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(0, 1, 2);
1342d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1343d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1344d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(array_member, "Struct with array member",
1345d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1346d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1347d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_one; };"
1348d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1349d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1350d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1351d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	b[3];"
1352d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1353d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1354d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { S s; };"
1355d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1356d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1357d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1358d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.a, s.b[0], s.b[1], s.c);"
1359d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1360d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1361d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1362d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ONE);
1363d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1364d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct paddedFloat {
1365d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float value;
1366d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float _padding[3];
1367d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1368d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1369d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1370d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				paddedFloat	a;
1371d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				paddedFloat	b[3];
1372d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int			c;
1373d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1374d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1375d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s;
1376d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.a.value = constCoords.w();
1377d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b[0].value = constCoords.z();
1378d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b[1].value = constCoords.y();
1379d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b[2].value = constCoords.x();
1380d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.c = 1;
1381d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(1u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,sizeof(S), &s);
1382d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1383d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1384d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(3, 2, 1);
1385d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1386d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1387d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(array_member_dynamic_index, "Struct with array member, dynamic indexing",
1388d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1389d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1390d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1391d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1392d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1393d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1394d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1395d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1396d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	b[3];"
1397d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1398d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1399d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { S s; };"
1400d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1401d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1402d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1403d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s.b[ui_one], s.b[ui_zero], s.b[ui_two], s.c);"
1404d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1405d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1406d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1407d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1408d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1409d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1410d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1411d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct paddedFloat {
1412d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float value;
1413d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float _padding[3];
1414d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1415d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1416d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1417d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				paddedFloat	a;
1418d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				paddedFloat	b[3];
1419d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int			c;
1420d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1421d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1422d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s;
1423d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.a.value = constCoords.w();
1424d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b[0].value = constCoords.z();
1425d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b[1].value = constCoords.y();
1426d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.b[2].value = constCoords.x();
1427d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s.c = 1;
1428d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &s);
1429d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1430d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1431d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(1, 2, 0);
1432d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1433d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1434d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(struct_array, "Struct array",
1435d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1436d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1437d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1438d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1439d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1440d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1441d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1442d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1443d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
1444d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1445d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { S s[3]; };"
1446d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1447d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1448d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1449d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(s[2].a, s[1].a, s[0].a, s[2].b - s[1].b + s[0].b);"
1450d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1451d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1452d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1453d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1454d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1455d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1456d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1457d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1458d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1459d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		b;
1460d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[2];
1461d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1462d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1463d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[3];
1464d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1465d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b = 0;
1466d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.y();
1467d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b = 1;
1468d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].a = constCoords.z();
1469d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].b = 2;
1470d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3 * sizeof(S), s);
1471d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1472d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1473d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(2, 1, 0);
1474d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1475d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1476d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(struct_array_dynamic_index, "Struct array with dynamic indexing",
1477d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1478d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1479d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1480d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1481d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1482d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1483d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1484d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1485d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
1486d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1487d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { S s[3]; };"
1488d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1489d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1490d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1491d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${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);"
1492d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1493d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1494d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1495d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1496d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1497d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1498d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1499d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1500d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1501d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		b;
1502d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[2];
1503d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1504d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1505d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[3];
1506d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1507d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b = 0;
1508d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.y();
1509d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b = 1;
1510d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].a = constCoords.z();
1511d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].b = 2;
1512d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3 * sizeof(S), s);
1513d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1514d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1515d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(2, 1, 0);
1516d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1517d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1518d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(nested_struct_array, "Nested struct array",
1519d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1520d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1521d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1522d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1523d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
1524d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1525d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1526d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1527d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
1528d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1529d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1530d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { S s[2]; };"
1531d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1532d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1533d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1534d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
1535d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float g = s[1].b[0].b[0].y * s[0].b[2].a * s[1].b[2].a; // x * 0.25 * 4"
1536d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
1537d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float a = float(s[0].c) + s[1].b[2].a - s[1].b[1].a; // 0 + 4.0 - 3.0"
1538d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r, g, b, a);"
1539d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1540d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1541d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1542d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1543d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct T {
1544d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		a;
1545d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		_padding1[3];
1546d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				tcu::Vec4	b[2];
1547d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1548d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1549d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1550d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1551d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[3];
1552d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				T		b[3];
1553d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		c;
1554d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding2[3];
1555d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1556d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1557d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[2];
1558d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1559d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].a = 0.5f;
1560d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[0] = constCoords.swizzle(0,1,0,0);
1561d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[1] = constCoords.swizzle(2,3,0,0);
1562d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].a = 1.0f / 3.0f;
1563d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[0] = constCoords.swizzle(2,3,0,0);
1564d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[1] = constCoords.swizzle(0,1,0,0);
1565d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].a = 1.0f / 4.0f;
1566d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[0] = constCoords.swizzle(0,2,0,0);
1567d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[1] = constCoords.swizzle(1,3,0,0);
1568d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].c = 0;
1569d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1570d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.w();
1571d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].a = 2.0f;
1572d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[0] = constCoords.swizzle(0,0,0,0);
1573d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[1] = constCoords.swizzle(1,1,0,0);
1574d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].a = 3.0f;
1575d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0);
1576d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0);
1577d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].a = 4.0f;
1578d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0);
1579d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0);
1580d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].c = 1;
1581d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1582d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(0u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s);
1583d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1584d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1585d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(2, 0, 3);
1586d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1587d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1588d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(nested_struct_array_dynamic_index, "Nested struct array with dynamic indexing",
1589d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1590d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1591d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1592d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1593d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1594d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1595d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1596d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1597d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
1598d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1599d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1600d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1601d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
1602d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1603d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1604d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (set = 0, binding = 3) uniform buffer3 { S s[2]; };"
1605d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1606d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1607d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1608d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
1609d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
1610d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
1611d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	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"
1612d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r, g, b, a);"
1613d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1614d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1615d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1616d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct T {
1617d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		a;
1618d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		_padding1[3];
1619d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				tcu::Vec4	b[2];
1620d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1621d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1622d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1623d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1624d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[3];
1625d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				T		b[3];
1626d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		c;
1627d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding2[3];
1628d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1629d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1630d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[2];
1631d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1632d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].a = 0.5f;
1633d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[0] = constCoords.swizzle(0,1,0,0);
1634d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[1] = constCoords.swizzle(2,3,0,0);
1635d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].a = 1.0f / 3.0f;
1636d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[0] = constCoords.swizzle(2,3,0,0);
1637d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[1] = constCoords.swizzle(0,1,0,0);
1638d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].a = 1.0f / 4.0f;
1639d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[0] = constCoords.swizzle(0,2,0,0);
1640d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[1] = constCoords.swizzle(1,3,0,0);
1641d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].c = 0;
1642d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1643d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.w();
1644d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].a = 2.0f;
1645d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[0] = constCoords.swizzle(0,0,0,0);
1646d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[1] = constCoords.swizzle(1,1,0,0);
1647d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].a = 3.0f;
1648d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0);
1649d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0);
1650d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].a = 4.0f;
1651d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0);
1652d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0);
1653d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].c = 1;
1654d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1655d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1656d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1657d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1658d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s);
1659d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1660d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1661d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(2, 0, 3);
1662d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1663d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(loop_struct_array, "Struct array usage in loop",
1664d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1665d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1666d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1667d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1668d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1669d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1670d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1671d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1672d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
1673d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1674d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { S s[3]; };"
1675d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1676d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1677d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1678d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float rgb[3];"
1679d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int alpha = 0;"
1680d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < 3; i++)"
1681d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
1682d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		rgb[i] = s[2-i].a;"
1683d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		alpha += s[i].b;"
1684d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
1685d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
1686d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1687d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1688d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1689d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1690d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1691d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1692d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1693d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1694d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1695d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		b;
1696d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[2];
1697d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1698d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1699d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[3];
1700d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1701d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b = 0;
1702d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.y();
1703d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b = -1;
1704d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].a = constCoords.z();
1705d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].b = 2;
1706d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u * sizeof(S), s);
1707d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1708d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1709d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(2, 1, 0);
1710d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1711d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1712d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(loop_nested_struct_array, "Nested struct array usage in loop",
1713d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1714d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1715d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1716d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1717d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1718d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { mediump float uf_two; };"
1719d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_three; };"
1720d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_four; };"
1721d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_half; };"
1722d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_third; };"
1723d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_fourth; };"
1724d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_sixth; };"
1725d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1726d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1727d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1728d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
1729d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1730d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1731d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1732d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
1733d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1734d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1735d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 10) uniform buffer10 { S s[2]; };"
1736d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1737d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1738d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1739d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
1740d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
1741d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
1742d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float a = 1.0;"
1743d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < 2; i++)"
1744d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
1745d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		for (int j = 0; j < 3; j++)"
1746d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		{"
1747d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			r += s[0].b[j].b[i].y;"
1748d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			g += s[i].b[j].b[0].x;"
1749d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			b += s[i].b[j].b[1].x;"
1750d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			a *= s[i].b[j].a;"
1751d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		}"
1752d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
1753d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
1754d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1755d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1756d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1757d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1758d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1759d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1760d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UF_TWO);
1761d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(4u, UF_THREE);
1762d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(5u, UF_FOUR);
1763d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(6u, UF_HALF);
1764d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(7u, UF_THIRD);
1765d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(8u, UF_FOURTH);
1766d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(9u, UF_SIXTH);
1767d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1768d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct T {
1769d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		a;
1770d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		_padding1[3];
1771d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				tcu::Vec4	b[2];
1772d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1773d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1774d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1775d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1776d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[3];
1777d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				T		b[3];
1778d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		c;
1779d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding2[3];
1780d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1781d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1782d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[2];
1783d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1784d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].a = 0.5f;
1785d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[0] = constCoords.swizzle(1,0,0,0);
1786d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[1] = constCoords.swizzle(2,0,0,0);
1787d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].a = 1.0f / 3.0f;
1788d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[0] = constCoords.swizzle(1,1,0,0);
1789d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[1] = constCoords.swizzle(3,1,0,0);
1790d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].a = 1.0f / 4.0f;
1791d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[0] = constCoords.swizzle(2,1,0,0);
1792d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[1] = constCoords.swizzle(2,1,0,0);
1793d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].c = 0;
1794d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1795d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.w();
1796d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].a = 2.0f;
1797d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[0] = constCoords.swizzle(2,0,0,0);
1798d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[1] = constCoords.swizzle(2,1,0,0);
1799d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].a = 3.0f;
1800d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0);
1801d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0);
1802d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].a = 4.0f;
1803d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0);
1804d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0);
1805d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].c = 1;
1806d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1807d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(10u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s);
1808d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1809d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1810d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1811d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = (c.constCoords.swizzle(0, 1, 2) + c.constCoords.swizzle(1, 2, 3)) * 0.5f;
1812d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1813d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1814d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(dynamic_loop_struct_array, "Struct array usage in dynamic loop",
1815d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1816d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1817d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1818d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1819d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1820d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };"
1821d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1822d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1823d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1824d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump int		b;"
1825d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1826d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { S s[3]; };"
1827d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1828d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1829d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1830d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float rgb[3];"
1831d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int alpha = 0;"
1832d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < ui_three; i++)"
1833d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
1834d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		rgb[i] = s[2-i].a;"
1835d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		alpha += s[i].b;"
1836d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
1837d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(rgb[0], rgb[1], rgb[2], alpha);"
1838d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1839d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1840d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1841d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1842d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1843d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1844d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UI_THREE);
1845d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1846d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1847d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1848d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		b;
1849d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[2];
1850d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1851d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1852d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[3];
1853d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1854d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b = 0;
1855d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.y();
1856d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b = -1;
1857d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].a = constCoords.z();
1858d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[2].b = 2;
1859d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(4u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3u * sizeof(S), s);
1860d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1861d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1862d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1863d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = c.constCoords.swizzle(2, 1, 0);
1864d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1865d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1866d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(dynamic_loop_nested_struct_array, "Nested struct array usage in dynamic loop",
1867d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1868d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1869d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { int ui_zero; };"
1870d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_one; };"
1871d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { int ui_two; };"
1872d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { int ui_three; };"
1873d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { mediump float uf_two; };"
1874d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 5) uniform buffer5 { mediump float uf_three; };"
1875d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 6) uniform buffer6 { mediump float uf_four; };"
1876d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 7) uniform buffer7 { mediump float uf_half; };"
1877d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 8) uniform buffer8 { mediump float uf_third; };"
1878d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 9) uniform buffer9 { mediump float uf_fourth; };"
1879d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 10) uniform buffer10 { mediump float uf_sixth; };"
1880d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1881d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct T {"
1882d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1883d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec2	b[2];"
1884d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1885d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1886d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1887d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	T				b[3];"
1888d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1889d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1890533b2651cc2f6ac8da907fcb1b2932ec53576e3dpflisiko		<< "layout (std140, set = 0, binding = 11) uniform buffer11 { S s[2]; };"
1891d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1892d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1893d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1894d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float r = 0.0; // (x*3 + y*3) / 6.0"
1895d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float g = 0.0; // (y*3 + z*3) / 6.0"
1896d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float b = 0.0; // (z*3 + w*3) / 6.0"
1897d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float a = 1.0;"
1898d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	for (int i = 0; i < ui_two; i++)"
1899d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	{"
1900d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		for (int j = 0; j < ui_three; j++)"
1901d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		{"
1902d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			r += s[0].b[j].b[i].y;"
1903d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			g += s[i].b[j].b[0].x;"
1904d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			b += s[i].b[j].b[1].x;"
1905d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "			a *= s[i].b[j].a;"
1906d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "		}"
1907d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	}"
1908d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(r*uf_sixth, g*uf_sixth, b*uf_sixth, a);"
1909d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1910d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1911d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1912d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UI_ZERO);
1913d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_ONE);
1914d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(2u, UI_TWO);
1915d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(3u, UI_THREE);
1916d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(4u, UF_TWO);
1917d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(5u, UF_THREE);
1918d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(6u, UF_FOUR);
1919d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(7u, UF_HALF);
1920d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(8u, UF_THIRD);
1921d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(9u, UF_FOURTH);
1922d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(10u, UF_SIXTH);
1923d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1924d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct T {
1925d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		a;
1926d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float		_padding1[3];
1927d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				tcu::Vec4	b[2];
1928d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1929d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1930d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
1931d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	a;
1932d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding1[3];
1933d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				T		b[3];
1934d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int		c;
1935d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float	_padding2[3];
1936d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
1937d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1938d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S s[2];
1939d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].a = constCoords.x();
1940d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].a = 0.5f;
1941d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[0] = constCoords.swizzle(1,0,0,0);
1942d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[0].b[1] = constCoords.swizzle(2,0,0,0);
1943d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].a = 1.0f / 3.0f;
1944d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[0] = constCoords.swizzle(1,1,0,0);
1945d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[1].b[1] = constCoords.swizzle(3,1,0,0);
1946d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].a = 1.0f / 4.0f;
1947d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[0] = constCoords.swizzle(2,1,0,0);
1948d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].b[2].b[1] = constCoords.swizzle(2,1,0,0);
1949d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[0].c = 0;
1950d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1951d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].a = constCoords.w();
1952d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].a = 2.0f;
1953d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[0] = constCoords.swizzle(2,0,0,0);
1954d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[0].b[1] = constCoords.swizzle(2,1,0,0);
1955d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].a = 3.0f;
1956d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[0] = constCoords.swizzle(2,2,0,0);
1957d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[1].b[1] = constCoords.swizzle(3,3,0,0);
1958d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].a = 4.0f;
1959d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[0] = constCoords.swizzle(1,0,0,0);
1960d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].b[2].b[1] = constCoords.swizzle(3,2,0,0);
1961d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			s[1].c = 1;
1962d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1963d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(11u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2 * sizeof(S), s);
1964d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1965d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
1966d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1967d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xyz() = (c.constCoords.swizzle(0, 1, 2) + c.constCoords.swizzle(1, 2, 3)) * 0.5f;
1968d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
1969d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1970d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(equal, "Struct equality",
1971d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
1972d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
1973d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { mediump float uf_one; };"
1974d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };"
1975d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1976d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
1977d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
1978d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
1979d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
1980d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
1981d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { S a; };"
1982d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { S b; };"
1983d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { S c; };"
1984d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
1985d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
1986d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
1987d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);"
1988d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
1989d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == b) ${DST}.x = 1.0;"
1990d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == c) ${DST}.y = 1.0;"
1991d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a == d) ${DST}.z = 1.0;"
1992d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
1993d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
1994d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
1995d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			DE_UNREF(constCoords);
1996d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UF_ONE);
1997d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_TWO);
1998d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
1999d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
2000d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			a;
2001d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			_padding1[3];
2002d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				tcu::Vec3		b;
2003d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int				c;
2004d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
2005d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2006d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S sa;
2007d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sa.a = 1.0f;
2008d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sa.b = tcu::Vec3(0.0f, 1.0f, 2.0f);
2009d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sa.c = 2;
2010d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(2u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sa);
2011d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2012d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S sb;
2013d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sb.a = 1.0f;
2014d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sb.b = tcu::Vec3(0.0f, 1.0f, 2.0f);
2015d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sb.c = 2;
2016d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sb);
2017d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2018d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S sc;
2019d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sc.a = 1.0f;
2020d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sc.b = tcu::Vec3(0.0f, 1.1f, 2.0f);
2021d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sc.c = 2;
2022d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(4u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sc);
2023d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
2024d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
2025d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xy() = tcu::Vec2(1.0f, 0.0f);
2026d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[1] + 1.0f) == deFloatFloor(1.1f))
2027d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.z() = 1.0f;
2028d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
2029d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2030d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	UNIFORM_STRUCT_CASE(not_equal, "Struct equality",
2031d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		LineStream()
2032d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "${HEADER}"
2033d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 0) uniform buffer0 { mediump float uf_one; };"
2034d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 1) uniform buffer1 { int ui_two; };"
2035d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
2036d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "struct S {"
2037d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump float	a;"
2038d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	mediump vec3	b;"
2039d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	int				c;"
2040d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "};"
2041d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 2) uniform buffer2 { S a; };"
2042d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 3) uniform buffer3 { S b; };"
2043d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "layout (std140, set = 0, binding = 4) uniform buffer4 { S c; };"
2044d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< ""
2045d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "void main (void)"
2046d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "{"
2047d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	S d = S(uf_one, vec3(0.0, floor(${COORDS}.y+1.0), 2.0), ui_two);"
2048d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${DST} = vec4(0.0, 0.0, 0.0, 1.0);"
2049d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != b) ${DST}.x = 1.0;"
2050d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != c) ${DST}.y = 1.0;"
2051d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	if (a != d) ${DST}.z = 1.0;"
2052d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "	${ASSIGN_POS}"
2053d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		<< "}",
2054d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
2055d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			DE_UNREF(constCoords);
2056d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(0u, UF_ONE);
2057d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.useUniform(1u, UI_TWO);
2058d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2059d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			struct S {
2060d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			a;
2061d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				float			_padding1[3];
2062d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				tcu::Vec3		b;
2063d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				int				c;
2064d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			};
2065d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2066d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S sa;
2067d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sa.a = 1.0f;
2068d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sa.b = tcu::Vec3(0.0f, 1.0f, 2.0f);
2069d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sa.c = 2;
2070d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(2u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sa);
2071d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2072d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S sb;
2073d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sb.a = 1.0f;
2074d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sb.b = tcu::Vec3(0.0f, 1.0f, 2.0f);
2075d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sb.c = 2;
2076d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(3u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sb);
2077d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2078d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			S sc;
2079d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sc.a = 1.0f;
2080d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sc.b = tcu::Vec3(0.0f, 1.1f, 2.0f);
2081d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			sc.c = 2;
2082d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			instance.addUniform(4u, vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, sizeof(S), &sc);
2083d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		},
2084d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		{
2085d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			c.color.xy() = tcu::Vec2(0.0f, 1.0f);
2086d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal			if (deFloatFloor(c.coords[1] + 1.0f) != deFloatFloor(1.1f))
2087d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal				c.color.z() = 1.0f;
2088d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal		});
2089d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
2090d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2091d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galclass ShaderStructTests : public tcu::TestCaseGroup
2092d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
2093d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galpublic:
2094d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal							ShaderStructTests		(tcu::TestContext& context);
2095d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	virtual					~ShaderStructTests		(void);
2096d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2097d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	virtual void			init					(void);
2098d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2099d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galprivate:
2100d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal							ShaderStructTests		(const ShaderStructTests&);		// not allowed!
2101d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	ShaderStructTests&		operator=				(const ShaderStructTests&);		// not allowed!
2102d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal};
2103d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2104d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructTests::ShaderStructTests (tcu::TestContext& testCtx)
2105d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	: TestCaseGroup(testCtx, "struct", "Struct Tests")
2106d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
2107d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
2108d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2109d994b3a2d869497f1496273b6d9b8affb1752b20Peter GalShaderStructTests::~ShaderStructTests (void)
2110d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
2111d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
2112d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2113d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galvoid ShaderStructTests::init (void)
2114d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
2115d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	addChild(new LocalStructTests(m_testCtx));
2116d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	addChild(new UniformStructTests(m_testCtx));
2117d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
2118d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2119d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} // anonymous
2120d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2121d994b3a2d869497f1496273b6d9b8affb1752b20Peter Galtcu::TestCaseGroup* createStructTests (tcu::TestContext& testCtx)
2122d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal{
2123d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal	return new ShaderStructTests(testCtx);
2124d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal}
2125d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal
2126d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} // sr
2127d994b3a2d869497f1496273b6d9b8affb1752b20Peter Gal} // vkt
2128