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