1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.1 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2017 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Negative Compute tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es31fNegativeComputeTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker namespace deqp
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard Worker using std::map;
35*35238bceSAndroid Build Coastguard Worker using std::string;
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard Worker namespace gles31
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace Functional
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace NegativeTestShared
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
47*35238bceSAndroid Build Coastguard Worker using namespace glw;
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker static const char *const vertexShaderSource = "${GLSL_VERSION_STRING}\n"
50*35238bceSAndroid Build Coastguard Worker "\n"
51*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
52*35238bceSAndroid Build Coastguard Worker "{\n"
53*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0.0);\n"
54*35238bceSAndroid Build Coastguard Worker "}\n";
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker static const char *const fragmentShaderSource = "${GLSL_VERSION_STRING}\n"
57*35238bceSAndroid Build Coastguard Worker "precision mediump float;\n"
58*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 fragColor;\n"
59*35238bceSAndroid Build Coastguard Worker "\n"
60*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
61*35238bceSAndroid Build Coastguard Worker "{\n"
62*35238bceSAndroid Build Coastguard Worker " fragColor = vec4(1.0);\n"
63*35238bceSAndroid Build Coastguard Worker "}\n";
64*35238bceSAndroid Build Coastguard Worker
65*35238bceSAndroid Build Coastguard Worker static const char *const computeShaderSource = "${GLSL_VERSION_STRING}\n"
66*35238bceSAndroid Build Coastguard Worker "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
67*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
68*35238bceSAndroid Build Coastguard Worker "{\n"
69*35238bceSAndroid Build Coastguard Worker "}\n";
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Worker static const char *const invalidComputeShaderSource =
72*35238bceSAndroid Build Coastguard Worker "${GLSL_VERSION_STRING}\n"
73*35238bceSAndroid Build Coastguard Worker "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
74*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
75*35238bceSAndroid Build Coastguard Worker "{\n"
76*35238bceSAndroid Build Coastguard Worker " highp uint var = -1;\n" // error
77*35238bceSAndroid Build Coastguard Worker "}\n";
78*35238bceSAndroid Build Coastguard Worker
getResourceLimit(NegativeTestContext & ctx,GLenum resource)79*35238bceSAndroid Build Coastguard Worker int getResourceLimit(NegativeTestContext &ctx, GLenum resource)
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker int limit = 0;
82*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegerv(resource, &limit);
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker return limit;
85*35238bceSAndroid Build Coastguard Worker }
86*35238bceSAndroid Build Coastguard Worker
verifyLinkError(NegativeTestContext & ctx,const glu::ShaderProgram & program)87*35238bceSAndroid Build Coastguard Worker void verifyLinkError(NegativeTestContext &ctx, const glu::ShaderProgram &program)
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker bool testFailed = false;
90*35238bceSAndroid Build Coastguard Worker
91*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
92*35238bceSAndroid Build Coastguard Worker log << program;
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard Worker testFailed = program.getProgramInfo().linkOk;
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker if (testFailed)
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker const char *const message("Program was not expected to link.");
99*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
100*35238bceSAndroid Build Coastguard Worker ctx.fail(message);
101*35238bceSAndroid Build Coastguard Worker }
102*35238bceSAndroid Build Coastguard Worker }
103*35238bceSAndroid Build Coastguard Worker
verifyCompileError(NegativeTestContext & ctx,const glu::ShaderProgram & program,glu::ShaderType shaderType)104*35238bceSAndroid Build Coastguard Worker void verifyCompileError(NegativeTestContext &ctx, const glu::ShaderProgram &program, glu::ShaderType shaderType)
105*35238bceSAndroid Build Coastguard Worker {
106*35238bceSAndroid Build Coastguard Worker bool testFailed = false;
107*35238bceSAndroid Build Coastguard Worker
108*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
109*35238bceSAndroid Build Coastguard Worker log << program;
110*35238bceSAndroid Build Coastguard Worker
111*35238bceSAndroid Build Coastguard Worker testFailed = program.getShaderInfo(shaderType).compileOk;
112*35238bceSAndroid Build Coastguard Worker
113*35238bceSAndroid Build Coastguard Worker if (testFailed)
114*35238bceSAndroid Build Coastguard Worker {
115*35238bceSAndroid Build Coastguard Worker const char *const message("Program was not expected to compile.");
116*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
117*35238bceSAndroid Build Coastguard Worker ctx.fail(message);
118*35238bceSAndroid Build Coastguard Worker }
119*35238bceSAndroid Build Coastguard Worker }
120*35238bceSAndroid Build Coastguard Worker
generateComputeShader(NegativeTestContext & ctx,const string & shaderDeclarations,const string & shaderBody)121*35238bceSAndroid Build Coastguard Worker string generateComputeShader(NegativeTestContext &ctx, const string &shaderDeclarations, const string &shaderBody)
122*35238bceSAndroid Build Coastguard Worker {
123*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
124*35238bceSAndroid Build Coastguard Worker const char *const shaderVersion = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
125*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker std::ostringstream compShaderSource;
128*35238bceSAndroid Build Coastguard Worker
129*35238bceSAndroid Build Coastguard Worker compShaderSource << shaderVersion << "\n"
130*35238bceSAndroid Build Coastguard Worker << "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
131*35238bceSAndroid Build Coastguard Worker << shaderDeclarations << "\n"
132*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
133*35238bceSAndroid Build Coastguard Worker << "{\n"
134*35238bceSAndroid Build Coastguard Worker << shaderBody << "}\n";
135*35238bceSAndroid Build Coastguard Worker
136*35238bceSAndroid Build Coastguard Worker return compShaderSource.str();
137*35238bceSAndroid Build Coastguard Worker }
138*35238bceSAndroid Build Coastguard Worker
genBuiltInSource(glu::ShaderType shaderType)139*35238bceSAndroid Build Coastguard Worker string genBuiltInSource(glu::ShaderType shaderType)
140*35238bceSAndroid Build Coastguard Worker {
141*35238bceSAndroid Build Coastguard Worker std::ostringstream source;
142*35238bceSAndroid Build Coastguard Worker source << "${GLSL_VERSION_STRING}\n";
143*35238bceSAndroid Build Coastguard Worker
144*35238bceSAndroid Build Coastguard Worker switch (shaderType)
145*35238bceSAndroid Build Coastguard Worker {
146*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_VERTEX:
147*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_FRAGMENT:
148*35238bceSAndroid Build Coastguard Worker break;
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_COMPUTE:
151*35238bceSAndroid Build Coastguard Worker source << "layout (local_size_x = 1) in;\n";
152*35238bceSAndroid Build Coastguard Worker break;
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_GEOMETRY:
155*35238bceSAndroid Build Coastguard Worker source << "layout(points) in;\n"
156*35238bceSAndroid Build Coastguard Worker << "layout(line_strip, max_vertices = 3) out;\n";
157*35238bceSAndroid Build Coastguard Worker break;
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_TESSELLATION_CONTROL:
160*35238bceSAndroid Build Coastguard Worker source << "${GLSL_TESS_EXTENSION_STRING}\n"
161*35238bceSAndroid Build Coastguard Worker << "layout(vertices = 10) out;\n";
162*35238bceSAndroid Build Coastguard Worker break;
163*35238bceSAndroid Build Coastguard Worker
164*35238bceSAndroid Build Coastguard Worker case glu::SHADERTYPE_TESSELLATION_EVALUATION:
165*35238bceSAndroid Build Coastguard Worker source << "${GLSL_TESS_EXTENSION_STRING}\n"
166*35238bceSAndroid Build Coastguard Worker << "layout(triangles) in;\n";
167*35238bceSAndroid Build Coastguard Worker break;
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker default:
170*35238bceSAndroid Build Coastguard Worker DE_FATAL("Unknown shader type");
171*35238bceSAndroid Build Coastguard Worker break;
172*35238bceSAndroid Build Coastguard Worker }
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker source << "\n"
175*35238bceSAndroid Build Coastguard Worker << "void main(void)\n"
176*35238bceSAndroid Build Coastguard Worker << "{\n"
177*35238bceSAndroid Build Coastguard Worker << "${COMPUTE_BUILT_IN_CONSTANTS_STRING}"
178*35238bceSAndroid Build Coastguard Worker << "}\n";
179*35238bceSAndroid Build Coastguard Worker
180*35238bceSAndroid Build Coastguard Worker return source.str();
181*35238bceSAndroid Build Coastguard Worker }
182*35238bceSAndroid Build Coastguard Worker
exceed_uniform_block_limit(NegativeTestContext & ctx)183*35238bceSAndroid Build Coastguard Worker void exceed_uniform_block_limit(NegativeTestContext &ctx)
184*35238bceSAndroid Build Coastguard Worker {
185*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
186*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
187*35238bceSAndroid Build Coastguard Worker
188*35238bceSAndroid Build Coastguard Worker shaderDecl << "layout(std140, binding = 0) uniform Block\n"
189*35238bceSAndroid Build Coastguard Worker << "{\n"
190*35238bceSAndroid Build Coastguard Worker << " highp vec4 val;\n"
191*35238bceSAndroid Build Coastguard Worker << "} block[" << getResourceLimit(ctx, GL_MAX_COMPUTE_UNIFORM_BLOCKS) + 1 << "];\n";
192*35238bceSAndroid Build Coastguard Worker
193*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
194*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
195*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
196*35238bceSAndroid Build Coastguard Worker
197*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Link error is generated if a compute shader exceeds GL_MAX_COMPUTE_UNIFORM_BLOCKS.");
198*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
199*35238bceSAndroid Build Coastguard Worker ctx.endSection();
200*35238bceSAndroid Build Coastguard Worker }
201*35238bceSAndroid Build Coastguard Worker
exceed_shader_storage_block_limit(NegativeTestContext & ctx)202*35238bceSAndroid Build Coastguard Worker void exceed_shader_storage_block_limit(NegativeTestContext &ctx)
203*35238bceSAndroid Build Coastguard Worker {
204*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
205*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker shaderDecl << "layout(std140, binding = 0) buffer Block\n"
208*35238bceSAndroid Build Coastguard Worker << "{\n"
209*35238bceSAndroid Build Coastguard Worker << " highp vec4 val;\n"
210*35238bceSAndroid Build Coastguard Worker << "} block[" << getResourceLimit(ctx, GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS) + 1 << "];\n";
211*35238bceSAndroid Build Coastguard Worker
212*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
213*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
214*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
215*35238bceSAndroid Build Coastguard Worker
216*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Link error is generated if compute shader exceeds GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS.");
217*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
218*35238bceSAndroid Build Coastguard Worker ctx.endSection();
219*35238bceSAndroid Build Coastguard Worker }
220*35238bceSAndroid Build Coastguard Worker
exceed_texture_image_units_limit(NegativeTestContext & ctx)221*35238bceSAndroid Build Coastguard Worker void exceed_texture_image_units_limit(NegativeTestContext &ctx)
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker const int limit = getResourceLimit(ctx, GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS) + 1;
224*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
225*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
226*35238bceSAndroid Build Coastguard Worker
227*35238bceSAndroid Build Coastguard Worker shaderDecl << "layout(binding = 0) "
228*35238bceSAndroid Build Coastguard Worker << "uniform highp sampler2D u_sampler[" << limit + 1 << "];\n"
229*35238bceSAndroid Build Coastguard Worker << "\n"
230*35238bceSAndroid Build Coastguard Worker << "layout(binding = 0) buffer Output {\n"
231*35238bceSAndroid Build Coastguard Worker << " vec4 values[ " << limit + 1 << " ];\n"
232*35238bceSAndroid Build Coastguard Worker << "} sb_out;\n";
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < limit + 1; ++i)
235*35238bceSAndroid Build Coastguard Worker shaderBody << " sb_out.values[" << i << "] = texture(u_sampler[" << i << "], vec2(1.0f));\n";
236*35238bceSAndroid Build Coastguard Worker
237*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
238*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
239*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
240*35238bceSAndroid Build Coastguard Worker
241*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
242*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Message
243*35238bceSAndroid Build Coastguard Worker << "Possible link error is generated if compute shader exceeds GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS."
244*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
245*35238bceSAndroid Build Coastguard Worker log << program;
246*35238bceSAndroid Build Coastguard Worker
247*35238bceSAndroid Build Coastguard Worker if (program.getProgramInfo().linkOk)
248*35238bceSAndroid Build Coastguard Worker {
249*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Message << "Quality Warning: program was not expected to link."
250*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
251*35238bceSAndroid Build Coastguard Worker ctx.glUseProgram(program.getProgram());
252*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
253*35238bceSAndroid Build Coastguard Worker
254*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION error is generated if the sum of the number of active samplers for each "
255*35238bceSAndroid Build Coastguard Worker "active program exceeds the maximum number of texture image units allowed");
256*35238bceSAndroid Build Coastguard Worker ctx.glDispatchCompute(1, 1, 1);
257*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
258*35238bceSAndroid Build Coastguard Worker ctx.endSection();
259*35238bceSAndroid Build Coastguard Worker }
260*35238bceSAndroid Build Coastguard Worker }
261*35238bceSAndroid Build Coastguard Worker
exceed_image_uniforms_limit(NegativeTestContext & ctx)262*35238bceSAndroid Build Coastguard Worker void exceed_image_uniforms_limit(NegativeTestContext &ctx)
263*35238bceSAndroid Build Coastguard Worker {
264*35238bceSAndroid Build Coastguard Worker const int limit = getResourceLimit(ctx, GL_MAX_COMPUTE_IMAGE_UNIFORMS);
265*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
266*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
267*35238bceSAndroid Build Coastguard Worker
268*35238bceSAndroid Build Coastguard Worker shaderDecl << "layout(rgba8, binding = 0) "
269*35238bceSAndroid Build Coastguard Worker << "uniform readonly highp image2D u_image[" << limit + 1 << "];\n"
270*35238bceSAndroid Build Coastguard Worker << "\n"
271*35238bceSAndroid Build Coastguard Worker << "layout(binding = 0) buffer Output {\n"
272*35238bceSAndroid Build Coastguard Worker << " float values[" << limit + 1 << "];\n"
273*35238bceSAndroid Build Coastguard Worker << "} sb_out;\n";
274*35238bceSAndroid Build Coastguard Worker
275*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < limit + 1; ++i)
276*35238bceSAndroid Build Coastguard Worker shaderBody << " sb_out.values[" << i << "]"
277*35238bceSAndroid Build Coastguard Worker << " = imageLoad(u_image[" << i << "], ivec2(gl_GlobalInvocationID.xy)).x;\n";
278*35238bceSAndroid Build Coastguard Worker
279*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
280*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
281*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Link error is generated if compute shader exceeds GL_MAX_COMPUTE_IMAGE_UNIFORMS.");
284*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
285*35238bceSAndroid Build Coastguard Worker ctx.endSection();
286*35238bceSAndroid Build Coastguard Worker }
287*35238bceSAndroid Build Coastguard Worker
exceed_shared_memory_size_limit(NegativeTestContext & ctx)288*35238bceSAndroid Build Coastguard Worker void exceed_shared_memory_size_limit(NegativeTestContext &ctx)
289*35238bceSAndroid Build Coastguard Worker {
290*35238bceSAndroid Build Coastguard Worker const int limit = getResourceLimit(ctx, GL_MAX_COMPUTE_SHARED_MEMORY_SIZE);
291*35238bceSAndroid Build Coastguard Worker const long numberOfElements = limit / sizeof(GLuint);
292*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
293*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
294*35238bceSAndroid Build Coastguard Worker
295*35238bceSAndroid Build Coastguard Worker shaderDecl << "shared uint values[" << numberOfElements + 1 << "];\n"
296*35238bceSAndroid Build Coastguard Worker << "\n"
297*35238bceSAndroid Build Coastguard Worker << "layout(binding = 0) buffer Output {\n"
298*35238bceSAndroid Build Coastguard Worker << " uint values;\n"
299*35238bceSAndroid Build Coastguard Worker << "} sb_out;\n";
300*35238bceSAndroid Build Coastguard Worker
301*35238bceSAndroid Build Coastguard Worker shaderBody << " sb_out.values = values[" << numberOfElements << "];\n";
302*35238bceSAndroid Build Coastguard Worker
303*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
304*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
305*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
306*35238bceSAndroid Build Coastguard Worker
307*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Link error is generated if compute shader exceeds GL_MAX_COMPUTE_SHARED_MEMORY_SIZE.");
308*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
309*35238bceSAndroid Build Coastguard Worker ctx.endSection();
310*35238bceSAndroid Build Coastguard Worker }
311*35238bceSAndroid Build Coastguard Worker
exceed_uniform_components_limit(NegativeTestContext & ctx)312*35238bceSAndroid Build Coastguard Worker void exceed_uniform_components_limit(NegativeTestContext &ctx)
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker const int limit = getResourceLimit(ctx, GL_MAX_COMPUTE_UNIFORM_COMPONENTS);
315*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
316*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
317*35238bceSAndroid Build Coastguard Worker
318*35238bceSAndroid Build Coastguard Worker shaderDecl << "uniform highp uint u_value[" << limit + 1 << "];\n"
319*35238bceSAndroid Build Coastguard Worker << "\n"
320*35238bceSAndroid Build Coastguard Worker << "layout(binding = 0) buffer Output {\n"
321*35238bceSAndroid Build Coastguard Worker << " uint values[2];\n"
322*35238bceSAndroid Build Coastguard Worker << "} sb_out;\n";
323*35238bceSAndroid Build Coastguard Worker
324*35238bceSAndroid Build Coastguard Worker shaderBody << " sb_out.values[0] = u_value[" << limit << "];\n";
325*35238bceSAndroid Build Coastguard Worker shaderBody << " sb_out.values[1] = u_value[0];\n";
326*35238bceSAndroid Build Coastguard Worker
327*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
328*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
329*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
330*35238bceSAndroid Build Coastguard Worker
331*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Link error is generated if compute shader exceeds GL_MAX_COMPUTE_UNIFORM_COMPONENTS.");
332*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
333*35238bceSAndroid Build Coastguard Worker ctx.endSection();
334*35238bceSAndroid Build Coastguard Worker }
335*35238bceSAndroid Build Coastguard Worker
exceed_atomic_counter_buffer_limit(NegativeTestContext & ctx)336*35238bceSAndroid Build Coastguard Worker void exceed_atomic_counter_buffer_limit(NegativeTestContext &ctx)
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker const int limit = getResourceLimit(ctx, GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS);
339*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
340*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
341*35238bceSAndroid Build Coastguard Worker
342*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < limit + 1; ++i)
343*35238bceSAndroid Build Coastguard Worker {
344*35238bceSAndroid Build Coastguard Worker shaderDecl << "layout(binding = " << i << ") "
345*35238bceSAndroid Build Coastguard Worker << "uniform atomic_uint u_atomic" << i << ";\n";
346*35238bceSAndroid Build Coastguard Worker
347*35238bceSAndroid Build Coastguard Worker if (i == 0)
348*35238bceSAndroid Build Coastguard Worker shaderBody << " uint oldVal = atomicCounterIncrement(u_atomic" << i << ");\n";
349*35238bceSAndroid Build Coastguard Worker else
350*35238bceSAndroid Build Coastguard Worker shaderBody << " oldVal = atomicCounterIncrement(u_atomic" << i << ");\n";
351*35238bceSAndroid Build Coastguard Worker }
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker shaderBody << " sb_out.value = oldVal;\n";
354*35238bceSAndroid Build Coastguard Worker
355*35238bceSAndroid Build Coastguard Worker shaderDecl << "\n"
356*35238bceSAndroid Build Coastguard Worker << "layout(binding = 0) buffer Output {\n"
357*35238bceSAndroid Build Coastguard Worker << " uint value;\n"
358*35238bceSAndroid Build Coastguard Worker << "} sb_out;\n";
359*35238bceSAndroid Build Coastguard Worker
360*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
361*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
362*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
363*35238bceSAndroid Build Coastguard Worker
364*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Link error is generated if compute shader exceeds GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS.");
365*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
366*35238bceSAndroid Build Coastguard Worker ctx.endSection();
367*35238bceSAndroid Build Coastguard Worker }
368*35238bceSAndroid Build Coastguard Worker
exceed_atomic_counters_limit(NegativeTestContext & ctx)369*35238bceSAndroid Build Coastguard Worker void exceed_atomic_counters_limit(NegativeTestContext &ctx)
370*35238bceSAndroid Build Coastguard Worker {
371*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderDecl;
372*35238bceSAndroid Build Coastguard Worker std::ostringstream shaderBody;
373*35238bceSAndroid Build Coastguard Worker
374*35238bceSAndroid Build Coastguard Worker shaderDecl << "layout(binding = 0, offset = 0) uniform atomic_uint u_atomic0;\n"
375*35238bceSAndroid Build Coastguard Worker << "layout(binding = " << sizeof(GLuint) * getResourceLimit(ctx, GL_MAX_COMPUTE_ATOMIC_COUNTERS)
376*35238bceSAndroid Build Coastguard Worker << ", offset = 0) uniform atomic_uint u_atomic1;\n"
377*35238bceSAndroid Build Coastguard Worker << "\n"
378*35238bceSAndroid Build Coastguard Worker << "layout(binding = 0) buffer Output {\n"
379*35238bceSAndroid Build Coastguard Worker << " uint value;\n"
380*35238bceSAndroid Build Coastguard Worker << "} sb_out;\n";
381*35238bceSAndroid Build Coastguard Worker
382*35238bceSAndroid Build Coastguard Worker shaderBody << " uint oldVal = 0u;\n"
383*35238bceSAndroid Build Coastguard Worker << " oldVal = atomicCounterIncrement(u_atomic0);\n"
384*35238bceSAndroid Build Coastguard Worker << " oldVal = atomicCounterIncrement(u_atomic1);\n"
385*35238bceSAndroid Build Coastguard Worker << " sb_out.value = oldVal;\n";
386*35238bceSAndroid Build Coastguard Worker
387*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(
388*35238bceSAndroid Build Coastguard Worker ctx.getRenderContext(),
389*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::ComputeSource(generateComputeShader(ctx, shaderDecl.str(), shaderBody.str())));
390*35238bceSAndroid Build Coastguard Worker
391*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Link error is generated if compute shader exceeds GL_MAX_COMPUTE_ATOMIC_COUNTERS.");
392*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
393*35238bceSAndroid Build Coastguard Worker ctx.endSection();
394*35238bceSAndroid Build Coastguard Worker }
395*35238bceSAndroid Build Coastguard Worker
program_not_active(NegativeTestContext & ctx)396*35238bceSAndroid Build Coastguard Worker void program_not_active(NegativeTestContext &ctx)
397*35238bceSAndroid Build Coastguard Worker {
398*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
399*35238bceSAndroid Build Coastguard Worker map<string, string> args;
400*35238bceSAndroid Build Coastguard Worker args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
401*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
402*35238bceSAndroid Build Coastguard Worker
403*35238bceSAndroid Build Coastguard Worker const glu::VertexSource vertSource(tcu::StringTemplate(vertexShaderSource).specialize(args));
404*35238bceSAndroid Build Coastguard Worker const glu::FragmentSource fragSource(tcu::StringTemplate(fragmentShaderSource).specialize(args));
405*35238bceSAndroid Build Coastguard Worker
406*35238bceSAndroid Build Coastguard Worker glu::ProgramPipeline pipeline(ctx.getRenderContext());
407*35238bceSAndroid Build Coastguard Worker
408*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram vertProgram(ctx.getRenderContext(), glu::ProgramSources()
409*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << vertSource);
410*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram fragProgram(ctx.getRenderContext(), glu::ProgramSources()
411*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << fragSource);
412*35238bceSAndroid Build Coastguard Worker
413*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
414*35238bceSAndroid Build Coastguard Worker log << vertProgram << fragProgram;
415*35238bceSAndroid Build Coastguard Worker
416*35238bceSAndroid Build Coastguard Worker if (!vertProgram.isOk() || !fragProgram.isOk())
417*35238bceSAndroid Build Coastguard Worker TCU_THROW(InternalError, "failed to build program");
418*35238bceSAndroid Build Coastguard Worker
419*35238bceSAndroid Build Coastguard Worker ctx.glBindProgramPipeline(pipeline.getPipeline());
420*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
421*35238bceSAndroid Build Coastguard Worker
422*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Program not set at all");
423*35238bceSAndroid Build Coastguard Worker {
424*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated by glDispatchCompute if there is no active program for the "
425*35238bceSAndroid Build Coastguard Worker "compute shader stage.");
426*35238bceSAndroid Build Coastguard Worker ctx.glDispatchCompute(1, 1, 1);
427*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
428*35238bceSAndroid Build Coastguard Worker ctx.endSection();
429*35238bceSAndroid Build Coastguard Worker
430*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated by glDispatchComputeIndirect if there is no active program "
431*35238bceSAndroid Build Coastguard Worker "for the compute shader stage.");
432*35238bceSAndroid Build Coastguard Worker GLintptr indirect = 0;
433*35238bceSAndroid Build Coastguard Worker ctx.glDispatchComputeIndirect(indirect);
434*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
435*35238bceSAndroid Build Coastguard Worker ctx.endSection();
436*35238bceSAndroid Build Coastguard Worker }
437*35238bceSAndroid Build Coastguard Worker ctx.endSection();
438*35238bceSAndroid Build Coastguard Worker
439*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Program contains graphic pipeline stages");
440*35238bceSAndroid Build Coastguard Worker {
441*35238bceSAndroid Build Coastguard Worker ctx.glUseProgramStages(pipeline.getPipeline(), GL_VERTEX_SHADER_BIT, vertProgram.getProgram());
442*35238bceSAndroid Build Coastguard Worker ctx.glUseProgramStages(pipeline.getPipeline(), GL_FRAGMENT_SHADER_BIT, fragProgram.getProgram());
443*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
444*35238bceSAndroid Build Coastguard Worker
445*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated by glDispatchCompute if there is no active program for the "
446*35238bceSAndroid Build Coastguard Worker "compute shader stage.");
447*35238bceSAndroid Build Coastguard Worker ctx.glDispatchCompute(1, 1, 1);
448*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
449*35238bceSAndroid Build Coastguard Worker ctx.endSection();
450*35238bceSAndroid Build Coastguard Worker
451*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated by glDispatchComputeIndirect if there is no active program "
452*35238bceSAndroid Build Coastguard Worker "for the compute shader stage.");
453*35238bceSAndroid Build Coastguard Worker GLintptr indirect = 0;
454*35238bceSAndroid Build Coastguard Worker ctx.glDispatchComputeIndirect(indirect);
455*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
456*35238bceSAndroid Build Coastguard Worker ctx.endSection();
457*35238bceSAndroid Build Coastguard Worker }
458*35238bceSAndroid Build Coastguard Worker ctx.endSection();
459*35238bceSAndroid Build Coastguard Worker
460*35238bceSAndroid Build Coastguard Worker ctx.glBindProgramPipeline(0);
461*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
462*35238bceSAndroid Build Coastguard Worker }
463*35238bceSAndroid Build Coastguard Worker
invalid_program_query(NegativeTestContext & ctx)464*35238bceSAndroid Build Coastguard Worker void invalid_program_query(NegativeTestContext &ctx)
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
467*35238bceSAndroid Build Coastguard Worker map<string, string> args;
468*35238bceSAndroid Build Coastguard Worker args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
469*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
470*35238bceSAndroid Build Coastguard Worker
471*35238bceSAndroid Build Coastguard Worker GLint data[3] = {0, 0, 0};
472*35238bceSAndroid Build Coastguard Worker
473*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Compute shader that does not link");
474*35238bceSAndroid Build Coastguard Worker {
475*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(tcu::StringTemplate(invalidComputeShaderSource).specialize(args));
476*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram invalidComputeProgram(ctx.getRenderContext(), glu::ProgramSources() << compSource);
477*35238bceSAndroid Build Coastguard Worker
478*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
479*35238bceSAndroid Build Coastguard Worker log << invalidComputeProgram;
480*35238bceSAndroid Build Coastguard Worker
481*35238bceSAndroid Build Coastguard Worker if (invalidComputeProgram.isOk())
482*35238bceSAndroid Build Coastguard Worker TCU_THROW(InternalError, "program should not of built");
483*35238bceSAndroid Build Coastguard Worker
484*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated if GL_COMPUTE_WORK_GROUP_SIZE is queried for a program "
485*35238bceSAndroid Build Coastguard Worker "which has not been linked properly.");
486*35238bceSAndroid Build Coastguard Worker ctx.glGetProgramiv(invalidComputeProgram.getProgram(), GL_COMPUTE_WORK_GROUP_SIZE, &data[0]);
487*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
488*35238bceSAndroid Build Coastguard Worker ctx.endSection();
489*35238bceSAndroid Build Coastguard Worker
490*35238bceSAndroid Build Coastguard Worker ctx.glUseProgram(0);
491*35238bceSAndroid Build Coastguard Worker }
492*35238bceSAndroid Build Coastguard Worker ctx.endSection();
493*35238bceSAndroid Build Coastguard Worker
494*35238bceSAndroid Build Coastguard Worker ctx.beginSection("Compute shader not present");
495*35238bceSAndroid Build Coastguard Worker {
496*35238bceSAndroid Build Coastguard Worker const glu::VertexSource vertSource(tcu::StringTemplate(vertexShaderSource).specialize(args));
497*35238bceSAndroid Build Coastguard Worker const glu::FragmentSource fragSource(tcu::StringTemplate(fragmentShaderSource).specialize(args));
498*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram graphicsPipelineProgram(ctx.getRenderContext(), glu::ProgramSources()
499*35238bceSAndroid Build Coastguard Worker << vertSource << fragSource);
500*35238bceSAndroid Build Coastguard Worker
501*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
502*35238bceSAndroid Build Coastguard Worker log << graphicsPipelineProgram;
503*35238bceSAndroid Build Coastguard Worker
504*35238bceSAndroid Build Coastguard Worker if (!graphicsPipelineProgram.isOk())
505*35238bceSAndroid Build Coastguard Worker TCU_THROW(InternalError, "failed to build program");
506*35238bceSAndroid Build Coastguard Worker
507*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated if GL_COMPUTE_WORK_GROUP_SIZE is queried for a program "
508*35238bceSAndroid Build Coastguard Worker "which has not been linked properly.");
509*35238bceSAndroid Build Coastguard Worker ctx.glGetProgramiv(graphicsPipelineProgram.getProgram(), GL_COMPUTE_WORK_GROUP_SIZE, &data[0]);
510*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
511*35238bceSAndroid Build Coastguard Worker ctx.endSection();
512*35238bceSAndroid Build Coastguard Worker
513*35238bceSAndroid Build Coastguard Worker ctx.glUseProgram(0);
514*35238bceSAndroid Build Coastguard Worker }
515*35238bceSAndroid Build Coastguard Worker ctx.endSection();
516*35238bceSAndroid Build Coastguard Worker }
517*35238bceSAndroid Build Coastguard Worker
invalid_dispatch_compute_indirect(NegativeTestContext & ctx)518*35238bceSAndroid Build Coastguard Worker void invalid_dispatch_compute_indirect(NegativeTestContext &ctx)
519*35238bceSAndroid Build Coastguard Worker {
520*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
521*35238bceSAndroid Build Coastguard Worker map<string, string> args;
522*35238bceSAndroid Build Coastguard Worker args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
523*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
524*35238bceSAndroid Build Coastguard Worker
525*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(tcu::StringTemplate(computeShaderSource).specialize(args));
526*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << compSource);
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
529*35238bceSAndroid Build Coastguard Worker log << program;
530*35238bceSAndroid Build Coastguard Worker
531*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
532*35238bceSAndroid Build Coastguard Worker TCU_THROW(InternalError, "failed to build program");
533*35238bceSAndroid Build Coastguard Worker
534*35238bceSAndroid Build Coastguard Worker ctx.glUseProgram(program.getProgram());
535*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
536*35238bceSAndroid Build Coastguard Worker
537*35238bceSAndroid Build Coastguard Worker static const struct
538*35238bceSAndroid Build Coastguard Worker {
539*35238bceSAndroid Build Coastguard Worker GLuint numGroupsX;
540*35238bceSAndroid Build Coastguard Worker GLuint numGroupsY;
541*35238bceSAndroid Build Coastguard Worker GLuint numGroupsZ;
542*35238bceSAndroid Build Coastguard Worker } data = {0, 0, 0};
543*35238bceSAndroid Build Coastguard Worker
544*35238bceSAndroid Build Coastguard Worker {
545*35238bceSAndroid Build Coastguard Worker GLuint buffer;
546*35238bceSAndroid Build Coastguard Worker ctx.glGenBuffers(1, &buffer);
547*35238bceSAndroid Build Coastguard Worker ctx.glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0);
548*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated by glDispatchComputeIndirect if zero is bound to "
551*35238bceSAndroid Build Coastguard Worker "GL_DISPATCH_INDIRECT_BUFFER.");
552*35238bceSAndroid Build Coastguard Worker GLintptr indirect = 0;
553*35238bceSAndroid Build Coastguard Worker ctx.glDispatchComputeIndirect(indirect);
554*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
555*35238bceSAndroid Build Coastguard Worker ctx.endSection();
556*35238bceSAndroid Build Coastguard Worker
557*35238bceSAndroid Build Coastguard Worker ctx.glDeleteBuffers(1, &buffer);
558*35238bceSAndroid Build Coastguard Worker }
559*35238bceSAndroid Build Coastguard Worker
560*35238bceSAndroid Build Coastguard Worker {
561*35238bceSAndroid Build Coastguard Worker GLuint buffer;
562*35238bceSAndroid Build Coastguard Worker ctx.glGenBuffers(1, &buffer);
563*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
564*35238bceSAndroid Build Coastguard Worker
565*35238bceSAndroid Build Coastguard Worker ctx.glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, buffer);
566*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
567*35238bceSAndroid Build Coastguard Worker
568*35238bceSAndroid Build Coastguard Worker ctx.glBufferData(GL_DISPATCH_INDIRECT_BUFFER, sizeof(data), &data, GL_STATIC_DRAW);
569*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
570*35238bceSAndroid Build Coastguard Worker
571*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_OPERATION is generated by glDispatchComputeIndirect if data is sourced beyond the "
572*35238bceSAndroid Build Coastguard Worker "end of the buffer object.");
573*35238bceSAndroid Build Coastguard Worker GLintptr indirect = 1 << 10;
574*35238bceSAndroid Build Coastguard Worker ctx.glDispatchComputeIndirect(indirect);
575*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_OPERATION);
576*35238bceSAndroid Build Coastguard Worker ctx.endSection();
577*35238bceSAndroid Build Coastguard Worker
578*35238bceSAndroid Build Coastguard Worker ctx.glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0);
579*35238bceSAndroid Build Coastguard Worker ctx.glDeleteBuffers(1, &buffer);
580*35238bceSAndroid Build Coastguard Worker }
581*35238bceSAndroid Build Coastguard Worker
582*35238bceSAndroid Build Coastguard Worker {
583*35238bceSAndroid Build Coastguard Worker ctx.beginSection(
584*35238bceSAndroid Build Coastguard Worker "GL_INVALID_VALUE is generated by glDispatchComputeIndirect if the value of indirect is less than zero.");
585*35238bceSAndroid Build Coastguard Worker GLintptr indirect = -1;
586*35238bceSAndroid Build Coastguard Worker ctx.glDispatchComputeIndirect(indirect);
587*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_VALUE);
588*35238bceSAndroid Build Coastguard Worker ctx.endSection();
589*35238bceSAndroid Build Coastguard Worker }
590*35238bceSAndroid Build Coastguard Worker
591*35238bceSAndroid Build Coastguard Worker {
592*35238bceSAndroid Build Coastguard Worker GLuint buffer;
593*35238bceSAndroid Build Coastguard Worker ctx.glGenBuffers(1, &buffer);
594*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
595*35238bceSAndroid Build Coastguard Worker
596*35238bceSAndroid Build Coastguard Worker ctx.glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, buffer);
597*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
598*35238bceSAndroid Build Coastguard Worker
599*35238bceSAndroid Build Coastguard Worker ctx.glBufferData(GL_DISPATCH_INDIRECT_BUFFER, sizeof(data), &data, GL_STATIC_DRAW);
600*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
601*35238bceSAndroid Build Coastguard Worker
602*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_VALUE is generated by glDispatchComputeIndirect if indirect is not a multiple of "
603*35238bceSAndroid Build Coastguard Worker "the size, in basic machine units, of uint.");
604*35238bceSAndroid Build Coastguard Worker GLintptr indirect = sizeof(data) + 1;
605*35238bceSAndroid Build Coastguard Worker ctx.glDispatchComputeIndirect(indirect);
606*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_VALUE);
607*35238bceSAndroid Build Coastguard Worker ctx.endSection();
608*35238bceSAndroid Build Coastguard Worker
609*35238bceSAndroid Build Coastguard Worker ctx.glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0);
610*35238bceSAndroid Build Coastguard Worker ctx.glDeleteBuffers(1, &buffer);
611*35238bceSAndroid Build Coastguard Worker }
612*35238bceSAndroid Build Coastguard Worker }
613*35238bceSAndroid Build Coastguard Worker
invalid_maximum_work_group_counts(NegativeTestContext & ctx)614*35238bceSAndroid Build Coastguard Worker void invalid_maximum_work_group_counts(NegativeTestContext &ctx)
615*35238bceSAndroid Build Coastguard Worker {
616*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
617*35238bceSAndroid Build Coastguard Worker map<string, string> args;
618*35238bceSAndroid Build Coastguard Worker args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
619*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
620*35238bceSAndroid Build Coastguard Worker
621*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(tcu::StringTemplate(computeShaderSource).specialize(args));
622*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << compSource);
623*35238bceSAndroid Build Coastguard Worker
624*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
625*35238bceSAndroid Build Coastguard Worker log << program;
626*35238bceSAndroid Build Coastguard Worker
627*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
628*35238bceSAndroid Build Coastguard Worker TCU_THROW(InternalError, "failed to build program");
629*35238bceSAndroid Build Coastguard Worker
630*35238bceSAndroid Build Coastguard Worker ctx.glUseProgram(program.getProgram());
631*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
632*35238bceSAndroid Build Coastguard Worker
633*35238bceSAndroid Build Coastguard Worker GLint workGroupCountX;
634*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, (GLuint)0, &workGroupCountX);
635*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
636*35238bceSAndroid Build Coastguard Worker
637*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_VALUE is generated by glDispatchCompute if <numGroupsX> array is larger than the "
638*35238bceSAndroid Build Coastguard Worker "maximum work group count for the x dimension.");
639*35238bceSAndroid Build Coastguard Worker ctx.glDispatchCompute(workGroupCountX + 1, 1, 1);
640*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_VALUE);
641*35238bceSAndroid Build Coastguard Worker ctx.endSection();
642*35238bceSAndroid Build Coastguard Worker
643*35238bceSAndroid Build Coastguard Worker GLint workGroupCountY;
644*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, (GLuint)1, &workGroupCountY);
645*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
646*35238bceSAndroid Build Coastguard Worker
647*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_VALUE is generated by glDispatchCompute if <numGroupsY> array is larger than the "
648*35238bceSAndroid Build Coastguard Worker "maximum work group count for the y dimension.");
649*35238bceSAndroid Build Coastguard Worker ctx.glDispatchCompute(1, workGroupCountY + 1, 1);
650*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_VALUE);
651*35238bceSAndroid Build Coastguard Worker ctx.endSection();
652*35238bceSAndroid Build Coastguard Worker
653*35238bceSAndroid Build Coastguard Worker GLint workGroupCountZ;
654*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, (GLuint)2, &workGroupCountZ);
655*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
656*35238bceSAndroid Build Coastguard Worker
657*35238bceSAndroid Build Coastguard Worker ctx.beginSection("GL_INVALID_VALUE is generated by glDispatchCompute if <numGroupsZ> array is larger than the "
658*35238bceSAndroid Build Coastguard Worker "maximum work group count for the z dimension.");
659*35238bceSAndroid Build Coastguard Worker ctx.glDispatchCompute(1, 1, workGroupCountZ + 1);
660*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_INVALID_VALUE);
661*35238bceSAndroid Build Coastguard Worker ctx.endSection();
662*35238bceSAndroid Build Coastguard Worker }
663*35238bceSAndroid Build Coastguard Worker
invalid_maximum_work_group_sizes(NegativeTestContext & ctx)664*35238bceSAndroid Build Coastguard Worker void invalid_maximum_work_group_sizes(NegativeTestContext &ctx)
665*35238bceSAndroid Build Coastguard Worker {
666*35238bceSAndroid Build Coastguard Worker GLint maxWorkGroupSizeX;
667*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, (GLuint)0, &maxWorkGroupSizeX);
668*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
669*35238bceSAndroid Build Coastguard Worker
670*35238bceSAndroid Build Coastguard Worker GLint maxWorkGroupSizeY;
671*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, (GLuint)1, &maxWorkGroupSizeY);
672*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
673*35238bceSAndroid Build Coastguard Worker
674*35238bceSAndroid Build Coastguard Worker GLint maxWorkGroupSizeZ;
675*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, (GLuint)2, &maxWorkGroupSizeZ);
676*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
677*35238bceSAndroid Build Coastguard Worker
678*35238bceSAndroid Build Coastguard Worker GLint maxWorkGroupInvocations;
679*35238bceSAndroid Build Coastguard Worker ctx.glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &maxWorkGroupInvocations);
680*35238bceSAndroid Build Coastguard Worker ctx.expectError(GL_NO_ERROR);
681*35238bceSAndroid Build Coastguard Worker
682*35238bceSAndroid Build Coastguard Worker DE_ASSERT(((int64_t)maxWorkGroupSizeX * maxWorkGroupSizeY * maxWorkGroupSizeZ) > maxWorkGroupInvocations);
683*35238bceSAndroid Build Coastguard Worker
684*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
685*35238bceSAndroid Build Coastguard Worker const char *const shaderVersion = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
686*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
687*35238bceSAndroid Build Coastguard Worker
688*35238bceSAndroid Build Coastguard Worker static const struct
689*35238bceSAndroid Build Coastguard Worker {
690*35238bceSAndroid Build Coastguard Worker GLint x;
691*35238bceSAndroid Build Coastguard Worker GLint y;
692*35238bceSAndroid Build Coastguard Worker GLint z;
693*35238bceSAndroid Build Coastguard Worker } localWorkGroupSizeCases[] = {
694*35238bceSAndroid Build Coastguard Worker {maxWorkGroupSizeX + 1, 1, 1},
695*35238bceSAndroid Build Coastguard Worker {1, maxWorkGroupSizeY + 1, 1},
696*35238bceSAndroid Build Coastguard Worker {1, 1, maxWorkGroupSizeZ + 1},
697*35238bceSAndroid Build Coastguard Worker {maxWorkGroupSizeX, maxWorkGroupSizeY, maxWorkGroupSizeZ},
698*35238bceSAndroid Build Coastguard Worker };
699*35238bceSAndroid Build Coastguard Worker
700*35238bceSAndroid Build Coastguard Worker for (int testCase = 0; testCase < DE_LENGTH_OF_ARRAY(localWorkGroupSizeCases); ++testCase)
701*35238bceSAndroid Build Coastguard Worker {
702*35238bceSAndroid Build Coastguard Worker std::ostringstream compShaderSource;
703*35238bceSAndroid Build Coastguard Worker
704*35238bceSAndroid Build Coastguard Worker compShaderSource << shaderVersion << "\n"
705*35238bceSAndroid Build Coastguard Worker << "layout(local_size_x = " << localWorkGroupSizeCases[testCase].x
706*35238bceSAndroid Build Coastguard Worker << ", local_size_y = " << localWorkGroupSizeCases[testCase].y
707*35238bceSAndroid Build Coastguard Worker << ", local_size_z = " << localWorkGroupSizeCases[testCase].z << ") in;\n"
708*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
709*35238bceSAndroid Build Coastguard Worker << "{\n"
710*35238bceSAndroid Build Coastguard Worker << "}\n";
711*35238bceSAndroid Build Coastguard Worker
712*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(compShaderSource.str());
713*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << compSource);
714*35238bceSAndroid Build Coastguard Worker
715*35238bceSAndroid Build Coastguard Worker if (testCase == DE_LENGTH_OF_ARRAY(localWorkGroupSizeCases) - 1)
716*35238bceSAndroid Build Coastguard Worker {
717*35238bceSAndroid Build Coastguard Worker bool testFailed = false;
718*35238bceSAndroid Build Coastguard Worker ctx.beginSection(
719*35238bceSAndroid Build Coastguard Worker "A compile time or link error is generated if the maximum number of invocations in a single local work "
720*35238bceSAndroid Build Coastguard Worker "group (product of the three dimensions) is greater than GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS.");
721*35238bceSAndroid Build Coastguard Worker
722*35238bceSAndroid Build Coastguard Worker ctx.getLog() << program;
723*35238bceSAndroid Build Coastguard Worker testFailed =
724*35238bceSAndroid Build Coastguard Worker (program.getProgramInfo().linkOk) && (program.getShaderInfo(glu::SHADERTYPE_COMPUTE).compileOk);
725*35238bceSAndroid Build Coastguard Worker
726*35238bceSAndroid Build Coastguard Worker if (testFailed)
727*35238bceSAndroid Build Coastguard Worker {
728*35238bceSAndroid Build Coastguard Worker const char *const message("Program was not expected to compile or link.");
729*35238bceSAndroid Build Coastguard Worker ctx.getLog() << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
730*35238bceSAndroid Build Coastguard Worker ctx.fail(message);
731*35238bceSAndroid Build Coastguard Worker }
732*35238bceSAndroid Build Coastguard Worker }
733*35238bceSAndroid Build Coastguard Worker else
734*35238bceSAndroid Build Coastguard Worker {
735*35238bceSAndroid Build Coastguard Worker ctx.beginSection("A compile time error is generated if the fixed local group size of the shader in any "
736*35238bceSAndroid Build Coastguard Worker "dimension is greater than the maximum supported.");
737*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, program, glu::SHADERTYPE_COMPUTE);
738*35238bceSAndroid Build Coastguard Worker }
739*35238bceSAndroid Build Coastguard Worker
740*35238bceSAndroid Build Coastguard Worker ctx.endSection();
741*35238bceSAndroid Build Coastguard Worker }
742*35238bceSAndroid Build Coastguard Worker }
743*35238bceSAndroid Build Coastguard Worker
invalid_layout_qualifiers(NegativeTestContext & ctx)744*35238bceSAndroid Build Coastguard Worker void invalid_layout_qualifiers(NegativeTestContext &ctx)
745*35238bceSAndroid Build Coastguard Worker {
746*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
747*35238bceSAndroid Build Coastguard Worker const char *const shaderVersion = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
748*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
749*35238bceSAndroid Build Coastguard Worker
750*35238bceSAndroid Build Coastguard Worker {
751*35238bceSAndroid Build Coastguard Worker std::ostringstream compShaderSource;
752*35238bceSAndroid Build Coastguard Worker compShaderSource << shaderVersion << "\n"
753*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
754*35238bceSAndroid Build Coastguard Worker << "{\n"
755*35238bceSAndroid Build Coastguard Worker << "}\n";
756*35238bceSAndroid Build Coastguard Worker
757*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(compShaderSource.str());
758*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << compSource);
759*35238bceSAndroid Build Coastguard Worker
760*35238bceSAndroid Build Coastguard Worker ctx.beginSection("A link error is generated if the compute shader program does not contain an input layout "
761*35238bceSAndroid Build Coastguard Worker "qualifier specifying a fixed local group size.");
762*35238bceSAndroid Build Coastguard Worker verifyLinkError(ctx, program);
763*35238bceSAndroid Build Coastguard Worker ctx.endSection();
764*35238bceSAndroid Build Coastguard Worker }
765*35238bceSAndroid Build Coastguard Worker
766*35238bceSAndroid Build Coastguard Worker {
767*35238bceSAndroid Build Coastguard Worker std::ostringstream compShaderSource;
768*35238bceSAndroid Build Coastguard Worker compShaderSource << shaderVersion << "\n"
769*35238bceSAndroid Build Coastguard Worker << "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
770*35238bceSAndroid Build Coastguard Worker << "layout(local_size_x = 2, local_size_y = 2, local_size_z = 2) in;\n"
771*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
772*35238bceSAndroid Build Coastguard Worker << "{\n"
773*35238bceSAndroid Build Coastguard Worker << "}\n";
774*35238bceSAndroid Build Coastguard Worker
775*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(compShaderSource.str());
776*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << compSource);
777*35238bceSAndroid Build Coastguard Worker
778*35238bceSAndroid Build Coastguard Worker ctx.beginSection("A compile-time error is generated if a local work group size qualifier is declared more than "
779*35238bceSAndroid Build Coastguard Worker "once in the same shader.");
780*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, program, glu::SHADERTYPE_COMPUTE);
781*35238bceSAndroid Build Coastguard Worker ctx.endSection();
782*35238bceSAndroid Build Coastguard Worker }
783*35238bceSAndroid Build Coastguard Worker
784*35238bceSAndroid Build Coastguard Worker {
785*35238bceSAndroid Build Coastguard Worker std::ostringstream compShaderSource;
786*35238bceSAndroid Build Coastguard Worker compShaderSource << shaderVersion << "\n"
787*35238bceSAndroid Build Coastguard Worker << "out mediump vec4 fragColor;\n"
788*35238bceSAndroid Build Coastguard Worker << "\n"
789*35238bceSAndroid Build Coastguard Worker << "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
790*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
791*35238bceSAndroid Build Coastguard Worker << "{\n"
792*35238bceSAndroid Build Coastguard Worker << "}\n";
793*35238bceSAndroid Build Coastguard Worker
794*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(compShaderSource.str());
795*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << compSource);
796*35238bceSAndroid Build Coastguard Worker
797*35238bceSAndroid Build Coastguard Worker ctx.beginSection(
798*35238bceSAndroid Build Coastguard Worker "A compile-time error is generated if a user defined output variable is declared in a compute shader.");
799*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, program, glu::SHADERTYPE_COMPUTE);
800*35238bceSAndroid Build Coastguard Worker ctx.endSection();
801*35238bceSAndroid Build Coastguard Worker }
802*35238bceSAndroid Build Coastguard Worker
803*35238bceSAndroid Build Coastguard Worker if (glu::isContextTypeES(ctx.getRenderContext().getType())) // for GL4.5 program will compile and link
804*35238bceSAndroid Build Coastguard Worker {
805*35238bceSAndroid Build Coastguard Worker std::ostringstream compShaderSource;
806*35238bceSAndroid Build Coastguard Worker compShaderSource << shaderVersion << "\n"
807*35238bceSAndroid Build Coastguard Worker << "uvec3 gl_NumWorkGroups;\n"
808*35238bceSAndroid Build Coastguard Worker << "uvec3 gl_WorkGroupSize;\n"
809*35238bceSAndroid Build Coastguard Worker << "uvec3 gl_WorkGroupID;\n"
810*35238bceSAndroid Build Coastguard Worker << "uvec3 gl_LocalInvocationID;\n"
811*35238bceSAndroid Build Coastguard Worker << "uvec3 gl_GlobalInvocationID;\n"
812*35238bceSAndroid Build Coastguard Worker << "uvec3 gl_LocalInvocationIndex;\n"
813*35238bceSAndroid Build Coastguard Worker << "\n"
814*35238bceSAndroid Build Coastguard Worker << "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
815*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
816*35238bceSAndroid Build Coastguard Worker << "{\n"
817*35238bceSAndroid Build Coastguard Worker << "}\n";
818*35238bceSAndroid Build Coastguard Worker
819*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource compSource(compShaderSource.str());
820*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << compSource);
821*35238bceSAndroid Build Coastguard Worker
822*35238bceSAndroid Build Coastguard Worker ctx.beginSection(
823*35238bceSAndroid Build Coastguard Worker "A compile time or link error is generated if compute shader built-in variables are redeclared.");
824*35238bceSAndroid Build Coastguard Worker bool testFailed = false;
825*35238bceSAndroid Build Coastguard Worker
826*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = ctx.getLog();
827*35238bceSAndroid Build Coastguard Worker log << program;
828*35238bceSAndroid Build Coastguard Worker
829*35238bceSAndroid Build Coastguard Worker testFailed = (program.getProgramInfo().linkOk) && (program.getShaderInfo(glu::SHADERTYPE_COMPUTE).compileOk);
830*35238bceSAndroid Build Coastguard Worker
831*35238bceSAndroid Build Coastguard Worker if (testFailed)
832*35238bceSAndroid Build Coastguard Worker {
833*35238bceSAndroid Build Coastguard Worker const char *const message("Program was not expected to compile or link.");
834*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
835*35238bceSAndroid Build Coastguard Worker ctx.fail(message);
836*35238bceSAndroid Build Coastguard Worker }
837*35238bceSAndroid Build Coastguard Worker
838*35238bceSAndroid Build Coastguard Worker ctx.endSection();
839*35238bceSAndroid Build Coastguard Worker }
840*35238bceSAndroid Build Coastguard Worker }
841*35238bceSAndroid Build Coastguard Worker
invalid_write_built_in_constants(NegativeTestContext & ctx)842*35238bceSAndroid Build Coastguard Worker void invalid_write_built_in_constants(NegativeTestContext &ctx)
843*35238bceSAndroid Build Coastguard Worker {
844*35238bceSAndroid Build Coastguard Worker if (glu::isContextTypeES(ctx.getRenderContext().getType()))
845*35238bceSAndroid Build Coastguard Worker {
846*35238bceSAndroid Build Coastguard Worker if ((!ctx.isExtensionSupported("GL_EXT_tessellation_shader") &&
847*35238bceSAndroid Build Coastguard Worker !ctx.isExtensionSupported("GL_OES_tessellation_shader")) ||
848*35238bceSAndroid Build Coastguard Worker (!ctx.isExtensionSupported("GL_EXT_geometry_shader") &&
849*35238bceSAndroid Build Coastguard Worker !ctx.isExtensionSupported("GL_OES_geometry_shader")))
850*35238bceSAndroid Build Coastguard Worker TCU_THROW(NotSupportedError, "tessellation and geometry shader extensions not supported");
851*35238bceSAndroid Build Coastguard Worker }
852*35238bceSAndroid Build Coastguard Worker
853*35238bceSAndroid Build Coastguard Worker const bool isES32 = glu::contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
854*35238bceSAndroid Build Coastguard Worker map<string, string> args;
855*35238bceSAndroid Build Coastguard Worker
856*35238bceSAndroid Build Coastguard Worker args["GLSL_VERSION_STRING"] = isES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
857*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
858*35238bceSAndroid Build Coastguard Worker args["GLSL_TESS_EXTENSION_STRING"] = isES32 ? "" : "#extension GL_EXT_tessellation_shader : require";
859*35238bceSAndroid Build Coastguard Worker args["COMPUTE_BUILT_IN_CONSTANTS_STRING"] = " gl_MaxComputeWorkGroupCount = ivec3(65535, 65535, 65535);\n"
860*35238bceSAndroid Build Coastguard Worker " gl_MaxComputeWorkGroupCount = ivec3(1024, 1024, 64);\n"
861*35238bceSAndroid Build Coastguard Worker " gl_MaxComputeWorkGroupSize = ivec3(512);\n"
862*35238bceSAndroid Build Coastguard Worker " gl_MaxComputeUniformComponents = 512;\n"
863*35238bceSAndroid Build Coastguard Worker " gl_MaxComputeTextureImageUnits = 16;\n"
864*35238bceSAndroid Build Coastguard Worker " gl_MaxComputeImageUniforms = 8;\n"
865*35238bceSAndroid Build Coastguard Worker " gl_MaxComputeAtomicCounters = 8;\n"
866*35238bceSAndroid Build Coastguard Worker " gl_MaxComputeAtomicCounterBuffers = 1;\n";
867*35238bceSAndroid Build Coastguard Worker
868*35238bceSAndroid Build Coastguard Worker const glu::VertexSource vertSource(tcu::StringTemplate(genBuiltInSource(glu::SHADERTYPE_VERTEX)).specialize(args));
869*35238bceSAndroid Build Coastguard Worker const glu::FragmentSource fragSource(
870*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(genBuiltInSource(glu::SHADERTYPE_FRAGMENT)).specialize(args));
871*35238bceSAndroid Build Coastguard Worker const glu::TessellationControlSource tessCtrlSource(
872*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(genBuiltInSource(glu::SHADERTYPE_TESSELLATION_CONTROL)).specialize(args));
873*35238bceSAndroid Build Coastguard Worker const glu::TessellationEvaluationSource tessEvalSource(
874*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(genBuiltInSource(glu::SHADERTYPE_TESSELLATION_EVALUATION)).specialize(args));
875*35238bceSAndroid Build Coastguard Worker const glu::GeometrySource geometrySource(
876*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(genBuiltInSource(glu::SHADERTYPE_GEOMETRY)).specialize(args));
877*35238bceSAndroid Build Coastguard Worker const glu::ComputeSource computeSource(
878*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(genBuiltInSource(glu::SHADERTYPE_COMPUTE)).specialize(args));
879*35238bceSAndroid Build Coastguard Worker
880*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram vertProgram(ctx.getRenderContext(), glu::ProgramSources()
881*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << vertSource);
882*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram fragProgram(ctx.getRenderContext(), glu::ProgramSources()
883*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << fragSource);
884*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram tessCtrlProgram(ctx.getRenderContext(), glu::ProgramSources()
885*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << tessCtrlSource);
886*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram tessEvalProgram(ctx.getRenderContext(), glu::ProgramSources()
887*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << tessEvalSource);
888*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram geometryProgram(ctx.getRenderContext(), glu::ProgramSources()
889*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << geometrySource);
890*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram computeProgram(ctx.getRenderContext(), glu::ProgramSources()
891*35238bceSAndroid Build Coastguard Worker << glu::ProgramSeparable(true) << computeSource);
892*35238bceSAndroid Build Coastguard Worker
893*35238bceSAndroid Build Coastguard Worker ctx.beginSection(
894*35238bceSAndroid Build Coastguard Worker "A compile time is generated if compute built-in constants provided in all shaders are written to.");
895*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, vertProgram, glu::SHADERTYPE_VERTEX);
896*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, fragProgram, glu::SHADERTYPE_FRAGMENT);
897*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, tessCtrlProgram, glu::SHADERTYPE_TESSELLATION_CONTROL);
898*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, tessEvalProgram, glu::SHADERTYPE_TESSELLATION_EVALUATION);
899*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, geometryProgram, glu::SHADERTYPE_GEOMETRY);
900*35238bceSAndroid Build Coastguard Worker verifyCompileError(ctx, computeProgram, glu::SHADERTYPE_COMPUTE);
901*35238bceSAndroid Build Coastguard Worker ctx.endSection();
902*35238bceSAndroid Build Coastguard Worker }
903*35238bceSAndroid Build Coastguard Worker
904*35238bceSAndroid Build Coastguard Worker } // namespace
905*35238bceSAndroid Build Coastguard Worker
getNegativeComputeTestFunctions(void)906*35238bceSAndroid Build Coastguard Worker std::vector<FunctionContainer> getNegativeComputeTestFunctions(void)
907*35238bceSAndroid Build Coastguard Worker {
908*35238bceSAndroid Build Coastguard Worker const FunctionContainer funcs[] = {
909*35238bceSAndroid Build Coastguard Worker {program_not_active, "program_not_active", "Use dispatch commands with no active program"},
910*35238bceSAndroid Build Coastguard Worker {invalid_program_query, "invalid_program_query",
911*35238bceSAndroid Build Coastguard Worker "Querying GL_COMPUTE_WORK_GROUP_SIZE with glGetProgramiv() on invalid programs"},
912*35238bceSAndroid Build Coastguard Worker {invalid_dispatch_compute_indirect, "invalid_dispatch_compute_indirect",
913*35238bceSAndroid Build Coastguard Worker "Invalid glDispatchComputeIndirect usage"},
914*35238bceSAndroid Build Coastguard Worker {invalid_maximum_work_group_counts, "invalid_maximum_work_group_counts",
915*35238bceSAndroid Build Coastguard Worker "Maximum workgroup counts for dispatch commands"},
916*35238bceSAndroid Build Coastguard Worker {invalid_maximum_work_group_sizes, "invalid_maximum_work_group_sizes",
917*35238bceSAndroid Build Coastguard Worker "Maximum local workgroup sizes declared in compute shaders"},
918*35238bceSAndroid Build Coastguard Worker {invalid_layout_qualifiers, "invalid_layout_qualifiers", "Invalid layout qualifiers in compute shaders"},
919*35238bceSAndroid Build Coastguard Worker {invalid_write_built_in_constants, "invalid_write_built_in_constants",
920*35238bceSAndroid Build Coastguard Worker "Invalid writes to built-in compute shader constants"},
921*35238bceSAndroid Build Coastguard Worker {exceed_uniform_block_limit, "exceed_uniform_block_limit",
922*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_UNIFORM_BLOCKS"},
923*35238bceSAndroid Build Coastguard Worker {exceed_shader_storage_block_limit, "exceed_shader_storage_block_limit",
924*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS"},
925*35238bceSAndroid Build Coastguard Worker {exceed_texture_image_units_limit, "exceed_texture_image_units_limit",
926*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"},
927*35238bceSAndroid Build Coastguard Worker {exceed_image_uniforms_limit, "exceed_image_uniforms_limit",
928*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_IMAGE_UNIFORMS"},
929*35238bceSAndroid Build Coastguard Worker {exceed_shared_memory_size_limit, "exceed_shared_memory_size_limit",
930*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_SHARED_MEMORY_SIZE"},
931*35238bceSAndroid Build Coastguard Worker {exceed_uniform_components_limit, "exceed_uniform_components_limit",
932*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_UNIFORM_COMPONENTS"},
933*35238bceSAndroid Build Coastguard Worker {exceed_atomic_counter_buffer_limit, "exceed_atomic_counter_buffer_limit",
934*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"},
935*35238bceSAndroid Build Coastguard Worker {exceed_atomic_counters_limit, "exceed_atomic_counters_limit",
936*35238bceSAndroid Build Coastguard Worker "Link error when shader exceeds GL_MAX_COMPUTE_ATOMIC_COUNTERS"},
937*35238bceSAndroid Build Coastguard Worker };
938*35238bceSAndroid Build Coastguard Worker
939*35238bceSAndroid Build Coastguard Worker return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
940*35238bceSAndroid Build Coastguard Worker }
941*35238bceSAndroid Build Coastguard Worker
942*35238bceSAndroid Build Coastguard Worker } // namespace NegativeTestShared
943*35238bceSAndroid Build Coastguard Worker } // namespace Functional
944*35238bceSAndroid Build Coastguard Worker } // namespace gles31
945*35238bceSAndroid Build Coastguard Worker } // namespace deqp
946