1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL ES 3.1 Module
3e5c31af7Sopenharmony_ci * -------------------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2016 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Negative Shader Directive Tests
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "es31fNegativeShaderDirectiveTests.hpp"
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "gluShaderProgram.hpp"
27e5c31af7Sopenharmony_ci
28e5c31af7Sopenharmony_cinamespace deqp
29e5c31af7Sopenharmony_ci{
30e5c31af7Sopenharmony_cinamespace gles31
31e5c31af7Sopenharmony_ci{
32e5c31af7Sopenharmony_cinamespace Functional
33e5c31af7Sopenharmony_ci{
34e5c31af7Sopenharmony_cinamespace NegativeTestShared
35e5c31af7Sopenharmony_ci{
36e5c31af7Sopenharmony_cinamespace
37e5c31af7Sopenharmony_ci{
38e5c31af7Sopenharmony_ci
39e5c31af7Sopenharmony_cienum ExpectResult
40e5c31af7Sopenharmony_ci{
41e5c31af7Sopenharmony_ci	EXPECT_RESULT_PASS = 0,
42e5c31af7Sopenharmony_ci	EXPECT_RESULT_FAIL,
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_ci	EXPECT_RESULT_LAST
45e5c31af7Sopenharmony_ci};
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_civoid verifyProgram(NegativeTestContext& ctx, glu::ProgramSources sources, ExpectResult expect)
48e5c31af7Sopenharmony_ci{
49e5c31af7Sopenharmony_ci	DE_ASSERT(expect >= EXPECT_RESULT_PASS && expect < EXPECT_RESULT_LAST);
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ci	tcu::TestLog&				log			= ctx.getLog();
52e5c31af7Sopenharmony_ci	const glu::ShaderProgram	program		(ctx.getRenderContext(), sources);
53e5c31af7Sopenharmony_ci	bool						testFailed	= false;
54e5c31af7Sopenharmony_ci	std::string					message;
55e5c31af7Sopenharmony_ci
56e5c31af7Sopenharmony_ci	log << program;
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci	if (expect == EXPECT_RESULT_PASS)
59e5c31af7Sopenharmony_ci	{
60e5c31af7Sopenharmony_ci		testFailed = !program.getProgramInfo().linkOk;
61e5c31af7Sopenharmony_ci		message = "Program did not link.";
62e5c31af7Sopenharmony_ci	}
63e5c31af7Sopenharmony_ci	else
64e5c31af7Sopenharmony_ci	{
65e5c31af7Sopenharmony_ci		testFailed = program.getProgramInfo().linkOk;
66e5c31af7Sopenharmony_ci		message = "Program was not expected to link.";
67e5c31af7Sopenharmony_ci	}
68e5c31af7Sopenharmony_ci
69e5c31af7Sopenharmony_ci	if (testFailed)
70e5c31af7Sopenharmony_ci	{
71e5c31af7Sopenharmony_ci		log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
72e5c31af7Sopenharmony_ci		ctx.fail(message);
73e5c31af7Sopenharmony_ci	}
74e5c31af7Sopenharmony_ci}
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_civoid verifyShader(NegativeTestContext& ctx, glu::ShaderType shaderType, std::string shaderSource, ExpectResult expect)
77e5c31af7Sopenharmony_ci{
78e5c31af7Sopenharmony_ci	DE_ASSERT(expect >= EXPECT_RESULT_PASS && expect < EXPECT_RESULT_LAST);
79e5c31af7Sopenharmony_ci
80e5c31af7Sopenharmony_ci	tcu::TestLog&		log			= ctx.getLog();
81e5c31af7Sopenharmony_ci	bool				testFailed	= false;
82e5c31af7Sopenharmony_ci	const char* const	source		= shaderSource.c_str();
83e5c31af7Sopenharmony_ci	const int			length		= (int) shaderSource.size();
84e5c31af7Sopenharmony_ci	glu::Shader			shader		(ctx.getRenderContext(), shaderType);
85e5c31af7Sopenharmony_ci	std::string			message;
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_ci	shader.setSources(1, &source, &length);
88e5c31af7Sopenharmony_ci	shader.compile();
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_ci	log << shader;
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci	if (expect == EXPECT_RESULT_PASS)
93e5c31af7Sopenharmony_ci	{
94e5c31af7Sopenharmony_ci		testFailed = !shader.getCompileStatus();
95e5c31af7Sopenharmony_ci		message = "Shader did not compile.";
96e5c31af7Sopenharmony_ci	}
97e5c31af7Sopenharmony_ci	else
98e5c31af7Sopenharmony_ci	{
99e5c31af7Sopenharmony_ci		testFailed = shader.getCompileStatus();
100e5c31af7Sopenharmony_ci		message = "Shader was not expected to compile.";
101e5c31af7Sopenharmony_ci	}
102e5c31af7Sopenharmony_ci
103e5c31af7Sopenharmony_ci	if (testFailed)
104e5c31af7Sopenharmony_ci	{
105e5c31af7Sopenharmony_ci		log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
106e5c31af7Sopenharmony_ci		ctx.fail(message);
107e5c31af7Sopenharmony_ci	}
108e5c31af7Sopenharmony_ci}
109e5c31af7Sopenharmony_ci
110e5c31af7Sopenharmony_civoid primitive_bounding_box (NegativeTestContext& ctx)
111e5c31af7Sopenharmony_ci{
112e5c31af7Sopenharmony_ci	if (ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_CONTROL))
113e5c31af7Sopenharmony_ci	{
114e5c31af7Sopenharmony_ci		ctx.beginSection("GL_EXT_primitive_bounding_box features require enabling the extension in 310 es shaders.");
115e5c31af7Sopenharmony_ci		std::ostringstream source;
116e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
117e5c31af7Sopenharmony_ci					"void main()\n"
118e5c31af7Sopenharmony_ci					"{\n"
119e5c31af7Sopenharmony_ci					"	gl_BoundingBoxEXT[0] = vec4(0.0, 0.0, 0.0, 0.0);\n"
120e5c31af7Sopenharmony_ci					"	gl_BoundingBoxEXT[1] = vec4(1.0, 1.0, 1.0, 1.0);\n"
121e5c31af7Sopenharmony_ci					"}\n";
122e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source.str(), EXPECT_RESULT_FAIL);
123e5c31af7Sopenharmony_ci		ctx.endSection();
124e5c31af7Sopenharmony_ci	}
125e5c31af7Sopenharmony_ci
126e5c31af7Sopenharmony_ci	if (contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2)))
127e5c31af7Sopenharmony_ci	{
128e5c31af7Sopenharmony_ci		ctx.beginSection("gl_BoundingBox does not require the OES/EXT suffix in a 320 es shader.");
129e5c31af7Sopenharmony_ci		{
130e5c31af7Sopenharmony_ci			const std::string source =	"#version 320 es\n"
131e5c31af7Sopenharmony_ci										"layout(vertices = 3) out;\n"
132e5c31af7Sopenharmony_ci										"void main()\n"
133e5c31af7Sopenharmony_ci										"{\n"
134e5c31af7Sopenharmony_ci										"	gl_BoundingBox[0] = vec4(0.0, 0.0, 0.0, 0.0);\n"
135e5c31af7Sopenharmony_ci										"	gl_BoundingBox[1] = vec4(0.0, 0.0, 0.0, 0.0);\n"
136e5c31af7Sopenharmony_ci										"}\n";
137e5c31af7Sopenharmony_ci			verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source, EXPECT_RESULT_PASS);
138e5c31af7Sopenharmony_ci		}
139e5c31af7Sopenharmony_ci		ctx.endSection();
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_ci		ctx.beginSection("Invalid index used when assigning to gl_BoundingBox in 320 es shader.");
142e5c31af7Sopenharmony_ci		{
143e5c31af7Sopenharmony_ci			const std::string source =	"#version 320 es\n"
144e5c31af7Sopenharmony_ci										"layout(vertices = 3) out;\n"
145e5c31af7Sopenharmony_ci										"void main()\n"
146e5c31af7Sopenharmony_ci										"{\n"
147e5c31af7Sopenharmony_ci										"	gl_BoundingBox[0] = vec4(0.0, 0.0, 0.0, 0.0);\n"
148e5c31af7Sopenharmony_ci										"	gl_BoundingBox[2] = vec4(0.0, 0.0, 0.0, 0.0);\n"
149e5c31af7Sopenharmony_ci										"}\n";
150e5c31af7Sopenharmony_ci			verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source, EXPECT_RESULT_FAIL);
151e5c31af7Sopenharmony_ci		}
152e5c31af7Sopenharmony_ci		ctx.endSection();
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ci		ctx.beginSection("Invalid type assignment to per-patch output array in 320 es shader.");
155e5c31af7Sopenharmony_ci		{
156e5c31af7Sopenharmony_ci			const std::string source =	"#version 320 es\n"
157e5c31af7Sopenharmony_ci										"layout(vertices = 3) out;\n"
158e5c31af7Sopenharmony_ci										"void main()\n"
159e5c31af7Sopenharmony_ci										"{\n"
160e5c31af7Sopenharmony_ci										"	gl_BoundingBox[0] = ivec4(0, 0, 0, 0);\n"
161e5c31af7Sopenharmony_ci										"	gl_BoundingBox[1] = ivec4(0, 0, 0, 0);\n"
162e5c31af7Sopenharmony_ci										"}\n";
163e5c31af7Sopenharmony_ci			verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source, EXPECT_RESULT_FAIL);
164e5c31af7Sopenharmony_ci		}
165e5c31af7Sopenharmony_ci		ctx.endSection();
166e5c31af7Sopenharmony_ci	}
167e5c31af7Sopenharmony_ci}
168e5c31af7Sopenharmony_ci
169e5c31af7Sopenharmony_civoid blend_equation_advanced (NegativeTestContext& ctx)
170e5c31af7Sopenharmony_ci{
171e5c31af7Sopenharmony_ci	static const char* const s_qualifiers[] =
172e5c31af7Sopenharmony_ci	{
173e5c31af7Sopenharmony_ci		"blend_support_multiply",
174e5c31af7Sopenharmony_ci		"blend_support_screen",
175e5c31af7Sopenharmony_ci		"blend_support_overlay",
176e5c31af7Sopenharmony_ci		"blend_support_darken",
177e5c31af7Sopenharmony_ci		"blend_support_lighten",
178e5c31af7Sopenharmony_ci		"blend_support_colordodge",
179e5c31af7Sopenharmony_ci		"blend_support_colorburn",
180e5c31af7Sopenharmony_ci		"blend_support_hardlight",
181e5c31af7Sopenharmony_ci		"blend_support_softlight",
182e5c31af7Sopenharmony_ci		"blend_support_difference",
183e5c31af7Sopenharmony_ci		"blend_support_exclusion",
184e5c31af7Sopenharmony_ci		"blend_support_hsl_hue",
185e5c31af7Sopenharmony_ci		"blend_support_hsl_saturation",
186e5c31af7Sopenharmony_ci		"blend_support_hsl_color",
187e5c31af7Sopenharmony_ci		"blend_support_hsl_luminosity",
188e5c31af7Sopenharmony_ci	};
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci	ctx.beginSection("GL_KHR_blend_equation_advanced features require enabling the extension in 310 es shaders.");
191e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_qualifiers); ++ndx)
192e5c31af7Sopenharmony_ci	{
193e5c31af7Sopenharmony_ci		std::ostringstream source;
194e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
195e5c31af7Sopenharmony_ci					"layout(" << s_qualifiers[ndx] << ") out;\n"
196e5c31af7Sopenharmony_ci					"void main()\n"
197e5c31af7Sopenharmony_ci					"{\n"
198e5c31af7Sopenharmony_ci					"}\n";
199e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
200e5c31af7Sopenharmony_ci	}
201e5c31af7Sopenharmony_ci	ctx.endSection();
202e5c31af7Sopenharmony_ci}
203e5c31af7Sopenharmony_ci
204e5c31af7Sopenharmony_civoid sample_variables (NegativeTestContext& ctx)
205e5c31af7Sopenharmony_ci{
206e5c31af7Sopenharmony_ci	TCU_CHECK_AND_THROW(NotSupportedError,
207e5c31af7Sopenharmony_ci		contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2)) || contextSupports(ctx.getRenderContext().getType() , glu::ApiType::core(4, 5)),
208e5c31af7Sopenharmony_ci		"Test requires a context version 3.2 or higher.");
209e5c31af7Sopenharmony_ci
210e5c31af7Sopenharmony_ci	static const char* const s_tests[] =
211e5c31af7Sopenharmony_ci	{
212e5c31af7Sopenharmony_ci		"int sampleId = gl_SampleID;",
213e5c31af7Sopenharmony_ci		"vec2 samplePos = gl_SamplePosition;",
214e5c31af7Sopenharmony_ci		"int sampleMaskIn0 = gl_SampleMaskIn[0];",
215e5c31af7Sopenharmony_ci		"int sampleMask0 = gl_SampleMask[0];",
216e5c31af7Sopenharmony_ci		"int numSamples = gl_NumSamples;",
217e5c31af7Sopenharmony_ci	};
218e5c31af7Sopenharmony_ci
219e5c31af7Sopenharmony_ci	ctx.beginSection("GL_OES_sample_variables features require enabling the extension in 310 es shaders.");
220e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_tests); ++ndx)
221e5c31af7Sopenharmony_ci	{
222e5c31af7Sopenharmony_ci		std::ostringstream source;
223e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
224e5c31af7Sopenharmony_ci					"precision mediump float;\n"
225e5c31af7Sopenharmony_ci					"void main()\n"
226e5c31af7Sopenharmony_ci					"{\n"
227e5c31af7Sopenharmony_ci					"	" << s_tests[ndx] << "\n"
228e5c31af7Sopenharmony_ci					"}\n";
229e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
230e5c31af7Sopenharmony_ci	}
231e5c31af7Sopenharmony_ci	ctx.endSection();
232e5c31af7Sopenharmony_ci}
233e5c31af7Sopenharmony_ci
234e5c31af7Sopenharmony_civoid shader_image_atomic (NegativeTestContext& ctx)
235e5c31af7Sopenharmony_ci{
236e5c31af7Sopenharmony_ci	static const char* const s_tests[] =
237e5c31af7Sopenharmony_ci	{
238e5c31af7Sopenharmony_ci		"imageAtomicAdd(u_image, ivec2(1, 1), 1u);",
239e5c31af7Sopenharmony_ci		"imageAtomicMin(u_image, ivec2(1, 1), 1u);",
240e5c31af7Sopenharmony_ci		"imageAtomicMax(u_image, ivec2(1, 1), 1u);",
241e5c31af7Sopenharmony_ci		"imageAtomicAnd(u_image, ivec2(1, 1), 1u);",
242e5c31af7Sopenharmony_ci		"imageAtomicOr(u_image, ivec2(1, 1), 1u);",
243e5c31af7Sopenharmony_ci		"imageAtomicXor(u_image, ivec2(1, 1), 1u);",
244e5c31af7Sopenharmony_ci		"imageAtomicExchange(u_image, ivec2(1, 1), 1u);",
245e5c31af7Sopenharmony_ci		"imageAtomicCompSwap(u_image, ivec2(1, 1), 1u, 1u);",
246e5c31af7Sopenharmony_ci	};
247e5c31af7Sopenharmony_ci
248e5c31af7Sopenharmony_ci	ctx.beginSection("GL_OES_shader_image_atomic features require enabling the extension in 310 es shaders.");
249e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_tests); ++ndx)
250e5c31af7Sopenharmony_ci	{
251e5c31af7Sopenharmony_ci		std::ostringstream source;
252e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
253e5c31af7Sopenharmony_ci					"layout(binding=0, r32ui) coherent uniform highp uimage2D u_image;\n"
254e5c31af7Sopenharmony_ci					"precision mediump float;\n"
255e5c31af7Sopenharmony_ci					"void main()\n"
256e5c31af7Sopenharmony_ci					"{\n"
257e5c31af7Sopenharmony_ci					"	" << s_tests[ndx] << "\n"
258e5c31af7Sopenharmony_ci					"}\n";
259e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
260e5c31af7Sopenharmony_ci	}
261e5c31af7Sopenharmony_ci	ctx.endSection();
262e5c31af7Sopenharmony_ci}
263e5c31af7Sopenharmony_ci
264e5c31af7Sopenharmony_civoid shader_multisample_interpolation (NegativeTestContext& ctx)
265e5c31af7Sopenharmony_ci{
266e5c31af7Sopenharmony_ci	static const char* const s_sampleTests[] =
267e5c31af7Sopenharmony_ci	{
268e5c31af7Sopenharmony_ci		"sample in highp float v_var;",
269e5c31af7Sopenharmony_ci		"sample out highp float v_var;"
270e5c31af7Sopenharmony_ci	};
271e5c31af7Sopenharmony_ci
272e5c31af7Sopenharmony_ci	static const char* const s_interpolateAtTests[] =
273e5c31af7Sopenharmony_ci	{
274e5c31af7Sopenharmony_ci		"interpolateAtCentroid(interpolant);",
275e5c31af7Sopenharmony_ci		"interpolateAtSample(interpolant, 1);",
276e5c31af7Sopenharmony_ci		"interpolateAtOffset(interpolant, vec2(1.0, 0.0));"
277e5c31af7Sopenharmony_ci	};
278e5c31af7Sopenharmony_ci
279e5c31af7Sopenharmony_ci	ctx.beginSection("GL_OES_shader_multisample_interpolation features require enabling the extension in 310 es shaders.");
280e5c31af7Sopenharmony_ci	ctx.beginSection("Test sample in/out qualifiers.");
281e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_sampleTests); ++ndx)
282e5c31af7Sopenharmony_ci	{
283e5c31af7Sopenharmony_ci		std::ostringstream source;
284e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
285e5c31af7Sopenharmony_ci					"	" << s_sampleTests[ndx] << "\n"
286e5c31af7Sopenharmony_ci					"precision mediump float;\n"
287e5c31af7Sopenharmony_ci					"void main()\n"
288e5c31af7Sopenharmony_ci					"{\n"
289e5c31af7Sopenharmony_ci					"}\n";
290e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
291e5c31af7Sopenharmony_ci	}
292e5c31af7Sopenharmony_ci	ctx.endSection();
293e5c31af7Sopenharmony_ci
294e5c31af7Sopenharmony_ci	ctx.beginSection("Test interpolateAt* functions.");
295e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_sampleTests); ++ndx)
296e5c31af7Sopenharmony_ci	{
297e5c31af7Sopenharmony_ci		std::ostringstream source;
298e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
299e5c31af7Sopenharmony_ci					"in mediump float interpolant;\n"
300e5c31af7Sopenharmony_ci					"precision mediump float;\n"
301e5c31af7Sopenharmony_ci					"void main()\n"
302e5c31af7Sopenharmony_ci					"{\n"
303e5c31af7Sopenharmony_ci					"	" << s_interpolateAtTests[ndx] << "\n"
304e5c31af7Sopenharmony_ci					"}\n";
305e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
306e5c31af7Sopenharmony_ci	}
307e5c31af7Sopenharmony_ci	ctx.endSection();
308e5c31af7Sopenharmony_ci	ctx.endSection();
309e5c31af7Sopenharmony_ci}
310e5c31af7Sopenharmony_ci
311e5c31af7Sopenharmony_civoid texture_storage_multisample_2d_array (NegativeTestContext& ctx)
312e5c31af7Sopenharmony_ci{
313e5c31af7Sopenharmony_ci	static const char* const s_samplerTypeTests[] =
314e5c31af7Sopenharmony_ci	{
315e5c31af7Sopenharmony_ci		"uniform mediump sampler2DMSArray u_sampler;",
316e5c31af7Sopenharmony_ci		"uniform mediump isampler2DMSArray u_sampler;",
317e5c31af7Sopenharmony_ci		"uniform mediump usampler2DMSArray u_sampler;",
318e5c31af7Sopenharmony_ci	};
319e5c31af7Sopenharmony_ci
320e5c31af7Sopenharmony_ci	ctx.beginSection("GL_OES_texture_storage_multisample_2d_array features require enabling the extension in 310 es shaders.");
321e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerTypeTests); ++ndx)
322e5c31af7Sopenharmony_ci	{
323e5c31af7Sopenharmony_ci		std::ostringstream source;
324e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
325e5c31af7Sopenharmony_ci					"	" << s_samplerTypeTests[ndx] << "\n"
326e5c31af7Sopenharmony_ci					"precision mediump float;\n"
327e5c31af7Sopenharmony_ci					"void main()\n"
328e5c31af7Sopenharmony_ci					"{\n"
329e5c31af7Sopenharmony_ci					"}\n";
330e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
331e5c31af7Sopenharmony_ci	}
332e5c31af7Sopenharmony_ci	ctx.endSection();
333e5c31af7Sopenharmony_ci}
334e5c31af7Sopenharmony_ci
335e5c31af7Sopenharmony_civoid geometry_shader (NegativeTestContext& ctx)
336e5c31af7Sopenharmony_ci{
337e5c31af7Sopenharmony_ci	if (ctx.isShaderSupported(glu::SHADERTYPE_GEOMETRY))
338e5c31af7Sopenharmony_ci	{
339e5c31af7Sopenharmony_ci		const std::string	simpleVtxFrag	=	"#version 310 es\n"
340e5c31af7Sopenharmony_ci												"void main()\n"
341e5c31af7Sopenharmony_ci												"{\n"
342e5c31af7Sopenharmony_ci												"}\n";
343e5c31af7Sopenharmony_ci		const std::string	geometry		=	"#version 310 es\n"
344e5c31af7Sopenharmony_ci												"layout(points, invocations = 1) in;\n"
345e5c31af7Sopenharmony_ci												"layout(points, max_vertices = 3) out;\n"
346e5c31af7Sopenharmony_ci												"precision mediump float;\n"
347e5c31af7Sopenharmony_ci												"void main()\n"
348e5c31af7Sopenharmony_ci												"{\n"
349e5c31af7Sopenharmony_ci												"	EmitVertex();\n"
350e5c31af7Sopenharmony_ci												"	EndPrimitive();\n"
351e5c31af7Sopenharmony_ci												"}\n";
352e5c31af7Sopenharmony_ci		ctx.beginSection("GL_EXT_geometry_shader features require enabling the extension in 310 es shaders.");
353e5c31af7Sopenharmony_ci		verifyProgram(ctx, glu::ProgramSources() << glu::VertexSource(simpleVtxFrag) << glu::GeometrySource(geometry) << glu::FragmentSource(simpleVtxFrag), EXPECT_RESULT_FAIL);
354e5c31af7Sopenharmony_ci		ctx.endSection();
355e5c31af7Sopenharmony_ci	}
356e5c31af7Sopenharmony_ci}
357e5c31af7Sopenharmony_ci
358e5c31af7Sopenharmony_civoid gpu_shader_5 (NegativeTestContext& ctx)
359e5c31af7Sopenharmony_ci{
360e5c31af7Sopenharmony_ci	ctx.beginSection("GL_EXT_gpu_shader5 features require enabling the extension in 310 es shaders.");
361e5c31af7Sopenharmony_ci	ctx.beginSection("Testing the precise qualifier.");
362e5c31af7Sopenharmony_ci	{
363e5c31af7Sopenharmony_ci		std::ostringstream source;
364e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
365e5c31af7Sopenharmony_ci					"void main()\n"
366e5c31af7Sopenharmony_ci					"{\n"
367e5c31af7Sopenharmony_ci					"	int low = 0;\n"
368e5c31af7Sopenharmony_ci					"	int high = 10;\n"
369e5c31af7Sopenharmony_ci					"	precise int middle = low + ((high - low) / 2);\n"
370e5c31af7Sopenharmony_ci					"}\n";
371e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
372e5c31af7Sopenharmony_ci	}
373e5c31af7Sopenharmony_ci	ctx.endSection();
374e5c31af7Sopenharmony_ci
375e5c31af7Sopenharmony_ci	ctx.beginSection("Testing fused multiply-add.");
376e5c31af7Sopenharmony_ci	{
377e5c31af7Sopenharmony_ci		std::ostringstream source;
378e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
379e5c31af7Sopenharmony_ci					"in mediump float v_var;"
380e5c31af7Sopenharmony_ci					"void main()\n"
381e5c31af7Sopenharmony_ci					"{\n"
382e5c31af7Sopenharmony_ci					"	float fmaResult = fma(v_var, v_var, v_var);"
383e5c31af7Sopenharmony_ci					"}\n";
384e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
385e5c31af7Sopenharmony_ci	}
386e5c31af7Sopenharmony_ci	ctx.endSection();
387e5c31af7Sopenharmony_ci
388e5c31af7Sopenharmony_ci	ctx.beginSection("Testing textureGatherOffsets.");
389e5c31af7Sopenharmony_ci	{
390e5c31af7Sopenharmony_ci		std::ostringstream source;
391e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
392e5c31af7Sopenharmony_ci					"uniform mediump sampler2D u_tex;\n"
393e5c31af7Sopenharmony_ci					"void main()\n"
394e5c31af7Sopenharmony_ci					"{\n"
395e5c31af7Sopenharmony_ci					"	highp vec2 coords = vec2(0.0, 1.0);\n"
396e5c31af7Sopenharmony_ci					"	const ivec2 offsets[4] = ivec2[](ivec2(0,0), ivec2(1, 0), ivec2(0, 1), ivec2(1, 1));\n"
397e5c31af7Sopenharmony_ci					"	textureGatherOffsets(u_tex, coords, offsets);\n"
398e5c31af7Sopenharmony_ci					"}\n";
399e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
400e5c31af7Sopenharmony_ci	}
401e5c31af7Sopenharmony_ci	ctx.endSection();
402e5c31af7Sopenharmony_ci
403e5c31af7Sopenharmony_ci	ctx.endSection();
404e5c31af7Sopenharmony_ci}
405e5c31af7Sopenharmony_ci
406e5c31af7Sopenharmony_civoid shader_io_blocks (NegativeTestContext& ctx)
407e5c31af7Sopenharmony_ci{
408e5c31af7Sopenharmony_ci	ctx.beginSection("GL_EXT_shader_io_blocks features require enabling the extension in 310 es shaders.");
409e5c31af7Sopenharmony_ci	{
410e5c31af7Sopenharmony_ci		std::ostringstream source;
411e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
412e5c31af7Sopenharmony_ci					"in Data\n"
413e5c31af7Sopenharmony_ci					"{\n"
414e5c31af7Sopenharmony_ci					"	mediump vec3 a;\n"
415e5c31af7Sopenharmony_ci					"} data;\n"
416e5c31af7Sopenharmony_ci					"void main()\n"
417e5c31af7Sopenharmony_ci					"{\n"
418e5c31af7Sopenharmony_ci					"}\n";
419e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
420e5c31af7Sopenharmony_ci	}
421e5c31af7Sopenharmony_ci	ctx.endSection();
422e5c31af7Sopenharmony_ci}
423e5c31af7Sopenharmony_ci
424e5c31af7Sopenharmony_civoid tessellation_shader (NegativeTestContext& ctx)
425e5c31af7Sopenharmony_ci{
426e5c31af7Sopenharmony_ci	if (ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_CONTROL))
427e5c31af7Sopenharmony_ci	{
428e5c31af7Sopenharmony_ci		const std::string	simpleVtxFrag	=	"#version 310 es\n"
429e5c31af7Sopenharmony_ci												"void main()\n"
430e5c31af7Sopenharmony_ci												"{\n"
431e5c31af7Sopenharmony_ci												"}\n";
432e5c31af7Sopenharmony_ci		const std::string	tessControl		=	"#version 310 es\n"
433e5c31af7Sopenharmony_ci												"layout(vertices = 3) out;\n"
434e5c31af7Sopenharmony_ci												"void main()\n"
435e5c31af7Sopenharmony_ci												"{\n"
436e5c31af7Sopenharmony_ci												"}\n";
437e5c31af7Sopenharmony_ci		const std::string	tessEvaluation	=	"#version 310 es\n"
438e5c31af7Sopenharmony_ci												"layout(triangles, equal_spacing, cw) in;\n"
439e5c31af7Sopenharmony_ci												"void main()\n"
440e5c31af7Sopenharmony_ci												"{\n"
441e5c31af7Sopenharmony_ci												"}\n";
442e5c31af7Sopenharmony_ci		ctx.beginSection("GL_EXT_tessellation_shader features require enabling the extension in 310 es shaders.");
443e5c31af7Sopenharmony_ci		glu::ProgramSources sources;
444e5c31af7Sopenharmony_ci		sources << glu::VertexSource(simpleVtxFrag)
445e5c31af7Sopenharmony_ci				<< glu::TessellationControlSource(tessControl)
446e5c31af7Sopenharmony_ci				<< glu::TessellationEvaluationSource(tessEvaluation)
447e5c31af7Sopenharmony_ci				<< glu::FragmentSource(simpleVtxFrag);
448e5c31af7Sopenharmony_ci		verifyProgram(ctx, sources, EXPECT_RESULT_FAIL);
449e5c31af7Sopenharmony_ci		ctx.endSection();
450e5c31af7Sopenharmony_ci	}
451e5c31af7Sopenharmony_ci}
452e5c31af7Sopenharmony_ci
453e5c31af7Sopenharmony_civoid texture_buffer (NegativeTestContext& ctx)
454e5c31af7Sopenharmony_ci{
455e5c31af7Sopenharmony_ci	static const char* const s_samplerBufferTypes[] =
456e5c31af7Sopenharmony_ci	{
457e5c31af7Sopenharmony_ci		"uniform mediump samplerBuffer",
458e5c31af7Sopenharmony_ci	    "uniform mediump isamplerBuffer",
459e5c31af7Sopenharmony_ci	    "uniform mediump usamplerBuffer",
460e5c31af7Sopenharmony_ci	    "layout(rgba32f) uniform mediump writeonly imageBuffer",
461e5c31af7Sopenharmony_ci	    "layout(rgba32i) uniform mediump writeonly iimageBuffer",
462e5c31af7Sopenharmony_ci	    "layout(rgba32ui) uniform mediump writeonly uimageBuffer"
463e5c31af7Sopenharmony_ci	};
464e5c31af7Sopenharmony_ci
465e5c31af7Sopenharmony_ci	ctx.beginSection("GL_EXT_texture_buffer features require enabling the extension in 310 es shaders.");
466e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerBufferTypes); ++ndx)
467e5c31af7Sopenharmony_ci	{
468e5c31af7Sopenharmony_ci		std::ostringstream source;
469e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
470e5c31af7Sopenharmony_ci					"" << s_samplerBufferTypes[ndx] << " u_buffer;\n"
471e5c31af7Sopenharmony_ci					"void main()\n"
472e5c31af7Sopenharmony_ci					"{\n"
473e5c31af7Sopenharmony_ci					"}\n";
474e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
475e5c31af7Sopenharmony_ci	}
476e5c31af7Sopenharmony_ci	ctx.endSection();
477e5c31af7Sopenharmony_ci}
478e5c31af7Sopenharmony_ci
479e5c31af7Sopenharmony_ci
480e5c31af7Sopenharmony_civoid texture_cube_map_array (NegativeTestContext& ctx)
481e5c31af7Sopenharmony_ci{
482e5c31af7Sopenharmony_ci	static const char* const s_samplerCubeArrayTypes[] =
483e5c31af7Sopenharmony_ci	{
484e5c31af7Sopenharmony_ci	    "uniform mediump samplerCubeArray",
485e5c31af7Sopenharmony_ci	    "uniform mediump isamplerCubeArray",
486e5c31af7Sopenharmony_ci	    "uniform mediump usamplerCubeArray",
487e5c31af7Sopenharmony_ci	    "uniform mediump samplerCubeArrayShadow",
488e5c31af7Sopenharmony_ci	    "layout(rgba32f) uniform mediump writeonly imageCubeArray",
489e5c31af7Sopenharmony_ci	    "layout(rgba32i) uniform mediump writeonly iimageCubeArray",
490e5c31af7Sopenharmony_ci	    "layout(rgba32ui) uniform mediump writeonly uimageCubeArray"
491e5c31af7Sopenharmony_ci	};
492e5c31af7Sopenharmony_ci
493e5c31af7Sopenharmony_ci	ctx.beginSection("GL_EXT_texture_cube_map_array features require enabling the extension in 310 es shaders.");
494e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerCubeArrayTypes); ++ndx)
495e5c31af7Sopenharmony_ci	{
496e5c31af7Sopenharmony_ci		std::ostringstream source;
497e5c31af7Sopenharmony_ci		source <<	"#version 310 es\n"
498e5c31af7Sopenharmony_ci					"" << s_samplerCubeArrayTypes[ndx] << " u_cube;\n"
499e5c31af7Sopenharmony_ci					"void main()\n"
500e5c31af7Sopenharmony_ci					"{\n"
501e5c31af7Sopenharmony_ci					"}\n";
502e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL);
503e5c31af7Sopenharmony_ci	}
504e5c31af7Sopenharmony_ci	ctx.endSection();
505e5c31af7Sopenharmony_ci}
506e5c31af7Sopenharmony_ci
507e5c31af7Sopenharmony_civoid executeAccessingBoundingBoxType (NegativeTestContext& ctx, const std::string builtInTypeName, glu::GLSLVersion glslVersion)
508e5c31af7Sopenharmony_ci{
509e5c31af7Sopenharmony_ci	std::ostringstream	sourceStream;
510e5c31af7Sopenharmony_ci	std::string			version;
511e5c31af7Sopenharmony_ci	std::string			extensionPrim;
512e5c31af7Sopenharmony_ci	std::string			extensionTess;
513e5c31af7Sopenharmony_ci
514e5c31af7Sopenharmony_ci	if (glslVersion == glu::GLSL_VERSION_310_ES)
515e5c31af7Sopenharmony_ci	{
516e5c31af7Sopenharmony_ci		version = "#version 310 es\n";
517e5c31af7Sopenharmony_ci		extensionPrim = "#extension GL_EXT_primitive_bounding_box : require\n";
518e5c31af7Sopenharmony_ci		extensionTess = "#extension GL_EXT_tessellation_shader : require\n";
519e5c31af7Sopenharmony_ci	}
520e5c31af7Sopenharmony_ci	else if (glslVersion >= glu::GLSL_VERSION_320_ES)
521e5c31af7Sopenharmony_ci	{
522e5c31af7Sopenharmony_ci		version = "#version 320 es\n";
523e5c31af7Sopenharmony_ci		extensionPrim = "";
524e5c31af7Sopenharmony_ci		extensionTess = "";
525e5c31af7Sopenharmony_ci	}
526e5c31af7Sopenharmony_ci	else
527e5c31af7Sopenharmony_ci	{
528e5c31af7Sopenharmony_ci		DE_FATAL("error: context below 3.1 and not supported");
529e5c31af7Sopenharmony_ci	}
530e5c31af7Sopenharmony_ci
531e5c31af7Sopenharmony_ci	ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in vertex shader");
532e5c31af7Sopenharmony_ci	sourceStream	<< version
533e5c31af7Sopenharmony_ci					<< extensionPrim
534e5c31af7Sopenharmony_ci					<< "void main()\n"
535e5c31af7Sopenharmony_ci					<< "{\n"
536e5c31af7Sopenharmony_ci					<< "	" + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n"
537e5c31af7Sopenharmony_ci					<< "	gl_Position = " + builtInTypeName + "[0];\n"
538e5c31af7Sopenharmony_ci					<< "}\n";
539e5c31af7Sopenharmony_ci	verifyShader(ctx, glu::SHADERTYPE_VERTEX, sourceStream.str(), EXPECT_RESULT_FAIL);
540e5c31af7Sopenharmony_ci	ctx.endSection();
541e5c31af7Sopenharmony_ci
542e5c31af7Sopenharmony_ci	sourceStream.str(std::string());
543e5c31af7Sopenharmony_ci
544e5c31af7Sopenharmony_ci	if (ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_EVALUATION))
545e5c31af7Sopenharmony_ci	{
546e5c31af7Sopenharmony_ci		ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in tessellation evaluation shader");
547e5c31af7Sopenharmony_ci		sourceStream	<< version
548e5c31af7Sopenharmony_ci						<< extensionPrim
549e5c31af7Sopenharmony_ci						<< extensionTess
550e5c31af7Sopenharmony_ci						<< "layout (triangles, equal_spacing, ccw) in;\n"
551e5c31af7Sopenharmony_ci						<< "void main()\n"
552e5c31af7Sopenharmony_ci						<< "{\n"
553e5c31af7Sopenharmony_ci						<< "	" + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n"
554e5c31af7Sopenharmony_ci						<< "	gl_Position = (	gl_TessCoord.x * " +  builtInTypeName + "[0] +\n"
555e5c31af7Sopenharmony_ci						<< "					gl_TessCoord.y * " +  builtInTypeName + "[0] +\n"
556e5c31af7Sopenharmony_ci						<< "					gl_TessCoord.z * " +  builtInTypeName + "[0]);\n"
557e5c31af7Sopenharmony_ci						<< "}\n";
558e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_EVALUATION, sourceStream.str(), EXPECT_RESULT_FAIL);
559e5c31af7Sopenharmony_ci		ctx.endSection();
560e5c31af7Sopenharmony_ci
561e5c31af7Sopenharmony_ci		sourceStream.str(std::string());
562e5c31af7Sopenharmony_ci	}
563e5c31af7Sopenharmony_ci
564e5c31af7Sopenharmony_ci	if (ctx.isShaderSupported(glu::SHADERTYPE_GEOMETRY))
565e5c31af7Sopenharmony_ci	{
566e5c31af7Sopenharmony_ci		ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in geometry shader");
567e5c31af7Sopenharmony_ci		sourceStream	<< version
568e5c31af7Sopenharmony_ci						<< extensionPrim
569e5c31af7Sopenharmony_ci						<< "layout (triangles) in;\n"
570e5c31af7Sopenharmony_ci						<< "layout (triangle_strip, max_vertices = 3) out;\n"
571e5c31af7Sopenharmony_ci						<< "void main()\n"
572e5c31af7Sopenharmony_ci						<< "{\n"
573e5c31af7Sopenharmony_ci						<< "	" + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n"
574e5c31af7Sopenharmony_ci						<< "	for (int idx = 0; idx < 3; idx++)\n"
575e5c31af7Sopenharmony_ci						<< "	{\n"
576e5c31af7Sopenharmony_ci						<< "		gl_Position = gl_in[idx].gl_Position * " + builtInTypeName + "[0];\n"
577e5c31af7Sopenharmony_ci						<< "		EmitVertex();\n"
578e5c31af7Sopenharmony_ci						<< "	}\n"
579e5c31af7Sopenharmony_ci						<< "	EndPrimitive();\n"
580e5c31af7Sopenharmony_ci						<< "}\n";
581e5c31af7Sopenharmony_ci		verifyShader(ctx, glu::SHADERTYPE_GEOMETRY, sourceStream.str(), EXPECT_RESULT_FAIL);
582e5c31af7Sopenharmony_ci		ctx.endSection();
583e5c31af7Sopenharmony_ci
584e5c31af7Sopenharmony_ci		sourceStream.str(std::string());
585e5c31af7Sopenharmony_ci	}
586e5c31af7Sopenharmony_ci
587e5c31af7Sopenharmony_ci	ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in fragment shader");
588e5c31af7Sopenharmony_ci	sourceStream	<< version
589e5c31af7Sopenharmony_ci					<< extensionPrim
590e5c31af7Sopenharmony_ci					<< "layout (location = 0) out mediump vec4 fs_colour;\n"
591e5c31af7Sopenharmony_ci					<< "void main()\n"
592e5c31af7Sopenharmony_ci					<< "{\n"
593e5c31af7Sopenharmony_ci					<< "	" + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n"
594e5c31af7Sopenharmony_ci					<< "	fs_colour = " + builtInTypeName + "[0];\n"
595e5c31af7Sopenharmony_ci					<< "}\n";
596e5c31af7Sopenharmony_ci	verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, sourceStream.str(), EXPECT_RESULT_FAIL);
597e5c31af7Sopenharmony_ci	ctx.endSection();
598e5c31af7Sopenharmony_ci}
599e5c31af7Sopenharmony_ci
600e5c31af7Sopenharmony_civoid accessing_bounding_box_type (NegativeTestContext& ctx)
601e5c31af7Sopenharmony_ci{
602e5c31af7Sopenharmony_ci	// Extension requirements and name differences depending on the context
603e5c31af7Sopenharmony_ci	if ((ctx.getRenderContext().getType().getMajorVersion() == 3) && (ctx.getRenderContext().getType().getMinorVersion() == 1))
604e5c31af7Sopenharmony_ci	{
605e5c31af7Sopenharmony_ci		executeAccessingBoundingBoxType(ctx, "gl_BoundingBoxEXT", glu::GLSL_VERSION_310_ES);
606e5c31af7Sopenharmony_ci	}
607e5c31af7Sopenharmony_ci	else
608e5c31af7Sopenharmony_ci	{
609e5c31af7Sopenharmony_ci		executeAccessingBoundingBoxType(ctx, "gl_BoundingBox", glu::GLSL_VERSION_320_ES);
610e5c31af7Sopenharmony_ci	}
611e5c31af7Sopenharmony_ci
612e5c31af7Sopenharmony_ci}
613e5c31af7Sopenharmony_ci
614e5c31af7Sopenharmony_ci} // anonymous
615e5c31af7Sopenharmony_ci
616e5c31af7Sopenharmony_cistd::vector<FunctionContainer> getNegativeShaderDirectiveTestFunctions (void)
617e5c31af7Sopenharmony_ci{
618e5c31af7Sopenharmony_ci	const FunctionContainer funcs[] =
619e5c31af7Sopenharmony_ci	{
620e5c31af7Sopenharmony_ci		{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."	},
621e5c31af7Sopenharmony_ci		{blend_equation_advanced,				"blend_equation_advanced",				"GL_KHR_blend_equation_advanced is required in 310 es shaders to use AEP features"												},
622e5c31af7Sopenharmony_ci		{sample_variables,						"sample_variables",						"GL_OES_sample_variables is required in 310 es shaders to use AEP features"														},
623e5c31af7Sopenharmony_ci		{shader_image_atomic,					"shader_image_atomic",					"GL_OES_shader_image_atomic is required in 310 es shaders to use AEP features"													},
624e5c31af7Sopenharmony_ci		{shader_multisample_interpolation,		"shader_multisample_interpolation",		"GL_OES_shader_multisample_interpolation is required in 310 es shaders to use AEP features"										},
625e5c31af7Sopenharmony_ci		{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"									},
626e5c31af7Sopenharmony_ci		{geometry_shader,						"geometry_shader",						"GL_EXT_geometry_shader is required in 310 es shaders to use AEP features"														},
627e5c31af7Sopenharmony_ci		{gpu_shader_5,							"gpu_shader_5",							"GL_EXT_gpu_shader5 is required in 310 es shaders to use AEP features"															},
628e5c31af7Sopenharmony_ci		{shader_io_blocks,						"shader_io_blocks",						"GL_EXT_shader_io_blocks is required in 310 es shaders to use AEP features"														},
629e5c31af7Sopenharmony_ci		{tessellation_shader,					"tessellation_shader",					"GL_EXT_tessellation_shader is required in 310 es shaders to use AEP features"													},
630e5c31af7Sopenharmony_ci		{texture_buffer,						"texture_buffer",						"GL_EXT_texture_buffer is required in 310 es shaders to use AEP features"														},
631e5c31af7Sopenharmony_ci		{texture_cube_map_array,				"texture_cube_map_array",				"GL_EXT_texture_cube_map_array is required in 310 es shaders to use AEP features"												},
632e5c31af7Sopenharmony_ci		{accessing_bounding_box_type,			"accessing_bounding_box_type",			"Should not be able to access gl_BoundingBoxEXT[] and gl_BoundingBox[] in shaders other than tess control and evaluation"		},
633e5c31af7Sopenharmony_ci	};
634e5c31af7Sopenharmony_ci
635e5c31af7Sopenharmony_ci	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
636e5c31af7Sopenharmony_ci}
637e5c31af7Sopenharmony_ci
638e5c31af7Sopenharmony_ci} // NegativeTestShared
639e5c31af7Sopenharmony_ci} // Functional
640e5c31af7Sopenharmony_ci} // gles31
641e5c31af7Sopenharmony_ci} // deqp
642