1fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos/*-------------------------------------------------------------------------
2fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * drawElements Quality Program OpenGL ES 3.1 Module
3fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * -------------------------------------------------
4fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *
5fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * Copyright 2016 The Android Open Source Project
6fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *
7fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
8fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * you may not use this file except in compliance with the License.
9fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * You may obtain a copy of the License at
10fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *
11fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
12fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *
13fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * Unless required by applicable law or agreed to in writing, software
14fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
15fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * See the License for the specific language governing permissions and
17fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * limitations under the License.
18fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *
19fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *//*!
20fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * \file
21fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos * \brief Negative Shader Directive Tests
22fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos *//*--------------------------------------------------------------------*/
23fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
24fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos#include "es31fNegativeShaderDirectiveTests.hpp"
25fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
26fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos#include "gluShaderProgram.hpp"
27fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
28fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosnamespace deqp
29fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
30fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosnamespace gles31
31fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
32fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosnamespace Functional
33fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
34fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosnamespace NegativeTestShared
35fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
36fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosnamespace
37fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
38fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
39fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosenum ExpectResult
40fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
41fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	EXPECT_RESULT_PASS = 0,
42fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	EXPECT_RESULT_FAIL,
43fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
44fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	EXPECT_RESULT_LAST
45fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos};
46fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
47fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid verifyProgram(NegativeTestContext& ctx, glu::ProgramSources sources, ExpectResult expect)
48fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
49fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	DE_ASSERT(expect >= EXPECT_RESULT_PASS && expect < EXPECT_RESULT_LAST);
50fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
51fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	tcu::TestLog& 				log 		= ctx.getLog();
52fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const glu::ShaderProgram 	program		(ctx.getRenderContext(), sources);
53fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	bool						testFailed	= false;
54fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::string					message;
55fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
56fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	log << program;
57fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
58fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (expect == EXPECT_RESULT_PASS)
59fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
60fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		testFailed = !program.getProgramInfo().linkOk;
61fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		message = "Program did not link.";
62fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
63fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	else
64fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
65fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		testFailed = program.getProgramInfo().linkOk;
66fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		message = "Program was not expected to link.";
67fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
68fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
69fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (testFailed)
70fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
71fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
72fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.fail(message);
73fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
74fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
75fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
76fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid verifyShader(NegativeTestContext& ctx, glu::ShaderType shaderType, std::string shaderSource, ExpectResult expect)
77fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
78fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	DE_ASSERT(expect >= EXPECT_RESULT_PASS && expect < EXPECT_RESULT_LAST);
79fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
80fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	tcu::TestLog& 		log			= ctx.getLog();
81fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	bool				testFailed	= false;
82fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const char* const	source		= shaderSource.c_str();
83fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const int			length		= (int) shaderSource.size();
84fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	glu::Shader			shader		(ctx.getRenderContext(), shaderType);
85fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::string			message;
86fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
87fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	shader.setSources(1, &source, &length);
88fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	shader.compile();
89fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
90fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	log << shader;
91fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
92fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (expect == EXPECT_RESULT_PASS)
93fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
94fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		testFailed = !shader.getCompileStatus();
95fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		message = "Shader did not compile.";
96fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
97fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	else
98fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
99fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		testFailed = shader.getCompileStatus();
100fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		message = "Shader was not expected to compile.";
101fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
102fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
103fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (testFailed)
104fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
105fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
106fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.fail(message);
107fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
108fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
109fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
110fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid primitive_bounding_box (NegativeTestContext& ctx)
111fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
112fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_EXT_primitive_bounding_box features require enabling the extension in 310 es shaders.");
113fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
114fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
115fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
116fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
117fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
118fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	gl_BoundingBoxEXT[0] = vec4(0.0, 0.0, 0.0, 0.0);\n"
119fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	gl_BoundingBoxEXT[1] = vec4(1.0, 1.0, 1.0, 1.0);\n"
120fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
121fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source.str(), EXPECT_RESULT_FAIL);
122fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
123fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
124fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
125fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2)))
126fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
127fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("gl_BoundingBox does not require the OES/EXT suffix in a 320 es shader.");
128fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		const std::string source =	"#version 320 es\n"
129fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos									"layout(vertices = 3) out;\n"
130fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos									"void main()\n"
131fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos									"{\n"
132fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos									"	gl_BoundingBox[0] = vec4(0.0, 0.0, 0.0, 0.0);\n"
133fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos									"	gl_BoundingBox[1] = vec4(0.0, 0.0, 0.0, 0.0);\n"
134fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos									"}\n";
135fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source, EXPECT_RESULT_PASS);
136fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
137fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
138fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
139fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
140fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid blend_equation_advanced (NegativeTestContext& ctx)
141fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
142fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_qualifiers[] =
143fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
144fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_multiply",
145fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_screen",
146fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_overlay",
147fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_darken",
148fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_lighten",
149fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_colordodge",
150fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_colorburn",
151fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_hardlight",
152fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_softlight",
153fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_difference",
154fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_exclusion",
155fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_hsl_hue",
156fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_hsl_saturation",
157fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_hsl_color",
158fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"blend_support_hsl_luminosity",
159fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
160fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
161fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_KHR_blend_equation_advanced features require enabling the extension in 310 es shaders.");
162fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_qualifiers); ++ndx)
163fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
164fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
165fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
166fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"layout(" << s_qualifiers[ndx] << ") out;\n"
167fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
168fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
169fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
170fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
171fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
172fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
173fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
174fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
175fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid sample_variables (NegativeTestContext& ctx)
176fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
177fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2)), "Test requires a context version 3.2 or higher.");
178fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
179fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_tests[] =
180fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
181fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"int sampleId = gl_SampleID;",
182fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"vec2 samplePos = gl_SamplePosition;",
183fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"int sampleMaskIn0 = gl_SampleMaskIn[0];",
184fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"int sampleMask0 = gl_SampleMask[0];",
185fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"int numSamples = gl_NumSamples;",
186fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
187fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
188fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_OES_sample_variables features require enabling the extension in 310 es shaders.");
189fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_tests); ++ndx)
190fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
191fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
192fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
193fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"precision mediump float;\n"
194fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
195fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
196fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	" << s_tests[ndx] << "\n"
197fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
198fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
199fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
200fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
201fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
202fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
203fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid shader_image_atomic (NegativeTestContext& ctx)
204fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
205fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_tests[] =
206fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
207fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicAdd(u_image, ivec2(1, 1), 1u);",
208fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicMin(u_image, ivec2(1, 1), 1u);",
209fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicMax(u_image, ivec2(1, 1), 1u);",
210fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicAnd(u_image, ivec2(1, 1), 1u);",
211fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicOr(u_image, ivec2(1, 1), 1u);",
212fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicXor(u_image, ivec2(1, 1), 1u);",
213fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicExchange(u_image, ivec2(1, 1), 1u);",
214fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"imageAtomicCompSwap(u_image, ivec2(1, 1), 1u, 1u);",
215fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
216fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
217fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_OES_shader_image_atomic features require enabling the extension in 310 es shaders.");
218fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_tests); ++ndx)
219fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
220fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
221fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
222fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"layout(binding=0, r32ui) coherent uniform highp uimage2D u_image;\n"
223fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"precision mediump float;\n"
224fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
225fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
226fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	" << s_tests[ndx] << "\n"
227fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
228fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
229fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
230fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
231fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
232fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
233fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid shader_multisample_interpolation (NegativeTestContext& ctx)
234fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
235fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_sampleTests[] =
236fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
237fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"sample in highp float v_var;",
238fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"sample out highp float v_var;"
239fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
240fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
241fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_interpolateAtTests[] =
242fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
243fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"interpolateAtCentroid(interpolant);",
244fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"interpolateAtSample(interpolant, 1);",
245fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"interpolateAtOffset(interpolant, vec2(1.0, 0.0));"
246fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
247fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
248fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_OES_shader_multisample_interpolation features require enabling the extension in 310 es shaders.");
249fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("Test sample in/out qualifiers.");
250fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_sampleTests); ++ndx)
251fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
252fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
253fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
254fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	" << s_sampleTests[ndx] << "\n"
255fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"precision mediump float;\n"
256fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
257fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
258fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
259fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
260fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
261fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
262fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
263fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("Test interpolateAt* functions.");
264fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_sampleTests); ++ndx)
265fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
266fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
267fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
268fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"in mediump float interpolant;\n"
269fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"precision mediump float;\n"
270fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
271fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
272fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	" << s_interpolateAtTests[ndx] << "\n"
273fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
274fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
275fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
276fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
277fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
278fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
279fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
280fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid texture_storage_multisample_2d_array (NegativeTestContext& ctx)
281fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
282fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_samplerTypeTests[] =
283fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
284fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"uniform mediump sampler2DMSArray u_sampler;",
285fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"uniform mediump isampler2DMSArray u_sampler;",
286fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"uniform mediump usampler2DMSArray u_sampler;",
287fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
288fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
289fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_OES_texture_storage_multisample_2d_array features require enabling the extension in 310 es shaders.");
290fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerTypeTests); ++ndx)
291fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
292fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
293fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
294fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	" << s_samplerTypeTests[ndx] << "\n"
295fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"precision mediump float;\n"
296fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
297fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
298fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
299fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
300fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
301fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
302fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
303fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
304fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid geometry_shader (NegativeTestContext& ctx)
305fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
306fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const std::string	simpleVtxFrag	=	"#version 310 es\n"
307fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"void main()\n"
308fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"{\n"
309fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"}\n";
310fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const std::string	geometry		=	"#version 310 es\n"
311fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"layout(points, invocations = 1) in;\n"
312fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"layout(points, max_vertices = 3) out;\n"
313fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"precision mediump float;\n"
314fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"void main()\n"
315fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"{\n"
316fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"	EmitVertex();\n"
317fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"	EndPrimitive();\n"
318fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"}\n";
319fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_EXT_geometry_shader features require enabling the extension in 310 es shaders.");
320fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	verifyProgram(ctx, glu::ProgramSources() << glu::VertexSource(simpleVtxFrag) << glu::GeometrySource(geometry) << glu::FragmentSource(simpleVtxFrag), EXPECT_RESULT_FAIL);
321fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
322fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
323fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
324fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid gpu_shader_5 (NegativeTestContext& ctx)
325fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
326fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_EXT_gpu_shader5 features require enabling the extension in 310 es shaders.");
327fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("Testing the precise qualifier.");
328fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
329fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
330fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
331fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
332fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
333fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	int low = 0;\n"
334fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	int high = 10;\n"
335fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	precise int middle = low + ((high - low) / 2);\n"
336fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
337fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
338fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
339fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
340fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
341fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("Testing fused multiply-add.");
342fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
343fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
344fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
345fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"in mediump float v_var;"
346fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
347fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
348fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	float fmaResult = fma(v_var, v_var, v_var);"
349fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
350fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
351fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
352fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
353fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
354fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("Testing textureGatherOffsets.");
355fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
356fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
357fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
358fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"uniform mediump sampler2D u_tex;\n"
359fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
360fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
361fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	highp vec2 coords = vec2(0.0, 1.0);\n"
362fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	const ivec2 offsets[4] = ivec2[](ivec2(0,0), ivec2(1, 0), ivec2(0, 1), ivec2(1, 1));\n"
363fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	textureGatherOffsets(u_tex, coords, offsets);\n"
364fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
365fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
366fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
367fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
368fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
369fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
370fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
371fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
372fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid shader_io_blocks (NegativeTestContext& ctx)
373fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
374fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_EXT_shader_io_blocks features require enabling the extension in 310 es shaders.");
375fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
376fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
377fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
378fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"in Data\n"
379fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
380fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"	mediump vec3 a;\n"
381fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"} data;\n"
382fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
383fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
384fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
385fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
386fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
387fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
388fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
389fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
390fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid tessellation_shader (NegativeTestContext& ctx)
391fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
392fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const std::string	simpleVtxFrag	=	"#version 310 es\n"
393fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"void main()\n"
394fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"{\n"
395fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"}\n";
396fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const std::string	tessControl		=	"#version 310 es\n"
397fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"layout(vertices = 3) out;\n"
398fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"void main()\n"
399fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"{\n"
400fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"}\n";
401fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const std::string	tessEvaluation	=	"#version 310 es\n"
402fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"layout(triangles, equal_spacing, cw) in;\n"
403fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"void main()\n"
404fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"{\n"
405fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos											"}\n";
406fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_EXT_tessellation_shader features require enabling the extension in 310 es shaders.");
407fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	glu::ProgramSources sources;
408fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	sources << glu::VertexSource(simpleVtxFrag)
409fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos			<< glu::TessellationControlSource(tessControl)
410fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos			<< glu::TessellationEvaluationSource(tessEvaluation)
411fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos			<< glu::FragmentSource(simpleVtxFrag);
412fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	verifyProgram(ctx, sources, EXPECT_RESULT_FAIL);
413fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
414fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
415fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
416fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid texture_buffer (NegativeTestContext& ctx)
417fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
418fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_samplerBufferTypes[] =
419fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
420fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		"uniform mediump samplerBuffer",
421fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "uniform mediump isamplerBuffer",
422fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "uniform mediump usamplerBuffer",
423fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "layout(rgba32f) uniform mediump writeonly imageBuffer",
424fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "layout(rgba32i) uniform mediump writeonly iimageBuffer",
425fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "layout(rgba32ui) uniform mediump writeonly uimageBuffer"
426fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
427fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
428fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_EXT_texture_buffer features require enabling the extension in 310 es shaders.");
429fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerBufferTypes); ++ndx)
430fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
431fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
432fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
433fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"" << s_samplerBufferTypes[ndx] << " u_buffer;\n"
434fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
435fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
436fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
437fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
438fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
439fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
440fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
441fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
442fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
443fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid texture_cube_map_array (NegativeTestContext& ctx)
444fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
445fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	static const char* const s_samplerCubeArrayTypes[] =
446fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
447fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "uniform mediump samplerCubeArray",
448fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "uniform mediump isamplerCubeArray",
449fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "uniform mediump usamplerCubeArray",
450fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "uniform mediump samplerCubeArrayShadow",
451fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "layout(rgba32f) uniform mediump writeonly imageCubeArray",
452fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "layout(rgba32i) uniform mediump writeonly iimageCubeArray",
453fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	    "layout(rgba32ui) uniform mediump writeonly uimageCubeArray"
454fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
455fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
456fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_EXT_texture_cube_map_array features require enabling the extension in 310 es shaders.");
457fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerCubeArrayTypes); ++ndx)
458fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
459fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		std::ostringstream source;
460fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		source <<	"#version 310 es\n"
461fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"" << s_samplerCubeArrayTypes[ndx] << " u_cube;\n"
462fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"void main()\n"
463fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"{\n"
464fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos					"}\n";
465fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
466fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
467fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
468fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
469fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
470fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos} // anonymous
471fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
472fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosstd::vector<FunctionContainer> getNegativeShaderDirectiveTestFunctions (void)
473fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
474fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const FunctionContainer funcs[] =
475fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
476fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{primitive_bounding_box,				"primitive_bounding_box",				"GL_EXT_primitive_bounding_box required in 310 es shaders to use AEP features. Version 320 es shaders do not require suffixes."	},
477fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{blend_equation_advanced,				"blend_equation_advanced",				"GL_KHR_blend_equation_advanced is required in 310 es shaders to use AEP features"												},
478fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{sample_variables,						"sample_variables",						"GL_OES_sample_variables is required in 310 es shaders to use AEP features"														},
479fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{shader_image_atomic,					"shader_image_atomic",					"GL_OES_shader_image_atomic is required in 310 es shaders to use AEP features"													},
480fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{shader_multisample_interpolation,		"shader_multisample_interpolation",		"GL_OES_shader_multisample_interpolation is required in 310 es shaders to use AEP features"										},
481fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{texture_storage_multisample_2d_array,	"texture_storage_multisample_2d_array",	"GL_OES_texture_storage_multisample_2d_array is required in 310 es shaders to use AEP features"									},
482fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{geometry_shader,						"geometry_shader",						"GL_EXT_geometry_shader is required in 310 es shaders to use AEP features"														},
483fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{gpu_shader_5,							"gpu_shader_5",							"GL_EXT_gpu_shader5 is required in 310 es shaders to use AEP features"															},
484fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{shader_io_blocks,						"shader_io_blocks",						"GL_EXT_shader_io_blocks is required in 310 es shaders to use AEP features"														},
485fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{tessellation_shader,					"tessellation_shader",					"GL_EXT_tessellation_shader is required in 310 es shaders to use AEP features"													},
486fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{texture_buffer,						"texture_buffer",						"GL_EXT_texture_buffer is required in 310 es shaders to use AEP features"														},
487fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{texture_cube_map_array,				"texture_cube_map_array",				"GL_EXT_texture_cube_map_array is required in 310 es shaders to use AEP features"												},
488fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	};
489fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
490fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
491fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
492fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
493fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos} // NegativeTestShared
494fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos} // Functional
495fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos} // gles31
496fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos} // deqp
497