xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fNegativeShaderApiTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 2014 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 Shader API tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es31fNegativeShaderApiTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "deUniquePtr.hpp"
27*35238bceSAndroid Build Coastguard Worker 
28*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker namespace deqp
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace gles31
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace Functional
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace NegativeTestShared
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker using glu::CallLogWrapper;
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 *vertexShaderSource = "#version 300 es\n"
50*35238bceSAndroid Build Coastguard Worker                                         "void main (void)\n"
51*35238bceSAndroid Build Coastguard Worker                                         "{\n"
52*35238bceSAndroid Build Coastguard Worker                                         "    gl_Position = vec4(0.0);\n"
53*35238bceSAndroid Build Coastguard Worker                                         "}\n\0";
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker static const char *fragmentShaderSource = "#version 300 es\n"
56*35238bceSAndroid Build Coastguard Worker                                           "layout(location = 0) out mediump vec4 fragColor;"
57*35238bceSAndroid Build Coastguard Worker                                           "void main (void)\n"
58*35238bceSAndroid Build Coastguard Worker                                           "{\n"
59*35238bceSAndroid Build Coastguard Worker                                           "    fragColor = vec4(0.0);\n"
60*35238bceSAndroid Build Coastguard Worker                                           "}\n\0";
61*35238bceSAndroid Build Coastguard Worker 
62*35238bceSAndroid Build Coastguard Worker static const char *uniformTestVertSource = "#version 300 es\n"
63*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump vec4 vec4_v;\n"
64*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump mat4 mat4_v;\n"
65*35238bceSAndroid Build Coastguard Worker                                            "void main (void)\n"
66*35238bceSAndroid Build Coastguard Worker                                            "{\n"
67*35238bceSAndroid Build Coastguard Worker                                            "    gl_Position = mat4_v * vec4_v;\n"
68*35238bceSAndroid Build Coastguard Worker                                            "}\n\0";
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker static const char *uniformTestFragSource = "#version 300 es\n"
71*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump ivec4 ivec4_f;\n"
72*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump uvec4 uvec4_f;\n"
73*35238bceSAndroid Build Coastguard Worker                                            "uniform sampler2D sampler_f;\n"
74*35238bceSAndroid Build Coastguard Worker                                            "layout(location = 0) out mediump vec4 fragColor;"
75*35238bceSAndroid Build Coastguard Worker                                            "void main (void)\n"
76*35238bceSAndroid Build Coastguard Worker                                            "{\n"
77*35238bceSAndroid Build Coastguard Worker                                            "    fragColor.xy = (vec4(uvec4_f) + vec4(ivec4_f)).xy;\n"
78*35238bceSAndroid Build Coastguard Worker                                            "    fragColor.zw = texture(sampler_f, vec2(0.0, 0.0)).zw;\n"
79*35238bceSAndroid Build Coastguard Worker                                            "}\n\0";
80*35238bceSAndroid Build Coastguard Worker 
81*35238bceSAndroid Build Coastguard Worker static const char *uniformBlockVertSource = "#version 300 es\n"
82*35238bceSAndroid Build Coastguard Worker                                             "layout(shared) uniform Block { lowp float var; };\n"
83*35238bceSAndroid Build Coastguard Worker                                             "void main (void)\n"
84*35238bceSAndroid Build Coastguard Worker                                             "{\n"
85*35238bceSAndroid Build Coastguard Worker                                             "    gl_Position = vec4(var);\n"
86*35238bceSAndroid Build Coastguard Worker                                             "}\n\0";
87*35238bceSAndroid Build Coastguard Worker 
supportsES32orGL45(NegativeTestContext & ctx)88*35238bceSAndroid Build Coastguard Worker static bool supportsES32orGL45(NegativeTestContext &ctx)
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker     return contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
91*35238bceSAndroid Build Coastguard Worker            contextSupports(ctx.getRenderContext().getType(), glu::ApiType::core(4, 5));
92*35238bceSAndroid Build Coastguard Worker }
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker // Shader control commands
create_shader(NegativeTestContext & ctx)95*35238bceSAndroid Build Coastguard Worker void create_shader(NegativeTestContext &ctx)
96*35238bceSAndroid Build Coastguard Worker {
97*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if shaderType is not an accepted value.");
98*35238bceSAndroid Build Coastguard Worker     ctx.glCreateShader(-1);
99*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
100*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
101*35238bceSAndroid Build Coastguard Worker }
102*35238bceSAndroid Build Coastguard Worker 
shader_source(NegativeTestContext & ctx)103*35238bceSAndroid Build Coastguard Worker void shader_source(NegativeTestContext &ctx)
104*35238bceSAndroid Build Coastguard Worker {
105*35238bceSAndroid Build Coastguard Worker     // make notAShader not a shader id
106*35238bceSAndroid Build Coastguard Worker     const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
107*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(notAShader);
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
110*35238bceSAndroid Build Coastguard Worker     ctx.glShaderSource(notAShader, 0, 0, 0);
111*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
112*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
113*35238bceSAndroid Build Coastguard Worker 
114*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if count is less than 0.");
115*35238bceSAndroid Build Coastguard Worker     GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
116*35238bceSAndroid Build Coastguard Worker     ctx.glShaderSource(shader, -1, 0, 0);
117*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
118*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
121*35238bceSAndroid Build Coastguard Worker     GLuint program = ctx.glCreateProgram();
122*35238bceSAndroid Build Coastguard Worker     ctx.glShaderSource(program, 0, 0, 0);
123*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
124*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
125*35238bceSAndroid Build Coastguard Worker 
126*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(program);
127*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
128*35238bceSAndroid Build Coastguard Worker }
129*35238bceSAndroid Build Coastguard Worker 
compile_shader(NegativeTestContext & ctx)130*35238bceSAndroid Build Coastguard Worker void compile_shader(NegativeTestContext &ctx)
131*35238bceSAndroid Build Coastguard Worker {
132*35238bceSAndroid Build Coastguard Worker     const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
133*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(notAShader);
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
136*35238bceSAndroid Build Coastguard Worker     ctx.glCompileShader(notAShader);
137*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
138*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
139*35238bceSAndroid Build Coastguard Worker 
140*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
141*35238bceSAndroid Build Coastguard Worker     GLuint program = ctx.glCreateProgram();
142*35238bceSAndroid Build Coastguard Worker     ctx.glCompileShader(program);
143*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
144*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(program);
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker 
delete_shader(NegativeTestContext & ctx)149*35238bceSAndroid Build Coastguard Worker void delete_shader(NegativeTestContext &ctx)
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker     const GLuint notAShader = ctx.glCreateShader(GL_VERTEX_SHADER);
152*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(notAShader);
153*35238bceSAndroid Build Coastguard Worker 
154*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
155*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(notAShader);
156*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
157*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
158*35238bceSAndroid Build Coastguard Worker }
159*35238bceSAndroid Build Coastguard Worker 
shader_binary(NegativeTestContext & ctx)160*35238bceSAndroid Build Coastguard Worker void shader_binary(NegativeTestContext &ctx)
161*35238bceSAndroid Build Coastguard Worker {
162*35238bceSAndroid Build Coastguard Worker     std::vector<int32_t> binaryFormats;
163*35238bceSAndroid Build Coastguard Worker     bool shaderBinarySupported = !binaryFormats.empty();
164*35238bceSAndroid Build Coastguard Worker     GLuint shaders[2];
165*35238bceSAndroid Build Coastguard Worker     GLuint shaderPair[2];
166*35238bceSAndroid Build Coastguard Worker     GLuint nonProgram[2];
167*35238bceSAndroid Build Coastguard Worker     GLuint shaderProgram[2];
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker     {
170*35238bceSAndroid Build Coastguard Worker         int32_t numFormats = 0x1234;
171*35238bceSAndroid Build Coastguard Worker         ctx.glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &numFormats);
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker         if (numFormats == 0)
174*35238bceSAndroid Build Coastguard Worker             ctx.getLog() << TestLog::Message << "// No supported extensions available." << TestLog::EndMessage;
175*35238bceSAndroid Build Coastguard Worker         else
176*35238bceSAndroid Build Coastguard Worker         {
177*35238bceSAndroid Build Coastguard Worker             binaryFormats.resize(numFormats);
178*35238bceSAndroid Build Coastguard Worker             ctx.glGetIntegerv(GL_SHADER_BINARY_FORMATS, &binaryFormats[0]);
179*35238bceSAndroid Build Coastguard Worker         }
180*35238bceSAndroid Build Coastguard Worker     }
181*35238bceSAndroid Build Coastguard Worker 
182*35238bceSAndroid Build Coastguard Worker     if (!shaderBinarySupported)
183*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// Shader binaries not supported." << TestLog::EndMessage;
184*35238bceSAndroid Build Coastguard Worker     else
185*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// Shader binaries supported" << TestLog::EndMessage;
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker     shaders[0]       = ctx.glCreateShader(GL_VERTEX_SHADER);
188*35238bceSAndroid Build Coastguard Worker     shaders[1]       = ctx.glCreateShader(GL_VERTEX_SHADER);
189*35238bceSAndroid Build Coastguard Worker     shaderPair[0]    = ctx.glCreateShader(GL_VERTEX_SHADER);
190*35238bceSAndroid Build Coastguard Worker     shaderPair[1]    = ctx.glCreateShader(GL_FRAGMENT_SHADER);
191*35238bceSAndroid Build Coastguard Worker     nonProgram[0]    = -1;
192*35238bceSAndroid Build Coastguard Worker     nonProgram[1]    = -1;
193*35238bceSAndroid Build Coastguard Worker     shaderProgram[0] = ctx.glCreateShader(GL_VERTEX_SHADER);
194*35238bceSAndroid Build Coastguard Worker     shaderProgram[1] = ctx.glCreateProgram();
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if binaryFormat is not an accepted value.");
197*35238bceSAndroid Build Coastguard Worker     ctx.glShaderBinary(1, &shaders[0], -1, 0, 0);
198*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
199*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker     if (shaderBinarySupported)
202*35238bceSAndroid Build Coastguard Worker     {
203*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("GL_INVALID_VALUE is generated if the data pointed to by binary does not match the format "
204*35238bceSAndroid Build Coastguard Worker                          "specified by binaryFormat.");
205*35238bceSAndroid Build Coastguard Worker         const GLbyte data = 0x005F;
206*35238bceSAndroid Build Coastguard Worker         ctx.glShaderBinary(1, &shaders[0], binaryFormats[0], &data, 1);
207*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_VALUE);
208*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("GL_INVALID_OPERATION is generated if more than one of the handles in shaders refers to the "
211*35238bceSAndroid Build Coastguard Worker                          "same type of shader, or GL_INVALID_VALUE due to invalid data pointer.");
212*35238bceSAndroid Build Coastguard Worker         ctx.glShaderBinary(2, &shaders[0], binaryFormats[0], 0, 0);
213*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
214*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
215*35238bceSAndroid Build Coastguard Worker 
216*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("GL_INVALID_VALUE is generated if count or length is negative.");
217*35238bceSAndroid Build Coastguard Worker         ctx.glShaderBinary(2, &shaderPair[0], binaryFormats[0], 0, -1);
218*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_VALUE);
219*35238bceSAndroid Build Coastguard Worker         ctx.glShaderBinary(-1, &shaderPair[0], binaryFormats[0], 0, 0);
220*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_VALUE);
221*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
222*35238bceSAndroid Build Coastguard Worker 
223*35238bceSAndroid Build Coastguard Worker         ctx.beginSection(
224*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_VALUE is generated if shaders contains anything other than shader or program objects.");
225*35238bceSAndroid Build Coastguard Worker         ctx.glShaderBinary(2, &nonProgram[0], binaryFormats[0], 0, 0);
226*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_VALUE);
227*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
228*35238bceSAndroid Build Coastguard Worker 
229*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("GL_INVALID_OPERATION is generated if shaders refers to a program object.");
230*35238bceSAndroid Build Coastguard Worker         ctx.glShaderBinary(2, &shaderProgram[0], binaryFormats[0], 0, 0);
231*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_OPERATION);
232*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
233*35238bceSAndroid Build Coastguard Worker     }
234*35238bceSAndroid Build Coastguard Worker 
235*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shaders[0]);
236*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shaders[1]);
237*35238bceSAndroid Build Coastguard Worker }
238*35238bceSAndroid Build Coastguard Worker 
attach_shader(NegativeTestContext & ctx)239*35238bceSAndroid Build Coastguard Worker void attach_shader(NegativeTestContext &ctx)
240*35238bceSAndroid Build Coastguard Worker {
241*35238bceSAndroid Build Coastguard Worker     GLuint shader1 = ctx.glCreateShader(GL_VERTEX_SHADER);
242*35238bceSAndroid Build Coastguard Worker     GLuint shader2 = ctx.glCreateShader(GL_VERTEX_SHADER);
243*35238bceSAndroid Build Coastguard Worker     GLuint program = ctx.glCreateProgram();
244*35238bceSAndroid Build Coastguard Worker 
245*35238bceSAndroid Build Coastguard Worker     const GLuint notAShader  = ctx.glCreateShader(GL_VERTEX_SHADER);
246*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
247*35238bceSAndroid Build Coastguard Worker 
248*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(notAShader);
249*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
252*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(shader1, shader1);
253*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
254*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
255*35238bceSAndroid Build Coastguard Worker 
256*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
257*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(program, program);
258*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
259*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(shader1, program);
260*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
261*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
264*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(program, notAShader);
265*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
266*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(notAProgram, shader1);
267*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
268*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(notAProgram, notAShader);
269*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
270*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
271*35238bceSAndroid Build Coastguard Worker 
272*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if shader is already attached to program.");
273*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(program, shader1);
274*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
275*35238bceSAndroid Build Coastguard Worker     ctx.glAttachShader(program, shader1);
276*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
277*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker     if (glu::isContextTypeES(ctx.getRenderContext().getType()))
280*35238bceSAndroid Build Coastguard Worker     {
281*35238bceSAndroid Build Coastguard Worker         ctx.beginSection(
282*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_OPERATION is generated if a shader of the same type as shader is already attached to program.");
283*35238bceSAndroid Build Coastguard Worker         ctx.glAttachShader(program, shader2);
284*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_OPERATION);
285*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
286*35238bceSAndroid Build Coastguard Worker     }
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(program);
289*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader1);
290*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader2);
291*35238bceSAndroid Build Coastguard Worker }
292*35238bceSAndroid Build Coastguard Worker 
detach_shader(NegativeTestContext & ctx)293*35238bceSAndroid Build Coastguard Worker void detach_shader(NegativeTestContext &ctx)
294*35238bceSAndroid Build Coastguard Worker {
295*35238bceSAndroid Build Coastguard Worker     GLuint shader  = ctx.glCreateShader(GL_VERTEX_SHADER);
296*35238bceSAndroid Build Coastguard Worker     GLuint program = ctx.glCreateProgram();
297*35238bceSAndroid Build Coastguard Worker 
298*35238bceSAndroid Build Coastguard Worker     const GLuint notAShader  = ctx.glCreateShader(GL_VERTEX_SHADER);
299*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
300*35238bceSAndroid Build Coastguard Worker 
301*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(notAShader);
302*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
303*35238bceSAndroid Build Coastguard Worker 
304*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
305*35238bceSAndroid Build Coastguard Worker     ctx.glDetachShader(notAProgram, shader);
306*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
307*35238bceSAndroid Build Coastguard Worker     ctx.glDetachShader(program, notAShader);
308*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
309*35238bceSAndroid Build Coastguard Worker     ctx.glDetachShader(notAProgram, notAShader);
310*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
311*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
312*35238bceSAndroid Build Coastguard Worker 
313*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
314*35238bceSAndroid Build Coastguard Worker     ctx.glDetachShader(shader, shader);
315*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
316*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
317*35238bceSAndroid Build Coastguard Worker 
318*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not a shader object.");
319*35238bceSAndroid Build Coastguard Worker     ctx.glDetachShader(program, program);
320*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
321*35238bceSAndroid Build Coastguard Worker     ctx.glDetachShader(shader, program);
322*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
323*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if shader is not attached to program.");
326*35238bceSAndroid Build Coastguard Worker     ctx.glDetachShader(program, shader);
327*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
328*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
329*35238bceSAndroid Build Coastguard Worker 
330*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(program);
331*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
332*35238bceSAndroid Build Coastguard Worker }
333*35238bceSAndroid Build Coastguard Worker 
link_program(NegativeTestContext & ctx)334*35238bceSAndroid Build Coastguard Worker void link_program(NegativeTestContext &ctx)
335*35238bceSAndroid Build Coastguard Worker {
336*35238bceSAndroid Build Coastguard Worker     GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
337*35238bceSAndroid Build Coastguard Worker 
338*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
339*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
340*35238bceSAndroid Build Coastguard Worker 
341*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
342*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(notAProgram);
343*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
344*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
345*35238bceSAndroid Build Coastguard Worker 
346*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
347*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(shader);
348*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
349*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
352*35238bceSAndroid Build Coastguard Worker 
353*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is the currently active program object and "
354*35238bceSAndroid Build Coastguard Worker                      "transform feedback mode is active.");
355*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
356*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
357*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
358*35238bceSAndroid Build Coastguard Worker     uint32_t tfID         = 0x1234;
359*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
360*35238bceSAndroid Build Coastguard Worker 
361*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(1, &tfID);
362*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
363*35238bceSAndroid Build Coastguard Worker 
364*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
365*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
366*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
367*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
368*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
369*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
370*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
371*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
372*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
373*35238bceSAndroid Build Coastguard Worker 
374*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
375*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
378*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(1, &tfID);
379*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
380*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
381*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
382*35238bceSAndroid Build Coastguard Worker }
383*35238bceSAndroid Build Coastguard Worker 
use_program(NegativeTestContext & ctx)384*35238bceSAndroid Build Coastguard Worker void use_program(NegativeTestContext &ctx)
385*35238bceSAndroid Build Coastguard Worker {
386*35238bceSAndroid Build Coastguard Worker     GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
387*35238bceSAndroid Build Coastguard Worker 
388*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
389*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is neither 0 nor a value generated by OpenGL.");
392*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(notAProgram);
393*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
394*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
395*35238bceSAndroid Build Coastguard Worker 
396*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
397*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(shader);
398*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
399*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
400*35238bceSAndroid Build Coastguard Worker 
401*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback mode is active and not paused.");
402*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program1(ctx.getRenderContext(),
403*35238bceSAndroid Build Coastguard Worker                                 glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
404*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program2(ctx.getRenderContext(),
405*35238bceSAndroid Build Coastguard Worker                                 glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
406*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
407*35238bceSAndroid Build Coastguard Worker     uint32_t tfID         = 0x1234;
408*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
409*35238bceSAndroid Build Coastguard Worker 
410*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(1, &tfID);
411*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program1.getProgram());
414*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program1.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
415*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program1.getProgram());
416*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
417*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
418*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
419*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
420*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
421*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
422*35238bceSAndroid Build Coastguard Worker 
423*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program2.getProgram());
424*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
425*35238bceSAndroid Build Coastguard Worker 
426*35238bceSAndroid Build Coastguard Worker     ctx.glPauseTransformFeedback();
427*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program2.getProgram());
428*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
429*35238bceSAndroid Build Coastguard Worker 
430*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
431*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(1, &tfID);
432*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
433*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
434*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
435*35238bceSAndroid Build Coastguard Worker 
436*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
437*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
438*35238bceSAndroid Build Coastguard Worker }
439*35238bceSAndroid Build Coastguard Worker 
delete_program(NegativeTestContext & ctx)440*35238bceSAndroid Build Coastguard Worker void delete_program(NegativeTestContext &ctx)
441*35238bceSAndroid Build Coastguard Worker {
442*35238bceSAndroid Build Coastguard Worker     GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
443*35238bceSAndroid Build Coastguard Worker 
444*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
445*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
446*35238bceSAndroid Build Coastguard Worker 
447*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
448*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
449*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
450*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
451*35238bceSAndroid Build Coastguard Worker 
452*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not zero and is the name of a shader object.");
453*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(shader);
454*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
455*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
456*35238bceSAndroid Build Coastguard Worker 
457*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
458*35238bceSAndroid Build Coastguard Worker }
459*35238bceSAndroid Build Coastguard Worker 
validate_program(NegativeTestContext & ctx)460*35238bceSAndroid Build Coastguard Worker void validate_program(NegativeTestContext &ctx)
461*35238bceSAndroid Build Coastguard Worker {
462*35238bceSAndroid Build Coastguard Worker     GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
463*35238bceSAndroid Build Coastguard Worker 
464*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
465*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
466*35238bceSAndroid Build Coastguard Worker 
467*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
468*35238bceSAndroid Build Coastguard Worker     ctx.glValidateProgram(notAProgram);
469*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
470*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
471*35238bceSAndroid Build Coastguard Worker 
472*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
473*35238bceSAndroid Build Coastguard Worker     ctx.glValidateProgram(shader);
474*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
475*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
476*35238bceSAndroid Build Coastguard Worker 
477*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
478*35238bceSAndroid Build Coastguard Worker }
479*35238bceSAndroid Build Coastguard Worker 
get_program_binary(NegativeTestContext & ctx)480*35238bceSAndroid Build Coastguard Worker void get_program_binary(NegativeTestContext &ctx)
481*35238bceSAndroid Build Coastguard Worker {
482*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
483*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
484*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram programInvalid(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
485*35238bceSAndroid Build Coastguard Worker     GLenum binaryFormat  = -1;
486*35238bceSAndroid Build Coastguard Worker     GLsizei binaryLength = -1;
487*35238bceSAndroid Build Coastguard Worker     GLint binaryPtr      = -1;
488*35238bceSAndroid Build Coastguard Worker     GLint bufSize        = -1;
489*35238bceSAndroid Build Coastguard Worker     GLint linkStatus     = -1;
490*35238bceSAndroid Build Coastguard Worker 
491*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
492*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_OPERATION is generated if bufSize is less than the size of GL_PROGRAM_BINARY_LENGTH for program.");
493*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(program.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
494*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
495*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(program.getProgram(), GL_LINK_STATUS, &linkStatus);
496*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
497*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
498*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
499*35238bceSAndroid Build Coastguard Worker 
500*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramBinary(program.getProgram(), 0, &binaryLength, &binaryFormat, &binaryPtr);
501*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
502*35238bceSAndroid Build Coastguard Worker     if (bufSize > 0)
503*35238bceSAndroid Build Coastguard Worker     {
504*35238bceSAndroid Build Coastguard Worker         ctx.glGetProgramBinary(program.getProgram(), bufSize - 1, &binaryLength, &binaryFormat, &binaryPtr);
505*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_OPERATION);
506*35238bceSAndroid Build Coastguard Worker     }
507*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
508*35238bceSAndroid Build Coastguard Worker 
509*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if GL_LINK_STATUS for the program object is false.");
510*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(programInvalid.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
511*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
512*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(programInvalid.getProgram(), GL_LINK_STATUS, &linkStatus);
513*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
514*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
515*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
516*35238bceSAndroid Build Coastguard Worker 
517*35238bceSAndroid Build Coastguard Worker     if (!linkStatus)
518*35238bceSAndroid Build Coastguard Worker     {
519*35238bceSAndroid Build Coastguard Worker         ctx.glGetProgramBinary(programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
520*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_OPERATION);
521*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
522*35238bceSAndroid Build Coastguard Worker     }
523*35238bceSAndroid Build Coastguard Worker     else
524*35238bceSAndroid Build Coastguard Worker     {
525*35238bceSAndroid Build Coastguard Worker         if (isContextTypeES(ctx.getRenderContext().getType()))
526*35238bceSAndroid Build Coastguard Worker             ctx.fail("Program should not have linked");
527*35238bceSAndroid Build Coastguard Worker     }
528*35238bceSAndroid Build Coastguard Worker }
529*35238bceSAndroid Build Coastguard Worker 
program_binary(NegativeTestContext & ctx)530*35238bceSAndroid Build Coastguard Worker void program_binary(NegativeTestContext &ctx)
531*35238bceSAndroid Build Coastguard Worker {
532*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram srcProgram(ctx.getRenderContext(),
533*35238bceSAndroid Build Coastguard Worker                                   glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
534*35238bceSAndroid Build Coastguard Worker     GLuint dstProgram    = ctx.glCreateProgram();
535*35238bceSAndroid Build Coastguard Worker     GLuint unusedShader  = ctx.glCreateShader(GL_VERTEX_SHADER);
536*35238bceSAndroid Build Coastguard Worker     GLenum binaryFormat  = -1;
537*35238bceSAndroid Build Coastguard Worker     GLsizei binaryLength = -1;
538*35238bceSAndroid Build Coastguard Worker     std::vector<uint8_t> binaryBuf;
539*35238bceSAndroid Build Coastguard Worker     GLint bufSize    = -1;
540*35238bceSAndroid Build Coastguard Worker     GLint linkStatus = -1;
541*35238bceSAndroid Build Coastguard Worker 
542*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(srcProgram.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
543*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(srcProgram.getProgram(), GL_LINK_STATUS, &linkStatus);
544*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
545*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
546*35238bceSAndroid Build Coastguard Worker 
547*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(bufSize >= 0);
548*35238bceSAndroid Build Coastguard Worker     if (bufSize > 0)
549*35238bceSAndroid Build Coastguard Worker     {
550*35238bceSAndroid Build Coastguard Worker         binaryBuf.resize(bufSize);
551*35238bceSAndroid Build Coastguard Worker         ctx.glGetProgramBinary(srcProgram.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryBuf[0]);
552*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_NO_ERROR);
553*35238bceSAndroid Build Coastguard Worker 
554*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("GL_INVALID_OPERATION is generated if program is not the name of an existing program object.");
555*35238bceSAndroid Build Coastguard Worker         ctx.glProgramBinary(unusedShader, binaryFormat, &binaryBuf[0], binaryLength);
556*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_OPERATION);
557*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
558*35238bceSAndroid Build Coastguard Worker 
559*35238bceSAndroid Build Coastguard Worker         ctx.beginSection(
560*35238bceSAndroid Build Coastguard Worker             "GL_INVALID_ENUM is generated if binaryFormat is not a value recognized by the implementation.");
561*35238bceSAndroid Build Coastguard Worker         ctx.glProgramBinary(dstProgram, -1, &binaryBuf[0], binaryLength);
562*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_ENUM);
563*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
564*35238bceSAndroid Build Coastguard Worker     }
565*35238bceSAndroid Build Coastguard Worker 
566*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(unusedShader);
567*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(dstProgram);
568*35238bceSAndroid Build Coastguard Worker }
569*35238bceSAndroid Build Coastguard Worker 
program_parameteri(NegativeTestContext & ctx)570*35238bceSAndroid Build Coastguard Worker void program_parameteri(NegativeTestContext &ctx)
571*35238bceSAndroid Build Coastguard Worker {
572*35238bceSAndroid Build Coastguard Worker     GLuint program = ctx.glCreateProgram();
573*35238bceSAndroid Build Coastguard Worker     GLuint shader  = ctx.glCreateShader(GL_VERTEX_SHADER);
574*35238bceSAndroid Build Coastguard Worker 
575*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
576*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
577*35238bceSAndroid Build Coastguard Worker 
578*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of an existing program object.");
579*35238bceSAndroid Build Coastguard Worker     ctx.glProgramParameteri(notAProgram, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
580*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
581*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
582*35238bceSAndroid Build Coastguard Worker 
583*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
584*35238bceSAndroid Build Coastguard Worker     ctx.glProgramParameteri(shader, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
585*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
586*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
587*35238bceSAndroid Build Coastguard Worker 
588*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
589*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_ENUM is generated if pname is not GL_PROGRAM_BINARY_RETRIEVABLE_HINT or PROGRAM_SEPARABLE.");
590*35238bceSAndroid Build Coastguard Worker     ctx.glProgramParameteri(program, -1, GL_TRUE);
591*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
592*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
593*35238bceSAndroid Build Coastguard Worker 
594*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if value is not GL_FALSE or GL_TRUE.");
595*35238bceSAndroid Build Coastguard Worker     ctx.glProgramParameteri(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, 2);
596*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
597*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
598*35238bceSAndroid Build Coastguard Worker 
599*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(program);
600*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
601*35238bceSAndroid Build Coastguard Worker }
602*35238bceSAndroid Build Coastguard Worker 
gen_samplers(NegativeTestContext & ctx)603*35238bceSAndroid Build Coastguard Worker void gen_samplers(NegativeTestContext &ctx)
604*35238bceSAndroid Build Coastguard Worker {
605*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
606*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0;
607*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(-1, &sampler);
608*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
609*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
610*35238bceSAndroid Build Coastguard Worker }
611*35238bceSAndroid Build Coastguard Worker 
bind_sampler(NegativeTestContext & ctx)612*35238bceSAndroid Build Coastguard Worker void bind_sampler(NegativeTestContext &ctx)
613*35238bceSAndroid Build Coastguard Worker {
614*35238bceSAndroid Build Coastguard Worker     int maxTexImageUnits = 0x1234;
615*35238bceSAndroid Build Coastguard Worker     GLuint sampler       = 0;
616*35238bceSAndroid Build Coastguard Worker     ctx.glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTexImageUnits);
617*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
618*35238bceSAndroid Build Coastguard Worker 
619*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if unit is greater than or equal to the value of "
620*35238bceSAndroid Build Coastguard Worker                      "GL_MAX_COMBIED_TEXTURE_IMAGE_UNITS.");
621*35238bceSAndroid Build Coastguard Worker     ctx.glBindSampler(maxTexImageUnits, sampler);
622*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
623*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
624*35238bceSAndroid Build Coastguard Worker 
625*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not zero or a name previously returned from a "
626*35238bceSAndroid Build Coastguard Worker                      "call to ctx.glGenSamplers.");
627*35238bceSAndroid Build Coastguard Worker     ctx.glBindSampler(1, -1);
628*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
629*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
630*35238bceSAndroid Build Coastguard Worker 
631*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
632*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_OPERATION is generated if sampler has been deleted by a call to ctx.glDeleteSamplers.");
633*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
634*35238bceSAndroid Build Coastguard Worker     ctx.glBindSampler(1, sampler);
635*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
636*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
637*35238bceSAndroid Build Coastguard Worker }
638*35238bceSAndroid Build Coastguard Worker 
delete_samplers(NegativeTestContext & ctx)639*35238bceSAndroid Build Coastguard Worker void delete_samplers(NegativeTestContext &ctx)
640*35238bceSAndroid Build Coastguard Worker {
641*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
642*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(-1, 0);
643*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
644*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
645*35238bceSAndroid Build Coastguard Worker }
646*35238bceSAndroid Build Coastguard Worker 
get_sampler_parameteriv(NegativeTestContext & ctx)647*35238bceSAndroid Build Coastguard Worker void get_sampler_parameteriv(NegativeTestContext &ctx)
648*35238bceSAndroid Build Coastguard Worker {
649*35238bceSAndroid Build Coastguard Worker     int params     = 0x1234;
650*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0;
651*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
652*35238bceSAndroid Build Coastguard Worker 
653*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a "
654*35238bceSAndroid Build Coastguard Worker                      "previous call to ctx.glGenSamplers.");
655*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameteriv(-1, GL_TEXTURE_MAG_FILTER, &params);
656*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
657*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
658*35238bceSAndroid Build Coastguard Worker 
659*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
660*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameteriv(sampler, -1, &params);
661*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
662*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
663*35238bceSAndroid Build Coastguard Worker 
664*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
665*35238bceSAndroid Build Coastguard Worker }
666*35238bceSAndroid Build Coastguard Worker 
get_sampler_parameterfv(NegativeTestContext & ctx)667*35238bceSAndroid Build Coastguard Worker void get_sampler_parameterfv(NegativeTestContext &ctx)
668*35238bceSAndroid Build Coastguard Worker {
669*35238bceSAndroid Build Coastguard Worker     float params   = 0.0f;
670*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0;
671*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
672*35238bceSAndroid Build Coastguard Worker 
673*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a "
674*35238bceSAndroid Build Coastguard Worker                      "previous call to ctx.glGenSamplers.");
675*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameterfv(-1, GL_TEXTURE_MAG_FILTER, &params);
676*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
677*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
678*35238bceSAndroid Build Coastguard Worker 
679*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
680*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameterfv(sampler, -1, &params);
681*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
682*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
683*35238bceSAndroid Build Coastguard Worker 
684*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
685*35238bceSAndroid Build Coastguard Worker }
686*35238bceSAndroid Build Coastguard Worker 
get_sampler_parameterIiv(NegativeTestContext & ctx)687*35238bceSAndroid Build Coastguard Worker void get_sampler_parameterIiv(NegativeTestContext &ctx)
688*35238bceSAndroid Build Coastguard Worker {
689*35238bceSAndroid Build Coastguard Worker     if (!supportsES32orGL45(ctx))
690*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("glGetSamplerParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
691*35238bceSAndroid Build Coastguard Worker 
692*35238bceSAndroid Build Coastguard Worker     GLuint sampler      = 0x1234;
693*35238bceSAndroid Build Coastguard Worker     GLint borderColor[] = {0x1234, 0x4123, 0x3412, 0x2341};
694*35238bceSAndroid Build Coastguard Worker 
695*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a "
696*35238bceSAndroid Build Coastguard Worker                      "previous call to ctx.glGenSamplers.");
697*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameterIiv(sampler, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
698*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
699*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
700*35238bceSAndroid Build Coastguard Worker 
701*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
702*35238bceSAndroid Build Coastguard Worker 
703*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
704*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameterIiv(sampler, -1, &borderColor[0]);
705*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
706*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
709*35238bceSAndroid Build Coastguard Worker }
710*35238bceSAndroid Build Coastguard Worker 
get_sampler_parameterIuiv(NegativeTestContext & ctx)711*35238bceSAndroid Build Coastguard Worker void get_sampler_parameterIuiv(NegativeTestContext &ctx)
712*35238bceSAndroid Build Coastguard Worker {
713*35238bceSAndroid Build Coastguard Worker     if (!supportsES32orGL45(ctx))
714*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("glGetSamplerParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
715*35238bceSAndroid Build Coastguard Worker 
716*35238bceSAndroid Build Coastguard Worker     GLuint sampler       = 0x1234;
717*35238bceSAndroid Build Coastguard Worker     GLuint borderColor[] = {0x1234, 0x4123, 0x3412, 0x2341};
718*35238bceSAndroid Build Coastguard Worker 
719*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object returned from a "
720*35238bceSAndroid Build Coastguard Worker                      "previous call to ctx.glGenSamplers.");
721*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameterIuiv(sampler, GL_TEXTURE_BORDER_COLOR, &borderColor[0]);
722*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
723*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
724*35238bceSAndroid Build Coastguard Worker 
725*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
726*35238bceSAndroid Build Coastguard Worker 
727*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted value.");
728*35238bceSAndroid Build Coastguard Worker     ctx.glGetSamplerParameterIuiv(sampler, -1, &borderColor[0]);
729*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
730*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
731*35238bceSAndroid Build Coastguard Worker 
732*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
733*35238bceSAndroid Build Coastguard Worker }
734*35238bceSAndroid Build Coastguard Worker 
sampler_parameteri(NegativeTestContext & ctx)735*35238bceSAndroid Build Coastguard Worker void sampler_parameteri(NegativeTestContext &ctx)
736*35238bceSAndroid Build Coastguard Worker {
737*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0;
738*35238bceSAndroid Build Coastguard Worker 
739*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
740*35238bceSAndroid Build Coastguard Worker 
741*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously "
742*35238bceSAndroid Build Coastguard Worker                      "returned from a call to ctx.glGenSamplers.");
743*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameteri(-1, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
744*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
745*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
746*35238bceSAndroid Build Coastguard Worker 
747*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value "
748*35238bceSAndroid Build Coastguard Worker                      "of pname) and does not.");
749*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, -1);
750*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
751*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
752*35238bceSAndroid Build Coastguard Worker 
753*35238bceSAndroid Build Coastguard Worker     if (supportsES32orGL45(ctx))
754*35238bceSAndroid Build Coastguard Worker     {
755*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("GL_INVALID_ENUM is generated if glSamplerParameteri is called for a non-scalar parameter.");
756*35238bceSAndroid Build Coastguard Worker         ctx.glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, 0);
757*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_ENUM);
758*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
759*35238bceSAndroid Build Coastguard Worker     }
760*35238bceSAndroid Build Coastguard Worker 
761*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
762*35238bceSAndroid Build Coastguard Worker }
763*35238bceSAndroid Build Coastguard Worker 
sampler_parameteriv(NegativeTestContext & ctx)764*35238bceSAndroid Build Coastguard Worker void sampler_parameteriv(NegativeTestContext &ctx)
765*35238bceSAndroid Build Coastguard Worker {
766*35238bceSAndroid Build Coastguard Worker     int params     = 0x1234;
767*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0;
768*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
769*35238bceSAndroid Build Coastguard Worker 
770*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously "
771*35238bceSAndroid Build Coastguard Worker                      "returned from a call to ctx.glGenSamplers.");
772*35238bceSAndroid Build Coastguard Worker     params = GL_CLAMP_TO_EDGE;
773*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameteriv(-1, GL_TEXTURE_WRAP_S, &params);
774*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
775*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
776*35238bceSAndroid Build Coastguard Worker 
777*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value "
778*35238bceSAndroid Build Coastguard Worker                      "of pname) and does not.");
779*35238bceSAndroid Build Coastguard Worker     params = -1;
780*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameteriv(sampler, GL_TEXTURE_WRAP_S, &params);
781*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
782*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
783*35238bceSAndroid Build Coastguard Worker 
784*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
785*35238bceSAndroid Build Coastguard Worker }
786*35238bceSAndroid Build Coastguard Worker 
sampler_parameterf(NegativeTestContext & ctx)787*35238bceSAndroid Build Coastguard Worker void sampler_parameterf(NegativeTestContext &ctx)
788*35238bceSAndroid Build Coastguard Worker {
789*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0;
790*35238bceSAndroid Build Coastguard Worker 
791*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
792*35238bceSAndroid Build Coastguard Worker 
793*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously "
794*35238bceSAndroid Build Coastguard Worker                      "returned from a call to ctx.glGenSamplers.");
795*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterf(-1, GL_TEXTURE_MIN_LOD, -1000.0f);
796*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
797*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
798*35238bceSAndroid Build Coastguard Worker 
799*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value "
800*35238bceSAndroid Build Coastguard Worker                      "of pname) and does not.");
801*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterf(sampler, GL_TEXTURE_WRAP_S, -1.0f);
802*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
803*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
804*35238bceSAndroid Build Coastguard Worker 
805*35238bceSAndroid Build Coastguard Worker     if (supportsES32orGL45(ctx))
806*35238bceSAndroid Build Coastguard Worker     {
807*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("GL_INVALID_ENUM is generated if glSamplerParameterf is called for a non-scalar parameter.");
808*35238bceSAndroid Build Coastguard Worker         ctx.glSamplerParameteri(sampler, GL_TEXTURE_BORDER_COLOR, 0);
809*35238bceSAndroid Build Coastguard Worker         ctx.expectError(GL_INVALID_ENUM);
810*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
811*35238bceSAndroid Build Coastguard Worker     }
812*35238bceSAndroid Build Coastguard Worker 
813*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
814*35238bceSAndroid Build Coastguard Worker }
815*35238bceSAndroid Build Coastguard Worker 
sampler_parameterfv(NegativeTestContext & ctx)816*35238bceSAndroid Build Coastguard Worker void sampler_parameterfv(NegativeTestContext &ctx)
817*35238bceSAndroid Build Coastguard Worker {
818*35238bceSAndroid Build Coastguard Worker     float params;
819*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0;
820*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
821*35238bceSAndroid Build Coastguard Worker 
822*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously "
823*35238bceSAndroid Build Coastguard Worker                      "returned from a call to ctx.glGenSamplers.");
824*35238bceSAndroid Build Coastguard Worker     params = -1000.0f;
825*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterfv(-1, GL_TEXTURE_WRAP_S, &params);
826*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
827*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
828*35238bceSAndroid Build Coastguard Worker 
829*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if params should have a defined constant value (based on the value "
830*35238bceSAndroid Build Coastguard Worker                      "of pname) and does not.");
831*35238bceSAndroid Build Coastguard Worker     params = -1.0f;
832*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterfv(sampler, GL_TEXTURE_WRAP_S, &params);
833*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
834*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
835*35238bceSAndroid Build Coastguard Worker 
836*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
837*35238bceSAndroid Build Coastguard Worker }
838*35238bceSAndroid Build Coastguard Worker 
sampler_parameterIiv(NegativeTestContext & ctx)839*35238bceSAndroid Build Coastguard Worker void sampler_parameterIiv(NegativeTestContext &ctx)
840*35238bceSAndroid Build Coastguard Worker {
841*35238bceSAndroid Build Coastguard Worker     if (!supportsES32orGL45(ctx))
842*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("glSamplerParameterIiv is not supported.", DE_NULL, __FILE__, __LINE__);
843*35238bceSAndroid Build Coastguard Worker 
844*35238bceSAndroid Build Coastguard Worker     GLuint sampler;
845*35238bceSAndroid Build Coastguard Worker     GLint color[] = {0, 0, 0, 0};
846*35238bceSAndroid Build Coastguard Worker 
847*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
848*35238bceSAndroid Build Coastguard Worker 
849*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously "
850*35238bceSAndroid Build Coastguard Worker                      "returned from a call to ctx.glGenSamplers.");
851*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterIiv(-1, GL_TEXTURE_BORDER_COLOR, color);
852*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
853*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
854*35238bceSAndroid Build Coastguard Worker 
855*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted sampler state name.");
856*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterIiv(sampler, -1, color);
857*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
858*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
859*35238bceSAndroid Build Coastguard Worker }
860*35238bceSAndroid Build Coastguard Worker 
sampler_parameterIuiv(NegativeTestContext & ctx)861*35238bceSAndroid Build Coastguard Worker void sampler_parameterIuiv(NegativeTestContext &ctx)
862*35238bceSAndroid Build Coastguard Worker {
863*35238bceSAndroid Build Coastguard Worker     if (!supportsES32orGL45(ctx))
864*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("glSamplerParameterIuiv is not supported.", DE_NULL, __FILE__, __LINE__);
865*35238bceSAndroid Build Coastguard Worker 
866*35238bceSAndroid Build Coastguard Worker     GLuint sampler;
867*35238bceSAndroid Build Coastguard Worker     GLuint color[] = {0, 0, 0, 0};
868*35238bceSAndroid Build Coastguard Worker 
869*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
870*35238bceSAndroid Build Coastguard Worker 
871*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if sampler is not the name of a sampler object previously "
872*35238bceSAndroid Build Coastguard Worker                      "returned from a call to ctx.glGenSamplers.");
873*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterIuiv(-1, GL_TEXTURE_BORDER_COLOR, color);
874*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
875*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
876*35238bceSAndroid Build Coastguard Worker 
877*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is not an accepted sampler state name.");
878*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterIuiv(sampler, -1, color);
879*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
880*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
881*35238bceSAndroid Build Coastguard Worker }
882*35238bceSAndroid Build Coastguard Worker 
883*35238bceSAndroid Build Coastguard Worker // Shader data commands
884*35238bceSAndroid Build Coastguard Worker 
get_attrib_location(NegativeTestContext & ctx)885*35238bceSAndroid Build Coastguard Worker void get_attrib_location(NegativeTestContext &ctx)
886*35238bceSAndroid Build Coastguard Worker {
887*35238bceSAndroid Build Coastguard Worker     GLuint programEmpty = ctx.glCreateProgram();
888*35238bceSAndroid Build Coastguard Worker     GLuint shader       = ctx.glCreateShader(GL_VERTEX_SHADER);
889*35238bceSAndroid Build Coastguard Worker 
890*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
891*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
892*35238bceSAndroid Build Coastguard Worker 
893*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
894*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
895*35238bceSAndroid Build Coastguard Worker 
896*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
897*35238bceSAndroid Build Coastguard Worker     ctx.glBindAttribLocation(programEmpty, 0, "test");
898*35238bceSAndroid Build Coastguard Worker     ctx.glGetAttribLocation(programEmpty, "test");
899*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
900*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
901*35238bceSAndroid Build Coastguard Worker 
902*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not a program or shader object.");
903*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
904*35238bceSAndroid Build Coastguard Worker     ctx.glBindAttribLocation(program.getProgram(), 0, "test");
905*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
906*35238bceSAndroid Build Coastguard Worker     ctx.glGetAttribLocation(program.getProgram(), "test");
907*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
908*35238bceSAndroid Build Coastguard Worker     ctx.glGetAttribLocation(notAProgram, "test");
909*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
910*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
911*35238bceSAndroid Build Coastguard Worker 
912*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
913*35238bceSAndroid Build Coastguard Worker     ctx.glGetAttribLocation(shader, "test");
914*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
915*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
916*35238bceSAndroid Build Coastguard Worker 
917*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
918*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
919*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(programEmpty);
920*35238bceSAndroid Build Coastguard Worker }
921*35238bceSAndroid Build Coastguard Worker 
get_uniform_location(NegativeTestContext & ctx)922*35238bceSAndroid Build Coastguard Worker void get_uniform_location(NegativeTestContext &ctx)
923*35238bceSAndroid Build Coastguard Worker {
924*35238bceSAndroid Build Coastguard Worker     GLuint programEmpty = ctx.glCreateProgram();
925*35238bceSAndroid Build Coastguard Worker     GLuint shader       = ctx.glCreateShader(GL_VERTEX_SHADER);
926*35238bceSAndroid Build Coastguard Worker 
927*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
928*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
929*35238bceSAndroid Build Coastguard Worker 
930*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
931*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
932*35238bceSAndroid Build Coastguard Worker 
933*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program has not been successfully linked.");
934*35238bceSAndroid Build Coastguard Worker     ctx.glGetUniformLocation(programEmpty, "test");
935*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
936*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
937*35238bceSAndroid Build Coastguard Worker 
938*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
939*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
940*35238bceSAndroid Build Coastguard Worker     ctx.glGetUniformLocation(notAProgram, "test");
941*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
942*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
943*35238bceSAndroid Build Coastguard Worker 
944*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
945*35238bceSAndroid Build Coastguard Worker     ctx.glGetAttribLocation(shader, "test");
946*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
947*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
948*35238bceSAndroid Build Coastguard Worker 
949*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
950*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(programEmpty);
951*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
952*35238bceSAndroid Build Coastguard Worker }
953*35238bceSAndroid Build Coastguard Worker 
bind_attrib_location(NegativeTestContext & ctx)954*35238bceSAndroid Build Coastguard Worker void bind_attrib_location(NegativeTestContext &ctx)
955*35238bceSAndroid Build Coastguard Worker {
956*35238bceSAndroid Build Coastguard Worker     GLuint program  = ctx.glCreateProgram();
957*35238bceSAndroid Build Coastguard Worker     GLuint maxIndex = ctx.getInteger(GL_MAX_VERTEX_ATTRIBS);
958*35238bceSAndroid Build Coastguard Worker     GLuint shader   = ctx.glCreateShader(GL_VERTEX_SHADER);
959*35238bceSAndroid Build Coastguard Worker 
960*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
961*35238bceSAndroid Build Coastguard Worker     ctx.glBindAttribLocation(program, maxIndex, "test");
962*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
963*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
964*35238bceSAndroid Build Coastguard Worker 
965*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if name starts with the reserved prefix \"gl_\".");
966*35238bceSAndroid Build Coastguard Worker     ctx.glBindAttribLocation(program, maxIndex - 1, "gl_test");
967*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
968*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
969*35238bceSAndroid Build Coastguard Worker 
970*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
971*35238bceSAndroid Build Coastguard Worker     ctx.glBindAttribLocation(-1, maxIndex - 1, "test");
972*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
973*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
974*35238bceSAndroid Build Coastguard Worker 
975*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is not a program object.");
976*35238bceSAndroid Build Coastguard Worker     ctx.glBindAttribLocation(shader, maxIndex - 1, "test");
977*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
978*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
979*35238bceSAndroid Build Coastguard Worker 
980*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(program);
981*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
982*35238bceSAndroid Build Coastguard Worker }
983*35238bceSAndroid Build Coastguard Worker 
uniform_block_binding(NegativeTestContext & ctx)984*35238bceSAndroid Build Coastguard Worker void uniform_block_binding(NegativeTestContext &ctx)
985*35238bceSAndroid Build Coastguard Worker {
986*35238bceSAndroid Build Coastguard Worker     GLint maxUniformBufferBindings = -1;
987*35238bceSAndroid Build Coastguard Worker     GLint numActiveUniforms        = -1;
988*35238bceSAndroid Build Coastguard Worker     GLint numActiveBlocks          = -1;
989*35238bceSAndroid Build Coastguard Worker     GLuint shader                  = -1;
990*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
991*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformBlockVertSource, uniformTestFragSource));
992*35238bceSAndroid Build Coastguard Worker 
993*35238bceSAndroid Build Coastguard Worker     shader = ctx.glCreateShader(GL_VERTEX_SHADER);
994*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
995*35238bceSAndroid Build Coastguard Worker 
996*35238bceSAndroid Build Coastguard Worker     ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
997*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms);
998*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
999*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_MAX_UNIFORM_BUFFER_BINDINGS = " << maxUniformBufferBindings
1000*35238bceSAndroid Build Coastguard Worker                  << TestLog::EndMessage;
1001*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << TestLog::EndMessage;
1002*35238bceSAndroid Build Coastguard Worker     ctx.getLog() << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << TestLog::EndMessage;
1003*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1004*35238bceSAndroid Build Coastguard Worker 
1005*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
1006*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_VALUE is generated if uniformBlockIndex is not an active uniform block index of program.");
1007*35238bceSAndroid Build Coastguard Worker     ctx.glUniformBlockBinding(program.getProgram(), -1, 0);
1008*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
1009*35238bceSAndroid Build Coastguard Worker     ctx.glUniformBlockBinding(program.getProgram(), 5, 0);
1010*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
1011*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1012*35238bceSAndroid Build Coastguard Worker 
1013*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if uniformBlockBinding is greater than or equal to the value of "
1014*35238bceSAndroid Build Coastguard Worker                      "GL_MAX_UNIFORM_BUFFER_BINDINGS.");
1015*35238bceSAndroid Build Coastguard Worker     ctx.glUniformBlockBinding(program.getProgram(), maxUniformBufferBindings, 0);
1016*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
1017*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1018*35238bceSAndroid Build Coastguard Worker 
1019*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
1020*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_VALUE is generated if program is not the name of a program object generated by the GL.");
1021*35238bceSAndroid Build Coastguard Worker     ctx.glUniformBlockBinding(-1, 0, 0);
1022*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
1023*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1024*35238bceSAndroid Build Coastguard Worker 
1025*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
1026*35238bceSAndroid Build Coastguard Worker     ctx.glUniformBlockBinding(shader, 0, 0);
1027*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1028*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1029*35238bceSAndroid Build Coastguard Worker 
1030*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
1031*35238bceSAndroid Build Coastguard Worker }
1032*35238bceSAndroid Build Coastguard Worker 
1033*35238bceSAndroid Build Coastguard Worker // ctx.glUniform*f
1034*35238bceSAndroid Build Coastguard Worker 
uniformf_invalid_program(NegativeTestContext & ctx)1035*35238bceSAndroid Build Coastguard Worker void uniformf_invalid_program(NegativeTestContext &ctx)
1036*35238bceSAndroid Build Coastguard Worker {
1037*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1038*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1039*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1f(-1, 0.0f);
1040*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1041*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2f(-1, 0.0f, 0.0f);
1042*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1043*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
1044*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1045*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
1046*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1047*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1048*35238bceSAndroid Build Coastguard Worker }
1049*35238bceSAndroid Build Coastguard Worker 
uniformf_incompatible_type(NegativeTestContext & ctx)1050*35238bceSAndroid Build Coastguard Worker void uniformf_incompatible_type(NegativeTestContext &ctx)
1051*35238bceSAndroid Build Coastguard Worker {
1052*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1053*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1054*35238bceSAndroid Build Coastguard Worker 
1055*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1056*35238bceSAndroid Build Coastguard Worker     GLint vec4_v    = ctx.glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1057*35238bceSAndroid Build Coastguard Worker     GLint ivec4_f   = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1058*35238bceSAndroid Build Coastguard Worker     GLint uvec4_f   = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1059*35238bceSAndroid Build Coastguard Worker     GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1060*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1061*35238bceSAndroid Build Coastguard Worker 
1062*35238bceSAndroid Build Coastguard Worker     if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1063*35238bceSAndroid Build Coastguard Worker     {
1064*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1065*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1066*35238bceSAndroid Build Coastguard Worker     }
1067*35238bceSAndroid Build Coastguard Worker 
1068*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader "
1069*35238bceSAndroid Build Coastguard Worker                      "does not match the size indicated by the ctx.glUniform command.");
1070*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1071*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1f(vec4_v, 0.0f);
1072*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1073*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2f(vec4_v, 0.0f, 0.0f);
1074*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1075*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3f(vec4_v, 0.0f, 0.0f, 0.0f);
1076*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1077*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4f(vec4_v, 0.0f, 0.0f, 0.0f, 0.0f);
1078*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1079*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1080*35238bceSAndroid Build Coastguard Worker 
1081*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}f is used to load a uniform variable of "
1082*35238bceSAndroid Build Coastguard Worker                      "type int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4.");
1083*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1084*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4f(ivec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
1085*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1086*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4f(uvec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
1087*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1088*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1089*35238bceSAndroid Build Coastguard Worker 
1090*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than "
1091*35238bceSAndroid Build Coastguard Worker                      "ctx.glUniform1i and ctx.glUniform1iv.");
1092*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1093*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1f(sampler_f, 0.0f);
1094*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1095*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1096*35238bceSAndroid Build Coastguard Worker 
1097*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1098*35238bceSAndroid Build Coastguard Worker }
1099*35238bceSAndroid Build Coastguard Worker 
uniformf_invalid_location(NegativeTestContext & ctx)1100*35238bceSAndroid Build Coastguard Worker void uniformf_invalid_location(NegativeTestContext &ctx)
1101*35238bceSAndroid Build Coastguard Worker {
1102*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1103*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1104*35238bceSAndroid Build Coastguard Worker 
1105*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1106*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1107*35238bceSAndroid Build Coastguard Worker 
1108*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current "
1109*35238bceSAndroid Build Coastguard Worker                      "program object and location is not equal to -1.");
1110*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1111*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1f(-2, 0.0f);
1112*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1113*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2f(-2, 0.0f, 0.0f);
1114*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1115*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3f(-2, 0.0f, 0.0f, 0.0f);
1116*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1117*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4f(-2, 0.0f, 0.0f, 0.0f, 0.0f);
1118*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1119*35238bceSAndroid Build Coastguard Worker 
1120*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1121*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1f(-1, 0.0f);
1122*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1123*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2f(-1, 0.0f, 0.0f);
1124*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1125*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3f(-1, 0.0f, 0.0f, 0.0f);
1126*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1127*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
1128*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1129*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1130*35238bceSAndroid Build Coastguard Worker 
1131*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1132*35238bceSAndroid Build Coastguard Worker }
1133*35238bceSAndroid Build Coastguard Worker 
1134*35238bceSAndroid Build Coastguard Worker // ctx.glUniform*fv
1135*35238bceSAndroid Build Coastguard Worker 
uniformfv_invalid_program(NegativeTestContext & ctx)1136*35238bceSAndroid Build Coastguard Worker void uniformfv_invalid_program(NegativeTestContext &ctx)
1137*35238bceSAndroid Build Coastguard Worker {
1138*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(4);
1139*35238bceSAndroid Build Coastguard Worker 
1140*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1141*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1142*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1fv(-1, 1, &data[0]);
1143*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1144*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2fv(-1, 1, &data[0]);
1145*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1146*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3fv(-1, 1, &data[0]);
1147*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1148*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4fv(-1, 1, &data[0]);
1149*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1150*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1151*35238bceSAndroid Build Coastguard Worker }
1152*35238bceSAndroid Build Coastguard Worker 
uniformfv_incompatible_type(NegativeTestContext & ctx)1153*35238bceSAndroid Build Coastguard Worker void uniformfv_incompatible_type(NegativeTestContext &ctx)
1154*35238bceSAndroid Build Coastguard Worker {
1155*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1156*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1157*35238bceSAndroid Build Coastguard Worker 
1158*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1159*35238bceSAndroid Build Coastguard Worker     GLint vec4_v    = ctx.glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1160*35238bceSAndroid Build Coastguard Worker     GLint ivec4_f   = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1161*35238bceSAndroid Build Coastguard Worker     GLint uvec4_f   = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1162*35238bceSAndroid Build Coastguard Worker     GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1163*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1164*35238bceSAndroid Build Coastguard Worker 
1165*35238bceSAndroid Build Coastguard Worker     if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1166*35238bceSAndroid Build Coastguard Worker     {
1167*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1168*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1169*35238bceSAndroid Build Coastguard Worker     }
1170*35238bceSAndroid Build Coastguard Worker 
1171*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(4);
1172*35238bceSAndroid Build Coastguard Worker 
1173*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader "
1174*35238bceSAndroid Build Coastguard Worker                      "does not match the size indicated by the ctx.glUniform command.");
1175*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1176*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1fv(vec4_v, 1, &data[0]);
1177*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1178*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2fv(vec4_v, 1, &data[0]);
1179*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1180*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3fv(vec4_v, 1, &data[0]);
1181*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1182*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4fv(vec4_v, 1, &data[0]);
1183*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1184*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1185*35238bceSAndroid Build Coastguard Worker 
1186*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}fv is used to load a uniform variable of "
1187*35238bceSAndroid Build Coastguard Worker                      "type int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4.");
1188*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1189*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4fv(ivec4_f, 1, &data[0]);
1190*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1191*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4fv(uvec4_f, 1, &data[0]);
1192*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1193*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1194*35238bceSAndroid Build Coastguard Worker 
1195*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than "
1196*35238bceSAndroid Build Coastguard Worker                      "ctx.glUniform1i and ctx.glUniform1iv.");
1197*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1198*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1fv(sampler_f, 1, &data[0]);
1199*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1200*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1201*35238bceSAndroid Build Coastguard Worker 
1202*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1203*35238bceSAndroid Build Coastguard Worker }
1204*35238bceSAndroid Build Coastguard Worker 
uniformfv_invalid_location(NegativeTestContext & ctx)1205*35238bceSAndroid Build Coastguard Worker void uniformfv_invalid_location(NegativeTestContext &ctx)
1206*35238bceSAndroid Build Coastguard Worker {
1207*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1208*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1209*35238bceSAndroid Build Coastguard Worker 
1210*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1211*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1212*35238bceSAndroid Build Coastguard Worker 
1213*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(4);
1214*35238bceSAndroid Build Coastguard Worker 
1215*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current "
1216*35238bceSAndroid Build Coastguard Worker                      "program object and location is not equal to -1.");
1217*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1218*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1fv(-2, 1, &data[0]);
1219*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1220*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2fv(-2, 1, &data[0]);
1221*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1222*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3fv(-2, 1, &data[0]);
1223*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1224*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4fv(-2, 1, &data[0]);
1225*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1226*35238bceSAndroid Build Coastguard Worker 
1227*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1228*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1fv(-1, 1, &data[0]);
1229*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1230*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2fv(-1, 1, &data[0]);
1231*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1232*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3fv(-1, 1, &data[0]);
1233*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1234*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4fv(-1, 1, &data[0]);
1235*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1236*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1237*35238bceSAndroid Build Coastguard Worker 
1238*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1239*35238bceSAndroid Build Coastguard Worker }
1240*35238bceSAndroid Build Coastguard Worker 
uniformfv_invalid_count(NegativeTestContext & ctx)1241*35238bceSAndroid Build Coastguard Worker void uniformfv_invalid_count(NegativeTestContext &ctx)
1242*35238bceSAndroid Build Coastguard Worker {
1243*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1244*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1245*35238bceSAndroid Build Coastguard Worker 
1246*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1247*35238bceSAndroid Build Coastguard Worker     GLint vec4_v = ctx.glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
1248*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1249*35238bceSAndroid Build Coastguard Worker 
1250*35238bceSAndroid Build Coastguard Worker     if (vec4_v == -1)
1251*35238bceSAndroid Build Coastguard Worker     {
1252*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1253*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1254*35238bceSAndroid Build Coastguard Worker     }
1255*35238bceSAndroid Build Coastguard Worker 
1256*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(8);
1257*35238bceSAndroid Build Coastguard Worker 
1258*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable "
1259*35238bceSAndroid Build Coastguard Worker                      "is not an array variable.");
1260*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1261*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1fv(vec4_v, 2, &data[0]);
1262*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1263*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2fv(vec4_v, 2, &data[0]);
1264*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1265*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3fv(vec4_v, 2, &data[0]);
1266*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1267*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4fv(vec4_v, 2, &data[0]);
1268*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1269*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1270*35238bceSAndroid Build Coastguard Worker 
1271*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1272*35238bceSAndroid Build Coastguard Worker }
1273*35238bceSAndroid Build Coastguard Worker 
1274*35238bceSAndroid Build Coastguard Worker // ctx.glUniform*i
1275*35238bceSAndroid Build Coastguard Worker 
uniformi_invalid_program(NegativeTestContext & ctx)1276*35238bceSAndroid Build Coastguard Worker void uniformi_invalid_program(NegativeTestContext &ctx)
1277*35238bceSAndroid Build Coastguard Worker {
1278*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1279*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1280*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(-1, 0);
1281*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1282*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(-1, 0, 0);
1283*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1284*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(-1, 0, 0, 0);
1285*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1286*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(-1, 0, 0, 0, 0);
1287*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1288*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1289*35238bceSAndroid Build Coastguard Worker }
1290*35238bceSAndroid Build Coastguard Worker 
uniformi_incompatible_type(NegativeTestContext & ctx)1291*35238bceSAndroid Build Coastguard Worker void uniformi_incompatible_type(NegativeTestContext &ctx)
1292*35238bceSAndroid Build Coastguard Worker {
1293*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1294*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1295*35238bceSAndroid Build Coastguard Worker 
1296*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1297*35238bceSAndroid Build Coastguard Worker     GLint vec4_v    = ctx.glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1298*35238bceSAndroid Build Coastguard Worker     GLint ivec4_f   = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1299*35238bceSAndroid Build Coastguard Worker     GLint uvec4_f   = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1300*35238bceSAndroid Build Coastguard Worker     GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1301*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1302*35238bceSAndroid Build Coastguard Worker 
1303*35238bceSAndroid Build Coastguard Worker     if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1304*35238bceSAndroid Build Coastguard Worker     {
1305*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1306*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1307*35238bceSAndroid Build Coastguard Worker     }
1308*35238bceSAndroid Build Coastguard Worker 
1309*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader "
1310*35238bceSAndroid Build Coastguard Worker                      "does not match the size indicated by the ctx.glUniform command.");
1311*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1312*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(ivec4_f, 0);
1313*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1314*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(ivec4_f, 0, 0);
1315*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1316*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(ivec4_f, 0, 0, 0);
1317*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1318*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(ivec4_f, 0, 0, 0, 0);
1319*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1320*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1321*35238bceSAndroid Build Coastguard Worker 
1322*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of "
1323*35238bceSAndroid Build Coastguard Worker                      "type unsigned int, uvec2, uvec3, uvec4, or an array of these.");
1324*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1325*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(uvec4_f, 0);
1326*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1327*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(uvec4_f, 0, 0);
1328*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1329*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(uvec4_f, 0, 0, 0);
1330*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1331*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(uvec4_f, 0, 0, 0, 0);
1332*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1333*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1334*35238bceSAndroid Build Coastguard Worker 
1335*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of "
1336*35238bceSAndroid Build Coastguard Worker                      "type float, vec2, vec3, or vec4.");
1337*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1338*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(vec4_v, 0);
1339*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1340*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(vec4_v, 0, 0);
1341*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1342*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(vec4_v, 0, 0, 0);
1343*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1344*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(vec4_v, 0, 0, 0, 0);
1345*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1346*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1347*35238bceSAndroid Build Coastguard Worker 
1348*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1349*35238bceSAndroid Build Coastguard Worker }
1350*35238bceSAndroid Build Coastguard Worker 
uniformi_invalid_location(NegativeTestContext & ctx)1351*35238bceSAndroid Build Coastguard Worker void uniformi_invalid_location(NegativeTestContext &ctx)
1352*35238bceSAndroid Build Coastguard Worker {
1353*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1354*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1355*35238bceSAndroid Build Coastguard Worker 
1356*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1357*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1358*35238bceSAndroid Build Coastguard Worker 
1359*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current "
1360*35238bceSAndroid Build Coastguard Worker                      "program object and location is not equal to -1.");
1361*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1362*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(-2, 0);
1363*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1364*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(-2, 0, 0);
1365*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1366*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(-2, 0, 0, 0);
1367*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1368*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(-2, 0, 0, 0, 0);
1369*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1370*35238bceSAndroid Build Coastguard Worker 
1371*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1372*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(-1, 0);
1373*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1374*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(-1, 0, 0);
1375*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1376*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(-1, 0, 0, 0);
1377*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1378*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(-1, 0, 0, 0, 0);
1379*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1380*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1381*35238bceSAndroid Build Coastguard Worker 
1382*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1383*35238bceSAndroid Build Coastguard Worker }
1384*35238bceSAndroid Build Coastguard Worker 
1385*35238bceSAndroid Build Coastguard Worker // ctx.glUniform*iv
1386*35238bceSAndroid Build Coastguard Worker 
uniformiv_invalid_program(NegativeTestContext & ctx)1387*35238bceSAndroid Build Coastguard Worker void uniformiv_invalid_program(NegativeTestContext &ctx)
1388*35238bceSAndroid Build Coastguard Worker {
1389*35238bceSAndroid Build Coastguard Worker     std::vector<GLint> data(4);
1390*35238bceSAndroid Build Coastguard Worker 
1391*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1392*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1393*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1iv(-1, 1, &data[0]);
1394*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1395*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2iv(-1, 1, &data[0]);
1396*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1397*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3iv(-1, 1, &data[0]);
1398*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1399*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4iv(-1, 1, &data[0]);
1400*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1401*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1402*35238bceSAndroid Build Coastguard Worker }
1403*35238bceSAndroid Build Coastguard Worker 
uniformiv_incompatible_type(NegativeTestContext & ctx)1404*35238bceSAndroid Build Coastguard Worker void uniformiv_incompatible_type(NegativeTestContext &ctx)
1405*35238bceSAndroid Build Coastguard Worker {
1406*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1407*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1408*35238bceSAndroid Build Coastguard Worker 
1409*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1410*35238bceSAndroid Build Coastguard Worker     GLint vec4_v    = ctx.glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1411*35238bceSAndroid Build Coastguard Worker     GLint ivec4_f   = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1412*35238bceSAndroid Build Coastguard Worker     GLint uvec4_f   = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1413*35238bceSAndroid Build Coastguard Worker     GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1414*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1415*35238bceSAndroid Build Coastguard Worker 
1416*35238bceSAndroid Build Coastguard Worker     if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1417*35238bceSAndroid Build Coastguard Worker     {
1418*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1419*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1420*35238bceSAndroid Build Coastguard Worker     }
1421*35238bceSAndroid Build Coastguard Worker 
1422*35238bceSAndroid Build Coastguard Worker     std::vector<GLint> data(4);
1423*35238bceSAndroid Build Coastguard Worker 
1424*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader "
1425*35238bceSAndroid Build Coastguard Worker                      "does not match the size indicated by the ctx.glUniform command.");
1426*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1427*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1iv(ivec4_f, 1, &data[0]);
1428*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1429*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2iv(ivec4_f, 1, &data[0]);
1430*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1431*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3iv(ivec4_f, 1, &data[0]);
1432*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1433*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4iv(ivec4_f, 1, &data[0]);
1434*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1435*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1436*35238bceSAndroid Build Coastguard Worker 
1437*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}iv is used to load a uniform variable of "
1438*35238bceSAndroid Build Coastguard Worker                      "type float, vec2, vec3, or vec4.");
1439*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1440*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1iv(vec4_v, 1, &data[0]);
1441*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1442*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2iv(vec4_v, 1, &data[0]);
1443*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1444*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3iv(vec4_v, 1, &data[0]);
1445*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1446*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4iv(vec4_v, 1, &data[0]);
1447*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1448*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1449*35238bceSAndroid Build Coastguard Worker 
1450*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}iv is used to load a uniform variable of "
1451*35238bceSAndroid Build Coastguard Worker                      "type unsigned int, uvec2, uvec3 or uvec4.");
1452*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1453*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1iv(uvec4_f, 1, &data[0]);
1454*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1455*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2iv(uvec4_f, 1, &data[0]);
1456*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1457*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3iv(uvec4_f, 1, &data[0]);
1458*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1459*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4iv(uvec4_f, 1, &data[0]);
1460*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1461*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1462*35238bceSAndroid Build Coastguard Worker 
1463*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1464*35238bceSAndroid Build Coastguard Worker }
1465*35238bceSAndroid Build Coastguard Worker 
uniformiv_invalid_location(NegativeTestContext & ctx)1466*35238bceSAndroid Build Coastguard Worker void uniformiv_invalid_location(NegativeTestContext &ctx)
1467*35238bceSAndroid Build Coastguard Worker {
1468*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1469*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1470*35238bceSAndroid Build Coastguard Worker 
1471*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1472*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1473*35238bceSAndroid Build Coastguard Worker 
1474*35238bceSAndroid Build Coastguard Worker     std::vector<GLint> data(4);
1475*35238bceSAndroid Build Coastguard Worker 
1476*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current "
1477*35238bceSAndroid Build Coastguard Worker                      "program object and location is not equal to -1.");
1478*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1479*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1iv(-2, 1, &data[0]);
1480*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1481*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2iv(-2, 1, &data[0]);
1482*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1483*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3iv(-2, 1, &data[0]);
1484*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1485*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4iv(-2, 1, &data[0]);
1486*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1487*35238bceSAndroid Build Coastguard Worker 
1488*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1489*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1iv(-1, 1, &data[0]);
1490*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1491*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2iv(-1, 1, &data[0]);
1492*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1493*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3iv(-1, 1, &data[0]);
1494*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1495*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4iv(-1, 1, &data[0]);
1496*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1497*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1498*35238bceSAndroid Build Coastguard Worker 
1499*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1500*35238bceSAndroid Build Coastguard Worker }
1501*35238bceSAndroid Build Coastguard Worker 
uniformiv_invalid_count(NegativeTestContext & ctx)1502*35238bceSAndroid Build Coastguard Worker void uniformiv_invalid_count(NegativeTestContext &ctx)
1503*35238bceSAndroid Build Coastguard Worker {
1504*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1505*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1506*35238bceSAndroid Build Coastguard Worker 
1507*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1508*35238bceSAndroid Build Coastguard Worker     GLint ivec4_f = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1509*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1510*35238bceSAndroid Build Coastguard Worker 
1511*35238bceSAndroid Build Coastguard Worker     if (ivec4_f == -1)
1512*35238bceSAndroid Build Coastguard Worker     {
1513*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1514*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1515*35238bceSAndroid Build Coastguard Worker     }
1516*35238bceSAndroid Build Coastguard Worker 
1517*35238bceSAndroid Build Coastguard Worker     std::vector<GLint> data(8);
1518*35238bceSAndroid Build Coastguard Worker 
1519*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable "
1520*35238bceSAndroid Build Coastguard Worker                      "is not an array variable.");
1521*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1522*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1iv(ivec4_f, 2, &data[0]);
1523*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1524*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2iv(ivec4_f, 2, &data[0]);
1525*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1526*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3iv(ivec4_f, 2, &data[0]);
1527*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1528*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4iv(ivec4_f, 2, &data[0]);
1529*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1530*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1531*35238bceSAndroid Build Coastguard Worker 
1532*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1533*35238bceSAndroid Build Coastguard Worker }
1534*35238bceSAndroid Build Coastguard Worker 
1535*35238bceSAndroid Build Coastguard Worker // ctx.glUniform{1234}ui
1536*35238bceSAndroid Build Coastguard Worker 
uniformui_invalid_program(NegativeTestContext & ctx)1537*35238bceSAndroid Build Coastguard Worker void uniformui_invalid_program(NegativeTestContext &ctx)
1538*35238bceSAndroid Build Coastguard Worker {
1539*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1540*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1541*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1ui(-1, 0);
1542*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1543*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2ui(-1, 0, 0);
1544*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1545*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3ui(-1, 0, 0, 0);
1546*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1547*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4ui(-1, 0, 0, 0, 0);
1548*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1549*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1550*35238bceSAndroid Build Coastguard Worker }
1551*35238bceSAndroid Build Coastguard Worker 
uniformui_incompatible_type(NegativeTestContext & ctx)1552*35238bceSAndroid Build Coastguard Worker void uniformui_incompatible_type(NegativeTestContext &ctx)
1553*35238bceSAndroid Build Coastguard Worker {
1554*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1555*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1556*35238bceSAndroid Build Coastguard Worker 
1557*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1558*35238bceSAndroid Build Coastguard Worker     GLint vec4_v    = ctx.glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1559*35238bceSAndroid Build Coastguard Worker     GLint ivec4_f   = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1560*35238bceSAndroid Build Coastguard Worker     GLint uvec4_f   = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1561*35238bceSAndroid Build Coastguard Worker     GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1562*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1563*35238bceSAndroid Build Coastguard Worker 
1564*35238bceSAndroid Build Coastguard Worker     if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1565*35238bceSAndroid Build Coastguard Worker     {
1566*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1567*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1568*35238bceSAndroid Build Coastguard Worker     }
1569*35238bceSAndroid Build Coastguard Worker 
1570*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader "
1571*35238bceSAndroid Build Coastguard Worker                      "does not match the size indicated by the ctx.glUniform command.");
1572*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1573*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1ui(uvec4_f, 0);
1574*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1575*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2ui(uvec4_f, 0, 0);
1576*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1577*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3ui(uvec4_f, 0, 0, 0);
1578*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1579*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4ui(uvec4_f, 0, 0, 0, 0);
1580*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1581*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1582*35238bceSAndroid Build Coastguard Worker 
1583*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of "
1584*35238bceSAndroid Build Coastguard Worker                      "type int, ivec2, ivec3, ivec4, or an array of these.");
1585*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1586*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1ui(ivec4_f, 0);
1587*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1588*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2ui(ivec4_f, 0, 0);
1589*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1590*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3ui(ivec4_f, 0, 0, 0);
1591*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1592*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4ui(ivec4_f, 0, 0, 0, 0);
1593*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1594*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1595*35238bceSAndroid Build Coastguard Worker 
1596*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}i is used to load a uniform variable of "
1597*35238bceSAndroid Build Coastguard Worker                      "type float, vec2, vec3, or vec4.");
1598*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1599*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1ui(vec4_v, 0);
1600*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1601*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2ui(vec4_v, 0, 0);
1602*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1603*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3ui(vec4_v, 0, 0, 0);
1604*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1605*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4ui(vec4_v, 0, 0, 0, 0);
1606*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1607*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1608*35238bceSAndroid Build Coastguard Worker 
1609*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than "
1610*35238bceSAndroid Build Coastguard Worker                      "ctx.glUniform1i and ctx.glUniform1iv.");
1611*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1612*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1ui(sampler_f, 0);
1613*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1614*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1615*35238bceSAndroid Build Coastguard Worker 
1616*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1617*35238bceSAndroid Build Coastguard Worker }
1618*35238bceSAndroid Build Coastguard Worker 
uniformui_invalid_location(NegativeTestContext & ctx)1619*35238bceSAndroid Build Coastguard Worker void uniformui_invalid_location(NegativeTestContext &ctx)
1620*35238bceSAndroid Build Coastguard Worker {
1621*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1622*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1623*35238bceSAndroid Build Coastguard Worker 
1624*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1625*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1626*35238bceSAndroid Build Coastguard Worker 
1627*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current "
1628*35238bceSAndroid Build Coastguard Worker                      "program object and location is not equal to -1.");
1629*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1630*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(-2, 0);
1631*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1632*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(-2, 0, 0);
1633*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1634*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(-2, 0, 0, 0);
1635*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1636*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(-2, 0, 0, 0, 0);
1637*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1638*35238bceSAndroid Build Coastguard Worker 
1639*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1640*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1i(-1, 0);
1641*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1642*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2i(-1, 0, 0);
1643*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1644*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3i(-1, 0, 0, 0);
1645*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1646*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4i(-1, 0, 0, 0, 0);
1647*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1648*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1649*35238bceSAndroid Build Coastguard Worker 
1650*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1651*35238bceSAndroid Build Coastguard Worker }
1652*35238bceSAndroid Build Coastguard Worker 
1653*35238bceSAndroid Build Coastguard Worker // ctx.glUniform{1234}uiv
1654*35238bceSAndroid Build Coastguard Worker 
uniformuiv_invalid_program(NegativeTestContext & ctx)1655*35238bceSAndroid Build Coastguard Worker void uniformuiv_invalid_program(NegativeTestContext &ctx)
1656*35238bceSAndroid Build Coastguard Worker {
1657*35238bceSAndroid Build Coastguard Worker     std::vector<GLuint> data(4);
1658*35238bceSAndroid Build Coastguard Worker 
1659*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1660*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1661*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(-1, 1, &data[0]);
1662*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1663*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2uiv(-1, 1, &data[0]);
1664*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1665*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3uiv(-1, 1, &data[0]);
1666*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1667*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4uiv(-1, 1, &data[0]);
1668*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1669*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1670*35238bceSAndroid Build Coastguard Worker }
1671*35238bceSAndroid Build Coastguard Worker 
uniformuiv_incompatible_type(NegativeTestContext & ctx)1672*35238bceSAndroid Build Coastguard Worker void uniformuiv_incompatible_type(NegativeTestContext &ctx)
1673*35238bceSAndroid Build Coastguard Worker {
1674*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1675*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1676*35238bceSAndroid Build Coastguard Worker 
1677*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1678*35238bceSAndroid Build Coastguard Worker     GLint vec4_v    = ctx.glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1679*35238bceSAndroid Build Coastguard Worker     GLint ivec4_f   = ctx.glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1680*35238bceSAndroid Build Coastguard Worker     GLint uvec4_f   = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1681*35238bceSAndroid Build Coastguard Worker     GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1682*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1683*35238bceSAndroid Build Coastguard Worker 
1684*35238bceSAndroid Build Coastguard Worker     if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1685*35238bceSAndroid Build Coastguard Worker     {
1686*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1687*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1688*35238bceSAndroid Build Coastguard Worker     }
1689*35238bceSAndroid Build Coastguard Worker 
1690*35238bceSAndroid Build Coastguard Worker     std::vector<GLuint> data(4);
1691*35238bceSAndroid Build Coastguard Worker 
1692*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader "
1693*35238bceSAndroid Build Coastguard Worker                      "does not match the size indicated by the ctx.glUniform command.");
1694*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1695*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(uvec4_f, 1, &data[0]);
1696*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1697*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2uiv(uvec4_f, 1, &data[0]);
1698*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1699*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3uiv(uvec4_f, 1, &data[0]);
1700*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1701*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4uiv(uvec4_f, 1, &data[0]);
1702*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1703*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1704*35238bceSAndroid Build Coastguard Worker 
1705*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}uiv is used to load a uniform variable "
1706*35238bceSAndroid Build Coastguard Worker                      "of type float, vec2, vec3, or vec4.");
1707*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1708*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(vec4_v, 1, &data[0]);
1709*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1710*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2uiv(vec4_v, 1, &data[0]);
1711*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1712*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3uiv(vec4_v, 1, &data[0]);
1713*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1714*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4uiv(vec4_v, 1, &data[0]);
1715*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1716*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1717*35238bceSAndroid Build Coastguard Worker 
1718*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if ctx.glUniform{1234}uiv is used to load a uniform variable "
1719*35238bceSAndroid Build Coastguard Worker                      "of type int, ivec2, ivec3 or ivec4.");
1720*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1721*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(ivec4_f, 1, &data[0]);
1722*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1723*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2uiv(ivec4_f, 1, &data[0]);
1724*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1725*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3uiv(ivec4_f, 1, &data[0]);
1726*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1727*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4uiv(ivec4_f, 1, &data[0]);
1728*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1729*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1730*35238bceSAndroid Build Coastguard Worker 
1731*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than "
1732*35238bceSAndroid Build Coastguard Worker                      "ctx.glUniform1i and ctx.glUniform1iv.");
1733*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1734*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(sampler_f, 1, &data[0]);
1735*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1736*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1737*35238bceSAndroid Build Coastguard Worker 
1738*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1739*35238bceSAndroid Build Coastguard Worker }
1740*35238bceSAndroid Build Coastguard Worker 
uniformuiv_invalid_location(NegativeTestContext & ctx)1741*35238bceSAndroid Build Coastguard Worker void uniformuiv_invalid_location(NegativeTestContext &ctx)
1742*35238bceSAndroid Build Coastguard Worker {
1743*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1744*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1745*35238bceSAndroid Build Coastguard Worker 
1746*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1747*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1748*35238bceSAndroid Build Coastguard Worker 
1749*35238bceSAndroid Build Coastguard Worker     std::vector<GLuint> data(4);
1750*35238bceSAndroid Build Coastguard Worker 
1751*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current "
1752*35238bceSAndroid Build Coastguard Worker                      "program object and location is not equal to -1.");
1753*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1754*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(-2, 1, &data[0]);
1755*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1756*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2uiv(-2, 1, &data[0]);
1757*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1758*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3uiv(-2, 1, &data[0]);
1759*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1760*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4uiv(-2, 1, &data[0]);
1761*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1762*35238bceSAndroid Build Coastguard Worker 
1763*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1764*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(-1, 1, &data[0]);
1765*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1766*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2uiv(-1, 1, &data[0]);
1767*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1768*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3uiv(-1, 1, &data[0]);
1769*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1770*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4uiv(-1, 1, &data[0]);
1771*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1772*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1773*35238bceSAndroid Build Coastguard Worker 
1774*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1775*35238bceSAndroid Build Coastguard Worker }
1776*35238bceSAndroid Build Coastguard Worker 
uniformuiv_invalid_count(NegativeTestContext & ctx)1777*35238bceSAndroid Build Coastguard Worker void uniformuiv_invalid_count(NegativeTestContext &ctx)
1778*35238bceSAndroid Build Coastguard Worker {
1779*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1780*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1781*35238bceSAndroid Build Coastguard Worker 
1782*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1783*35238bceSAndroid Build Coastguard Worker     int uvec4_f = ctx.glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1784*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1785*35238bceSAndroid Build Coastguard Worker 
1786*35238bceSAndroid Build Coastguard Worker     if (uvec4_f == -1)
1787*35238bceSAndroid Build Coastguard Worker     {
1788*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1789*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1790*35238bceSAndroid Build Coastguard Worker     }
1791*35238bceSAndroid Build Coastguard Worker 
1792*35238bceSAndroid Build Coastguard Worker     std::vector<GLuint> data(8);
1793*35238bceSAndroid Build Coastguard Worker 
1794*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable "
1795*35238bceSAndroid Build Coastguard Worker                      "is not an array variable.");
1796*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1797*35238bceSAndroid Build Coastguard Worker     ctx.glUniform1uiv(uvec4_f, 2, &data[0]);
1798*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1799*35238bceSAndroid Build Coastguard Worker     ctx.glUniform2uiv(uvec4_f, 2, &data[0]);
1800*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1801*35238bceSAndroid Build Coastguard Worker     ctx.glUniform3uiv(uvec4_f, 2, &data[0]);
1802*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1803*35238bceSAndroid Build Coastguard Worker     ctx.glUniform4uiv(uvec4_f, 2, &data[0]);
1804*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1805*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1806*35238bceSAndroid Build Coastguard Worker 
1807*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1808*35238bceSAndroid Build Coastguard Worker }
1809*35238bceSAndroid Build Coastguard Worker 
1810*35238bceSAndroid Build Coastguard Worker // ctx.glUniformMatrix*fv
1811*35238bceSAndroid Build Coastguard Worker 
uniform_matrixfv_invalid_program(NegativeTestContext & ctx)1812*35238bceSAndroid Build Coastguard Worker void uniform_matrixfv_invalid_program(NegativeTestContext &ctx)
1813*35238bceSAndroid Build Coastguard Worker {
1814*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(16);
1815*35238bceSAndroid Build Coastguard Worker 
1816*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if there is no current program object.");
1817*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1818*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1819*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1820*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1821*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1822*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1823*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1824*35238bceSAndroid Build Coastguard Worker 
1825*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1826*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1827*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1828*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1829*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1830*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1831*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1832*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1833*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1834*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1835*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1836*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1837*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1838*35238bceSAndroid Build Coastguard Worker }
1839*35238bceSAndroid Build Coastguard Worker 
uniform_matrixfv_incompatible_type(NegativeTestContext & ctx)1840*35238bceSAndroid Build Coastguard Worker void uniform_matrixfv_incompatible_type(NegativeTestContext &ctx)
1841*35238bceSAndroid Build Coastguard Worker {
1842*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1843*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1844*35238bceSAndroid Build Coastguard Worker 
1845*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1846*35238bceSAndroid Build Coastguard Worker     GLint mat4_v    = ctx.glGetUniformLocation(program.getProgram(), "mat4_v");    // mat4
1847*35238bceSAndroid Build Coastguard Worker     GLint sampler_f = ctx.glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1848*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1849*35238bceSAndroid Build Coastguard Worker 
1850*35238bceSAndroid Build Coastguard Worker     if (mat4_v == -1 || sampler_f == -1)
1851*35238bceSAndroid Build Coastguard Worker     {
1852*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1853*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1854*35238bceSAndroid Build Coastguard Worker     }
1855*35238bceSAndroid Build Coastguard Worker 
1856*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(16);
1857*35238bceSAndroid Build Coastguard Worker 
1858*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader "
1859*35238bceSAndroid Build Coastguard Worker                      "does not match the size indicated by the ctx.glUniform command.");
1860*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1861*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2fv(mat4_v, 1, GL_FALSE, &data[0]);
1862*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1863*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3fv(mat4_v, 1, GL_FALSE, &data[0]);
1864*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1865*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4fv(mat4_v, 1, GL_FALSE, &data[0]);
1866*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1867*35238bceSAndroid Build Coastguard Worker 
1868*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1869*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1870*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1871*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1872*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1873*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1874*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1875*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1876*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1877*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1878*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1879*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1880*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1881*35238bceSAndroid Build Coastguard Worker 
1882*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than "
1883*35238bceSAndroid Build Coastguard Worker                      "ctx.glUniform1i and ctx.glUniform1iv.");
1884*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1885*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2fv(sampler_f, 1, GL_FALSE, &data[0]);
1886*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1887*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3fv(sampler_f, 1, GL_FALSE, &data[0]);
1888*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1889*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4fv(sampler_f, 1, GL_FALSE, &data[0]);
1890*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1891*35238bceSAndroid Build Coastguard Worker 
1892*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1893*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1894*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1895*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1896*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1897*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1898*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1899*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1900*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1901*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1902*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1903*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1904*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1905*35238bceSAndroid Build Coastguard Worker 
1906*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1907*35238bceSAndroid Build Coastguard Worker }
1908*35238bceSAndroid Build Coastguard Worker 
uniform_matrixfv_invalid_location(NegativeTestContext & ctx)1909*35238bceSAndroid Build Coastguard Worker void uniform_matrixfv_invalid_location(NegativeTestContext &ctx)
1910*35238bceSAndroid Build Coastguard Worker {
1911*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1912*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1913*35238bceSAndroid Build Coastguard Worker 
1914*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1915*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1916*35238bceSAndroid Build Coastguard Worker 
1917*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(16);
1918*35238bceSAndroid Build Coastguard Worker 
1919*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current "
1920*35238bceSAndroid Build Coastguard Worker                      "program object and location is not equal to -1.");
1921*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1922*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2fv(-2, 1, GL_FALSE, &data[0]);
1923*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1924*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3fv(-2, 1, GL_FALSE, &data[0]);
1925*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1926*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4fv(-2, 1, GL_FALSE, &data[0]);
1927*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1928*35238bceSAndroid Build Coastguard Worker 
1929*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x3fv(-2, 1, GL_FALSE, &data[0]);
1930*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1931*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x2fv(-2, 1, GL_FALSE, &data[0]);
1932*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1933*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x4fv(-2, 1, GL_FALSE, &data[0]);
1934*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1935*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x2fv(-2, 1, GL_FALSE, &data[0]);
1936*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1937*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x4fv(-2, 1, GL_FALSE, &data[0]);
1938*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1939*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x3fv(-2, 1, GL_FALSE, &data[0]);
1940*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1941*35238bceSAndroid Build Coastguard Worker 
1942*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1943*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1944*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1945*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1946*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1947*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1948*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1949*35238bceSAndroid Build Coastguard Worker 
1950*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1951*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1952*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1953*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1954*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1955*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1956*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1957*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1958*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1959*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1960*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1961*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1962*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
1963*35238bceSAndroid Build Coastguard Worker 
1964*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
1965*35238bceSAndroid Build Coastguard Worker }
1966*35238bceSAndroid Build Coastguard Worker 
uniform_matrixfv_invalid_count(NegativeTestContext & ctx)1967*35238bceSAndroid Build Coastguard Worker void uniform_matrixfv_invalid_count(NegativeTestContext &ctx)
1968*35238bceSAndroid Build Coastguard Worker {
1969*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
1970*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1971*35238bceSAndroid Build Coastguard Worker 
1972*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1973*35238bceSAndroid Build Coastguard Worker     GLint mat4_v = ctx.glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1974*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
1975*35238bceSAndroid Build Coastguard Worker 
1976*35238bceSAndroid Build Coastguard Worker     if (mat4_v == -1)
1977*35238bceSAndroid Build Coastguard Worker     {
1978*35238bceSAndroid Build Coastguard Worker         ctx.getLog() << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1979*35238bceSAndroid Build Coastguard Worker         ctx.fail("Failed to retrieve uniform location");
1980*35238bceSAndroid Build Coastguard Worker     }
1981*35238bceSAndroid Build Coastguard Worker 
1982*35238bceSAndroid Build Coastguard Worker     std::vector<GLfloat> data(32);
1983*35238bceSAndroid Build Coastguard Worker 
1984*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable "
1985*35238bceSAndroid Build Coastguard Worker                      "is not an array variable.");
1986*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
1987*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2fv(mat4_v, 2, GL_FALSE, &data[0]);
1988*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1989*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3fv(mat4_v, 2, GL_FALSE, &data[0]);
1990*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1991*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4fv(mat4_v, 2, GL_FALSE, &data[0]);
1992*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1993*35238bceSAndroid Build Coastguard Worker 
1994*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1995*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1996*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1997*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
1998*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1999*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2000*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
2001*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2002*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
2003*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2004*35238bceSAndroid Build Coastguard Worker     ctx.glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
2005*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2006*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2007*35238bceSAndroid Build Coastguard Worker 
2008*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
2009*35238bceSAndroid Build Coastguard Worker }
2010*35238bceSAndroid Build Coastguard Worker 
2011*35238bceSAndroid Build Coastguard Worker // Transform feedback
gen_transform_feedbacks(NegativeTestContext & ctx)2012*35238bceSAndroid Build Coastguard Worker void gen_transform_feedbacks(NegativeTestContext &ctx)
2013*35238bceSAndroid Build Coastguard Worker {
2014*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
2015*35238bceSAndroid Build Coastguard Worker     GLuint id = 0;
2016*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(-1, &id);
2017*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
2018*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2019*35238bceSAndroid Build Coastguard Worker }
2020*35238bceSAndroid Build Coastguard Worker 
bind_transform_feedback(NegativeTestContext & ctx)2021*35238bceSAndroid Build Coastguard Worker void bind_transform_feedback(NegativeTestContext &ctx)
2022*35238bceSAndroid Build Coastguard Worker {
2023*35238bceSAndroid Build Coastguard Worker     GLuint tfID[2];
2024*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2025*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2026*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
2027*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
2028*35238bceSAndroid Build Coastguard Worker 
2029*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
2030*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(2, tfID);
2031*35238bceSAndroid Build Coastguard Worker 
2032*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK.");
2033*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(-1, tfID[0]);
2034*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2035*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2036*35238bceSAndroid Build Coastguard Worker 
2037*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the transform feedback operation is active on the currently "
2038*35238bceSAndroid Build Coastguard Worker                      "bound transform feedback object, and is not paused.");
2039*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
2040*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2041*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
2042*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
2043*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2044*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2045*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2046*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2047*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2048*35238bceSAndroid Build Coastguard Worker 
2049*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[1]);
2050*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2051*35238bceSAndroid Build Coastguard Worker 
2052*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
2053*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2054*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2055*35238bceSAndroid Build Coastguard Worker 
2056*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
2057*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
2058*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(2, tfID);
2059*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2060*35238bceSAndroid Build Coastguard Worker 
2061*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if id has been deleted with glDeleteTransformFeedback().");
2062*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
2063*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2064*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2065*35238bceSAndroid Build Coastguard Worker 
2066*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
2067*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_OPERATION is generated if id is not 0 or a value returned from glGenTransformFeedbacks().");
2068*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, -1);
2069*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2070*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2071*35238bceSAndroid Build Coastguard Worker }
2072*35238bceSAndroid Build Coastguard Worker 
delete_transform_feedbacks(NegativeTestContext & ctx)2073*35238bceSAndroid Build Coastguard Worker void delete_transform_feedbacks(NegativeTestContext &ctx)
2074*35238bceSAndroid Build Coastguard Worker {
2075*35238bceSAndroid Build Coastguard Worker     GLuint id = 0;
2076*35238bceSAndroid Build Coastguard Worker     GLuint tfID[2];
2077*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
2078*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
2079*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2080*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2081*35238bceSAndroid Build Coastguard Worker 
2082*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
2083*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(1, &id);
2084*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(2, tfID);
2085*35238bceSAndroid Build Coastguard Worker 
2086*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
2087*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(-1, &id);
2088*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
2089*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2090*35238bceSAndroid Build Coastguard Worker 
2091*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the transform feedback operation for any object named by "
2092*35238bceSAndroid Build Coastguard Worker                      "ids is currently active.");
2093*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
2094*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2095*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
2096*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
2097*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2098*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2099*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2100*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2101*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2102*35238bceSAndroid Build Coastguard Worker 
2103*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[1]);
2104*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2105*35238bceSAndroid Build Coastguard Worker 
2106*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(2, tfID);
2107*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2108*35238bceSAndroid Build Coastguard Worker 
2109*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
2110*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2111*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2112*35238bceSAndroid Build Coastguard Worker 
2113*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(1, &id);
2114*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(2, tfID);
2115*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
2116*35238bceSAndroid Build Coastguard Worker }
2117*35238bceSAndroid Build Coastguard Worker 
begin_transform_feedback(NegativeTestContext & ctx)2118*35238bceSAndroid Build Coastguard Worker void begin_transform_feedback(NegativeTestContext &ctx)
2119*35238bceSAndroid Build Coastguard Worker {
2120*35238bceSAndroid Build Coastguard Worker     GLuint tfID[2];
2121*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2122*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2123*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
2124*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
2125*35238bceSAndroid Build Coastguard Worker 
2126*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
2127*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(2, tfID);
2128*35238bceSAndroid Build Coastguard Worker 
2129*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
2130*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2131*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
2132*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
2133*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2134*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2135*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2136*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2137*35238bceSAndroid Build Coastguard Worker 
2138*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
2139*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_ENUM is generated if primitiveMode is not one of GL_POINTS, GL_LINES, or GL_TRIANGLES.");
2140*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(-1);
2141*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2142*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2143*35238bceSAndroid Build Coastguard Worker 
2144*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is already active.");
2145*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2146*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2147*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_POINTS);
2148*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2149*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2150*35238bceSAndroid Build Coastguard Worker 
2151*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if any binding point used in transform feedback mode does not "
2152*35238bceSAndroid Build Coastguard Worker                      "have a buffer object bound.");
2153*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
2154*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2155*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2156*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2157*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2158*35238bceSAndroid Build Coastguard Worker 
2159*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
2160*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_OPERATION is generated if no binding points would be used because no program object is active.");
2161*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(0);
2162*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2163*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2164*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
2165*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2166*35238bceSAndroid Build Coastguard Worker 
2167*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if no binding points would be used because the active program "
2168*35238bceSAndroid Build Coastguard Worker                      "object has specified no varying variables to record.");
2169*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 0, 0, GL_INTERLEAVED_ATTRIBS);
2170*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2171*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2172*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2173*35238bceSAndroid Build Coastguard Worker 
2174*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
2175*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
2176*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(2, tfID);
2177*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2178*35238bceSAndroid Build Coastguard Worker }
2179*35238bceSAndroid Build Coastguard Worker 
pause_transform_feedback(NegativeTestContext & ctx)2180*35238bceSAndroid Build Coastguard Worker void pause_transform_feedback(NegativeTestContext &ctx)
2181*35238bceSAndroid Build Coastguard Worker {
2182*35238bceSAndroid Build Coastguard Worker     GLuint tfID[2];
2183*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2184*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2185*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
2186*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
2187*35238bceSAndroid Build Coastguard Worker 
2188*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
2189*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(2, tfID);
2190*35238bceSAndroid Build Coastguard Worker 
2191*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
2192*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2193*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
2194*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
2195*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2196*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2197*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2198*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2199*35238bceSAndroid Build Coastguard Worker 
2200*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active "
2201*35238bceSAndroid Build Coastguard Worker                      "or is paused.");
2202*35238bceSAndroid Build Coastguard Worker     ctx.glPauseTransformFeedback();
2203*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2204*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2205*35238bceSAndroid Build Coastguard Worker     ctx.glPauseTransformFeedback();
2206*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2207*35238bceSAndroid Build Coastguard Worker     ctx.glPauseTransformFeedback();
2208*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2209*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2210*35238bceSAndroid Build Coastguard Worker 
2211*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
2212*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
2213*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(2, tfID);
2214*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2215*35238bceSAndroid Build Coastguard Worker }
2216*35238bceSAndroid Build Coastguard Worker 
resume_transform_feedback(NegativeTestContext & ctx)2217*35238bceSAndroid Build Coastguard Worker void resume_transform_feedback(NegativeTestContext &ctx)
2218*35238bceSAndroid Build Coastguard Worker {
2219*35238bceSAndroid Build Coastguard Worker     GLuint tfID[2];
2220*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2221*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2222*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
2223*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
2224*35238bceSAndroid Build Coastguard Worker 
2225*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
2226*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(2, tfID);
2227*35238bceSAndroid Build Coastguard Worker 
2228*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
2229*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2230*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
2231*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
2232*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2233*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2234*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2235*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2236*35238bceSAndroid Build Coastguard Worker 
2237*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if the currently bound transform feedback object is not active "
2238*35238bceSAndroid Build Coastguard Worker                      "or is not paused.");
2239*35238bceSAndroid Build Coastguard Worker     ctx.glResumeTransformFeedback();
2240*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2241*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2242*35238bceSAndroid Build Coastguard Worker     ctx.glResumeTransformFeedback();
2243*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2244*35238bceSAndroid Build Coastguard Worker     ctx.glPauseTransformFeedback();
2245*35238bceSAndroid Build Coastguard Worker     ctx.glResumeTransformFeedback();
2246*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2247*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2248*35238bceSAndroid Build Coastguard Worker 
2249*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
2250*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
2251*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(2, tfID);
2252*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2253*35238bceSAndroid Build Coastguard Worker }
2254*35238bceSAndroid Build Coastguard Worker 
end_transform_feedback(NegativeTestContext & ctx)2255*35238bceSAndroid Build Coastguard Worker void end_transform_feedback(NegativeTestContext &ctx)
2256*35238bceSAndroid Build Coastguard Worker {
2257*35238bceSAndroid Build Coastguard Worker     GLuint tfID = 0;
2258*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2259*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2260*35238bceSAndroid Build Coastguard Worker     uint32_t buf          = 0x1234;
2261*35238bceSAndroid Build Coastguard Worker     const char *tfVarying = "gl_Position";
2262*35238bceSAndroid Build Coastguard Worker 
2263*35238bceSAndroid Build Coastguard Worker     ctx.glGenBuffers(1, &buf);
2264*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(1, &tfID);
2265*35238bceSAndroid Build Coastguard Worker 
2266*35238bceSAndroid Build Coastguard Worker     ctx.glUseProgram(program.getProgram());
2267*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2268*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
2269*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
2270*35238bceSAndroid Build Coastguard Worker     ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
2271*35238bceSAndroid Build Coastguard Worker     ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
2272*35238bceSAndroid Build Coastguard Worker     ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
2273*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2274*35238bceSAndroid Build Coastguard Worker 
2275*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if transform feedback is not active.");
2276*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
2277*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2278*35238bceSAndroid Build Coastguard Worker     ctx.glBeginTransformFeedback(GL_TRIANGLES);
2279*35238bceSAndroid Build Coastguard Worker     ctx.glEndTransformFeedback();
2280*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2281*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2282*35238bceSAndroid Build Coastguard Worker 
2283*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteBuffers(1, &buf);
2284*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(1, &tfID);
2285*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2286*35238bceSAndroid Build Coastguard Worker }
2287*35238bceSAndroid Build Coastguard Worker 
get_transform_feedback_varying(NegativeTestContext & ctx)2288*35238bceSAndroid Build Coastguard Worker void get_transform_feedback_varying(NegativeTestContext &ctx)
2289*35238bceSAndroid Build Coastguard Worker {
2290*35238bceSAndroid Build Coastguard Worker     GLuint tfID = 0;
2291*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2292*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2293*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram programInvalid(ctx.getRenderContext(), glu::makeVtxFragSources(vertexShaderSource, ""));
2294*35238bceSAndroid Build Coastguard Worker     const char *tfVarying            = "gl_Position";
2295*35238bceSAndroid Build Coastguard Worker     int maxTransformFeedbackVaryings = 0;
2296*35238bceSAndroid Build Coastguard Worker 
2297*35238bceSAndroid Build Coastguard Worker     GLsizei length;
2298*35238bceSAndroid Build Coastguard Worker     GLsizei size;
2299*35238bceSAndroid Build Coastguard Worker     GLenum type;
2300*35238bceSAndroid Build Coastguard Worker     char name[32];
2301*35238bceSAndroid Build Coastguard Worker 
2302*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
2303*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
2304*35238bceSAndroid Build Coastguard Worker 
2305*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(1, &tfID);
2306*35238bceSAndroid Build Coastguard Worker 
2307*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2308*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2309*35238bceSAndroid Build Coastguard Worker     ctx.glLinkProgram(program.getProgram());
2310*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2311*35238bceSAndroid Build Coastguard Worker 
2312*35238bceSAndroid Build Coastguard Worker     ctx.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
2313*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2314*35238bceSAndroid Build Coastguard Worker 
2315*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
2316*35238bceSAndroid Build Coastguard Worker     ctx.glGetTransformFeedbackVarying(notAProgram, 0, 32, &length, &size, &type, &name[0]);
2317*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
2318*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2319*35238bceSAndroid Build Coastguard Worker 
2320*35238bceSAndroid Build Coastguard Worker     ctx.beginSection(
2321*35238bceSAndroid Build Coastguard Worker         "GL_INVALID_VALUE is generated if index is greater or equal to the value of GL_TRANSFORM_FEEDBACK_VARYINGS.");
2322*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(program.getProgram(), GL_TRANSFORM_FEEDBACK_VARYINGS, &maxTransformFeedbackVaryings);
2323*35238bceSAndroid Build Coastguard Worker     ctx.glGetTransformFeedbackVarying(program.getProgram(), maxTransformFeedbackVaryings, 32, &length, &size, &type,
2324*35238bceSAndroid Build Coastguard Worker                                       &name[0]);
2325*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
2326*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2327*35238bceSAndroid Build Coastguard Worker 
2328*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION or GL_INVALID_VALUE is generated program has not been linked.");
2329*35238bceSAndroid Build Coastguard Worker     ctx.glGetTransformFeedbackVarying(programInvalid.getProgram(), 0, 32, &length, &size, &type, &name[0]);
2330*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
2331*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2332*35238bceSAndroid Build Coastguard Worker 
2333*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(1, &tfID);
2334*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2335*35238bceSAndroid Build Coastguard Worker }
2336*35238bceSAndroid Build Coastguard Worker 
transform_feedback_varyings(NegativeTestContext & ctx)2337*35238bceSAndroid Build Coastguard Worker void transform_feedback_varyings(NegativeTestContext &ctx)
2338*35238bceSAndroid Build Coastguard Worker {
2339*35238bceSAndroid Build Coastguard Worker     GLuint tfID   = 0;
2340*35238bceSAndroid Build Coastguard Worker     GLuint shader = ctx.glCreateShader(GL_VERTEX_SHADER);
2341*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram program(ctx.getRenderContext(),
2342*35238bceSAndroid Build Coastguard Worker                                glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2343*35238bceSAndroid Build Coastguard Worker     const char *tfVarying                     = "gl_Position";
2344*35238bceSAndroid Build Coastguard Worker     GLint maxTransformFeedbackSeparateAttribs = 0;
2345*35238bceSAndroid Build Coastguard Worker 
2346*35238bceSAndroid Build Coastguard Worker     const GLuint notAProgram = ctx.glCreateProgram();
2347*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteProgram(notAProgram);
2348*35238bceSAndroid Build Coastguard Worker 
2349*35238bceSAndroid Build Coastguard Worker     ctx.glGenTransformFeedbacks(1, &tfID);
2350*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2351*35238bceSAndroid Build Coastguard Worker 
2352*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if program is not the name of a program object.");
2353*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(notAProgram, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2354*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
2355*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2356*35238bceSAndroid Build Coastguard Worker 
2357*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_OPERATION is generated if program is the name of a shader object.");
2358*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(shader, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2359*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_OPERATION);
2360*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
2361*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2362*35238bceSAndroid Build Coastguard Worker 
2363*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if count is negative.");
2364*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), -1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2365*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
2366*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2367*35238bceSAndroid Build Coastguard Worker 
2368*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if bufferMode is not SEPARATE_ATTRIBS or INTERLEAVED_ATTRIBS.");
2369*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, 0);
2370*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2371*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2372*35238bceSAndroid Build Coastguard Worker 
2373*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_VALUE is generated if bufferMode is GL_SEPARATE_ATTRIBS and count is greater than "
2374*35238bceSAndroid Build Coastguard Worker                      "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
2375*35238bceSAndroid Build Coastguard Worker     ctx.glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTransformFeedbackSeparateAttribs);
2376*35238bceSAndroid Build Coastguard Worker     ctx.glTransformFeedbackVaryings(program.getProgram(), maxTransformFeedbackSeparateAttribs + 1, &tfVarying,
2377*35238bceSAndroid Build Coastguard Worker                                     GL_SEPARATE_ATTRIBS);
2378*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_VALUE);
2379*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2380*35238bceSAndroid Build Coastguard Worker 
2381*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteTransformFeedbacks(1, &tfID);
2382*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_NO_ERROR);
2383*35238bceSAndroid Build Coastguard Worker }
2384*35238bceSAndroid Build Coastguard Worker 
link_compute_shader(NegativeTestContext & ctx)2385*35238bceSAndroid Build Coastguard Worker void link_compute_shader(NegativeTestContext &ctx)
2386*35238bceSAndroid Build Coastguard Worker {
2387*35238bceSAndroid Build Coastguard Worker     const char *computeShaderSource = "#version 320 es\n"
2388*35238bceSAndroid Build Coastguard Worker                                       "void main (void)\n"
2389*35238bceSAndroid Build Coastguard Worker                                       "{\n"
2390*35238bceSAndroid Build Coastguard Worker                                       "}\n\0";
2391*35238bceSAndroid Build Coastguard Worker     {
2392*35238bceSAndroid Build Coastguard Worker         const GLenum shaderTypes[] = {GL_VERTEX_SHADER, GL_FRAGMENT_SHADER, GL_GEOMETRY_SHADER, GL_TESS_CONTROL_SHADER,
2393*35238bceSAndroid Build Coastguard Worker                                       GL_TESS_EVALUATION_SHADER};
2394*35238bceSAndroid Build Coastguard Worker 
2395*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("Compute Shader linked with shader of other kind.");
2396*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(shaderTypes); ndx++)
2397*35238bceSAndroid Build Coastguard Worker         {
2398*35238bceSAndroid Build Coastguard Worker             GLint linkStatus              = -1;
2399*35238bceSAndroid Build Coastguard Worker             GLuint program                = ctx.glCreateProgram();
2400*35238bceSAndroid Build Coastguard Worker             GLuint computeShader          = ctx.glCreateShader(GL_COMPUTE_SHADER);
2401*35238bceSAndroid Build Coastguard Worker             GLuint otherShader            = ctx.glCreateShader(shaderTypes[ndx]);
2402*35238bceSAndroid Build Coastguard Worker             const char *otherShaderSource = (shaderTypes[ndx] != GL_GEOMETRY_SHADER) ? computeShaderSource :
2403*35238bceSAndroid Build Coastguard Worker                                                                                        "#version 320 es\n"
2404*35238bceSAndroid Build Coastguard Worker                                                                                        "layout(max_vertices = 3) out;\n"
2405*35238bceSAndroid Build Coastguard Worker                                                                                        "void main(void){}\n\0";
2406*35238bceSAndroid Build Coastguard Worker 
2407*35238bceSAndroid Build Coastguard Worker             ctx.glShaderSource(computeShader, 1, &computeShaderSource, DE_NULL);
2408*35238bceSAndroid Build Coastguard Worker             ctx.glShaderSource(otherShader, 1, &otherShaderSource, DE_NULL);
2409*35238bceSAndroid Build Coastguard Worker             ctx.glCompileShader(computeShader);
2410*35238bceSAndroid Build Coastguard Worker             ctx.glCompileShader(otherShader);
2411*35238bceSAndroid Build Coastguard Worker             ctx.glAttachShader(program, computeShader);
2412*35238bceSAndroid Build Coastguard Worker             ctx.glAttachShader(program, otherShader);
2413*35238bceSAndroid Build Coastguard Worker             ctx.glLinkProgram(program);
2414*35238bceSAndroid Build Coastguard Worker             ctx.glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
2415*35238bceSAndroid Build Coastguard Worker             ctx.glDeleteShader(otherShader);
2416*35238bceSAndroid Build Coastguard Worker             ctx.glDeleteShader(computeShader);
2417*35238bceSAndroid Build Coastguard Worker             ctx.glDeleteProgram(program);
2418*35238bceSAndroid Build Coastguard Worker             if (linkStatus != GL_FALSE)
2419*35238bceSAndroid Build Coastguard Worker                 ctx.fail("Program should not have linked");
2420*35238bceSAndroid Build Coastguard Worker         }
2421*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
2422*35238bceSAndroid Build Coastguard Worker     }
2423*35238bceSAndroid Build Coastguard Worker     {
2424*35238bceSAndroid Build Coastguard Worker         const char *computeShaderSource310 = "#version 310 es\n"
2425*35238bceSAndroid Build Coastguard Worker                                              "void main (void)\n"
2426*35238bceSAndroid Build Coastguard Worker                                              "{\n"
2427*35238bceSAndroid Build Coastguard Worker                                              "}\n\0";
2428*35238bceSAndroid Build Coastguard Worker         GLint linkStatus                   = -1;
2429*35238bceSAndroid Build Coastguard Worker         GLuint program                     = ctx.glCreateProgram();
2430*35238bceSAndroid Build Coastguard Worker         GLuint computeShader               = ctx.glCreateShader(GL_COMPUTE_SHADER);
2431*35238bceSAndroid Build Coastguard Worker         GLuint computeShader310            = ctx.glCreateShader(GL_FRAGMENT_SHADER);
2432*35238bceSAndroid Build Coastguard Worker 
2433*35238bceSAndroid Build Coastguard Worker         ctx.glShaderSource(computeShader, 1, &computeShaderSource, DE_NULL);
2434*35238bceSAndroid Build Coastguard Worker         ctx.glShaderSource(computeShader310, 1, &computeShaderSource310, DE_NULL);
2435*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("Compute Shader should not be linked with shaders of different version.");
2436*35238bceSAndroid Build Coastguard Worker         ctx.glCompileShader(computeShader);
2437*35238bceSAndroid Build Coastguard Worker         ctx.glCompileShader(computeShader310);
2438*35238bceSAndroid Build Coastguard Worker         ctx.glAttachShader(program, computeShader);
2439*35238bceSAndroid Build Coastguard Worker         ctx.glAttachShader(program, computeShader310);
2440*35238bceSAndroid Build Coastguard Worker         ctx.glLinkProgram(program);
2441*35238bceSAndroid Build Coastguard Worker         ctx.glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
2442*35238bceSAndroid Build Coastguard Worker         ctx.glDeleteShader(computeShader310);
2443*35238bceSAndroid Build Coastguard Worker         ctx.glDeleteShader(computeShader);
2444*35238bceSAndroid Build Coastguard Worker         ctx.glDeleteProgram(program);
2445*35238bceSAndroid Build Coastguard Worker         if (linkStatus != GL_FALSE)
2446*35238bceSAndroid Build Coastguard Worker             ctx.fail("Program should not have linked");
2447*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
2448*35238bceSAndroid Build Coastguard Worker     }
2449*35238bceSAndroid Build Coastguard Worker }
2450*35238bceSAndroid Build Coastguard Worker 
compile_compute_shader_helper(NegativeTestContext & ctx,const char * const * computeShaderSource,GLint * compileStatus)2451*35238bceSAndroid Build Coastguard Worker void compile_compute_shader_helper(NegativeTestContext &ctx, const char *const *computeShaderSource,
2452*35238bceSAndroid Build Coastguard Worker                                    GLint *compileStatus)
2453*35238bceSAndroid Build Coastguard Worker {
2454*35238bceSAndroid Build Coastguard Worker     GLuint shader = ctx.glCreateShader(GL_COMPUTE_SHADER);
2455*35238bceSAndroid Build Coastguard Worker 
2456*35238bceSAndroid Build Coastguard Worker     *compileStatus = -1;
2457*35238bceSAndroid Build Coastguard Worker     ctx.glShaderSource(shader, 1, computeShaderSource, DE_NULL);
2458*35238bceSAndroid Build Coastguard Worker     ctx.glCompileShader(shader);
2459*35238bceSAndroid Build Coastguard Worker     ctx.glGetShaderiv(shader, GL_COMPILE_STATUS, compileStatus);
2460*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shader);
2461*35238bceSAndroid Build Coastguard Worker }
2462*35238bceSAndroid Build Coastguard Worker 
compile_compute_shader(NegativeTestContext & ctx)2463*35238bceSAndroid Build Coastguard Worker void compile_compute_shader(NegativeTestContext &ctx)
2464*35238bceSAndroid Build Coastguard Worker {
2465*35238bceSAndroid Build Coastguard Worker     GLint compileStatus;
2466*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("Compile Computer Shader");
2467*35238bceSAndroid Build Coastguard Worker 
2468*35238bceSAndroid Build Coastguard Worker     {
2469*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 300 es\n"
2470*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2471*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2472*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2473*35238bceSAndroid Build Coastguard Worker 
2474*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2475*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2476*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled with #version 300 es.");
2477*35238bceSAndroid Build Coastguard Worker     }
2478*35238bceSAndroid Build Coastguard Worker     {
2479*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2480*35238bceSAndroid Build Coastguard Worker                                                 "buffer SSBO { vec4 data }"
2481*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2482*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2483*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2484*35238bceSAndroid Build Coastguard Worker 
2485*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2486*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2487*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: incorrect SSBO syntax.");
2488*35238bceSAndroid Build Coastguard Worker     }
2489*35238bceSAndroid Build Coastguard Worker     {
2490*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2491*35238bceSAndroid Build Coastguard Worker                                                 "buffer SSBO { vec4 data;};"
2492*35238bceSAndroid Build Coastguard Worker                                                 "uniform mat4 data;"
2493*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2494*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2495*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2496*35238bceSAndroid Build Coastguard Worker 
2497*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2498*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2499*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: buffer variable redefinition.");
2500*35238bceSAndroid Build Coastguard Worker     }
2501*35238bceSAndroid Build Coastguard Worker     {
2502*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2503*35238bceSAndroid Build Coastguard Worker                                                 "buffer SSBO { vec4 data[]; vec4 moreData;};"
2504*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2505*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2506*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2507*35238bceSAndroid Build Coastguard Worker 
2508*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2509*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2510*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: unspecified length buffer member not at the end.");
2511*35238bceSAndroid Build Coastguard Worker     }
2512*35238bceSAndroid Build Coastguard Worker     {
2513*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2514*35238bceSAndroid Build Coastguard Worker                                                 "in vec4 data;"
2515*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2516*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2517*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2518*35238bceSAndroid Build Coastguard Worker 
2519*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2520*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2521*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: input qualifier used.");
2522*35238bceSAndroid Build Coastguard Worker     }
2523*35238bceSAndroid Build Coastguard Worker     {
2524*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2525*35238bceSAndroid Build Coastguard Worker                                                 "shared uint data = 0;";
2526*35238bceSAndroid Build Coastguard Worker 
2527*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2528*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2529*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: shared-qualified variable initialized.");
2530*35238bceSAndroid Build Coastguard Worker     }
2531*35238bceSAndroid Build Coastguard Worker     {
2532*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2533*35238bceSAndroid Build Coastguard Worker                                                 "buffer SSBO { vec4 data; vec4 moreData[];} ssbo;"
2534*35238bceSAndroid Build Coastguard Worker                                                 "void test (vec4 data[10]) {}"
2535*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2536*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2537*35238bceSAndroid Build Coastguard Worker                                                 "    test(ssbo.moreData);"
2538*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2539*35238bceSAndroid Build Coastguard Worker 
2540*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2541*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2542*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: unspecified length buffer member passed as argument to "
2543*35238bceSAndroid Build Coastguard Worker                      "function.");
2544*35238bceSAndroid Build Coastguard Worker     }
2545*35238bceSAndroid Build Coastguard Worker     {
2546*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2547*35238bceSAndroid Build Coastguard Worker                                                 "buffer SSBO { vec4 data; vec4 moreData[];} ssbo;"
2548*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2549*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2550*35238bceSAndroid Build Coastguard Worker                                                 "    vec4 var = ssbo.moreData[-1];"
2551*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2552*35238bceSAndroid Build Coastguard Worker 
2553*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2554*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2555*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: unspecified length buffer member indexed with negative "
2556*35238bceSAndroid Build Coastguard Worker                      "constant expression.");
2557*35238bceSAndroid Build Coastguard Worker     }
2558*35238bceSAndroid Build Coastguard Worker     {
2559*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2560*35238bceSAndroid Build Coastguard Worker                                                 "layout(binding=-1) buffer SSBO { vec4 data;};"
2561*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2562*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2563*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2564*35238bceSAndroid Build Coastguard Worker 
2565*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2566*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2567*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: binding point less than zero.");
2568*35238bceSAndroid Build Coastguard Worker     }
2569*35238bceSAndroid Build Coastguard Worker     {
2570*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2571*35238bceSAndroid Build Coastguard Worker                                                 "layout(binding=1) buffer;"
2572*35238bceSAndroid Build Coastguard Worker                                                 "layout(binding=2) buffer SSBO { vec4 data;};"
2573*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2574*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2575*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2576*35238bceSAndroid Build Coastguard Worker 
2577*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2578*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2579*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: binding point specified for global scope.");
2580*35238bceSAndroid Build Coastguard Worker     }
2581*35238bceSAndroid Build Coastguard Worker     {
2582*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2583*35238bceSAndroid Build Coastguard Worker                                                 "buffer SSBO {"
2584*35238bceSAndroid Build Coastguard Worker                                                 "    layout(binding=1) vec4 data;"
2585*35238bceSAndroid Build Coastguard Worker                                                 "    layout(binding=2) vec4 moreData[];"
2586*35238bceSAndroid Build Coastguard Worker                                                 "} ssbo;"
2587*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2588*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2589*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2590*35238bceSAndroid Build Coastguard Worker 
2591*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2592*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2593*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: binding point specified for block member declarations.");
2594*35238bceSAndroid Build Coastguard Worker     }
2595*35238bceSAndroid Build Coastguard Worker     {
2596*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2597*35238bceSAndroid Build Coastguard Worker                                                 "readonly buffer SSBO {vec4 data;} ssbo;"
2598*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2599*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2600*35238bceSAndroid Build Coastguard Worker                                                 "ssbo.data = vec4(1, 1, 1, 1);"
2601*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2602*35238bceSAndroid Build Coastguard Worker 
2603*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2604*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2605*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: writing to buffer block qualified with readonly.");
2606*35238bceSAndroid Build Coastguard Worker     }
2607*35238bceSAndroid Build Coastguard Worker     {
2608*35238bceSAndroid Build Coastguard Worker         const char *const computeShaderSource = "#version 310 es\n"
2609*35238bceSAndroid Build Coastguard Worker                                                 "writeonly buffer SSBO {vec4 data;} ssbo;"
2610*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
2611*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
2612*35238bceSAndroid Build Coastguard Worker                                                 "vec4 var = ssbo.data;"
2613*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
2614*35238bceSAndroid Build Coastguard Worker 
2615*35238bceSAndroid Build Coastguard Worker         compile_compute_shader_helper(ctx, &computeShaderSource, &compileStatus);
2616*35238bceSAndroid Build Coastguard Worker         if (compileStatus != GL_FALSE)
2617*35238bceSAndroid Build Coastguard Worker             ctx.fail("Compute Shader should not have compiled: reading from buffer block qualified with writeonly.");
2618*35238bceSAndroid Build Coastguard Worker     }
2619*35238bceSAndroid Build Coastguard Worker 
2620*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2621*35238bceSAndroid Build Coastguard Worker }
2622*35238bceSAndroid Build Coastguard Worker 
srgb_decode_samplerparameteri(NegativeTestContext & ctx)2623*35238bceSAndroid Build Coastguard Worker void srgb_decode_samplerparameteri(NegativeTestContext &ctx)
2624*35238bceSAndroid Build Coastguard Worker {
2625*35238bceSAndroid Build Coastguard Worker     if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
2626*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "GL_EXT_texture_sRGB_decode is not supported.");
2627*35238bceSAndroid Build Coastguard Worker 
2628*35238bceSAndroid Build Coastguard Worker     GLuint sampler    = 0x1234;
2629*35238bceSAndroid Build Coastguard Worker     GLint samplerMode = -1;
2630*35238bceSAndroid Build Coastguard Worker 
2631*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
2632*35238bceSAndroid Build Coastguard Worker 
2633*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is GL_TEXTURE_SRGB_DECODE_EXT and the value of param(s) is "
2634*35238bceSAndroid Build Coastguard Worker                      "not a valid value (one of DECODE_EXT, or SKIP_DECODE_EXT).");
2635*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameteri(sampler, GL_TEXTURE_SRGB_DECODE_EXT, samplerMode);
2636*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2637*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2638*35238bceSAndroid Build Coastguard Worker 
2639*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
2640*35238bceSAndroid Build Coastguard Worker }
2641*35238bceSAndroid Build Coastguard Worker 
srgb_decode_samplerparameterf(NegativeTestContext & ctx)2642*35238bceSAndroid Build Coastguard Worker void srgb_decode_samplerparameterf(NegativeTestContext &ctx)
2643*35238bceSAndroid Build Coastguard Worker {
2644*35238bceSAndroid Build Coastguard Worker     if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
2645*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "GL_EXT_texture_sRGB_decode is not supported.");
2646*35238bceSAndroid Build Coastguard Worker 
2647*35238bceSAndroid Build Coastguard Worker     GLuint sampler      = 0x1234;
2648*35238bceSAndroid Build Coastguard Worker     GLfloat samplerMode = -1.0f;
2649*35238bceSAndroid Build Coastguard Worker 
2650*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
2651*35238bceSAndroid Build Coastguard Worker 
2652*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is GL_TEXTURE_SRGB_DECODE_EXT and the value of param(s) is "
2653*35238bceSAndroid Build Coastguard Worker                      "not a valid value (one of DECODE_EXT, or SKIP_DECODE_EXT).");
2654*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterf(sampler, GL_TEXTURE_SRGB_DECODE_EXT, samplerMode);
2655*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2656*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2657*35238bceSAndroid Build Coastguard Worker 
2658*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
2659*35238bceSAndroid Build Coastguard Worker }
2660*35238bceSAndroid Build Coastguard Worker 
srgb_decode_samplerparameteriv(NegativeTestContext & ctx)2661*35238bceSAndroid Build Coastguard Worker void srgb_decode_samplerparameteriv(NegativeTestContext &ctx)
2662*35238bceSAndroid Build Coastguard Worker {
2663*35238bceSAndroid Build Coastguard Worker     if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
2664*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "GL_EXT_texture_sRGB_decode is not supported.");
2665*35238bceSAndroid Build Coastguard Worker 
2666*35238bceSAndroid Build Coastguard Worker     int params[1]  = {GL_LINEAR};
2667*35238bceSAndroid Build Coastguard Worker     GLuint sampler = 0x1234;
2668*35238bceSAndroid Build Coastguard Worker 
2669*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
2670*35238bceSAndroid Build Coastguard Worker 
2671*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is GL_TEXTURE_SRGB_DECODE_EXT and the value of param(s) is "
2672*35238bceSAndroid Build Coastguard Worker                      "not a valid value (one of DECODE_EXT, or SKIP_DECODE_EXT).");
2673*35238bceSAndroid Build Coastguard Worker     params[0] = -1;
2674*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameteriv(sampler, GL_TEXTURE_SRGB_DECODE_EXT, &params[0]);
2675*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2676*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2677*35238bceSAndroid Build Coastguard Worker 
2678*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
2679*35238bceSAndroid Build Coastguard Worker }
2680*35238bceSAndroid Build Coastguard Worker 
srgb_decode_samplerparameterfv(NegativeTestContext & ctx)2681*35238bceSAndroid Build Coastguard Worker void srgb_decode_samplerparameterfv(NegativeTestContext &ctx)
2682*35238bceSAndroid Build Coastguard Worker {
2683*35238bceSAndroid Build Coastguard Worker     if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
2684*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "GL_EXT_texture_sRGB_decode is not supported.");
2685*35238bceSAndroid Build Coastguard Worker 
2686*35238bceSAndroid Build Coastguard Worker     float params[1] = {GL_LINEAR};
2687*35238bceSAndroid Build Coastguard Worker     GLuint sampler  = 0x1234;
2688*35238bceSAndroid Build Coastguard Worker 
2689*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
2690*35238bceSAndroid Build Coastguard Worker 
2691*35238bceSAndroid Build Coastguard Worker     params[0] = -1.0f;
2692*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is GL_TEXTURE_SRGB_DECODE_EXT and the value of param(s) is "
2693*35238bceSAndroid Build Coastguard Worker                      "not a valid value (one of DECODE_EXT, or SKIP_DECODE_EXT).");
2694*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterfv(sampler, GL_TEXTURE_SRGB_DECODE_EXT, &params[0]);
2695*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2696*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2697*35238bceSAndroid Build Coastguard Worker 
2698*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
2699*35238bceSAndroid Build Coastguard Worker }
2700*35238bceSAndroid Build Coastguard Worker 
srgb_decode_samplerparameterIiv(NegativeTestContext & ctx)2701*35238bceSAndroid Build Coastguard Worker void srgb_decode_samplerparameterIiv(NegativeTestContext &ctx)
2702*35238bceSAndroid Build Coastguard Worker {
2703*35238bceSAndroid Build Coastguard Worker     if (!supportsES32orGL45(ctx))
2704*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "glSamplerParameterIiv is not supported.");
2705*35238bceSAndroid Build Coastguard Worker 
2706*35238bceSAndroid Build Coastguard Worker     if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
2707*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "GL_EXT_texture_sRGB_decode is not supported.");
2708*35238bceSAndroid Build Coastguard Worker 
2709*35238bceSAndroid Build Coastguard Worker     GLint samplerMode[] = {GL_DEPTH_COMPONENT, GL_STENCIL_INDEX};
2710*35238bceSAndroid Build Coastguard Worker     GLuint sampler      = 0x1234;
2711*35238bceSAndroid Build Coastguard Worker 
2712*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
2713*35238bceSAndroid Build Coastguard Worker 
2714*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is GL_TEXTURE_SRGB_DECODE_EXT and the value of param(s) is "
2715*35238bceSAndroid Build Coastguard Worker                      "not a valid value (one of DECODE_EXT, or SKIP_DECODE_EXT).");
2716*35238bceSAndroid Build Coastguard Worker     samplerMode[0] = -1;
2717*35238bceSAndroid Build Coastguard Worker     samplerMode[1] = -1;
2718*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterIiv(sampler, GL_TEXTURE_SRGB_DECODE_EXT, samplerMode);
2719*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2720*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2721*35238bceSAndroid Build Coastguard Worker 
2722*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
2723*35238bceSAndroid Build Coastguard Worker }
2724*35238bceSAndroid Build Coastguard Worker 
srgb_decode_samplerparameterIuiv(NegativeTestContext & ctx)2725*35238bceSAndroid Build Coastguard Worker void srgb_decode_samplerparameterIuiv(NegativeTestContext &ctx)
2726*35238bceSAndroid Build Coastguard Worker {
2727*35238bceSAndroid Build Coastguard Worker     if (!supportsES32orGL45(ctx))
2728*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "glSamplerParameterIuiv is not supported.");
2729*35238bceSAndroid Build Coastguard Worker 
2730*35238bceSAndroid Build Coastguard Worker     if (!ctx.isExtensionSupported("GL_EXT_texture_sRGB_decode"))
2731*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "GL_EXT_texture_sRGB_decode is not supported.");
2732*35238bceSAndroid Build Coastguard Worker 
2733*35238bceSAndroid Build Coastguard Worker     GLuint samplerMode[] = {GL_DEPTH_COMPONENT, GL_STENCIL_INDEX};
2734*35238bceSAndroid Build Coastguard Worker     GLuint sampler       = 0x1234;
2735*35238bceSAndroid Build Coastguard Worker 
2736*35238bceSAndroid Build Coastguard Worker     ctx.glGenSamplers(1, &sampler);
2737*35238bceSAndroid Build Coastguard Worker 
2738*35238bceSAndroid Build Coastguard Worker     ctx.beginSection("GL_INVALID_ENUM is generated if pname is GL_TEXTURE_SRGB_DECODE_EXT and the value of param(s) is "
2739*35238bceSAndroid Build Coastguard Worker                      "not a valid value (one of DECODE_EXT, or SKIP_DECODE_EXT).");
2740*35238bceSAndroid Build Coastguard Worker     samplerMode[0] = GL_DONT_CARE;
2741*35238bceSAndroid Build Coastguard Worker     samplerMode[1] = GL_DONT_CARE;
2742*35238bceSAndroid Build Coastguard Worker     ctx.glSamplerParameterIuiv(sampler, GL_TEXTURE_SRGB_DECODE_EXT, samplerMode);
2743*35238bceSAndroid Build Coastguard Worker     ctx.expectError(GL_INVALID_ENUM);
2744*35238bceSAndroid Build Coastguard Worker     ctx.endSection();
2745*35238bceSAndroid Build Coastguard Worker 
2746*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteSamplers(1, &sampler);
2747*35238bceSAndroid Build Coastguard Worker }
2748*35238bceSAndroid Build Coastguard Worker 
getNegativeShaderApiTestFunctions()2749*35238bceSAndroid Build Coastguard Worker std::vector<FunctionContainer> getNegativeShaderApiTestFunctions()
2750*35238bceSAndroid Build Coastguard Worker {
2751*35238bceSAndroid Build Coastguard Worker     FunctionContainer funcs[] = {
2752*35238bceSAndroid Build Coastguard Worker         {create_shader, "create_shader", "Invalid glCreateShader() usage"},
2753*35238bceSAndroid Build Coastguard Worker         {shader_source, "shader_source", "Invalid glShaderSource() usage"},
2754*35238bceSAndroid Build Coastguard Worker         {compile_shader, "compile_shader", "Invalid glCompileShader() usage"},
2755*35238bceSAndroid Build Coastguard Worker         {delete_shader, "delete_shader", "Invalid glDeleteShader() usage"},
2756*35238bceSAndroid Build Coastguard Worker         {shader_binary, "shader_binary", "Invalid glShaderBinary() usage"},
2757*35238bceSAndroid Build Coastguard Worker         {attach_shader, "attach_shader", "Invalid glAttachShader() usage"},
2758*35238bceSAndroid Build Coastguard Worker         {detach_shader, "detach_shader", "Invalid glDetachShader() usage"},
2759*35238bceSAndroid Build Coastguard Worker         {link_program, "link_program", "Invalid glLinkProgram() usage"},
2760*35238bceSAndroid Build Coastguard Worker         {use_program, "use_program", "Invalid glUseProgram() usage"},
2761*35238bceSAndroid Build Coastguard Worker         {delete_program, "delete_program", "Invalid glDeleteProgram() usage"},
2762*35238bceSAndroid Build Coastguard Worker         {validate_program, "validate_program", "Invalid glValidateProgram() usage"},
2763*35238bceSAndroid Build Coastguard Worker         {get_program_binary, "get_program_binary", "Invalid glGetProgramBinary() usage"},
2764*35238bceSAndroid Build Coastguard Worker         {program_binary, "program_binary", "Invalid glProgramBinary() usage"},
2765*35238bceSAndroid Build Coastguard Worker         {program_parameteri, "program_parameteri", "Invalid glProgramParameteri() usage"},
2766*35238bceSAndroid Build Coastguard Worker         {gen_samplers, "gen_samplers", "Invalid glGenSamplers() usage"},
2767*35238bceSAndroid Build Coastguard Worker         {bind_sampler, "bind_sampler", "Invalid glBindSampler() usage"},
2768*35238bceSAndroid Build Coastguard Worker         {delete_samplers, "delete_samplers", "Invalid glDeleteSamplers() usage"},
2769*35238bceSAndroid Build Coastguard Worker         {get_sampler_parameteriv, "get_sampler_parameteriv", "Invalid glGetSamplerParameteriv() usage"},
2770*35238bceSAndroid Build Coastguard Worker         {get_sampler_parameterfv, "get_sampler_parameterfv", "Invalid glGetSamplerParameterfv() usage"},
2771*35238bceSAndroid Build Coastguard Worker         {get_sampler_parameterIiv, "get_sampler_parameterIiv", "Invalid glGetSamplerParameterIiv() usage"},
2772*35238bceSAndroid Build Coastguard Worker         {get_sampler_parameterIuiv, "get_sampler_parameterIuiv", "Invalid glGetSamplerParameterIuiv() usage"},
2773*35238bceSAndroid Build Coastguard Worker         {sampler_parameteri, "sampler_parameteri", "Invalid glSamplerParameteri() usage"},
2774*35238bceSAndroid Build Coastguard Worker         {sampler_parameteriv, "sampler_parameteriv", "Invalid glSamplerParameteriv() usage"},
2775*35238bceSAndroid Build Coastguard Worker         {sampler_parameterf, "sampler_parameterf", "Invalid glSamplerParameterf() usage"},
2776*35238bceSAndroid Build Coastguard Worker         {sampler_parameterfv, "sampler_parameterfv", "Invalid glSamplerParameterfv() usage"},
2777*35238bceSAndroid Build Coastguard Worker         {sampler_parameterIiv, "sampler_parameterIiv", "Invalid glSamplerParameterIiv() usage"},
2778*35238bceSAndroid Build Coastguard Worker         {sampler_parameterIuiv, "sampler_parameterIuiv", "Invalid glSamplerParameterIuiv() usage"},
2779*35238bceSAndroid Build Coastguard Worker         {get_attrib_location, "get_attrib_location", "Invalid glGetAttribLocation() usage"},
2780*35238bceSAndroid Build Coastguard Worker         {get_uniform_location, "get_uniform_location", "Invalid glGetUniformLocation() usage"},
2781*35238bceSAndroid Build Coastguard Worker         {bind_attrib_location, "bind_attrib_location", "Invalid glBindAttribLocation() usage"},
2782*35238bceSAndroid Build Coastguard Worker         {uniform_block_binding, "uniform_block_binding", "Invalid glUniformBlockBinding() usage"},
2783*35238bceSAndroid Build Coastguard Worker         {uniformf_invalid_program, "uniformf_invalid_program", "Invalid glUniform{1234}f() usage"},
2784*35238bceSAndroid Build Coastguard Worker         {uniformf_incompatible_type, "uniformf_incompatible_type", "Invalid glUniform{1234}f() usage"},
2785*35238bceSAndroid Build Coastguard Worker         {uniformf_invalid_location, "uniformf_invalid_location", "Invalid glUniform{1234}f() usage"},
2786*35238bceSAndroid Build Coastguard Worker         {uniformfv_invalid_program, "uniformfv_invalid_program", "Invalid glUniform{1234}fv() usage"},
2787*35238bceSAndroid Build Coastguard Worker         {uniformfv_incompatible_type, "uniformfv_incompatible_type", "Invalid glUniform{1234}fv() usage"},
2788*35238bceSAndroid Build Coastguard Worker         {uniformfv_invalid_location, "uniformfv_invalid_location", "Invalid glUniform{1234}fv() usage"},
2789*35238bceSAndroid Build Coastguard Worker         {uniformfv_invalid_count, "uniformfv_invalid_count", "Invalid glUniform{1234}fv() usage"},
2790*35238bceSAndroid Build Coastguard Worker         {uniformi_invalid_program, "uniformi_invalid_program", "Invalid glUniform{1234}i() usage"},
2791*35238bceSAndroid Build Coastguard Worker         {uniformi_incompatible_type, "uniformi_incompatible_type", "Invalid glUniform{1234}i() usage"},
2792*35238bceSAndroid Build Coastguard Worker         {uniformi_invalid_location, "uniformi_invalid_location", "Invalid glUniform{1234}i() usage"},
2793*35238bceSAndroid Build Coastguard Worker         {uniformiv_invalid_program, "uniformiv_invalid_program", "Invalid glUniform{1234}iv() usage"},
2794*35238bceSAndroid Build Coastguard Worker         {uniformiv_incompatible_type, "uniformiv_incompatible_type", "Invalid glUniform{1234}iv() usage"},
2795*35238bceSAndroid Build Coastguard Worker         {uniformiv_invalid_location, "uniformiv_invalid_location", "Invalid glUniform{1234}iv() usage"},
2796*35238bceSAndroid Build Coastguard Worker         {uniformiv_invalid_count, "uniformiv_invalid_count", "Invalid glUniform{1234}iv() usage"},
2797*35238bceSAndroid Build Coastguard Worker         {uniformui_invalid_program, "uniformui_invalid_program", "Invalid glUniform{234}ui() usage"},
2798*35238bceSAndroid Build Coastguard Worker         {uniformui_incompatible_type, "uniformui_incompatible_type", "Invalid glUniform{1234}ui() usage"},
2799*35238bceSAndroid Build Coastguard Worker         {uniformui_invalid_location, "uniformui_invalid_location", "Invalid glUniform{1234}ui() usage"},
2800*35238bceSAndroid Build Coastguard Worker         {uniformuiv_invalid_program, "uniformuiv_invalid_program", "Invalid glUniform{234}uiv() usage"},
2801*35238bceSAndroid Build Coastguard Worker         {uniformuiv_incompatible_type, "uniformuiv_incompatible_type", "Invalid glUniform{1234}uiv() usage"},
2802*35238bceSAndroid Build Coastguard Worker         {uniformuiv_invalid_location, "uniformuiv_invalid_location", "Invalid glUniform{1234}uiv() usage"},
2803*35238bceSAndroid Build Coastguard Worker         {uniformuiv_invalid_count, "uniformuiv_invalid_count", "Invalid glUniform{1234}uiv() usage"},
2804*35238bceSAndroid Build Coastguard Worker         {uniform_matrixfv_invalid_program, "uniform_matrixfv_invalid_program",
2805*35238bceSAndroid Build Coastguard Worker          "Invalid glUniformMatrix{234}fv() usage"},
2806*35238bceSAndroid Build Coastguard Worker         {uniform_matrixfv_incompatible_type, "uniform_matrixfv_incompatible_type",
2807*35238bceSAndroid Build Coastguard Worker          "Invalid glUniformMatrix{234}fv() usage"},
2808*35238bceSAndroid Build Coastguard Worker         {uniform_matrixfv_invalid_location, "uniform_matrixfv_invalid_location",
2809*35238bceSAndroid Build Coastguard Worker          "Invalid glUniformMatrix{234}fv() usage"},
2810*35238bceSAndroid Build Coastguard Worker         {uniform_matrixfv_invalid_count, "uniform_matrixfv_invalid_count", "Invalid glUniformMatrix{234}fv() usage"},
2811*35238bceSAndroid Build Coastguard Worker         {gen_transform_feedbacks, "gen_transform_feedbacks", "Invalid glGenTransformFeedbacks() usage"},
2812*35238bceSAndroid Build Coastguard Worker         {bind_transform_feedback, "bind_transform_feedback", "Invalid glBindTransformFeedback() usage"},
2813*35238bceSAndroid Build Coastguard Worker         {delete_transform_feedbacks, "delete_transform_feedbacks", "Invalid glDeleteTransformFeedbacks() usage"},
2814*35238bceSAndroid Build Coastguard Worker         {begin_transform_feedback, "begin_transform_feedback", "Invalid glBeginTransformFeedback() usage"},
2815*35238bceSAndroid Build Coastguard Worker         {pause_transform_feedback, "pause_transform_feedback", "Invalid glPauseTransformFeedback() usage"},
2816*35238bceSAndroid Build Coastguard Worker         {resume_transform_feedback, "resume_transform_feedback", "Invalid glResumeTransformFeedback() usage"},
2817*35238bceSAndroid Build Coastguard Worker         {end_transform_feedback, "end_transform_feedback", "Invalid glEndTransformFeedback() usage"},
2818*35238bceSAndroid Build Coastguard Worker         {get_transform_feedback_varying, "get_transform_feedback_varying",
2819*35238bceSAndroid Build Coastguard Worker          "Invalid glGetTransformFeedbackVarying() usage"},
2820*35238bceSAndroid Build Coastguard Worker         {transform_feedback_varyings, "transform_feedback_varyings", "Invalid glTransformFeedbackVaryings() usage"},
2821*35238bceSAndroid Build Coastguard Worker         {compile_compute_shader, "compile_compute_shader", "Invalid Compute Shader compilation"},
2822*35238bceSAndroid Build Coastguard Worker         {link_compute_shader, "link_compute_shader", "Invalid Compute Shader linkage"},
2823*35238bceSAndroid Build Coastguard Worker         {srgb_decode_samplerparameteri, "srgb_decode_samplerparameteri", "Invalid glSamplerParameteri() usage srgb"},
2824*35238bceSAndroid Build Coastguard Worker         {srgb_decode_samplerparameterf, "srgb_decode_samplerparameterf", "Invalid glSamplerParameterf() usage srgb"},
2825*35238bceSAndroid Build Coastguard Worker         {srgb_decode_samplerparameteriv, "srgb_decode_samplerparameteriv", "Invalid glSamplerParameteriv() usage srgb"},
2826*35238bceSAndroid Build Coastguard Worker         {srgb_decode_samplerparameterfv, "srgb_decode_samplerparameterfv", "Invalid glSamplerParameterfv() usage srgb"},
2827*35238bceSAndroid Build Coastguard Worker         {srgb_decode_samplerparameterIiv, "srgb_decode_samplerparameterIiv",
2828*35238bceSAndroid Build Coastguard Worker          "Invalid glSamplerParameterIiv() usage srgb"},
2829*35238bceSAndroid Build Coastguard Worker         {srgb_decode_samplerparameterIuiv, "srgb_decode_samplerparameterIuiv",
2830*35238bceSAndroid Build Coastguard Worker          "Invalid glSamplerParameterIiuv() usage srgb"},
2831*35238bceSAndroid Build Coastguard Worker     };
2832*35238bceSAndroid Build Coastguard Worker 
2833*35238bceSAndroid Build Coastguard Worker     return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
2834*35238bceSAndroid Build Coastguard Worker }
2835*35238bceSAndroid Build Coastguard Worker 
2836*35238bceSAndroid Build Coastguard Worker } // namespace NegativeTestShared
2837*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2838*35238bceSAndroid Build Coastguard Worker } // namespace gles31
2839*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2840