1c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe/*-------------------------------------------------------------------------
2c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * drawElements Quality Program OpenGL ES 3.1 Module
3c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * -------------------------------------------------
4c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *
5c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * Copyright 2015 The Android Open Source Project
6c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *
7c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * Licensed under the Apache License, Version 2.0 (the "License");
8c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * you may not use this file except in compliance with the License.
9c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * You may obtain a copy of the License at
10c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *
11c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *      http://www.apache.org/licenses/LICENSE-2.0
12c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *
13c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * Unless required by applicable law or agreed to in writing, software
14c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * distributed under the License is distributed on an "AS IS" BASIS,
15c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * See the License for the specific language governing permissions and
17c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * limitations under the License.
18c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *
19c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *//*!
20c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * \file
21c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * \brief Negative Atomic Counter Tests
22c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *//*--------------------------------------------------------------------*/
23c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
24c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "es31fNegativeAtomicCounterTests.hpp"
25c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
26c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "deUniquePtr.hpp"
27c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
28c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "glwEnums.hpp"
29c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "gluShaderProgram.hpp"
30c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
31c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "tcuTestLog.hpp"
32c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
33c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace deqp
34c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
35c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace gles31
36c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
37c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace Functional
38c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
39c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace NegativeTestShared
40c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
41c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace
42c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
43c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
44c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppeenum TestCase
45c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
46c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_LAYOUT_LARGE_BINDING = 0,
47c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_LAYOUT_MEDIUMP_PRECISION,
48c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_LAYOUT_LOWP_PRECISION,
49c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_LAYOUT_BINDING_OFFSET_OVERLAP,
50c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_LAYOUT_BINDING_OMITTED,
51c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_STRUCT,
52c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_BODY_WRITE,
53c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_BODY_DECLARE,
54c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
55c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	TESTCASE_LAST
56c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe};
57c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
58c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestatic const glu::ShaderType s_shaders[] =
59c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
60c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	glu::SHADERTYPE_VERTEX,
61c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	glu::SHADERTYPE_FRAGMENT,
62c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	glu::SHADERTYPE_GEOMETRY,
63c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	glu::SHADERTYPE_TESSELLATION_CONTROL,
64c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	glu::SHADERTYPE_TESSELLATION_EVALUATION,
65c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	glu::SHADERTYPE_COMPUTE
66c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe};
67c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
68c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string genShaderSource (NegativeTestContext& ctx, TestCase test, glu::ShaderType type)
69c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
70c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	DE_ASSERT(test < TESTCASE_LAST && type < glu::SHADERTYPE_LAST);
71c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
72c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	glw::GLint maxBuffers = -1;
73c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	std::ostringstream shader;
74c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
75c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxBuffers);
76c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
77c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	shader << getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES) << "\n";
78c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
79c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	switch (type)
80c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	{
81c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case glu::SHADERTYPE_GEOMETRY:
82c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "#extension GL_EXT_geometry_shader : enable\n";
83c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "layout(max_vertices = 3) out;\n";
84c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
85c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
86c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case glu::SHADERTYPE_TESSELLATION_CONTROL:
87c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case glu::SHADERTYPE_TESSELLATION_EVALUATION:
88c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "#extension GL_EXT_tessellation_shader : enable\n";
89c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
90c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
91c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		default:
92c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
93c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	}
94c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
95c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	switch (test)
96c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	{
97c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_LAYOUT_LARGE_BINDING:
98c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "layout (binding = " << maxBuffers << ", offset = 0) uniform atomic_uint counter0;\n";
99c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
100c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
101c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_LAYOUT_MEDIUMP_PRECISION:
102c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "layout (binding = 1, offset = 0) " << glu::getPrecisionName(glu::PRECISION_MEDIUMP) << " uniform atomic_uint counter0;\n";
103c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
104c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
105c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_LAYOUT_LOWP_PRECISION:
106c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "layout (binding = 1, offset = 0) " << glu::getPrecisionName(glu::PRECISION_LOWP) << " uniform atomic_uint counter0;\n";
107c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
108c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
109c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_LAYOUT_BINDING_OFFSET_OVERLAP:
110c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "layout (binding = 1, offset = 0) uniform atomic_uint counter0;\n"
111c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				   << "layout (binding = 1, offset = 2) uniform atomic_uint counter1;\n";
112c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
113c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
114c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_LAYOUT_BINDING_OMITTED:
115c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "layout (offset = 0) uniform atomic_uint counter0;\n";
116c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
117c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
118c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_STRUCT:
119c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "struct\n"
120c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				   << "{\n"
121c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				   << "  int a;\n"
122c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				   << "  atomic_uint counter;\n"
123c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				   << "} S;\n";
124c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
125c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
126c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_BODY_WRITE:
127c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "layout (binding = 1) uniform atomic_uint counter;\n";
128c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
129c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
130c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		default:
131c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
132c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	}
133c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
134c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	shader << "void main (void)\n"
135c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				 << "{\n";
136c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
137c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	switch (test)
138c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	{
139c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_BODY_WRITE:
140c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "counter = 1;\n";
141c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
142c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
143c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		case TESTCASE_BODY_DECLARE:
144c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			shader << "atomic_uint counter;\n";
145c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
146c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
147c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		default:
148c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			break;
149c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	}
150c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
151c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	shader << "}\n";
152c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
153c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	return shader.str();
154c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
155c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
156c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid iterateShaders (NegativeTestContext& ctx, TestCase testCase)
157c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
158c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	tcu::TestLog& log = ctx.getLog();
159c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaders); ndx++)
160c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	{
161c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		if (ctx.isShaderSupported(s_shaders[ndx]))
162c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{
163c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			ctx.beginSection(std::string("Verify shader: ") + glu::getShaderTypeName(s_shaders[ndx]));
164c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			const glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << glu::ShaderSource(s_shaders[ndx], genShaderSource(ctx, testCase, s_shaders[ndx])));
165c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			if (program.getShaderInfo(s_shaders[ndx]).compileOk)
166c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			{
167c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				log << program;
168c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				log << tcu::TestLog::Message << "Expected program to fail, but compilation passed." << tcu::TestLog::EndMessage;
169c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe				ctx.fail("Shader was not expected to compile.");
170c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			}
171c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe			ctx.endSection();
172c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		}
173c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	}
174c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
175c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
176c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_max_counter_bindings (NegativeTestContext& ctx)
177c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
178c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.beginSection("It is a compile-time error to bind an atomic counter with a binding value greater than or equal to gl_MaxAtomicCounterBindings.");
179c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_LAYOUT_LARGE_BINDING);
180c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.endSection();
181c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
182c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
183c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_precision (NegativeTestContext& ctx)
184c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
185c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.beginSection("It is an error to declare an atomic type with a lowp or mediump precision.");
186c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_LAYOUT_MEDIUMP_PRECISION);
187c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_LAYOUT_LOWP_PRECISION);
188c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.endSection();
189c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
190c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
191c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_binding_offset_overlap (NegativeTestContext& ctx)
192c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
193c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.beginSection("Atomic counters may not have overlapping offsets in the same binding.");
194c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_LAYOUT_BINDING_OFFSET_OVERLAP);
195c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.endSection();
196c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
197c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
198c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_binding_omitted (NegativeTestContext& ctx)
199c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
200c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.beginSection("Atomic counters must specify a binding point");
201c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_LAYOUT_BINDING_OMITTED);
202c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.endSection();
203c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
204c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
205c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_struct (NegativeTestContext& ctx)
206c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
207c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.beginSection("Structures may not have an atomic_uint variable.");
208c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_STRUCT);
209c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.endSection();
210c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
211c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
212c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_body_write (NegativeTestContext& ctx)
213c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
214c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.beginSection("An atomic_uint variable cannot be directly written to.");
215c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_BODY_WRITE);
216c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.endSection();
217c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
218c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
219c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_body_declare (NegativeTestContext& ctx)
220c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
221c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.beginSection("An atomic_uint variable cannot be declared in local scope");
222c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	iterateShaders(ctx, TESTCASE_BODY_DECLARE);
223c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	ctx.endSection();
224c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
225c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
226c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // anonymous
227c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
228c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::vector<FunctionContainer> getNegativeAtomicCounterTestFunctions ()
229c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{
230c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	const FunctionContainer funcs[] =
231c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	{
232c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{atomic_max_counter_bindings,		"atomic_max_counter_bindings",		"Invalid atomic counter buffer binding."	},
233c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{atomic_precision,					"atomic_precision",					"Invalid precision qualifier."				},
234c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{atomic_binding_offset_overlap,		"atomic_binding_offset_overlap",	"Invalid offset."							},
235c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{atomic_binding_omitted,			"atomic_binding_omitted",			"Binding not specified."					},
236c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{atomic_struct,						"atomic_struct",					"Invalid atomic_uint usage in struct."		},
237c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{atomic_body_write,					"atomic_body_write",				"Invalid write access to atomic_uint."		},
238c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe		{atomic_body_declare,				"atomic_body_declare",				"Invalid precision qualifier."				},
239c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	};
240c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
241c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
242c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}
243c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe
244c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // NegativeTestShared
245c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // Functional
246c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // gles31
247c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // deqp
248