xref: /aosp_15_r20/external/deqp/modules/gles2/functional/es2fNegativeShaderApiTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 2.0 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 "es2fNegativeShaderApiTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es2fApiCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker namespace deqp
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace gles2
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker namespace Functional
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker static const char *vertexShaderSource   = "void main (void) { gl_Position = vec4(0.0); }\n\0";
44*35238bceSAndroid Build Coastguard Worker static const char *fragmentShaderSource = "void main (void) { gl_FragColor = vec4(0.0); }\n\0";
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker static const char *uniformTestVertSource = "uniform mediump vec4 vTest;\n"
47*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump mat4 vMatrix;\n"
48*35238bceSAndroid Build Coastguard Worker                                            "void main (void)\n"
49*35238bceSAndroid Build Coastguard Worker                                            "{\n"
50*35238bceSAndroid Build Coastguard Worker                                            "    gl_Position = vMatrix * vTest;\n"
51*35238bceSAndroid Build Coastguard Worker                                            "}\n\0";
52*35238bceSAndroid Build Coastguard Worker static const char *uniformTestFragSource = "uniform mediump ivec4 fTest;\n"
53*35238bceSAndroid Build Coastguard Worker                                            "uniform sampler2D fSampler;\n"
54*35238bceSAndroid Build Coastguard Worker                                            "void main (void)\n"
55*35238bceSAndroid Build Coastguard Worker                                            "{\n"
56*35238bceSAndroid Build Coastguard Worker                                            "    gl_FragColor.xy = vec4(fTest).xy;\n"
57*35238bceSAndroid Build Coastguard Worker                                            "    gl_FragColor.zw = texture2D(fSampler, vec2(0.0, 0.0)).zw;\n"
58*35238bceSAndroid Build Coastguard Worker                                            "}\n\0";
59*35238bceSAndroid Build Coastguard Worker 
60*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
61*35238bceSAndroid Build Coastguard Worker 
NegativeShaderApiTests(Context & context)62*35238bceSAndroid Build Coastguard Worker NegativeShaderApiTests::NegativeShaderApiTests(Context &context)
63*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "shader", "Negative Shader API Cases")
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker }
66*35238bceSAndroid Build Coastguard Worker 
~NegativeShaderApiTests(void)67*35238bceSAndroid Build Coastguard Worker NegativeShaderApiTests::~NegativeShaderApiTests(void)
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker }
70*35238bceSAndroid Build Coastguard Worker 
init(void)71*35238bceSAndroid Build Coastguard Worker void NegativeShaderApiTests::init(void)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(create_shader, "Invalid glCreateShader() usage", {
74*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if shaderType is not an accepted value.");
75*35238bceSAndroid Build Coastguard Worker         glCreateShader(-1);
76*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
77*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
78*35238bceSAndroid Build Coastguard Worker     });
79*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(shader_source, "Invalid glShaderSource() usage", {
80*35238bceSAndroid Build Coastguard Worker         GLboolean shaderCompilerSupported;
81*35238bceSAndroid Build Coastguard Worker         glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
82*35238bceSAndroid Build Coastguard Worker         if (!shaderCompilerSupported)
83*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION"
84*35238bceSAndroid Build Coastguard Worker                   << TestLog::EndMessage;
85*35238bceSAndroid Build Coastguard Worker         else
86*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
89*35238bceSAndroid Build Coastguard Worker         glShaderSource(1, 0, 0, 0);
90*35238bceSAndroid Build Coastguard Worker         expectError(shaderCompilerSupported ? GL_INVALID_VALUE : GL_INVALID_OPERATION);
91*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
92*35238bceSAndroid Build Coastguard Worker 
93*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if count is less than 0.");
94*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
95*35238bceSAndroid Build Coastguard Worker         glShaderSource(shader, -1, 0, 0);
96*35238bceSAndroid Build Coastguard Worker         expectError(shaderCompilerSupported ? GL_INVALID_VALUE : GL_INVALID_OPERATION);
97*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
100*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
101*35238bceSAndroid Build Coastguard Worker         glShaderSource(program, 0, 0, 0);
102*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
103*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
106*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
107*35238bceSAndroid Build Coastguard Worker     });
108*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(compile_shader, "Invalid glCompileShader() usage", {
109*35238bceSAndroid Build Coastguard Worker         GLboolean shaderCompilerSupported;
110*35238bceSAndroid Build Coastguard Worker         glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
111*35238bceSAndroid Build Coastguard Worker         if (!shaderCompilerSupported)
112*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader compiler not supported, always expect GL_INVALID_OPERATION"
113*35238bceSAndroid Build Coastguard Worker                   << TestLog::EndMessage;
114*35238bceSAndroid Build Coastguard Worker         else
115*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader compiler supported" << TestLog::EndMessage;
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
118*35238bceSAndroid Build Coastguard Worker         glCompileShader(9);
119*35238bceSAndroid Build Coastguard Worker         expectError(shaderCompilerSupported ? GL_INVALID_VALUE : GL_INVALID_OPERATION);
120*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
121*35238bceSAndroid Build Coastguard Worker 
122*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
123*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
124*35238bceSAndroid Build Coastguard Worker         glCompileShader(program);
125*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
126*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
129*35238bceSAndroid Build Coastguard Worker     });
130*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(delete_shader, "Invalid glDeleteShader() usage", {
131*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
132*35238bceSAndroid Build Coastguard Worker         glDeleteShader(9);
133*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
134*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
135*35238bceSAndroid Build Coastguard Worker     });
136*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(shader_binary, "Invalid glShaderBinary() usage", {
137*35238bceSAndroid Build Coastguard Worker         std::vector<int32_t> binaryFormats;
138*35238bceSAndroid Build Coastguard Worker         getSupportedExtensions(GL_NUM_SHADER_BINARY_FORMATS, GL_SHADER_BINARY_FORMATS, binaryFormats);
139*35238bceSAndroid Build Coastguard Worker         bool shaderBinarySupported = !binaryFormats.empty();
140*35238bceSAndroid Build Coastguard Worker         if (!shaderBinarySupported)
141*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader binaries not supported." << TestLog::EndMessage;
142*35238bceSAndroid Build Coastguard Worker         else
143*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader binaries supported" << TestLog::EndMessage;
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker         GLuint shaders[2];
146*35238bceSAndroid Build Coastguard Worker 
147*35238bceSAndroid Build Coastguard Worker         shaders[0]     = glCreateShader(GL_VERTEX_SHADER);
148*35238bceSAndroid Build Coastguard Worker         shaders[1]     = glCreateShader(GL_VERTEX_SHADER);
149*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if binaryformat is not a supported format returned "
152*35238bceSAndroid Build Coastguard Worker                                       "in GL_SHADER_BINARY_FORMATS.");
153*35238bceSAndroid Build Coastguard Worker         glShaderBinary(1, &shaders[0], -1, 0, 0);
154*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
155*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker         if (shaderBinarySupported)
158*35238bceSAndroid Build Coastguard Worker         {
159*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section(
160*35238bceSAndroid Build Coastguard Worker                 "", "GL_INVALID_VALUE is generated if any value in shaders is not a value generated by OpenGL.");
161*35238bceSAndroid Build Coastguard Worker             shaders[0] = 137;
162*35238bceSAndroid Build Coastguard Worker             glShaderBinary(1, &shaders[0], binaryFormats[0], 0, 0);
163*35238bceSAndroid Build Coastguard Worker             expectError(shaderBinarySupported ? GL_INVALID_VALUE : GL_INVALID_OPERATION);
164*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n or length is negative.");
167*35238bceSAndroid Build Coastguard Worker             shaders[0] = glCreateShader(GL_VERTEX_SHADER);
168*35238bceSAndroid Build Coastguard Worker             glShaderBinary(-1, &shaders[0], binaryFormats[0], 0, 0);
169*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
170*35238bceSAndroid Build Coastguard Worker             glShaderBinary(1, &shaders[0], binaryFormats[0], 0, -1);
171*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
172*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
173*35238bceSAndroid Build Coastguard Worker 
174*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section(
175*35238bceSAndroid Build Coastguard Worker                 "", "GL_INVALID_OPERATION is generated if any value in shaders is not a shader object.");
176*35238bceSAndroid Build Coastguard Worker             glShaderBinary(1, &program, binaryFormats[0], 0, 0);
177*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
178*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
179*35238bceSAndroid Build Coastguard Worker 
180*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if there is more than one vertex shader "
181*35238bceSAndroid Build Coastguard Worker                                           "object handle or more than one fragment shader object handle in shaders.");
182*35238bceSAndroid Build Coastguard Worker             shaders[0] = glCreateShader(GL_VERTEX_SHADER);
183*35238bceSAndroid Build Coastguard Worker             shaders[1] = glCreateShader(GL_VERTEX_SHADER);
184*35238bceSAndroid Build Coastguard Worker             glShaderBinary(2, &shaders[0], binaryFormats[0], 0, 1);
185*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
186*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
187*35238bceSAndroid Build Coastguard Worker         }
188*35238bceSAndroid Build Coastguard Worker 
189*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shaders[0]);
190*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shaders[1]);
191*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker         // \note: The format of the data pointed to by binary does not match binaryformat.
194*35238bceSAndroid Build Coastguard Worker     });
195*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(attach_shader, "Invalid glAttachShader() usage", {
196*35238bceSAndroid Build Coastguard Worker         GLuint shader1 = glCreateShader(GL_VERTEX_SHADER);
197*35238bceSAndroid Build Coastguard Worker         GLuint shader2 = glCreateShader(GL_VERTEX_SHADER);
198*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
199*35238bceSAndroid Build Coastguard Worker 
200*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
201*35238bceSAndroid Build Coastguard Worker         glAttachShader(shader1, shader1);
202*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
203*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
204*35238bceSAndroid Build Coastguard Worker 
205*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
206*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, program);
207*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
208*35238bceSAndroid Build Coastguard Worker         glAttachShader(shader1, program);
209*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
210*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
211*35238bceSAndroid Build Coastguard Worker 
212*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
213*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
214*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, -1);
215*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
216*35238bceSAndroid Build Coastguard Worker         glAttachShader(-1, shader1);
217*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
218*35238bceSAndroid Build Coastguard Worker         glAttachShader(-1, -1);
219*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
220*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
223*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_OPERATION is generated if shader is already attached to program, or if "
224*35238bceSAndroid Build Coastguard Worker                                   "another shader object of the same type as shader is already attached to program.");
225*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, shader1);
226*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
227*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, shader1);
228*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
229*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, shader2);
230*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
231*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
232*35238bceSAndroid Build Coastguard Worker 
233*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
234*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader1);
235*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader2);
236*35238bceSAndroid Build Coastguard Worker     });
237*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(detach_shader, "Invalid glDetachShader() usage", {
238*35238bceSAndroid Build Coastguard Worker         GLuint shader  = glCreateShader(GL_VERTEX_SHADER);
239*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
240*35238bceSAndroid Build Coastguard Worker 
241*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
242*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
243*35238bceSAndroid Build Coastguard Worker         glDetachShader(-1, shader);
244*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
245*35238bceSAndroid Build Coastguard Worker         glDetachShader(program, -1);
246*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
247*35238bceSAndroid Build Coastguard Worker         glDetachShader(-1, -1);
248*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
249*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
252*35238bceSAndroid Build Coastguard Worker         glDetachShader(shader, shader);
253*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
254*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
255*35238bceSAndroid Build Coastguard Worker 
256*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
257*35238bceSAndroid Build Coastguard Worker         glDetachShader(program, program);
258*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
259*35238bceSAndroid Build Coastguard Worker         glDetachShader(shader, program);
260*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
261*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not attached to program.");
264*35238bceSAndroid Build Coastguard Worker         glDetachShader(program, shader);
265*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
266*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
267*35238bceSAndroid Build Coastguard Worker 
268*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
269*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
270*35238bceSAndroid Build Coastguard Worker     });
271*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(link_program, "Invalid glLinkProgram() usage", {
272*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
275*35238bceSAndroid Build Coastguard Worker         glLinkProgram(-1);
276*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
277*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
280*35238bceSAndroid Build Coastguard Worker         glLinkProgram(shader);
281*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
282*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
283*35238bceSAndroid Build Coastguard Worker 
284*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
285*35238bceSAndroid Build Coastguard Worker     });
286*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(use_program, "Invalid glUseProgram() usage", {
287*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
288*35238bceSAndroid Build Coastguard Worker 
289*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
290*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if program is neither 0 nor a value generated by OpenGL.");
291*35238bceSAndroid Build Coastguard Worker         glUseProgram(-1);
292*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
293*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
294*35238bceSAndroid Build Coastguard Worker 
295*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
296*35238bceSAndroid Build Coastguard Worker         glUseProgram(shader);
297*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
298*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
301*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
302*35238bceSAndroid Build Coastguard Worker     });
303*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(delete_program, "Invalid glDeleteProgram() usage", {
304*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
305*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(-1);
306*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
307*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
308*35238bceSAndroid Build Coastguard Worker     });
309*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(get_active_attrib, "Invalid glGetActiveAttrib() usage", {
310*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
311*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
312*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
313*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
314*35238bceSAndroid Build Coastguard Worker 
315*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
316*35238bceSAndroid Build Coastguard Worker         glGetActiveAttrib(-1, 0, 0, 0, 0, 0, 0);
317*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
318*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
319*35238bceSAndroid Build Coastguard Worker 
320*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
321*35238bceSAndroid Build Coastguard Worker         glGetActiveAttrib(shader, 0, 0, 0, 0, 0, 0);
322*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
323*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to the number "
326*35238bceSAndroid Build Coastguard Worker                                       "of active attribute variables in program.");
327*35238bceSAndroid Build Coastguard Worker         glGetActiveAttrib(program.getProgram(), 0, 0, 0, 0, 0, 0);
328*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
329*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
330*35238bceSAndroid Build Coastguard Worker 
331*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if bufSize is less than 0.");
332*35238bceSAndroid Build Coastguard Worker         glGetActiveAttrib(program.getProgram(), 0, -1, 0, 0, 0, 0);
333*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
334*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
335*35238bceSAndroid Build Coastguard Worker 
336*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
337*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
338*35238bceSAndroid Build Coastguard Worker     });
339*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(get_attrib_location, "Invalid glGetAttribLocation() usage", {
340*35238bceSAndroid Build Coastguard Worker         GLuint programEmpty = glCreateProgram();
341*35238bceSAndroid Build Coastguard Worker         GLuint shader       = glCreateShader(GL_VERTEX_SHADER);
342*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
343*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
346*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(programEmpty, 0, "test");
347*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(programEmpty, "test");
348*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
349*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a program or shader object.");
352*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
353*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(program.getProgram(), 0, "test");
354*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
355*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(program.getProgram(), "test");
356*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
357*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(-2, "test");
358*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
359*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
360*35238bceSAndroid Build Coastguard Worker 
361*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
362*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(shader, "test");
363*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
364*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
365*35238bceSAndroid Build Coastguard Worker 
366*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
367*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
368*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(programEmpty);
369*35238bceSAndroid Build Coastguard Worker     });
370*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(get_uniform_location, "Invalid glGetUniformLocation() usage", {
371*35238bceSAndroid Build Coastguard Worker         GLuint programEmpty = glCreateProgram();
372*35238bceSAndroid Build Coastguard Worker         GLuint shader       = glCreateShader(GL_VERTEX_SHADER);
373*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
374*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
375*35238bceSAndroid Build Coastguard Worker 
376*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
377*35238bceSAndroid Build Coastguard Worker         glGetUniformLocation(programEmpty, "test");
378*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
379*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
380*35238bceSAndroid Build Coastguard Worker 
381*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
382*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
383*35238bceSAndroid Build Coastguard Worker         glGetUniformLocation(-2, "test");
384*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
385*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
386*35238bceSAndroid Build Coastguard Worker 
387*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
388*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(shader, "test");
389*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
390*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
391*35238bceSAndroid Build Coastguard Worker 
392*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
393*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(programEmpty);
394*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
395*35238bceSAndroid Build Coastguard Worker     });
396*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(bind_attrib_location, "Invalid glBindAttribLocation() usage", {
397*35238bceSAndroid Build Coastguard Worker         GLuint program  = glCreateProgram();
398*35238bceSAndroid Build Coastguard Worker         GLuint maxIndex = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
399*35238bceSAndroid Build Coastguard Worker         GLuint shader   = glCreateShader(GL_VERTEX_SHADER);
400*35238bceSAndroid Build Coastguard Worker 
401*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
402*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
403*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(program, maxIndex, "test");
404*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
405*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
406*35238bceSAndroid Build Coastguard Worker 
407*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
408*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_OPERATION is generated if name starts with the reserved prefix \"gl_\".");
409*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(program, maxIndex - 1, "gl_test");
410*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
411*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
414*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(-1, maxIndex - 1, "test");
415*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
416*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
419*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(shader, maxIndex - 1, "test");
420*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
421*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
422*35238bceSAndroid Build Coastguard Worker 
423*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
424*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
425*35238bceSAndroid Build Coastguard Worker     });
426*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(get_active_uniform, "Invalid glGetActiveUniform() usage", {
427*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
428*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
429*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
430*35238bceSAndroid Build Coastguard Worker 
431*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
432*35238bceSAndroid Build Coastguard Worker         glGetActiveUniform(-1, 0, 0, 0, 0, 0, 0);
433*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
434*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
435*35238bceSAndroid Build Coastguard Worker 
436*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
437*35238bceSAndroid Build Coastguard Worker         glGetActiveUniform(shader, 0, 0, 0, 0, 0, 0);
438*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
439*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
440*35238bceSAndroid Build Coastguard Worker 
441*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater than or equal to the number "
442*35238bceSAndroid Build Coastguard Worker                                       "of active attribute variables in program.");
443*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
444*35238bceSAndroid Build Coastguard Worker         glGetActiveUniform(program.getProgram(), 5, 0, 0, 0, 0, 0);
445*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
446*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
447*35238bceSAndroid Build Coastguard Worker 
448*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if bufSize is less than 0.");
449*35238bceSAndroid Build Coastguard Worker         glGetActiveUniform(program.getProgram(), 0, -1, 0, 0, 0, 0);
450*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
451*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
452*35238bceSAndroid Build Coastguard Worker 
453*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
454*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
455*35238bceSAndroid Build Coastguard Worker     });
456*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(validate_program, "Invalid glValidateProgram() usage", {
457*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
458*35238bceSAndroid Build Coastguard Worker 
459*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
460*35238bceSAndroid Build Coastguard Worker         glValidateProgram(-1);
461*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
462*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
463*35238bceSAndroid Build Coastguard Worker 
464*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
465*35238bceSAndroid Build Coastguard Worker         glValidateProgram(shader);
466*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
467*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
468*35238bceSAndroid Build Coastguard Worker 
469*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
470*35238bceSAndroid Build Coastguard Worker     });
471*35238bceSAndroid Build Coastguard Worker 
472*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(release_shader_compiler, "Invalid glReleaseShaderCompiler() usage", {
473*35238bceSAndroid Build Coastguard Worker         GLboolean shaderCompilerSupported;
474*35238bceSAndroid Build Coastguard Worker         glGetBooleanv(GL_SHADER_COMPILER, &shaderCompilerSupported);
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a shader compiler is not supported.");
477*35238bceSAndroid Build Coastguard Worker         glReleaseShaderCompiler();
478*35238bceSAndroid Build Coastguard Worker         expectError(shaderCompilerSupported ? GL_NONE : GL_INVALID_OPERATION);
479*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
480*35238bceSAndroid Build Coastguard Worker     });
481*35238bceSAndroid Build Coastguard Worker 
482*35238bceSAndroid Build Coastguard Worker     // glUniform*f
483*35238bceSAndroid Build Coastguard Worker 
484*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformf_invalid_program, "Invalid glUniform{1234}f() usage", {
485*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
486*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
487*35238bceSAndroid Build Coastguard Worker         glUniform1f(-1, 0.0f);
488*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
489*35238bceSAndroid Build Coastguard Worker         glUniform2f(-1, 0.0f, 0.0f);
490*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
491*35238bceSAndroid Build Coastguard Worker         glUniform3f(-1, 0.0f, 0.0f, 0.0f);
492*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
493*35238bceSAndroid Build Coastguard Worker         glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
494*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
495*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
496*35238bceSAndroid Build Coastguard Worker     });
497*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformf_incompatible_type, "Invalid glUniform{1234}f() usage", {
498*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
499*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
500*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
501*35238bceSAndroid Build Coastguard Worker         GLint vUnif    = glGetUniformLocation(program.getProgram(), "vTest");    // vec4
502*35238bceSAndroid Build Coastguard Worker         GLint fUnif    = glGetUniformLocation(program.getProgram(), "fTest");    // ivec4
503*35238bceSAndroid Build Coastguard Worker         GLint fSampler = glGetUniformLocation(program.getProgram(), "fSampler"); // sampler2D
504*35238bceSAndroid Build Coastguard Worker 
505*35238bceSAndroid Build Coastguard Worker         if (vUnif == -1 || fUnif == -1 || fSampler == -1)
506*35238bceSAndroid Build Coastguard Worker         {
507*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
508*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
509*35238bceSAndroid Build Coastguard Worker         }
510*35238bceSAndroid Build Coastguard Worker 
511*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
512*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
513*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
514*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
515*35238bceSAndroid Build Coastguard Worker         glUniform1f(vUnif, 0.0f);
516*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
517*35238bceSAndroid Build Coastguard Worker         glUniform2f(vUnif, 0.0f, 0.0f);
518*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
519*35238bceSAndroid Build Coastguard Worker         glUniform3f(vUnif, 0.0f, 0.0f, 0.0f);
520*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
521*35238bceSAndroid Build Coastguard Worker         glUniform4f(vUnif, 0.0f, 0.0f, 0.0f, 0.0f);
522*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
523*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
524*35238bceSAndroid Build Coastguard Worker 
525*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
526*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if one of the floating-point variants of this function is used to "
527*35238bceSAndroid Build Coastguard Worker                 "load a uniform variable of type int, ivec2, ivec3, or ivec4.");
528*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
529*35238bceSAndroid Build Coastguard Worker         glUniform4f(fUnif, 0.0f, 0.0f, 0.0f, 0.0f);
530*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
531*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
532*35238bceSAndroid Build Coastguard Worker 
533*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
534*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
535*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
536*35238bceSAndroid Build Coastguard Worker         glUniform1f(fSampler, 0.0f);
537*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
538*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
539*35238bceSAndroid Build Coastguard Worker 
540*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
541*35238bceSAndroid Build Coastguard Worker     });
542*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformf_invalid_location, "Invalid glUniform{1234}f() usage", {
543*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
544*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
545*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
546*35238bceSAndroid Build Coastguard Worker 
547*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
548*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
549*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
550*35238bceSAndroid Build Coastguard Worker         glUniform1f(-2, 0.0f);
551*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
552*35238bceSAndroid Build Coastguard Worker         glUniform2f(-2, 0.0f, 0.0f);
553*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
554*35238bceSAndroid Build Coastguard Worker         glUniform3f(-2, 0.0f, 0.0f, 0.0f);
555*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
556*35238bceSAndroid Build Coastguard Worker         glUniform4f(-2, 0.0f, 0.0f, 0.0f, 0.0f);
557*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
558*35238bceSAndroid Build Coastguard Worker 
559*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
560*35238bceSAndroid Build Coastguard Worker         glUniform1f(-1, 0.0f);
561*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
562*35238bceSAndroid Build Coastguard Worker         glUniform2f(-1, 0.0f, 0.0f);
563*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
564*35238bceSAndroid Build Coastguard Worker         glUniform3f(-1, 0.0f, 0.0f, 0.0f);
565*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
566*35238bceSAndroid Build Coastguard Worker         glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
567*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
568*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
571*35238bceSAndroid Build Coastguard Worker     });
572*35238bceSAndroid Build Coastguard Worker 
573*35238bceSAndroid Build Coastguard Worker     // glUniform*fv
574*35238bceSAndroid Build Coastguard Worker 
575*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformfv_invalid_program, "Invalid glUniform{1234}fv() usage", {
576*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(4);
577*35238bceSAndroid Build Coastguard Worker 
578*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
579*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
580*35238bceSAndroid Build Coastguard Worker         glUniform1fv(-1, 1, &data[0]);
581*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
582*35238bceSAndroid Build Coastguard Worker         glUniform2fv(-1, 1, &data[0]);
583*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
584*35238bceSAndroid Build Coastguard Worker         glUniform3fv(-1, 1, &data[0]);
585*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
586*35238bceSAndroid Build Coastguard Worker         glUniform4fv(-1, 1, &data[0]);
587*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
588*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
589*35238bceSAndroid Build Coastguard Worker     });
590*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformfv_incompatible_type, "Invalid glUniform{1234}fv() usage", {
591*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
592*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
593*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
594*35238bceSAndroid Build Coastguard Worker         GLint vUnif    = glGetUniformLocation(program.getProgram(), "vTest");    // vec4
595*35238bceSAndroid Build Coastguard Worker         GLint fUnif    = glGetUniformLocation(program.getProgram(), "fTest");    // ivec4
596*35238bceSAndroid Build Coastguard Worker         GLint fSampler = glGetUniformLocation(program.getProgram(), "fSampler"); // sampler2D
597*35238bceSAndroid Build Coastguard Worker 
598*35238bceSAndroid Build Coastguard Worker         if (vUnif == -1 || fUnif == -1 || fSampler == -1)
599*35238bceSAndroid Build Coastguard Worker         {
600*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
601*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
602*35238bceSAndroid Build Coastguard Worker         }
603*35238bceSAndroid Build Coastguard Worker 
604*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(4);
605*35238bceSAndroid Build Coastguard Worker 
606*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
607*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
608*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
609*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
610*35238bceSAndroid Build Coastguard Worker         glUniform1fv(vUnif, 1, &data[0]);
611*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
612*35238bceSAndroid Build Coastguard Worker         glUniform2fv(vUnif, 1, &data[0]);
613*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
614*35238bceSAndroid Build Coastguard Worker         glUniform3fv(vUnif, 1, &data[0]);
615*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
616*35238bceSAndroid Build Coastguard Worker         glUniform4fv(vUnif, 1, &data[0]);
617*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
618*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
619*35238bceSAndroid Build Coastguard Worker 
620*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
621*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if one of the floating-point variants of this function is used to "
622*35238bceSAndroid Build Coastguard Worker                 "load a uniform variable of type int, ivec2, ivec3, or ivec4.");
623*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
624*35238bceSAndroid Build Coastguard Worker         glUniform4fv(fUnif, 1, &data[0]);
625*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
626*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
627*35238bceSAndroid Build Coastguard Worker 
628*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
629*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
630*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
631*35238bceSAndroid Build Coastguard Worker         glUniform1fv(fSampler, 1, &data[0]);
632*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
633*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
634*35238bceSAndroid Build Coastguard Worker 
635*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
636*35238bceSAndroid Build Coastguard Worker     });
637*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformfv_invalid_location, "Invalid glUniform{1234}fv() usage", {
638*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
639*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
640*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
641*35238bceSAndroid Build Coastguard Worker 
642*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(4);
643*35238bceSAndroid Build Coastguard Worker 
644*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
645*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
646*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
647*35238bceSAndroid Build Coastguard Worker         glUniform1fv(-2, 1, &data[0]);
648*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
649*35238bceSAndroid Build Coastguard Worker         glUniform2fv(-2, 1, &data[0]);
650*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
651*35238bceSAndroid Build Coastguard Worker         glUniform3fv(-2, 1, &data[0]);
652*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
653*35238bceSAndroid Build Coastguard Worker         glUniform4fv(-2, 1, &data[0]);
654*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
655*35238bceSAndroid Build Coastguard Worker 
656*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
657*35238bceSAndroid Build Coastguard Worker         glUniform1fv(-1, 1, &data[0]);
658*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
659*35238bceSAndroid Build Coastguard Worker         glUniform2fv(-1, 1, &data[0]);
660*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
661*35238bceSAndroid Build Coastguard Worker         glUniform3fv(-1, 1, &data[0]);
662*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
663*35238bceSAndroid Build Coastguard Worker         glUniform4fv(-1, 1, &data[0]);
664*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
665*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
666*35238bceSAndroid Build Coastguard Worker 
667*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
668*35238bceSAndroid Build Coastguard Worker     });
669*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformfv_invalid_count, "Invalid glUniform{1234}fv() usage", {
670*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
671*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
672*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
673*35238bceSAndroid Build Coastguard Worker         GLint vUnif = glGetUniformLocation(program.getProgram(), "vTest"); // vec4
674*35238bceSAndroid Build Coastguard Worker 
675*35238bceSAndroid Build Coastguard Worker         if (vUnif == -1)
676*35238bceSAndroid Build Coastguard Worker         {
677*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
678*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
679*35238bceSAndroid Build Coastguard Worker         }
680*35238bceSAndroid Build Coastguard Worker 
681*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(8);
682*35238bceSAndroid Build Coastguard Worker 
683*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if count is greater than 1 and the "
684*35238bceSAndroid Build Coastguard Worker                                            "indicated uniform variable is not an array variable.");
685*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
686*35238bceSAndroid Build Coastguard Worker         glUniform1fv(vUnif, 2, &data[0]);
687*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
688*35238bceSAndroid Build Coastguard Worker         glUniform2fv(vUnif, 2, &data[0]);
689*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
690*35238bceSAndroid Build Coastguard Worker         glUniform3fv(vUnif, 2, &data[0]);
691*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
692*35238bceSAndroid Build Coastguard Worker         glUniform4fv(vUnif, 2, &data[0]);
693*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
694*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
695*35238bceSAndroid Build Coastguard Worker 
696*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
697*35238bceSAndroid Build Coastguard Worker     });
698*35238bceSAndroid Build Coastguard Worker 
699*35238bceSAndroid Build Coastguard Worker     // glUniform*i
700*35238bceSAndroid Build Coastguard Worker 
701*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformi_invalid_program, "Invalid glUniform{1234}i() usage", {
702*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
703*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
704*35238bceSAndroid Build Coastguard Worker         glUniform1i(-1, 0);
705*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
706*35238bceSAndroid Build Coastguard Worker         glUniform2i(-1, 0, 0);
707*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
708*35238bceSAndroid Build Coastguard Worker         glUniform3i(-1, 0, 0, 0);
709*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
710*35238bceSAndroid Build Coastguard Worker         glUniform4i(-1, 0, 0, 0, 0);
711*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
712*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
713*35238bceSAndroid Build Coastguard Worker     });
714*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformi_incompatible_type, "Invalid glUniform{1234}i() usage", {
715*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
716*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
717*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
718*35238bceSAndroid Build Coastguard Worker         GLint vUnif    = glGetUniformLocation(program.getProgram(), "vTest");    // vec4
719*35238bceSAndroid Build Coastguard Worker         GLint fUnif    = glGetUniformLocation(program.getProgram(), "fTest");    // ivec4
720*35238bceSAndroid Build Coastguard Worker         GLint fSampler = glGetUniformLocation(program.getProgram(), "fSampler"); // sampler2D
721*35238bceSAndroid Build Coastguard Worker 
722*35238bceSAndroid Build Coastguard Worker         if (vUnif == -1 || fUnif == -1 || fSampler == -1)
723*35238bceSAndroid Build Coastguard Worker         {
724*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
725*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
726*35238bceSAndroid Build Coastguard Worker         }
727*35238bceSAndroid Build Coastguard Worker 
728*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
729*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
730*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
731*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
732*35238bceSAndroid Build Coastguard Worker         glUniform1i(fUnif, 0);
733*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
734*35238bceSAndroid Build Coastguard Worker         glUniform2i(fUnif, 0, 0);
735*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
736*35238bceSAndroid Build Coastguard Worker         glUniform3i(fUnif, 0, 0, 0);
737*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
738*35238bceSAndroid Build Coastguard Worker         glUniform4i(fUnif, 0, 0, 0, 0);
739*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
740*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
741*35238bceSAndroid Build Coastguard Worker 
742*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
743*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if one of the integer variants of this function is used to load a "
744*35238bceSAndroid Build Coastguard Worker                 "uniform variable of type float, vec2, vec3, or vec4.");
745*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
746*35238bceSAndroid Build Coastguard Worker         glUniform4i(vUnif, 0, 0, 0, 0);
747*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
748*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
749*35238bceSAndroid Build Coastguard Worker 
750*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
751*35238bceSAndroid Build Coastguard Worker     });
752*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformi_invalid_location, "Invalid glUniform{1234}i() usage", {
753*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
754*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
755*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
756*35238bceSAndroid Build Coastguard Worker 
757*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
758*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
759*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
760*35238bceSAndroid Build Coastguard Worker         glUniform1i(-2, 0);
761*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
762*35238bceSAndroid Build Coastguard Worker         glUniform2i(-2, 0, 0);
763*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
764*35238bceSAndroid Build Coastguard Worker         glUniform3i(-2, 0, 0, 0);
765*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
766*35238bceSAndroid Build Coastguard Worker         glUniform4i(-2, 0, 0, 0, 0);
767*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
768*35238bceSAndroid Build Coastguard Worker 
769*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
770*35238bceSAndroid Build Coastguard Worker         glUniform1i(-1, 0);
771*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
772*35238bceSAndroid Build Coastguard Worker         glUniform2i(-1, 0, 0);
773*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
774*35238bceSAndroid Build Coastguard Worker         glUniform3i(-1, 0, 0, 0);
775*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
776*35238bceSAndroid Build Coastguard Worker         glUniform4i(-1, 0, 0, 0, 0);
777*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
778*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
779*35238bceSAndroid Build Coastguard Worker 
780*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
781*35238bceSAndroid Build Coastguard Worker     });
782*35238bceSAndroid Build Coastguard Worker 
783*35238bceSAndroid Build Coastguard Worker     // glUniform*iv
784*35238bceSAndroid Build Coastguard Worker 
785*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformiv_invalid_program, "Invalid glUniform{1234}iv() usage", {
786*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(4);
787*35238bceSAndroid Build Coastguard Worker 
788*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
789*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
790*35238bceSAndroid Build Coastguard Worker         glUniform1iv(-1, 1, &data[0]);
791*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
792*35238bceSAndroid Build Coastguard Worker         glUniform2iv(-1, 1, &data[0]);
793*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
794*35238bceSAndroid Build Coastguard Worker         glUniform3iv(-1, 1, &data[0]);
795*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
796*35238bceSAndroid Build Coastguard Worker         glUniform4iv(-1, 1, &data[0]);
797*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
798*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
799*35238bceSAndroid Build Coastguard Worker     });
800*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformiv_incompatible_type, "Invalid glUniform{1234}iv() usage", {
801*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
802*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
803*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
804*35238bceSAndroid Build Coastguard Worker         GLint vUnif    = glGetUniformLocation(program.getProgram(), "vTest");    // vec4
805*35238bceSAndroid Build Coastguard Worker         GLint fUnif    = glGetUniformLocation(program.getProgram(), "fTest");    // ivec4
806*35238bceSAndroid Build Coastguard Worker         GLint fSampler = glGetUniformLocation(program.getProgram(), "fSampler"); // sampler2D
807*35238bceSAndroid Build Coastguard Worker 
808*35238bceSAndroid Build Coastguard Worker         if (vUnif == -1 || fUnif == -1 || fSampler == -1)
809*35238bceSAndroid Build Coastguard Worker         {
810*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
811*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
812*35238bceSAndroid Build Coastguard Worker         }
813*35238bceSAndroid Build Coastguard Worker 
814*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(4);
815*35238bceSAndroid Build Coastguard Worker 
816*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
817*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
818*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
819*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
820*35238bceSAndroid Build Coastguard Worker         glUniform1iv(fUnif, 1, &data[0]);
821*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
822*35238bceSAndroid Build Coastguard Worker         glUniform2iv(fUnif, 1, &data[0]);
823*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
824*35238bceSAndroid Build Coastguard Worker         glUniform3iv(fUnif, 1, &data[0]);
825*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
826*35238bceSAndroid Build Coastguard Worker         glUniform4iv(fUnif, 1, &data[0]);
827*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
828*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
829*35238bceSAndroid Build Coastguard Worker 
830*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
831*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if one of the integer variants of this function is used to load a "
832*35238bceSAndroid Build Coastguard Worker                 "uniform variable of type float, vec2, vec3, or vec4.");
833*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
834*35238bceSAndroid Build Coastguard Worker         glUniform4iv(vUnif, 1, &data[0]);
835*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
836*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
837*35238bceSAndroid Build Coastguard Worker 
838*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
839*35238bceSAndroid Build Coastguard Worker     });
840*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformiv_invalid_location, "Invalid glUniform{1234}iv() usage", {
841*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
842*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
843*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
844*35238bceSAndroid Build Coastguard Worker 
845*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(4);
846*35238bceSAndroid Build Coastguard Worker 
847*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
848*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
849*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
850*35238bceSAndroid Build Coastguard Worker         glUniform1iv(-2, 1, &data[0]);
851*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
852*35238bceSAndroid Build Coastguard Worker         glUniform2iv(-2, 1, &data[0]);
853*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
854*35238bceSAndroid Build Coastguard Worker         glUniform3iv(-2, 1, &data[0]);
855*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
856*35238bceSAndroid Build Coastguard Worker         glUniform4iv(-2, 1, &data[0]);
857*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
858*35238bceSAndroid Build Coastguard Worker 
859*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
860*35238bceSAndroid Build Coastguard Worker         glUniform1iv(-1, 1, &data[0]);
861*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
862*35238bceSAndroid Build Coastguard Worker         glUniform2iv(-1, 1, &data[0]);
863*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
864*35238bceSAndroid Build Coastguard Worker         glUniform3iv(-1, 1, &data[0]);
865*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
866*35238bceSAndroid Build Coastguard Worker         glUniform4iv(-1, 1, &data[0]);
867*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
868*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
869*35238bceSAndroid Build Coastguard Worker 
870*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
871*35238bceSAndroid Build Coastguard Worker     });
872*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniformiv_invalid_count, "Invalid glUniform{1234}iv() usage", {
873*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
874*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
875*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
876*35238bceSAndroid Build Coastguard Worker         GLint fUnif = glGetUniformLocation(program.getProgram(), "fTest"); // ivec4
877*35238bceSAndroid Build Coastguard Worker 
878*35238bceSAndroid Build Coastguard Worker         if (fUnif == -1)
879*35238bceSAndroid Build Coastguard Worker         {
880*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
881*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
882*35238bceSAndroid Build Coastguard Worker         }
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(8);
885*35238bceSAndroid Build Coastguard Worker 
886*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if count is greater than 1 and the "
887*35238bceSAndroid Build Coastguard Worker                                            "indicated uniform variable is not an array variable.");
888*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
889*35238bceSAndroid Build Coastguard Worker         glUniform1iv(fUnif, 2, &data[0]);
890*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
891*35238bceSAndroid Build Coastguard Worker         glUniform2iv(fUnif, 2, &data[0]);
892*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
893*35238bceSAndroid Build Coastguard Worker         glUniform3iv(fUnif, 2, &data[0]);
894*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
895*35238bceSAndroid Build Coastguard Worker         glUniform4iv(fUnif, 2, &data[0]);
896*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
897*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
898*35238bceSAndroid Build Coastguard Worker 
899*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
900*35238bceSAndroid Build Coastguard Worker     });
901*35238bceSAndroid Build Coastguard Worker 
902*35238bceSAndroid Build Coastguard Worker     // glUniformMatrix*fv
903*35238bceSAndroid Build Coastguard Worker 
904*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniform_matrixfv_invalid_program, "Invalid glUniformMatrix{234}fv() usage", {
905*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(16);
906*35238bceSAndroid Build Coastguard Worker 
907*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
908*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
909*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
910*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
911*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
912*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
913*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
914*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
915*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
916*35238bceSAndroid Build Coastguard Worker     });
917*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniform_matrixfv_incompatible_type, "Invalid glUniformMatrix{234}fv() usage", {
918*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
919*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
920*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
921*35238bceSAndroid Build Coastguard Worker         GLint vMatUnif     = glGetUniformLocation(program.getProgram(), "vMatrix");  // mat4
922*35238bceSAndroid Build Coastguard Worker         GLint fSamplerUnif = glGetUniformLocation(program.getProgram(), "fSampler"); // sampler2D
923*35238bceSAndroid Build Coastguard Worker 
924*35238bceSAndroid Build Coastguard Worker         m_log << program;
925*35238bceSAndroid Build Coastguard Worker 
926*35238bceSAndroid Build Coastguard Worker         if (vMatUnif == -1 || fSamplerUnif == -1)
927*35238bceSAndroid Build Coastguard Worker         {
928*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
929*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
930*35238bceSAndroid Build Coastguard Worker         }
931*35238bceSAndroid Build Coastguard Worker 
932*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(16);
933*35238bceSAndroid Build Coastguard Worker 
934*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
935*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
936*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
937*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
938*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(vMatUnif, 1, GL_FALSE, &data[0]);
939*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
940*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(vMatUnif, 1, GL_FALSE, &data[0]);
941*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
942*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(vMatUnif, 1, GL_FALSE, &data[0]);
943*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
944*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
945*35238bceSAndroid Build Coastguard Worker 
946*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
947*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
948*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
949*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(fSamplerUnif, 1, GL_FALSE, &data[0]);
950*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
951*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
952*35238bceSAndroid Build Coastguard Worker 
953*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
954*35238bceSAndroid Build Coastguard Worker     });
955*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniform_matrixfv_invalid_location, "Invalid glUniformMatrix{234}fv() usage", {
956*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
957*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
958*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
959*35238bceSAndroid Build Coastguard Worker 
960*35238bceSAndroid Build Coastguard Worker         m_log << program;
961*35238bceSAndroid Build Coastguard Worker 
962*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(16);
963*35238bceSAndroid Build Coastguard Worker 
964*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
965*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
966*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
967*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(-2, 1, GL_FALSE, &data[0]);
968*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
969*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(-2, 1, GL_FALSE, &data[0]);
970*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
971*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(-2, 1, GL_FALSE, &data[0]);
972*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
973*35238bceSAndroid Build Coastguard Worker 
974*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
975*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
976*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
977*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
978*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
979*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
980*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
981*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
982*35238bceSAndroid Build Coastguard Worker 
983*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
984*35238bceSAndroid Build Coastguard Worker     });
985*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniform_matrixfv_invalid_count, "Invalid glUniformMatrix{234}fv() usage", {
986*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
987*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
988*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
989*35238bceSAndroid Build Coastguard Worker         GLint vMatUnif = glGetUniformLocation(program.getProgram(), "vMatrix"); // mat4
990*35238bceSAndroid Build Coastguard Worker 
991*35238bceSAndroid Build Coastguard Worker         m_log << program;
992*35238bceSAndroid Build Coastguard Worker 
993*35238bceSAndroid Build Coastguard Worker         if (vMatUnif == -1)
994*35238bceSAndroid Build Coastguard Worker         {
995*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
996*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
997*35238bceSAndroid Build Coastguard Worker         }
998*35238bceSAndroid Build Coastguard Worker 
999*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(32);
1000*35238bceSAndroid Build Coastguard Worker 
1001*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if count is greater than 1 and the "
1002*35238bceSAndroid Build Coastguard Worker                                            "indicated uniform variable is not an array variable.");
1003*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1004*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(vMatUnif, 2, GL_FALSE, &data[0]);
1005*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1006*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(vMatUnif, 2, GL_FALSE, &data[0]);
1007*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1008*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(vMatUnif, 2, GL_FALSE, &data[0]);
1009*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1010*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1011*35238bceSAndroid Build Coastguard Worker 
1012*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1013*35238bceSAndroid Build Coastguard Worker     });
1014*35238bceSAndroid Build Coastguard Worker     ES2F_ADD_API_CASE(uniform_matrixfv_invalid_transpose, "Invalid glUniformMatrix{234}fv() usage", {
1015*35238bceSAndroid Build Coastguard Worker         if (de::beginsWith((const char *)glGetString(GL_VERSION), "OpenGL ES 2.0 "))
1016*35238bceSAndroid Build Coastguard Worker         {
1017*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(m_context.getRenderContext().getType().getMajorVersion() < 3);
1018*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(m_context.getRenderContext().getType().getMinorVersion() == 0);
1019*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(m_context.getRenderContext().getType().getProfile() == glu::PROFILE_ES);
1020*35238bceSAndroid Build Coastguard Worker 
1021*35238bceSAndroid Build Coastguard Worker             glu::ShaderProgram program(m_context.getRenderContext(),
1022*35238bceSAndroid Build Coastguard Worker                                        glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1023*35238bceSAndroid Build Coastguard Worker             glUseProgram(program.getProgram());
1024*35238bceSAndroid Build Coastguard Worker 
1025*35238bceSAndroid Build Coastguard Worker             m_log << program;
1026*35238bceSAndroid Build Coastguard Worker 
1027*35238bceSAndroid Build Coastguard Worker             std::vector<GLfloat> data(16);
1028*35238bceSAndroid Build Coastguard Worker 
1029*35238bceSAndroid Build Coastguard Worker             m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if transpose is not GL_FALSE.");
1030*35238bceSAndroid Build Coastguard Worker             glUseProgram(program.getProgram());
1031*35238bceSAndroid Build Coastguard Worker             glUniformMatrix2fv(0, 1, GL_TRUE, &data[0]);
1032*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
1033*35238bceSAndroid Build Coastguard Worker             glUniformMatrix3fv(0, 1, GL_TRUE, &data[0]);
1034*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
1035*35238bceSAndroid Build Coastguard Worker             glUniformMatrix4fv(0, 1, GL_TRUE, &data[0]);
1036*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
1037*35238bceSAndroid Build Coastguard Worker             m_log << tcu::TestLog::EndSection;
1038*35238bceSAndroid Build Coastguard Worker 
1039*35238bceSAndroid Build Coastguard Worker             glUseProgram(0);
1040*35238bceSAndroid Build Coastguard Worker         }
1041*35238bceSAndroid Build Coastguard Worker     });
1042*35238bceSAndroid Build Coastguard Worker }
1043*35238bceSAndroid Build Coastguard Worker 
1044*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1045*35238bceSAndroid Build Coastguard Worker } // namespace gles2
1046*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1047