xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fNegativeShaderApiTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.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 "es3fNegativeShaderApiTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es3fApiCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deUniquePtr.hpp"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker namespace deqp
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker namespace gles3
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace Functional
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
43*35238bceSAndroid Build Coastguard Worker 
44*35238bceSAndroid Build Coastguard Worker static const char *vertexShaderSource = "#version 300 es\n"
45*35238bceSAndroid Build Coastguard Worker                                         "void main (void)\n"
46*35238bceSAndroid Build Coastguard Worker                                         "{\n"
47*35238bceSAndroid Build Coastguard Worker                                         "    gl_Position = vec4(0.0);\n"
48*35238bceSAndroid Build Coastguard Worker                                         "}\n\0";
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker static const char *fragmentShaderSource = "#version 300 es\n"
51*35238bceSAndroid Build Coastguard Worker                                           "layout(location = 0) out mediump vec4 fragColor;"
52*35238bceSAndroid Build Coastguard Worker                                           "void main (void)\n"
53*35238bceSAndroid Build Coastguard Worker                                           "{\n"
54*35238bceSAndroid Build Coastguard Worker                                           "    fragColor = vec4(0.0);\n"
55*35238bceSAndroid Build Coastguard Worker                                           "}\n\0";
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker static const char *uniformTestVertSource = "#version 300 es\n"
58*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump vec4 vec4_v;\n"
59*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump mat4 mat4_v;\n"
60*35238bceSAndroid Build Coastguard Worker                                            "void main (void)\n"
61*35238bceSAndroid Build Coastguard Worker                                            "{\n"
62*35238bceSAndroid Build Coastguard Worker                                            "    gl_Position = mat4_v * vec4_v;\n"
63*35238bceSAndroid Build Coastguard Worker                                            "}\n\0";
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker static const char *uniformTestFragSource = "#version 300 es\n"
66*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump ivec4 ivec4_f;\n"
67*35238bceSAndroid Build Coastguard Worker                                            "uniform mediump uvec4 uvec4_f;\n"
68*35238bceSAndroid Build Coastguard Worker                                            "uniform sampler2D sampler_f;\n"
69*35238bceSAndroid Build Coastguard Worker                                            "layout(location = 0) out mediump vec4 fragColor;"
70*35238bceSAndroid Build Coastguard Worker                                            "void main (void)\n"
71*35238bceSAndroid Build Coastguard Worker                                            "{\n"
72*35238bceSAndroid Build Coastguard Worker                                            "    fragColor.xy = (vec4(uvec4_f) + vec4(ivec4_f)).xy;\n"
73*35238bceSAndroid Build Coastguard Worker                                            "    fragColor.zw = texture(sampler_f, vec2(0.0, 0.0)).zw;\n"
74*35238bceSAndroid Build Coastguard Worker                                            "}\n\0";
75*35238bceSAndroid Build Coastguard Worker 
76*35238bceSAndroid Build Coastguard Worker static const char *uniformBlockVertSource = "#version 300 es\n"
77*35238bceSAndroid Build Coastguard Worker                                             "layout(shared) uniform Block { lowp float var; };\n"
78*35238bceSAndroid Build Coastguard Worker                                             "void main (void)\n"
79*35238bceSAndroid Build Coastguard Worker                                             "{\n"
80*35238bceSAndroid Build Coastguard Worker                                             "    gl_Position = vec4(var);\n"
81*35238bceSAndroid Build Coastguard Worker                                             "}\n\0";
82*35238bceSAndroid Build Coastguard Worker 
NegativeShaderApiTests(Context & context)83*35238bceSAndroid Build Coastguard Worker NegativeShaderApiTests::NegativeShaderApiTests(Context &context)
84*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "shader", "Negative Shader API Cases")
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker }
87*35238bceSAndroid Build Coastguard Worker 
~NegativeShaderApiTests(void)88*35238bceSAndroid Build Coastguard Worker NegativeShaderApiTests::~NegativeShaderApiTests(void)
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker }
91*35238bceSAndroid Build Coastguard Worker 
init(void)92*35238bceSAndroid Build Coastguard Worker void NegativeShaderApiTests::init(void)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker     // Shader control commands
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(create_shader, "Invalid glCreateShader() usage", {
97*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if shaderType is not an accepted value.");
98*35238bceSAndroid Build Coastguard Worker         glCreateShader(-1);
99*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
100*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
101*35238bceSAndroid Build Coastguard Worker     });
102*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(shader_source, "Invalid glShaderSource() usage", {
103*35238bceSAndroid Build Coastguard Worker         // \note Shader compilation must be supported.
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
106*35238bceSAndroid Build Coastguard Worker         glShaderSource(1, 0, 0, 0);
107*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
108*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if count is less than 0.");
111*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
112*35238bceSAndroid Build Coastguard Worker         glShaderSource(shader, -1, 0, 0);
113*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
114*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
117*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
118*35238bceSAndroid Build Coastguard Worker         glShaderSource(program, 0, 0, 0);
119*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
120*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
121*35238bceSAndroid Build Coastguard Worker 
122*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
123*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
124*35238bceSAndroid Build Coastguard Worker     });
125*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(compile_shader, "Invalid glCompileShader() usage", {
126*35238bceSAndroid Build Coastguard Worker         // \note Shader compilation must be supported.
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
129*35238bceSAndroid Build Coastguard Worker         glCompileShader(9);
130*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
131*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
134*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
135*35238bceSAndroid Build Coastguard Worker         glCompileShader(program);
136*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
137*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
140*35238bceSAndroid Build Coastguard Worker     });
141*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(delete_shader, "Invalid glDeleteShader() usage", {
142*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if shader is not a value generated by OpenGL.");
143*35238bceSAndroid Build Coastguard Worker         glDeleteShader(9);
144*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
145*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
146*35238bceSAndroid Build Coastguard Worker     });
147*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(shader_binary, "Invalid glShaderBinary() usage", {
148*35238bceSAndroid Build Coastguard Worker         std::vector<int32_t> binaryFormats;
149*35238bceSAndroid Build Coastguard Worker         getSupportedExtensions(GL_NUM_SHADER_BINARY_FORMATS, GL_SHADER_BINARY_FORMATS, binaryFormats);
150*35238bceSAndroid Build Coastguard Worker         bool shaderBinarySupported = !binaryFormats.empty();
151*35238bceSAndroid Build Coastguard Worker         if (!shaderBinarySupported)
152*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader binaries not supported." << TestLog::EndMessage;
153*35238bceSAndroid Build Coastguard Worker         else
154*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// Shader binaries supported" << TestLog::EndMessage;
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker         GLuint shaders[2];
157*35238bceSAndroid Build Coastguard Worker         shaders[0] = glCreateShader(GL_VERTEX_SHADER);
158*35238bceSAndroid Build Coastguard Worker         shaders[1] = glCreateShader(GL_VERTEX_SHADER);
159*35238bceSAndroid Build Coastguard Worker 
160*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if binaryFormat is not an accepted value.");
161*35238bceSAndroid Build Coastguard Worker         glShaderBinary(1, &shaders[0], -1, 0, 0);
162*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
163*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
164*35238bceSAndroid Build Coastguard Worker 
165*35238bceSAndroid Build Coastguard Worker         if (shaderBinarySupported)
166*35238bceSAndroid Build Coastguard Worker         {
167*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if the data pointed to by binary does not "
168*35238bceSAndroid Build Coastguard Worker                                           "match the format specified by binaryFormat.");
169*35238bceSAndroid Build Coastguard Worker             const GLbyte data = 0x005F;
170*35238bceSAndroid Build Coastguard Worker             glShaderBinary(1, &shaders[0], binaryFormats[0], &data, 1);
171*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_VALUE);
172*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
173*35238bceSAndroid Build Coastguard Worker 
174*35238bceSAndroid Build Coastguard Worker             // Error handling is different in case of SPIRV.
175*35238bceSAndroid Build Coastguard Worker             const bool spirvBinary = binaryFormats[0] == GL_SHADER_BINARY_FORMAT_SPIR_V;
176*35238bceSAndroid Build Coastguard Worker             if (spirvBinary)
177*35238bceSAndroid Build Coastguard Worker                 m_log << TestLog::Section("", "GL_INVALID_VALUE due to invalid data pointer.");
178*35238bceSAndroid Build Coastguard Worker             else
179*35238bceSAndroid Build Coastguard Worker                 m_log << TestLog::Section(
180*35238bceSAndroid Build Coastguard Worker                     "", "GL_INVALID_OPERATION is generated if more than one of the handles in shaders refers to the "
181*35238bceSAndroid Build Coastguard Worker                         "same type of shader, or GL_INVALID_VALUE due to invalid data pointer.");
182*35238bceSAndroid Build Coastguard Worker 
183*35238bceSAndroid Build Coastguard Worker             glShaderBinary(2, &shaders[0], binaryFormats[0], 0, 0);
184*35238bceSAndroid Build Coastguard Worker 
185*35238bceSAndroid Build Coastguard Worker             if (spirvBinary)
186*35238bceSAndroid Build Coastguard Worker                 expectError(GL_INVALID_VALUE);
187*35238bceSAndroid Build Coastguard Worker             else
188*35238bceSAndroid Build Coastguard Worker                 expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
189*35238bceSAndroid Build Coastguard Worker 
190*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
191*35238bceSAndroid Build Coastguard Worker         }
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shaders[0]);
194*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shaders[1]);
195*35238bceSAndroid Build Coastguard Worker     });
196*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(attach_shader, "Invalid glAttachShader() usage", {
197*35238bceSAndroid Build Coastguard Worker         GLuint shader1 = glCreateShader(GL_VERTEX_SHADER);
198*35238bceSAndroid Build Coastguard Worker         GLuint shader2 = glCreateShader(GL_VERTEX_SHADER);
199*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
202*35238bceSAndroid Build Coastguard Worker         glAttachShader(shader1, shader1);
203*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
204*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
207*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, program);
208*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
209*35238bceSAndroid Build Coastguard Worker         glAttachShader(shader1, program);
210*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
211*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
214*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
215*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, -1);
216*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
217*35238bceSAndroid Build Coastguard Worker         glAttachShader(-1, shader1);
218*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
219*35238bceSAndroid Build Coastguard Worker         glAttachShader(-1, -1);
220*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
221*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
222*35238bceSAndroid Build Coastguard Worker 
223*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is already attached to program.");
224*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, shader1);
225*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
226*35238bceSAndroid Build Coastguard Worker         glAttachShader(program, shader1);
227*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
228*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker         if (glu::isContextTypeES(m_context.getRenderContext().getType()))
231*35238bceSAndroid Build Coastguard Worker         {
232*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if a shader of the same type as shader is "
233*35238bceSAndroid Build Coastguard Worker                                           "already attached to program.");
234*35238bceSAndroid Build Coastguard Worker             glAttachShader(program, shader2);
235*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
236*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
237*35238bceSAndroid Build Coastguard Worker         }
238*35238bceSAndroid Build Coastguard Worker 
239*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
240*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader1);
241*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader2);
242*35238bceSAndroid Build Coastguard Worker     });
243*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(detach_shader, "Invalid glDetachShader() usage", {
244*35238bceSAndroid Build Coastguard Worker         GLuint shader  = glCreateShader(GL_VERTEX_SHADER);
245*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
248*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if either program or shader is not a value generated by OpenGL.");
249*35238bceSAndroid Build Coastguard Worker         glDetachShader(-1, shader);
250*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
251*35238bceSAndroid Build Coastguard Worker         glDetachShader(program, -1);
252*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
253*35238bceSAndroid Build Coastguard Worker         glDetachShader(-1, -1);
254*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
255*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
256*35238bceSAndroid Build Coastguard Worker 
257*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
258*35238bceSAndroid Build Coastguard Worker         glDetachShader(shader, shader);
259*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
260*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
261*35238bceSAndroid Build Coastguard Worker 
262*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not a shader object.");
263*35238bceSAndroid Build Coastguard Worker         glDetachShader(program, program);
264*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
265*35238bceSAndroid Build Coastguard Worker         glDetachShader(shader, program);
266*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
267*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if shader is not attached to program.");
270*35238bceSAndroid Build Coastguard Worker         glDetachShader(program, shader);
271*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
272*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
275*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
276*35238bceSAndroid Build Coastguard Worker     });
277*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(link_program, "Invalid glLinkProgram() usage", {
278*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
279*35238bceSAndroid Build Coastguard Worker 
280*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
281*35238bceSAndroid Build Coastguard Worker         glLinkProgram(-1);
282*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
283*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
284*35238bceSAndroid Build Coastguard Worker 
285*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
286*35238bceSAndroid Build Coastguard Worker         glLinkProgram(shader);
287*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
288*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
289*35238bceSAndroid Build Coastguard Worker 
290*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
291*35238bceSAndroid Build Coastguard Worker 
292*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is the currently active program "
293*35238bceSAndroid Build Coastguard Worker                                       "object and transform feedback mode is active.");
294*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
295*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
296*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
297*35238bceSAndroid Build Coastguard Worker         uint32_t tfID;
298*35238bceSAndroid Build Coastguard Worker         const char *tfVarying = "gl_Position";
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(1, &tfID);
301*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
304*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
305*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
306*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
307*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
308*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
309*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
310*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
311*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
312*35238bceSAndroid Build Coastguard Worker 
313*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
314*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
315*35238bceSAndroid Build Coastguard Worker 
316*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
317*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(1, &tfID);
318*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
319*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
320*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
321*35238bceSAndroid Build Coastguard Worker     });
322*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(use_program, "Invalid glUseProgram() usage", {
323*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
326*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if program is neither 0 nor a value generated by OpenGL.");
327*35238bceSAndroid Build Coastguard Worker         glUseProgram(-1);
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_OPERATION is generated if program is not a program object.");
332*35238bceSAndroid Build Coastguard Worker         glUseProgram(shader);
333*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
334*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
335*35238bceSAndroid Build Coastguard Worker 
336*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
337*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if transform feedback mode is active and not paused.");
338*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program1(m_context.getRenderContext(),
339*35238bceSAndroid Build Coastguard Worker                                     glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
340*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program2(m_context.getRenderContext(),
341*35238bceSAndroid Build Coastguard Worker                                     glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
342*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
343*35238bceSAndroid Build Coastguard Worker         uint32_t tfID;
344*35238bceSAndroid Build Coastguard Worker         const char *tfVarying = "gl_Position";
345*35238bceSAndroid Build Coastguard Worker 
346*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(1, &tfID);
347*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker         glUseProgram(program1.getProgram());
350*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program1.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
351*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program1.getProgram());
352*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
353*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
354*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
355*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
356*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
357*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
358*35238bceSAndroid Build Coastguard Worker 
359*35238bceSAndroid Build Coastguard Worker         glUseProgram(program2.getProgram());
360*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
361*35238bceSAndroid Build Coastguard Worker 
362*35238bceSAndroid Build Coastguard Worker         glPauseTransformFeedback();
363*35238bceSAndroid Build Coastguard Worker         glUseProgram(program2.getProgram());
364*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
365*35238bceSAndroid Build Coastguard Worker 
366*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
367*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(1, &tfID);
368*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
369*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
370*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
371*35238bceSAndroid Build Coastguard Worker 
372*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
373*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
374*35238bceSAndroid Build Coastguard Worker     });
375*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(delete_program, "Invalid glDeleteProgram() usage", {
376*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
377*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(-1);
378*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
379*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
380*35238bceSAndroid Build Coastguard Worker     });
381*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(validate_program, "Invalid glValidateProgram() usage", {
382*35238bceSAndroid Build Coastguard Worker         GLuint shader = glCreateShader(GL_VERTEX_SHADER);
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
385*35238bceSAndroid Build Coastguard Worker         glValidateProgram(-1);
386*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
387*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
388*35238bceSAndroid Build Coastguard Worker 
389*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
390*35238bceSAndroid Build Coastguard Worker         glValidateProgram(shader);
391*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
392*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
393*35238bceSAndroid Build Coastguard Worker 
394*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
395*35238bceSAndroid Build Coastguard Worker     });
396*35238bceSAndroid Build Coastguard Worker     if (glu::isContextTypeES(m_context.getRenderContext().getType()))
397*35238bceSAndroid Build Coastguard Worker     {
398*35238bceSAndroid Build Coastguard Worker         ES3F_ADD_API_CASE(get_program_binary, "Invalid glGetProgramBinary() usage", {
399*35238bceSAndroid Build Coastguard Worker             glu::ShaderProgram program(m_context.getRenderContext(),
400*35238bceSAndroid Build Coastguard Worker                                        glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
401*35238bceSAndroid Build Coastguard Worker             glu::ShaderProgram programInvalid(m_context.getRenderContext(),
402*35238bceSAndroid Build Coastguard Worker                                               glu::makeVtxFragSources(vertexShaderSource, ""));
403*35238bceSAndroid Build Coastguard Worker             GLenum binaryFormat  = -1;
404*35238bceSAndroid Build Coastguard Worker             GLsizei binaryLength = -1;
405*35238bceSAndroid Build Coastguard Worker             GLint binaryPtr      = -1;
406*35238bceSAndroid Build Coastguard Worker             GLint bufSize        = -1;
407*35238bceSAndroid Build Coastguard Worker             GLint linkStatus     = -1;
408*35238bceSAndroid Build Coastguard Worker 
409*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if bufSize is less than the size of "
410*35238bceSAndroid Build Coastguard Worker                                           "GL_PROGRAM_BINARY_LENGTH for program.");
411*35238bceSAndroid Build Coastguard Worker             glGetProgramiv(program.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
412*35238bceSAndroid Build Coastguard Worker             expectError(GL_NO_ERROR);
413*35238bceSAndroid Build Coastguard Worker             glGetProgramiv(program.getProgram(), GL_LINK_STATUS, &linkStatus);
414*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
415*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
416*35238bceSAndroid Build Coastguard Worker             expectError(GL_NO_ERROR);
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker             glGetProgramBinary(program.getProgram(), 0, &binaryLength, &binaryFormat, &binaryPtr);
419*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
420*35238bceSAndroid Build Coastguard Worker             if (bufSize > 0)
421*35238bceSAndroid Build Coastguard Worker             {
422*35238bceSAndroid Build Coastguard Worker                 glGetProgramBinary(program.getProgram(), bufSize - 1, &binaryLength, &binaryFormat, &binaryPtr);
423*35238bceSAndroid Build Coastguard Worker                 expectError(GL_INVALID_OPERATION);
424*35238bceSAndroid Build Coastguard Worker             }
425*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
426*35238bceSAndroid Build Coastguard Worker 
427*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section(
428*35238bceSAndroid Build Coastguard Worker                 "", "GL_INVALID_OPERATION is generated if GL_LINK_STATUS for the program object is false.");
429*35238bceSAndroid Build Coastguard Worker             glGetProgramiv(programInvalid.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
430*35238bceSAndroid Build Coastguard Worker             expectError(GL_NO_ERROR);
431*35238bceSAndroid Build Coastguard Worker             glGetProgramiv(programInvalid.getProgram(), GL_LINK_STATUS, &linkStatus);
432*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
433*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
434*35238bceSAndroid Build Coastguard Worker             expectError(GL_NO_ERROR);
435*35238bceSAndroid Build Coastguard Worker 
436*35238bceSAndroid Build Coastguard Worker             glGetProgramBinary(programInvalid.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryPtr);
437*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
438*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
439*35238bceSAndroid Build Coastguard Worker         });
440*35238bceSAndroid Build Coastguard Worker     }
441*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(program_binary, "Invalid glProgramBinary() usage", {
442*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram srcProgram(m_context.getRenderContext(),
443*35238bceSAndroid Build Coastguard Worker                                       glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
444*35238bceSAndroid Build Coastguard Worker         GLuint dstProgram    = glCreateProgram();
445*35238bceSAndroid Build Coastguard Worker         GLuint unusedShader  = glCreateShader(GL_VERTEX_SHADER);
446*35238bceSAndroid Build Coastguard Worker         GLenum binaryFormat  = -1;
447*35238bceSAndroid Build Coastguard Worker         GLsizei binaryLength = -1;
448*35238bceSAndroid Build Coastguard Worker         std::vector<uint8_t> binaryBuf;
449*35238bceSAndroid Build Coastguard Worker         GLint bufSize    = -1;
450*35238bceSAndroid Build Coastguard Worker         GLint linkStatus = -1;
451*35238bceSAndroid Build Coastguard Worker 
452*35238bceSAndroid Build Coastguard Worker         glGetProgramiv(srcProgram.getProgram(), GL_PROGRAM_BINARY_LENGTH, &bufSize);
453*35238bceSAndroid Build Coastguard Worker         glGetProgramiv(srcProgram.getProgram(), GL_LINK_STATUS, &linkStatus);
454*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_PROGRAM_BINARY_LENGTH = " << bufSize << TestLog::EndMessage;
455*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_LINK_STATUS = " << linkStatus << TestLog::EndMessage;
456*35238bceSAndroid Build Coastguard Worker 
457*35238bceSAndroid Build Coastguard Worker         TCU_CHECK(bufSize >= 0);
458*35238bceSAndroid Build Coastguard Worker 
459*35238bceSAndroid Build Coastguard Worker         if (bufSize > 0)
460*35238bceSAndroid Build Coastguard Worker         {
461*35238bceSAndroid Build Coastguard Worker             binaryBuf.resize(bufSize);
462*35238bceSAndroid Build Coastguard Worker             glGetProgramBinary(srcProgram.getProgram(), bufSize, &binaryLength, &binaryFormat, &binaryBuf[0]);
463*35238bceSAndroid Build Coastguard Worker             expectError(GL_NO_ERROR);
464*35238bceSAndroid Build Coastguard Worker 
465*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section(
466*35238bceSAndroid Build Coastguard Worker                 "", "GL_INVALID_OPERATION is generated if program is not the name of an existing program object.");
467*35238bceSAndroid Build Coastguard Worker             glProgramBinary(unusedShader, binaryFormat, &binaryBuf[0], binaryLength);
468*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_OPERATION);
469*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
470*35238bceSAndroid Build Coastguard Worker 
471*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Section(
472*35238bceSAndroid Build Coastguard Worker                 "", "GL_INVALID_ENUM is generated if binaryFormat is not a value recognized by the implementation.");
473*35238bceSAndroid Build Coastguard Worker             glProgramBinary(dstProgram, -1, &binaryBuf[0], binaryLength);
474*35238bceSAndroid Build Coastguard Worker             expectError(GL_INVALID_ENUM);
475*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::EndSection;
476*35238bceSAndroid Build Coastguard Worker         }
477*35238bceSAndroid Build Coastguard Worker 
478*35238bceSAndroid Build Coastguard Worker         glDeleteShader(unusedShader);
479*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(dstProgram);
480*35238bceSAndroid Build Coastguard Worker     });
481*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(program_parameteri, "Invalid glProgramParameteri() usage", {
482*35238bceSAndroid Build Coastguard Worker         GLuint program = glCreateProgram();
483*35238bceSAndroid Build Coastguard Worker 
484*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
485*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if program is not the name of an existing program object.");
486*35238bceSAndroid Build Coastguard Worker         glProgramParameteri(0, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
487*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
488*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
489*35238bceSAndroid Build Coastguard Worker 
490*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
491*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_ENUM is generated if pname is not GL_PROGRAM_BINARY_RETRIEVABLE_HINT.");
492*35238bceSAndroid Build Coastguard Worker         glProgramParameteri(program, -1, GL_TRUE);
493*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
494*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
495*35238bceSAndroid Build Coastguard Worker 
496*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if value is not GL_FALSE or GL_TRUE.");
497*35238bceSAndroid Build Coastguard Worker         glProgramParameteri(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, 2);
498*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
499*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
500*35238bceSAndroid Build Coastguard Worker 
501*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
502*35238bceSAndroid Build Coastguard Worker     });
503*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(gen_samplers, "Invalid glGenSamplers() usage", {
504*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
505*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
506*35238bceSAndroid Build Coastguard Worker         glGenSamplers(-1, &sampler);
507*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
508*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
509*35238bceSAndroid Build Coastguard Worker     });
510*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(bind_sampler, "Invalid glBindSampler() usage", {
511*35238bceSAndroid Build Coastguard Worker         int maxTexImageUnits;
512*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
513*35238bceSAndroid Build Coastguard Worker         glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTexImageUnits);
514*35238bceSAndroid Build Coastguard Worker         glGenSamplers(1, &sampler);
515*35238bceSAndroid Build Coastguard Worker 
516*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if unit is greater than or equal to the value of "
517*35238bceSAndroid Build Coastguard Worker                                       "GL_MAX_COMBIED_TEXTURE_IMAGE_UNITS.");
518*35238bceSAndroid Build Coastguard Worker         glBindSampler(maxTexImageUnits, sampler);
519*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
520*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
521*35238bceSAndroid Build Coastguard Worker 
522*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if sampler is not zero or a name previously "
523*35238bceSAndroid Build Coastguard Worker                                       "returned from a call to glGenSamplers.");
524*35238bceSAndroid Build Coastguard Worker         glBindSampler(1, -1);
525*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
526*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
527*35238bceSAndroid Build Coastguard Worker 
528*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
529*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if sampler has been deleted by a call to glDeleteSamplers.");
530*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(1, &sampler);
531*35238bceSAndroid Build Coastguard Worker         glBindSampler(1, sampler);
532*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
533*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
534*35238bceSAndroid Build Coastguard Worker     });
535*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(delete_samplers, "Invalid glDeleteSamplers() usage", {
536*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
537*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(-1, 0);
538*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
539*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
540*35238bceSAndroid Build Coastguard Worker     });
541*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(get_sampler_parameteriv, "Invalid glGetSamplerParameteriv() usage", {
542*35238bceSAndroid Build Coastguard Worker         int params = -1;
543*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
544*35238bceSAndroid Build Coastguard Worker         glGenSamplers(1, &sampler);
545*35238bceSAndroid Build Coastguard Worker 
546*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if sampler is not the name of a sampler "
547*35238bceSAndroid Build Coastguard Worker                                       "object returned from a previous call to glGenSamplers.");
548*35238bceSAndroid Build Coastguard Worker         glGetSamplerParameteriv(-1, GL_TEXTURE_MAG_FILTER, &params);
549*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
550*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
551*35238bceSAndroid Build Coastguard Worker 
552*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
553*35238bceSAndroid Build Coastguard Worker         glGetSamplerParameteriv(sampler, -1, &params);
554*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
555*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(1, &sampler);
558*35238bceSAndroid Build Coastguard Worker     });
559*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(get_sampler_parameterfv, "Invalid glGetSamplerParameterfv() usage", {
560*35238bceSAndroid Build Coastguard Worker         float params = 0.0f;
561*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
562*35238bceSAndroid Build Coastguard Worker         glGenSamplers(1, &sampler);
563*35238bceSAndroid Build Coastguard Worker 
564*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if sampler is not the name of a sampler "
565*35238bceSAndroid Build Coastguard Worker                                       "object returned from a previous call to glGenSamplers.");
566*35238bceSAndroid Build Coastguard Worker         glGetSamplerParameterfv(-1, GL_TEXTURE_MAG_FILTER, &params);
567*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
568*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if pname is not an accepted value.");
571*35238bceSAndroid Build Coastguard Worker         glGetSamplerParameterfv(sampler, -1, &params);
572*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
573*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
574*35238bceSAndroid Build Coastguard Worker 
575*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(1, &sampler);
576*35238bceSAndroid Build Coastguard Worker     });
577*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(sampler_parameteri, "Invalid glSamplerParameteri() usage", {
578*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
579*35238bceSAndroid Build Coastguard Worker         glGenSamplers(1, &sampler);
580*35238bceSAndroid Build Coastguard Worker 
581*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if sampler is not the name of a sampler "
582*35238bceSAndroid Build Coastguard Worker                                       "object previously returned from a call to glGenSamplers.");
583*35238bceSAndroid Build Coastguard Worker         glSamplerParameteri(-1, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
584*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
585*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
586*35238bceSAndroid Build Coastguard Worker 
587*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined constant value "
588*35238bceSAndroid Build Coastguard Worker                                       "(based on the value of pname) and does not.");
589*35238bceSAndroid Build Coastguard Worker         glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, -1);
590*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
591*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
592*35238bceSAndroid Build Coastguard Worker 
593*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(1, &sampler);
594*35238bceSAndroid Build Coastguard Worker     });
595*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(sampler_parameteriv, "Invalid glSamplerParameteriv() usage", {
596*35238bceSAndroid Build Coastguard Worker         int params = -1;
597*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
598*35238bceSAndroid Build Coastguard Worker         glGenSamplers(1, &sampler);
599*35238bceSAndroid Build Coastguard Worker 
600*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if sampler is not the name of a sampler "
601*35238bceSAndroid Build Coastguard Worker                                       "object previously returned from a call to glGenSamplers.");
602*35238bceSAndroid Build Coastguard Worker         params = GL_CLAMP_TO_EDGE;
603*35238bceSAndroid Build Coastguard Worker         glSamplerParameteriv(-1, GL_TEXTURE_WRAP_S, &params);
604*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
605*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
606*35238bceSAndroid Build Coastguard Worker 
607*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined constant value "
608*35238bceSAndroid Build Coastguard Worker                                       "(based on the value of pname) and does not.");
609*35238bceSAndroid Build Coastguard Worker         params = -1;
610*35238bceSAndroid Build Coastguard Worker         glSamplerParameteriv(sampler, GL_TEXTURE_WRAP_S, &params);
611*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
612*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
613*35238bceSAndroid Build Coastguard Worker 
614*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(1, &sampler);
615*35238bceSAndroid Build Coastguard Worker     });
616*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(sampler_parameterf, "Invalid glSamplerParameterf() usage", {
617*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
618*35238bceSAndroid Build Coastguard Worker         glGenSamplers(1, &sampler);
619*35238bceSAndroid Build Coastguard Worker 
620*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if sampler is not the name of a sampler "
621*35238bceSAndroid Build Coastguard Worker                                       "object previously returned from a call to glGenSamplers.");
622*35238bceSAndroid Build Coastguard Worker         glSamplerParameterf(-1, GL_TEXTURE_MIN_LOD, -1000.0f);
623*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
624*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
625*35238bceSAndroid Build Coastguard Worker 
626*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined constant value "
627*35238bceSAndroid Build Coastguard Worker                                       "(based on the value of pname) and does not.");
628*35238bceSAndroid Build Coastguard Worker         glSamplerParameterf(sampler, GL_TEXTURE_WRAP_S, -1.0f);
629*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
630*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
631*35238bceSAndroid Build Coastguard Worker 
632*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(1, &sampler);
633*35238bceSAndroid Build Coastguard Worker     });
634*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(sampler_parameterfv, "Invalid glSamplerParameterfv() usage", {
635*35238bceSAndroid Build Coastguard Worker         float params = 0.0f;
636*35238bceSAndroid Build Coastguard Worker         GLuint sampler;
637*35238bceSAndroid Build Coastguard Worker         glGenSamplers(1, &sampler);
638*35238bceSAndroid Build Coastguard Worker 
639*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if sampler is not the name of a sampler "
640*35238bceSAndroid Build Coastguard Worker                                       "object previously returned from a call to glGenSamplers.");
641*35238bceSAndroid Build Coastguard Worker         params = -1000.0f;
642*35238bceSAndroid Build Coastguard Worker         glSamplerParameterfv(-1, GL_TEXTURE_WRAP_S, &params);
643*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
644*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
645*35238bceSAndroid Build Coastguard Worker 
646*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_ENUM is generated if params should have a defined constant value "
647*35238bceSAndroid Build Coastguard Worker                                       "(based on the value of pname) and does not.");
648*35238bceSAndroid Build Coastguard Worker         params = -1.0f;
649*35238bceSAndroid Build Coastguard Worker         glSamplerParameterfv(sampler, GL_TEXTURE_WRAP_S, &params);
650*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
651*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
652*35238bceSAndroid Build Coastguard Worker 
653*35238bceSAndroid Build Coastguard Worker         glDeleteSamplers(1, &sampler);
654*35238bceSAndroid Build Coastguard Worker     });
655*35238bceSAndroid Build Coastguard Worker 
656*35238bceSAndroid Build Coastguard Worker     // Shader data commands
657*35238bceSAndroid Build Coastguard Worker 
658*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(get_attrib_location, "Invalid glGetAttribLocation() usage", {
659*35238bceSAndroid Build Coastguard Worker         GLuint programEmpty = glCreateProgram();
660*35238bceSAndroid Build Coastguard Worker         GLuint shader       = glCreateShader(GL_VERTEX_SHADER);
661*35238bceSAndroid Build Coastguard Worker 
662*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
663*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
664*35238bceSAndroid Build Coastguard Worker 
665*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
666*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(programEmpty, 0, "test");
667*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(programEmpty, "test");
668*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
669*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
670*35238bceSAndroid Build Coastguard Worker 
671*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a program or shader object.");
672*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
673*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(program.getProgram(), 0, "test");
674*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
675*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(program.getProgram(), "test");
676*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
677*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(-2, "test");
678*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
679*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
680*35238bceSAndroid Build Coastguard Worker 
681*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
682*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(shader, "test");
683*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
684*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
685*35238bceSAndroid Build Coastguard Worker 
686*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
687*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
688*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(programEmpty);
689*35238bceSAndroid Build Coastguard Worker     });
690*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(get_uniform_location, "Invalid glGetUniformLocation() usage", {
691*35238bceSAndroid Build Coastguard Worker         GLuint programEmpty = glCreateProgram();
692*35238bceSAndroid Build Coastguard Worker         GLuint shader       = glCreateShader(GL_VERTEX_SHADER);
693*35238bceSAndroid Build Coastguard Worker 
694*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
695*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
696*35238bceSAndroid Build Coastguard Worker 
697*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program has not been successfully linked.");
698*35238bceSAndroid Build Coastguard Worker         glGetUniformLocation(programEmpty, "test");
699*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
700*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
701*35238bceSAndroid Build Coastguard Worker 
702*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
703*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
704*35238bceSAndroid Build Coastguard Worker         glGetUniformLocation(-2, "test");
705*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
706*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
709*35238bceSAndroid Build Coastguard Worker         glGetAttribLocation(shader, "test");
710*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
711*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
712*35238bceSAndroid Build Coastguard Worker 
713*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
714*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(programEmpty);
715*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
716*35238bceSAndroid Build Coastguard Worker     });
717*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(bind_attrib_location, "Invalid glBindAttribLocation() usage", {
718*35238bceSAndroid Build Coastguard Worker         GLuint program  = glCreateProgram();
719*35238bceSAndroid Build Coastguard Worker         GLuint maxIndex = m_context.getContextInfo().getInt(GL_MAX_VERTEX_ATTRIBS);
720*35238bceSAndroid Build Coastguard Worker         GLuint shader   = glCreateShader(GL_VERTEX_SHADER);
721*35238bceSAndroid Build Coastguard Worker 
722*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section(
723*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if index is greater than or equal to GL_MAX_VERTEX_ATTRIBS.");
724*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(program, maxIndex, "test");
725*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
726*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
727*35238bceSAndroid Build Coastguard Worker 
728*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("",
729*35238bceSAndroid Build Coastguard Worker                                   "GL_INVALID_OPERATION is generated if name starts with the reserved prefix \"gl_\".");
730*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(program, maxIndex - 1, "gl_test");
731*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
732*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
733*35238bceSAndroid Build Coastguard Worker 
734*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_VALUE is generated if program is not a value generated by OpenGL.");
735*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(-1, maxIndex - 1, "test");
736*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
737*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
738*35238bceSAndroid Build Coastguard Worker 
739*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Section("", "GL_INVALID_OPERATION is generated if program is not a program object.");
740*35238bceSAndroid Build Coastguard Worker         glBindAttribLocation(shader, maxIndex - 1, "test");
741*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
742*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::EndSection;
743*35238bceSAndroid Build Coastguard Worker 
744*35238bceSAndroid Build Coastguard Worker         glDeleteProgram(program);
745*35238bceSAndroid Build Coastguard Worker         glDeleteShader(shader);
746*35238bceSAndroid Build Coastguard Worker     });
747*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniform_block_binding, "Invalid glUniformBlockBinding() usage", {
748*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
749*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformBlockVertSource, uniformTestFragSource));
750*35238bceSAndroid Build Coastguard Worker 
751*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
752*35238bceSAndroid Build Coastguard Worker 
753*35238bceSAndroid Build Coastguard Worker         GLint maxUniformBufferBindings;
754*35238bceSAndroid Build Coastguard Worker         GLint numActiveUniforms = -1;
755*35238bceSAndroid Build Coastguard Worker         GLint numActiveBlocks   = -1;
756*35238bceSAndroid Build Coastguard Worker         glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferBindings);
757*35238bceSAndroid Build Coastguard Worker         glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORMS, &numActiveUniforms);
758*35238bceSAndroid Build Coastguard Worker         glGetProgramiv(program.getProgram(), GL_ACTIVE_UNIFORM_BLOCKS, &numActiveBlocks);
759*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_MAX_UNIFORM_BUFFER_BINDINGS = " << maxUniformBufferBindings
760*35238bceSAndroid Build Coastguard Worker               << TestLog::EndMessage;
761*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_ACTIVE_UNIFORMS = " << numActiveUniforms << TestLog::EndMessage;
762*35238bceSAndroid Build Coastguard Worker         m_log << TestLog::Message << "// GL_ACTIVE_UNIFORM_BLOCKS = " << numActiveBlocks << TestLog::EndMessage;
763*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
764*35238bceSAndroid Build Coastguard Worker 
765*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
766*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if uniformBlockIndex is not an active uniform block index of program.");
767*35238bceSAndroid Build Coastguard Worker         glUniformBlockBinding(program.getProgram(), -1, 0);
768*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
769*35238bceSAndroid Build Coastguard Worker         glUniformBlockBinding(program.getProgram(), 5, 0);
770*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
771*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
772*35238bceSAndroid Build Coastguard Worker 
773*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if uniformBlockBinding is greater than or "
774*35238bceSAndroid Build Coastguard Worker                                            "equal to the value of GL_MAX_UNIFORM_BUFFER_BINDINGS.");
775*35238bceSAndroid Build Coastguard Worker         glUniformBlockBinding(program.getProgram(), maxUniformBufferBindings, 0);
776*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
777*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
778*35238bceSAndroid Build Coastguard Worker 
779*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
780*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_VALUE is generated if program is not the name of a program object generated by the GL.");
781*35238bceSAndroid Build Coastguard Worker         glUniformBlockBinding(-1, 0, 0);
782*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
783*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
784*35238bceSAndroid Build Coastguard Worker     });
785*35238bceSAndroid Build Coastguard Worker 
786*35238bceSAndroid Build Coastguard Worker     // glUniform*f
787*35238bceSAndroid Build Coastguard Worker 
788*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformf_invalid_program, "Invalid glUniform{1234}f() usage", {
789*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
790*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
791*35238bceSAndroid Build Coastguard Worker         glUniform1f(-1, 0.0f);
792*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
793*35238bceSAndroid Build Coastguard Worker         glUniform2f(-1, 0.0f, 0.0f);
794*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
795*35238bceSAndroid Build Coastguard Worker         glUniform3f(-1, 0.0f, 0.0f, 0.0f);
796*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
797*35238bceSAndroid Build Coastguard Worker         glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
798*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
799*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
800*35238bceSAndroid Build Coastguard Worker     });
801*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformf_incompatible_type, "Invalid glUniform{1234}f() usage", {
802*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
803*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
804*35238bceSAndroid Build Coastguard Worker 
805*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
806*35238bceSAndroid Build Coastguard Worker         GLint vec4_v    = glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
807*35238bceSAndroid Build Coastguard Worker         GLint ivec4_f   = glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
808*35238bceSAndroid Build Coastguard Worker         GLint uvec4_f   = glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
809*35238bceSAndroid Build Coastguard Worker         GLint sampler_f = glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
810*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
811*35238bceSAndroid Build Coastguard Worker 
812*35238bceSAndroid Build Coastguard Worker         if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
813*35238bceSAndroid Build Coastguard Worker         {
814*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
815*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
816*35238bceSAndroid Build Coastguard Worker         }
817*35238bceSAndroid Build Coastguard Worker 
818*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
819*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
820*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
821*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
822*35238bceSAndroid Build Coastguard Worker         glUniform1f(vec4_v, 0.0f);
823*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
824*35238bceSAndroid Build Coastguard Worker         glUniform2f(vec4_v, 0.0f, 0.0f);
825*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
826*35238bceSAndroid Build Coastguard Worker         glUniform3f(vec4_v, 0.0f, 0.0f, 0.0f);
827*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
828*35238bceSAndroid Build Coastguard Worker         glUniform4f(vec4_v, 0.0f, 0.0f, 0.0f, 0.0f);
829*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
830*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
831*35238bceSAndroid Build Coastguard Worker 
832*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
833*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if glUniform{1234}f is used to load a uniform variable of type int, "
834*35238bceSAndroid Build Coastguard Worker                 "ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4.");
835*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
836*35238bceSAndroid Build Coastguard Worker         glUniform4f(ivec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
837*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
838*35238bceSAndroid Build Coastguard Worker         glUniform4f(uvec4_f, 0.0f, 0.0f, 0.0f, 0.0f);
839*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
840*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
841*35238bceSAndroid Build Coastguard Worker 
842*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
843*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
844*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
845*35238bceSAndroid Build Coastguard Worker         glUniform1f(sampler_f, 0.0f);
846*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
847*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
848*35238bceSAndroid Build Coastguard Worker 
849*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
850*35238bceSAndroid Build Coastguard Worker     });
851*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformf_invalid_location, "Invalid glUniform{1234}f() usage", {
852*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
853*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
854*35238bceSAndroid Build Coastguard Worker 
855*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
856*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
857*35238bceSAndroid Build Coastguard Worker 
858*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
859*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
860*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
861*35238bceSAndroid Build Coastguard Worker         glUniform1f(-2, 0.0f);
862*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
863*35238bceSAndroid Build Coastguard Worker         glUniform2f(-2, 0.0f, 0.0f);
864*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
865*35238bceSAndroid Build Coastguard Worker         glUniform3f(-2, 0.0f, 0.0f, 0.0f);
866*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
867*35238bceSAndroid Build Coastguard Worker         glUniform4f(-2, 0.0f, 0.0f, 0.0f, 0.0f);
868*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
869*35238bceSAndroid Build Coastguard Worker 
870*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
871*35238bceSAndroid Build Coastguard Worker         glUniform1f(-1, 0.0f);
872*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
873*35238bceSAndroid Build Coastguard Worker         glUniform2f(-1, 0.0f, 0.0f);
874*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
875*35238bceSAndroid Build Coastguard Worker         glUniform3f(-1, 0.0f, 0.0f, 0.0f);
876*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
877*35238bceSAndroid Build Coastguard Worker         glUniform4f(-1, 0.0f, 0.0f, 0.0f, 0.0f);
878*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
879*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
880*35238bceSAndroid Build Coastguard Worker 
881*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
882*35238bceSAndroid Build Coastguard Worker     });
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker     // glUniform*fv
885*35238bceSAndroid Build Coastguard Worker 
886*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformfv_invalid_program, "Invalid glUniform{1234}fv() usage", {
887*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(4);
888*35238bceSAndroid Build Coastguard Worker 
889*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
890*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
891*35238bceSAndroid Build Coastguard Worker         glUniform1fv(-1, 1, &data[0]);
892*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
893*35238bceSAndroid Build Coastguard Worker         glUniform2fv(-1, 1, &data[0]);
894*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
895*35238bceSAndroid Build Coastguard Worker         glUniform3fv(-1, 1, &data[0]);
896*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
897*35238bceSAndroid Build Coastguard Worker         glUniform4fv(-1, 1, &data[0]);
898*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
899*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
900*35238bceSAndroid Build Coastguard Worker     });
901*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformfv_incompatible_type, "Invalid glUniform{1234}fv() usage", {
902*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
903*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
904*35238bceSAndroid Build Coastguard Worker 
905*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
906*35238bceSAndroid Build Coastguard Worker         GLint vec4_v    = glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
907*35238bceSAndroid Build Coastguard Worker         GLint ivec4_f   = glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
908*35238bceSAndroid Build Coastguard Worker         GLint uvec4_f   = glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
909*35238bceSAndroid Build Coastguard Worker         GLint sampler_f = glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
910*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
911*35238bceSAndroid Build Coastguard Worker 
912*35238bceSAndroid Build Coastguard Worker         if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
913*35238bceSAndroid Build Coastguard Worker         {
914*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
915*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
916*35238bceSAndroid Build Coastguard Worker         }
917*35238bceSAndroid Build Coastguard Worker 
918*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(4);
919*35238bceSAndroid Build Coastguard Worker 
920*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
921*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
922*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
923*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
924*35238bceSAndroid Build Coastguard Worker         glUniform1fv(vec4_v, 1, &data[0]);
925*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
926*35238bceSAndroid Build Coastguard Worker         glUniform2fv(vec4_v, 1, &data[0]);
927*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
928*35238bceSAndroid Build Coastguard Worker         glUniform3fv(vec4_v, 1, &data[0]);
929*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
930*35238bceSAndroid Build Coastguard Worker         glUniform4fv(vec4_v, 1, &data[0]);
931*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
932*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
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 glUniform{1234}fv is used to load a uniform variable of type "
936*35238bceSAndroid Build Coastguard Worker                 "int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4.");
937*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
938*35238bceSAndroid Build Coastguard Worker         glUniform4fv(ivec4_f, 1, &data[0]);
939*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
940*35238bceSAndroid Build Coastguard Worker         glUniform4fv(uvec4_f, 1, &data[0]);
941*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
942*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
943*35238bceSAndroid Build Coastguard Worker 
944*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
945*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
946*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
947*35238bceSAndroid Build Coastguard Worker         glUniform1fv(sampler_f, 1, &data[0]);
948*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
949*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
950*35238bceSAndroid Build Coastguard Worker 
951*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
952*35238bceSAndroid Build Coastguard Worker     });
953*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformfv_invalid_location, "Invalid glUniform{1234}fv() usage", {
954*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
955*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
956*35238bceSAndroid Build Coastguard Worker 
957*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
958*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
959*35238bceSAndroid Build Coastguard Worker 
960*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(4);
961*35238bceSAndroid Build Coastguard Worker 
962*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
963*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
964*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
965*35238bceSAndroid Build Coastguard Worker         glUniform1fv(-2, 1, &data[0]);
966*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
967*35238bceSAndroid Build Coastguard Worker         glUniform2fv(-2, 1, &data[0]);
968*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
969*35238bceSAndroid Build Coastguard Worker         glUniform3fv(-2, 1, &data[0]);
970*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
971*35238bceSAndroid Build Coastguard Worker         glUniform4fv(-2, 1, &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         glUniform1fv(-1, 1, &data[0]);
976*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
977*35238bceSAndroid Build Coastguard Worker         glUniform2fv(-1, 1, &data[0]);
978*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
979*35238bceSAndroid Build Coastguard Worker         glUniform3fv(-1, 1, &data[0]);
980*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
981*35238bceSAndroid Build Coastguard Worker         glUniform4fv(-1, 1, &data[0]);
982*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
983*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
984*35238bceSAndroid Build Coastguard Worker 
985*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
986*35238bceSAndroid Build Coastguard Worker     });
987*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformfv_invalid_count, "Invalid glUniform{1234}fv() usage", {
988*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
989*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
990*35238bceSAndroid Build Coastguard Worker 
991*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
992*35238bceSAndroid Build Coastguard Worker         GLint vec4_v = glGetUniformLocation(program.getProgram(), "vec4_v"); // vec4
993*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
994*35238bceSAndroid Build Coastguard Worker 
995*35238bceSAndroid Build Coastguard Worker         if (vec4_v == -1)
996*35238bceSAndroid Build Coastguard Worker         {
997*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
998*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
999*35238bceSAndroid Build Coastguard Worker         }
1000*35238bceSAndroid Build Coastguard Worker 
1001*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(8);
1002*35238bceSAndroid Build Coastguard Worker 
1003*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if count is greater than 1 and the "
1004*35238bceSAndroid Build Coastguard Worker                                            "indicated uniform variable is not an array variable.");
1005*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1006*35238bceSAndroid Build Coastguard Worker         glUniform1fv(vec4_v, 2, &data[0]);
1007*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1008*35238bceSAndroid Build Coastguard Worker         glUniform2fv(vec4_v, 2, &data[0]);
1009*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1010*35238bceSAndroid Build Coastguard Worker         glUniform3fv(vec4_v, 2, &data[0]);
1011*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1012*35238bceSAndroid Build Coastguard Worker         glUniform4fv(vec4_v, 2, &data[0]);
1013*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1014*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1015*35238bceSAndroid Build Coastguard Worker 
1016*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1017*35238bceSAndroid Build Coastguard Worker     });
1018*35238bceSAndroid Build Coastguard Worker 
1019*35238bceSAndroid Build Coastguard Worker     // glUniform*i
1020*35238bceSAndroid Build Coastguard Worker 
1021*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformi_invalid_program, "Invalid glUniform{1234}i() usage", {
1022*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
1023*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1024*35238bceSAndroid Build Coastguard Worker         glUniform1i(-1, 0);
1025*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1026*35238bceSAndroid Build Coastguard Worker         glUniform2i(-1, 0, 0);
1027*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1028*35238bceSAndroid Build Coastguard Worker         glUniform3i(-1, 0, 0, 0);
1029*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1030*35238bceSAndroid Build Coastguard Worker         glUniform4i(-1, 0, 0, 0, 0);
1031*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1032*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1033*35238bceSAndroid Build Coastguard Worker     });
1034*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformi_incompatible_type, "Invalid glUniform{1234}i() usage", {
1035*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1036*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1037*35238bceSAndroid Build Coastguard Worker 
1038*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1039*35238bceSAndroid Build Coastguard Worker         GLint vec4_v    = glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1040*35238bceSAndroid Build Coastguard Worker         GLint ivec4_f   = glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1041*35238bceSAndroid Build Coastguard Worker         GLint uvec4_f   = glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1042*35238bceSAndroid Build Coastguard Worker         GLint sampler_f = glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1043*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1044*35238bceSAndroid Build Coastguard Worker 
1045*35238bceSAndroid Build Coastguard Worker         if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1046*35238bceSAndroid Build Coastguard Worker         {
1047*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1048*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1049*35238bceSAndroid Build Coastguard Worker         }
1050*35238bceSAndroid Build Coastguard Worker 
1051*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1052*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
1053*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
1054*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1055*35238bceSAndroid Build Coastguard Worker         glUniform1i(ivec4_f, 0);
1056*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1057*35238bceSAndroid Build Coastguard Worker         glUniform2i(ivec4_f, 0, 0);
1058*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1059*35238bceSAndroid Build Coastguard Worker         glUniform3i(ivec4_f, 0, 0, 0);
1060*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1061*35238bceSAndroid Build Coastguard Worker         glUniform4i(ivec4_f, 0, 0, 0, 0);
1062*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1063*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1064*35238bceSAndroid Build Coastguard Worker 
1065*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
1066*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION is generated if glUniform{1234}i is used to load a uniform variable of type "
1067*35238bceSAndroid Build Coastguard Worker                 "unsigned int, uvec2, uvec3, uvec4, or an array of these.");
1068*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1069*35238bceSAndroid Build Coastguard Worker         glUniform1i(uvec4_f, 0);
1070*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1071*35238bceSAndroid Build Coastguard Worker         glUniform2i(uvec4_f, 0, 0);
1072*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1073*35238bceSAndroid Build Coastguard Worker         glUniform3i(uvec4_f, 0, 0, 0);
1074*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1075*35238bceSAndroid Build Coastguard Worker         glUniform4i(uvec4_f, 0, 0, 0, 0);
1076*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1077*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1078*35238bceSAndroid Build Coastguard Worker 
1079*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if glUniform{1234}i is used to load a "
1080*35238bceSAndroid Build Coastguard Worker                                            "uniform variable of type float, vec2, vec3, or vec4.");
1081*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1082*35238bceSAndroid Build Coastguard Worker         glUniform1i(vec4_v, 0);
1083*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1084*35238bceSAndroid Build Coastguard Worker         glUniform2i(vec4_v, 0, 0);
1085*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1086*35238bceSAndroid Build Coastguard Worker         glUniform3i(vec4_v, 0, 0, 0);
1087*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1088*35238bceSAndroid Build Coastguard Worker         glUniform4i(vec4_v, 0, 0, 0, 0);
1089*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1090*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1091*35238bceSAndroid Build Coastguard Worker 
1092*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1093*35238bceSAndroid Build Coastguard Worker     });
1094*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformi_invalid_location, "Invalid glUniform{1234}i() usage", {
1095*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1096*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1097*35238bceSAndroid Build Coastguard Worker 
1098*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1099*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1100*35238bceSAndroid Build Coastguard Worker 
1101*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
1102*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
1103*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1104*35238bceSAndroid Build Coastguard Worker         glUniform1i(-2, 0);
1105*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1106*35238bceSAndroid Build Coastguard Worker         glUniform2i(-2, 0, 0);
1107*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1108*35238bceSAndroid Build Coastguard Worker         glUniform3i(-2, 0, 0, 0);
1109*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1110*35238bceSAndroid Build Coastguard Worker         glUniform4i(-2, 0, 0, 0, 0);
1111*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1112*35238bceSAndroid Build Coastguard Worker 
1113*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1114*35238bceSAndroid Build Coastguard Worker         glUniform1i(-1, 0);
1115*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1116*35238bceSAndroid Build Coastguard Worker         glUniform2i(-1, 0, 0);
1117*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1118*35238bceSAndroid Build Coastguard Worker         glUniform3i(-1, 0, 0, 0);
1119*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1120*35238bceSAndroid Build Coastguard Worker         glUniform4i(-1, 0, 0, 0, 0);
1121*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1122*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1123*35238bceSAndroid Build Coastguard Worker 
1124*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1125*35238bceSAndroid Build Coastguard Worker     });
1126*35238bceSAndroid Build Coastguard Worker 
1127*35238bceSAndroid Build Coastguard Worker     // glUniform*iv
1128*35238bceSAndroid Build Coastguard Worker 
1129*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformiv_invalid_program, "Invalid glUniform{1234}iv() usage", {
1130*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(4);
1131*35238bceSAndroid Build Coastguard Worker 
1132*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
1133*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1134*35238bceSAndroid Build Coastguard Worker         glUniform1iv(-1, 1, &data[0]);
1135*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1136*35238bceSAndroid Build Coastguard Worker         glUniform2iv(-1, 1, &data[0]);
1137*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1138*35238bceSAndroid Build Coastguard Worker         glUniform3iv(-1, 1, &data[0]);
1139*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1140*35238bceSAndroid Build Coastguard Worker         glUniform4iv(-1, 1, &data[0]);
1141*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1142*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1143*35238bceSAndroid Build Coastguard Worker     });
1144*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformiv_incompatible_type, "Invalid glUniform{1234}iv() usage", {
1145*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1146*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1147*35238bceSAndroid Build Coastguard Worker 
1148*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1149*35238bceSAndroid Build Coastguard Worker         GLint vec4_v    = glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1150*35238bceSAndroid Build Coastguard Worker         GLint ivec4_f   = glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1151*35238bceSAndroid Build Coastguard Worker         GLint uvec4_f   = glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1152*35238bceSAndroid Build Coastguard Worker         GLint sampler_f = glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1153*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1154*35238bceSAndroid Build Coastguard Worker 
1155*35238bceSAndroid Build Coastguard Worker         if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1156*35238bceSAndroid Build Coastguard Worker         {
1157*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1158*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1159*35238bceSAndroid Build Coastguard Worker         }
1160*35238bceSAndroid Build Coastguard Worker 
1161*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(4);
1162*35238bceSAndroid Build Coastguard Worker 
1163*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1164*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
1165*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
1166*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1167*35238bceSAndroid Build Coastguard Worker         glUniform1iv(ivec4_f, 1, &data[0]);
1168*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1169*35238bceSAndroid Build Coastguard Worker         glUniform2iv(ivec4_f, 1, &data[0]);
1170*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1171*35238bceSAndroid Build Coastguard Worker         glUniform3iv(ivec4_f, 1, &data[0]);
1172*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1173*35238bceSAndroid Build Coastguard Worker         glUniform4iv(ivec4_f, 1, &data[0]);
1174*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1175*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1176*35238bceSAndroid Build Coastguard Worker 
1177*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if glUniform{1234}iv is used to load a "
1178*35238bceSAndroid Build Coastguard Worker                                            "uniform variable of type float, vec2, vec3, or vec4.");
1179*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1180*35238bceSAndroid Build Coastguard Worker         glUniform1iv(vec4_v, 1, &data[0]);
1181*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1182*35238bceSAndroid Build Coastguard Worker         glUniform2iv(vec4_v, 1, &data[0]);
1183*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1184*35238bceSAndroid Build Coastguard Worker         glUniform3iv(vec4_v, 1, &data[0]);
1185*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1186*35238bceSAndroid Build Coastguard Worker         glUniform4iv(vec4_v, 1, &data[0]);
1187*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1188*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1189*35238bceSAndroid Build Coastguard Worker 
1190*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if glUniform{1234}iv is used to load a "
1191*35238bceSAndroid Build Coastguard Worker                                            "uniform variable of type unsigned int, uvec2, uvec3 or uvec4.");
1192*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1193*35238bceSAndroid Build Coastguard Worker         glUniform1iv(uvec4_f, 1, &data[0]);
1194*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1195*35238bceSAndroid Build Coastguard Worker         glUniform2iv(uvec4_f, 1, &data[0]);
1196*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1197*35238bceSAndroid Build Coastguard Worker         glUniform3iv(uvec4_f, 1, &data[0]);
1198*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1199*35238bceSAndroid Build Coastguard Worker         glUniform4iv(uvec4_f, 1, &data[0]);
1200*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1201*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1202*35238bceSAndroid Build Coastguard Worker 
1203*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1204*35238bceSAndroid Build Coastguard Worker     });
1205*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformiv_invalid_location, "Invalid glUniform{1234}iv() usage", {
1206*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1207*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1208*35238bceSAndroid Build Coastguard Worker 
1209*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1210*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1211*35238bceSAndroid Build Coastguard Worker 
1212*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(4);
1213*35238bceSAndroid Build Coastguard Worker 
1214*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
1215*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
1216*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1217*35238bceSAndroid Build Coastguard Worker         glUniform1iv(-2, 1, &data[0]);
1218*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1219*35238bceSAndroid Build Coastguard Worker         glUniform2iv(-2, 1, &data[0]);
1220*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1221*35238bceSAndroid Build Coastguard Worker         glUniform3iv(-2, 1, &data[0]);
1222*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1223*35238bceSAndroid Build Coastguard Worker         glUniform4iv(-2, 1, &data[0]);
1224*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1225*35238bceSAndroid Build Coastguard Worker 
1226*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1227*35238bceSAndroid Build Coastguard Worker         glUniform1iv(-1, 1, &data[0]);
1228*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1229*35238bceSAndroid Build Coastguard Worker         glUniform2iv(-1, 1, &data[0]);
1230*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1231*35238bceSAndroid Build Coastguard Worker         glUniform3iv(-1, 1, &data[0]);
1232*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1233*35238bceSAndroid Build Coastguard Worker         glUniform4iv(-1, 1, &data[0]);
1234*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1235*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1236*35238bceSAndroid Build Coastguard Worker 
1237*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1238*35238bceSAndroid Build Coastguard Worker     });
1239*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformiv_invalid_count, "Invalid glUniform{1234}iv() usage", {
1240*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1241*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1242*35238bceSAndroid Build Coastguard Worker 
1243*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1244*35238bceSAndroid Build Coastguard Worker         GLint ivec4_f = glGetUniformLocation(program.getProgram(), "ivec4_f"); // ivec4
1245*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1246*35238bceSAndroid Build Coastguard Worker 
1247*35238bceSAndroid Build Coastguard Worker         if (ivec4_f == -1)
1248*35238bceSAndroid Build Coastguard Worker         {
1249*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1250*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1251*35238bceSAndroid Build Coastguard Worker         }
1252*35238bceSAndroid Build Coastguard Worker 
1253*35238bceSAndroid Build Coastguard Worker         std::vector<GLint> data(8);
1254*35238bceSAndroid Build Coastguard Worker 
1255*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if count is greater than 1 and the "
1256*35238bceSAndroid Build Coastguard Worker                                            "indicated uniform variable is not an array variable.");
1257*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1258*35238bceSAndroid Build Coastguard Worker         glUniform1iv(ivec4_f, 2, &data[0]);
1259*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1260*35238bceSAndroid Build Coastguard Worker         glUniform2iv(ivec4_f, 2, &data[0]);
1261*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1262*35238bceSAndroid Build Coastguard Worker         glUniform3iv(ivec4_f, 2, &data[0]);
1263*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1264*35238bceSAndroid Build Coastguard Worker         glUniform4iv(ivec4_f, 2, &data[0]);
1265*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1266*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1267*35238bceSAndroid Build Coastguard Worker 
1268*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1269*35238bceSAndroid Build Coastguard Worker     });
1270*35238bceSAndroid Build Coastguard Worker 
1271*35238bceSAndroid Build Coastguard Worker     // glUniform{1234}ui
1272*35238bceSAndroid Build Coastguard Worker 
1273*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformui_invalid_program, "Invalid glUniform{234}ui() usage", {
1274*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
1275*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1276*35238bceSAndroid Build Coastguard Worker         glUniform1ui(-1, 0);
1277*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1278*35238bceSAndroid Build Coastguard Worker         glUniform2ui(-1, 0, 0);
1279*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1280*35238bceSAndroid Build Coastguard Worker         glUniform3ui(-1, 0, 0, 0);
1281*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1282*35238bceSAndroid Build Coastguard Worker         glUniform4ui(-1, 0, 0, 0, 0);
1283*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1284*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1285*35238bceSAndroid Build Coastguard Worker     });
1286*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformui_incompatible_type, "Invalid glUniform{1234}ui() usage", {
1287*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1288*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1289*35238bceSAndroid Build Coastguard Worker 
1290*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1291*35238bceSAndroid Build Coastguard Worker         GLint vec4_v    = glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1292*35238bceSAndroid Build Coastguard Worker         GLint ivec4_f   = glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1293*35238bceSAndroid Build Coastguard Worker         GLint uvec4_f   = glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1294*35238bceSAndroid Build Coastguard Worker         GLint sampler_f = glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1295*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1296*35238bceSAndroid Build Coastguard Worker 
1297*35238bceSAndroid Build Coastguard Worker         if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1298*35238bceSAndroid Build Coastguard Worker         {
1299*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1300*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1301*35238bceSAndroid Build Coastguard Worker         }
1302*35238bceSAndroid Build Coastguard Worker 
1303*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1304*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
1305*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
1306*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1307*35238bceSAndroid Build Coastguard Worker         glUniform1ui(uvec4_f, 0);
1308*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1309*35238bceSAndroid Build Coastguard Worker         glUniform2ui(uvec4_f, 0, 0);
1310*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1311*35238bceSAndroid Build Coastguard Worker         glUniform3ui(uvec4_f, 0, 0, 0);
1312*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1313*35238bceSAndroid Build Coastguard Worker         glUniform4ui(uvec4_f, 0, 0, 0, 0);
1314*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1315*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1316*35238bceSAndroid Build Coastguard Worker 
1317*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if glUniform{1234}i is used to load a "
1318*35238bceSAndroid Build Coastguard Worker                                            "uniform variable of type int, ivec2, ivec3, ivec4, or an array of these.");
1319*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1320*35238bceSAndroid Build Coastguard Worker         glUniform1ui(ivec4_f, 0);
1321*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1322*35238bceSAndroid Build Coastguard Worker         glUniform2ui(ivec4_f, 0, 0);
1323*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1324*35238bceSAndroid Build Coastguard Worker         glUniform3ui(ivec4_f, 0, 0, 0);
1325*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1326*35238bceSAndroid Build Coastguard Worker         glUniform4ui(ivec4_f, 0, 0, 0, 0);
1327*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1328*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1329*35238bceSAndroid Build Coastguard Worker 
1330*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if glUniform{1234}i is used to load a "
1331*35238bceSAndroid Build Coastguard Worker                                            "uniform variable of type float, vec2, vec3, or vec4.");
1332*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1333*35238bceSAndroid Build Coastguard Worker         glUniform1ui(vec4_v, 0);
1334*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1335*35238bceSAndroid Build Coastguard Worker         glUniform2ui(vec4_v, 0, 0);
1336*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1337*35238bceSAndroid Build Coastguard Worker         glUniform3ui(vec4_v, 0, 0, 0);
1338*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1339*35238bceSAndroid Build Coastguard Worker         glUniform4ui(vec4_v, 0, 0, 0, 0);
1340*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1341*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1342*35238bceSAndroid Build Coastguard Worker 
1343*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
1344*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
1345*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1346*35238bceSAndroid Build Coastguard Worker         glUniform1ui(sampler_f, 0);
1347*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1348*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1349*35238bceSAndroid Build Coastguard Worker 
1350*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1351*35238bceSAndroid Build Coastguard Worker     });
1352*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformui_invalid_location, "Invalid glUniform{1234}ui() usage", {
1353*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1354*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1355*35238bceSAndroid Build Coastguard Worker 
1356*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1357*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1358*35238bceSAndroid Build Coastguard Worker 
1359*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
1360*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
1361*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1362*35238bceSAndroid Build Coastguard Worker         glUniform1i(-2, 0);
1363*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1364*35238bceSAndroid Build Coastguard Worker         glUniform2i(-2, 0, 0);
1365*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1366*35238bceSAndroid Build Coastguard Worker         glUniform3i(-2, 0, 0, 0);
1367*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1368*35238bceSAndroid Build Coastguard Worker         glUniform4i(-2, 0, 0, 0, 0);
1369*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1370*35238bceSAndroid Build Coastguard Worker 
1371*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1372*35238bceSAndroid Build Coastguard Worker         glUniform1i(-1, 0);
1373*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1374*35238bceSAndroid Build Coastguard Worker         glUniform2i(-1, 0, 0);
1375*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1376*35238bceSAndroid Build Coastguard Worker         glUniform3i(-1, 0, 0, 0);
1377*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1378*35238bceSAndroid Build Coastguard Worker         glUniform4i(-1, 0, 0, 0, 0);
1379*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1380*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1381*35238bceSAndroid Build Coastguard Worker 
1382*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1383*35238bceSAndroid Build Coastguard Worker     });
1384*35238bceSAndroid Build Coastguard Worker 
1385*35238bceSAndroid Build Coastguard Worker     // glUniform{1234}uiv
1386*35238bceSAndroid Build Coastguard Worker 
1387*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformuiv_invalid_program, "Invalid glUniform{234}uiv() usage", {
1388*35238bceSAndroid Build Coastguard Worker         std::vector<GLuint> data(4);
1389*35238bceSAndroid Build Coastguard Worker 
1390*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
1391*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1392*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(-1, 1, &data[0]);
1393*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1394*35238bceSAndroid Build Coastguard Worker         glUniform2uiv(-1, 1, &data[0]);
1395*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1396*35238bceSAndroid Build Coastguard Worker         glUniform3uiv(-1, 1, &data[0]);
1397*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1398*35238bceSAndroid Build Coastguard Worker         glUniform4uiv(-1, 1, &data[0]);
1399*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1400*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1401*35238bceSAndroid Build Coastguard Worker     });
1402*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformuiv_incompatible_type, "Invalid glUniform{1234}uiv() usage", {
1403*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1404*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1405*35238bceSAndroid Build Coastguard Worker 
1406*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1407*35238bceSAndroid Build Coastguard Worker         GLint vec4_v    = glGetUniformLocation(program.getProgram(), "vec4_v");    // vec4
1408*35238bceSAndroid Build Coastguard Worker         GLint ivec4_f   = glGetUniformLocation(program.getProgram(), "ivec4_f");   // ivec4
1409*35238bceSAndroid Build Coastguard Worker         GLint uvec4_f   = glGetUniformLocation(program.getProgram(), "uvec4_f");   // uvec4
1410*35238bceSAndroid Build Coastguard Worker         GLint sampler_f = glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1411*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1412*35238bceSAndroid Build Coastguard Worker 
1413*35238bceSAndroid Build Coastguard Worker         if (vec4_v == -1 || ivec4_f == -1 || uvec4_f == -1 || sampler_f == -1)
1414*35238bceSAndroid Build Coastguard Worker         {
1415*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1416*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1417*35238bceSAndroid Build Coastguard Worker         }
1418*35238bceSAndroid Build Coastguard Worker 
1419*35238bceSAndroid Build Coastguard Worker         std::vector<GLuint> data(4);
1420*35238bceSAndroid Build Coastguard Worker 
1421*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1422*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
1423*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
1424*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1425*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(uvec4_f, 1, &data[0]);
1426*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1427*35238bceSAndroid Build Coastguard Worker         glUniform2uiv(uvec4_f, 1, &data[0]);
1428*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1429*35238bceSAndroid Build Coastguard Worker         glUniform3uiv(uvec4_f, 1, &data[0]);
1430*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1431*35238bceSAndroid Build Coastguard Worker         glUniform4uiv(uvec4_f, 1, &data[0]);
1432*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1433*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1434*35238bceSAndroid Build Coastguard Worker 
1435*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if glUniform{1234}uiv is used to load a "
1436*35238bceSAndroid Build Coastguard Worker                                            "uniform variable of type float, vec2, vec3, or vec4.");
1437*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1438*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(vec4_v, 1, &data[0]);
1439*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1440*35238bceSAndroid Build Coastguard Worker         glUniform2uiv(vec4_v, 1, &data[0]);
1441*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1442*35238bceSAndroid Build Coastguard Worker         glUniform3uiv(vec4_v, 1, &data[0]);
1443*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1444*35238bceSAndroid Build Coastguard Worker         glUniform4uiv(vec4_v, 1, &data[0]);
1445*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1446*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1447*35238bceSAndroid Build Coastguard Worker 
1448*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if glUniform{1234}uiv is used to load a "
1449*35238bceSAndroid Build Coastguard Worker                                            "uniform variable of type int, ivec2, ivec3 or ivec4.");
1450*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1451*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(ivec4_f, 1, &data[0]);
1452*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1453*35238bceSAndroid Build Coastguard Worker         glUniform2uiv(ivec4_f, 1, &data[0]);
1454*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1455*35238bceSAndroid Build Coastguard Worker         glUniform3uiv(ivec4_f, 1, &data[0]);
1456*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1457*35238bceSAndroid Build Coastguard Worker         glUniform4uiv(ivec4_f, 1, &data[0]);
1458*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1459*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1460*35238bceSAndroid Build Coastguard Worker 
1461*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
1462*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
1463*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1464*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(sampler_f, 1, &data[0]);
1465*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1466*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1467*35238bceSAndroid Build Coastguard Worker 
1468*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1469*35238bceSAndroid Build Coastguard Worker     });
1470*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformuiv_invalid_location, "Invalid glUniform{1234}uiv() usage", {
1471*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1472*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1473*35238bceSAndroid Build Coastguard Worker 
1474*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1475*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1476*35238bceSAndroid Build Coastguard Worker 
1477*35238bceSAndroid Build Coastguard Worker         std::vector<GLuint> data(4);
1478*35238bceSAndroid Build Coastguard Worker 
1479*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
1480*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
1481*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1482*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(-2, 1, &data[0]);
1483*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1484*35238bceSAndroid Build Coastguard Worker         glUniform2uiv(-2, 1, &data[0]);
1485*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1486*35238bceSAndroid Build Coastguard Worker         glUniform3uiv(-2, 1, &data[0]);
1487*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1488*35238bceSAndroid Build Coastguard Worker         glUniform4uiv(-2, 1, &data[0]);
1489*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1490*35238bceSAndroid Build Coastguard Worker 
1491*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1492*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(-1, 1, &data[0]);
1493*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1494*35238bceSAndroid Build Coastguard Worker         glUniform2uiv(-1, 1, &data[0]);
1495*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1496*35238bceSAndroid Build Coastguard Worker         glUniform3uiv(-1, 1, &data[0]);
1497*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1498*35238bceSAndroid Build Coastguard Worker         glUniform4uiv(-1, 1, &data[0]);
1499*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1500*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1501*35238bceSAndroid Build Coastguard Worker 
1502*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1503*35238bceSAndroid Build Coastguard Worker     });
1504*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniformuiv_invalid_count, "Invalid glUniform{1234}uiv() usage", {
1505*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1506*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1507*35238bceSAndroid Build Coastguard Worker 
1508*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1509*35238bceSAndroid Build Coastguard Worker         int uvec4_f = glGetUniformLocation(program.getProgram(), "uvec4_f"); // uvec4
1510*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1511*35238bceSAndroid Build Coastguard Worker 
1512*35238bceSAndroid Build Coastguard Worker         if (uvec4_f == -1)
1513*35238bceSAndroid Build Coastguard Worker         {
1514*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1515*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1516*35238bceSAndroid Build Coastguard Worker         }
1517*35238bceSAndroid Build Coastguard Worker 
1518*35238bceSAndroid Build Coastguard Worker         std::vector<GLuint> data(8);
1519*35238bceSAndroid Build Coastguard Worker 
1520*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if count is greater than 1 and the "
1521*35238bceSAndroid Build Coastguard Worker                                            "indicated uniform variable is not an array variable.");
1522*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1523*35238bceSAndroid Build Coastguard Worker         glUniform1uiv(uvec4_f, 2, &data[0]);
1524*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1525*35238bceSAndroid Build Coastguard Worker         glUniform2uiv(uvec4_f, 2, &data[0]);
1526*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1527*35238bceSAndroid Build Coastguard Worker         glUniform3uiv(uvec4_f, 2, &data[0]);
1528*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1529*35238bceSAndroid Build Coastguard Worker         glUniform4uiv(uvec4_f, 2, &data[0]);
1530*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1531*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1532*35238bceSAndroid Build Coastguard Worker 
1533*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1534*35238bceSAndroid Build Coastguard Worker     });
1535*35238bceSAndroid Build Coastguard Worker 
1536*35238bceSAndroid Build Coastguard Worker     // glUniformMatrix*fv
1537*35238bceSAndroid Build Coastguard Worker 
1538*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniform_matrixfv_invalid_program, "Invalid glUniformMatrix{234}fv() usage", {
1539*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(16);
1540*35238bceSAndroid Build Coastguard Worker 
1541*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if there is no current program object.");
1542*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1543*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1544*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1545*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1546*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1547*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1548*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1549*35238bceSAndroid Build Coastguard Worker 
1550*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1551*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1552*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1553*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1554*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1555*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1556*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1557*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1558*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1559*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1560*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1561*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1562*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1563*35238bceSAndroid Build Coastguard Worker     });
1564*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniform_matrixfv_incompatible_type, "Invalid glUniformMatrix{234}fv() usage", {
1565*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1566*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1567*35238bceSAndroid Build Coastguard Worker 
1568*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1569*35238bceSAndroid Build Coastguard Worker         GLint mat4_v    = glGetUniformLocation(program.getProgram(), "mat4_v");    // mat4
1570*35238bceSAndroid Build Coastguard Worker         GLint sampler_f = glGetUniformLocation(program.getProgram(), "sampler_f"); // sampler2D
1571*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1572*35238bceSAndroid Build Coastguard Worker 
1573*35238bceSAndroid Build Coastguard Worker         if (mat4_v == -1 || sampler_f == -1)
1574*35238bceSAndroid Build Coastguard Worker         {
1575*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1576*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1577*35238bceSAndroid Build Coastguard Worker         }
1578*35238bceSAndroid Build Coastguard Worker 
1579*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(16);
1580*35238bceSAndroid Build Coastguard Worker 
1581*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1582*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the size of the uniform variable declared "
1583*35238bceSAndroid Build Coastguard Worker                                        "in the shader does not match the size indicated by the glUniform command.");
1584*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1585*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(mat4_v, 1, GL_FALSE, &data[0]);
1586*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1587*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(mat4_v, 1, GL_FALSE, &data[0]);
1588*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1589*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(mat4_v, 1, GL_FALSE, &data[0]);
1590*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1591*35238bceSAndroid Build Coastguard Worker 
1592*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1593*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1594*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1595*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1596*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1597*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1598*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1599*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1600*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1601*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1602*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1603*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1604*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1605*35238bceSAndroid Build Coastguard Worker 
1606*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if a sampler is loaded using a command "
1607*35238bceSAndroid Build Coastguard Worker                                            "other than glUniform1i and glUniform1iv.");
1608*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1609*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(sampler_f, 1, GL_FALSE, &data[0]);
1610*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1611*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(sampler_f, 1, GL_FALSE, &data[0]);
1612*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1613*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(sampler_f, 1, GL_FALSE, &data[0]);
1614*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1615*35238bceSAndroid Build Coastguard Worker 
1616*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1617*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1618*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1619*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1620*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1621*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1622*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x2fv(sampler_f, 1, GL_FALSE, &data[0]);
1623*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1624*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x4fv(sampler_f, 1, GL_FALSE, &data[0]);
1625*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1626*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x3fv(sampler_f, 1, GL_FALSE, &data[0]);
1627*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1628*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1629*35238bceSAndroid Build Coastguard Worker 
1630*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1631*35238bceSAndroid Build Coastguard Worker     });
1632*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniform_matrixfv_invalid_location, "Invalid glUniformMatrix{234}fv() usage", {
1633*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1634*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1635*35238bceSAndroid Build Coastguard Worker 
1636*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1637*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1638*35238bceSAndroid Build Coastguard Worker 
1639*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(16);
1640*35238bceSAndroid Build Coastguard Worker 
1641*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if location is an invalid uniform "
1642*35238bceSAndroid Build Coastguard Worker                                            "location for the current program object and location is not equal to -1.");
1643*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1644*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(-2, 1, GL_FALSE, &data[0]);
1645*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1646*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(-2, 1, GL_FALSE, &data[0]);
1647*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1648*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(-2, 1, GL_FALSE, &data[0]);
1649*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1650*35238bceSAndroid Build Coastguard Worker 
1651*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x3fv(-2, 1, GL_FALSE, &data[0]);
1652*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1653*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x2fv(-2, 1, GL_FALSE, &data[0]);
1654*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1655*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x4fv(-2, 1, GL_FALSE, &data[0]);
1656*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1657*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x2fv(-2, 1, GL_FALSE, &data[0]);
1658*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1659*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x4fv(-2, 1, GL_FALSE, &data[0]);
1660*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1661*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x3fv(-2, 1, GL_FALSE, &data[0]);
1662*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1663*35238bceSAndroid Build Coastguard Worker 
1664*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1665*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(-1, 1, GL_FALSE, &data[0]);
1666*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1667*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(-1, 1, GL_FALSE, &data[0]);
1668*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1669*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(-1, 1, GL_FALSE, &data[0]);
1670*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1671*35238bceSAndroid Build Coastguard Worker 
1672*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x3fv(-1, 1, GL_FALSE, &data[0]);
1673*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1674*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x2fv(-1, 1, GL_FALSE, &data[0]);
1675*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1676*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x4fv(-1, 1, GL_FALSE, &data[0]);
1677*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1678*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x2fv(-1, 1, GL_FALSE, &data[0]);
1679*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1680*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x4fv(-1, 1, GL_FALSE, &data[0]);
1681*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1682*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x3fv(-1, 1, GL_FALSE, &data[0]);
1683*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1684*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1685*35238bceSAndroid Build Coastguard Worker 
1686*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1687*35238bceSAndroid Build Coastguard Worker     });
1688*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(uniform_matrixfv_invalid_count, "Invalid glUniformMatrix{234}fv() usage", {
1689*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1690*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
1691*35238bceSAndroid Build Coastguard Worker 
1692*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1693*35238bceSAndroid Build Coastguard Worker         GLint mat4_v = glGetUniformLocation(program.getProgram(), "mat4_v"); // mat4
1694*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1695*35238bceSAndroid Build Coastguard Worker 
1696*35238bceSAndroid Build Coastguard Worker         if (mat4_v == -1)
1697*35238bceSAndroid Build Coastguard Worker         {
1698*35238bceSAndroid Build Coastguard Worker             m_log << TestLog::Message << "// ERROR: Failed to retrieve uniform location" << TestLog::EndMessage;
1699*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Failed to retrieve uniform location");
1700*35238bceSAndroid Build Coastguard Worker         }
1701*35238bceSAndroid Build Coastguard Worker 
1702*35238bceSAndroid Build Coastguard Worker         std::vector<GLfloat> data(32);
1703*35238bceSAndroid Build Coastguard Worker 
1704*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if count is greater than 1 and the "
1705*35238bceSAndroid Build Coastguard Worker                                            "indicated uniform variable is not an array variable.");
1706*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1707*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2fv(mat4_v, 2, GL_FALSE, &data[0]);
1708*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1709*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3fv(mat4_v, 2, GL_FALSE, &data[0]);
1710*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1711*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4fv(mat4_v, 2, GL_FALSE, &data[0]);
1712*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1713*35238bceSAndroid Build Coastguard Worker 
1714*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1715*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1716*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1717*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1718*35238bceSAndroid Build Coastguard Worker         glUniformMatrix2x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1719*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1720*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x2fv(mat4_v, 1, GL_FALSE, &data[0]);
1721*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1722*35238bceSAndroid Build Coastguard Worker         glUniformMatrix3x4fv(mat4_v, 1, GL_FALSE, &data[0]);
1723*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1724*35238bceSAndroid Build Coastguard Worker         glUniformMatrix4x3fv(mat4_v, 1, GL_FALSE, &data[0]);
1725*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1726*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1727*35238bceSAndroid Build Coastguard Worker 
1728*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1729*35238bceSAndroid Build Coastguard Worker     });
1730*35238bceSAndroid Build Coastguard Worker 
1731*35238bceSAndroid Build Coastguard Worker     // Transform feedback
1732*35238bceSAndroid Build Coastguard Worker 
1733*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(gen_transform_feedbacks, "Invalid glGenTransformFeedbacks() usage", {
1734*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
1735*35238bceSAndroid Build Coastguard Worker         GLuint id;
1736*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(-1, &id);
1737*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1738*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1739*35238bceSAndroid Build Coastguard Worker     });
1740*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(bind_transform_feedback, "Invalid glBindTransformFeedback() usage", {
1741*35238bceSAndroid Build Coastguard Worker         GLuint tfID[2];
1742*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1743*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1744*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
1745*35238bceSAndroid Build Coastguard Worker         const char *tfVarying = "gl_Position";
1746*35238bceSAndroid Build Coastguard Worker 
1747*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
1748*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(2, tfID);
1749*35238bceSAndroid Build Coastguard Worker 
1750*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_ENUM is generated if target is not GL_TRANSFORM_FEEDBACK.");
1751*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(-1, tfID[0]);
1752*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1753*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1754*35238bceSAndroid Build Coastguard Worker 
1755*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1756*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if the transform feedback operation is "
1757*35238bceSAndroid Build Coastguard Worker                                        "active on the currently bound transform feedback object, and is not paused.");
1758*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1759*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1760*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
1761*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
1762*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1763*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1764*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1765*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1766*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1767*35238bceSAndroid Build Coastguard Worker 
1768*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[1]);
1769*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1770*35238bceSAndroid Build Coastguard Worker 
1771*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
1772*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1773*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1774*35238bceSAndroid Build Coastguard Worker 
1775*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1776*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
1777*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(2, tfID);
1778*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1779*35238bceSAndroid Build Coastguard Worker     });
1780*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(delete_transform_feedbacks, "Invalid glDeleteTransformFeedbacks() usage", {
1781*35238bceSAndroid Build Coastguard Worker         GLuint id;
1782*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(1, &id);
1783*35238bceSAndroid Build Coastguard Worker 
1784*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if n is negative.");
1785*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(-1, &id);
1786*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1787*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1788*35238bceSAndroid Build Coastguard Worker 
1789*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(1, &id);
1790*35238bceSAndroid Build Coastguard Worker     });
1791*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(begin_transform_feedback, "Invalid glBeginTransformFeedback() usage", {
1792*35238bceSAndroid Build Coastguard Worker         GLuint tfID[2];
1793*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1794*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1795*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
1796*35238bceSAndroid Build Coastguard Worker         const char *tfVarying = "gl_Position";
1797*35238bceSAndroid Build Coastguard Worker 
1798*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
1799*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(2, tfID);
1800*35238bceSAndroid Build Coastguard Worker 
1801*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1802*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1803*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
1804*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
1805*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1806*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1807*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1808*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1809*35238bceSAndroid Build Coastguard Worker 
1810*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
1811*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_ENUM is generated if primitiveMode is not one of GL_POINTS, GL_LINES, or GL_TRIANGLES.");
1812*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(-1);
1813*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_ENUM);
1814*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1815*35238bceSAndroid Build Coastguard Worker 
1816*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1817*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if transform feedback is already active.");
1818*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1819*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1820*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_POINTS);
1821*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1822*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1823*35238bceSAndroid Build Coastguard Worker 
1824*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if any binding point used in transform "
1825*35238bceSAndroid Build Coastguard Worker                                            "feedback mode does not have a buffer object bound.");
1826*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
1827*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1828*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1829*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1830*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1831*35238bceSAndroid Build Coastguard Worker 
1832*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if no binding points would be used "
1833*35238bceSAndroid Build Coastguard Worker                                            "because no program object is active.");
1834*35238bceSAndroid Build Coastguard Worker         glUseProgram(0);
1835*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1836*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1837*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1838*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1839*35238bceSAndroid Build Coastguard Worker 
1840*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1841*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_OPERATION is generated if no binding points would be used because "
1842*35238bceSAndroid Build Coastguard Worker                                        "the active program object has specified no varying variables to record.");
1843*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 0, 0, GL_INTERLEAVED_ATTRIBS);
1844*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1845*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1846*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1847*35238bceSAndroid Build Coastguard Worker 
1848*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
1849*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
1850*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(2, tfID);
1851*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1852*35238bceSAndroid Build Coastguard Worker     });
1853*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(pause_transform_feedback, "Invalid glPauseTransformFeedback() usage", {
1854*35238bceSAndroid Build Coastguard Worker         GLuint tfID[2];
1855*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1856*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1857*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
1858*35238bceSAndroid Build Coastguard Worker         const char *tfVarying = "gl_Position";
1859*35238bceSAndroid Build Coastguard Worker 
1860*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
1861*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(2, tfID);
1862*35238bceSAndroid Build Coastguard Worker 
1863*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1864*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1865*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
1866*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
1867*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1868*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1869*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1870*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1871*35238bceSAndroid Build Coastguard Worker 
1872*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if the currently bound transform "
1873*35238bceSAndroid Build Coastguard Worker                                            "feedback object is not active or is paused.");
1874*35238bceSAndroid Build Coastguard Worker         glPauseTransformFeedback();
1875*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1876*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1877*35238bceSAndroid Build Coastguard Worker         glPauseTransformFeedback();
1878*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1879*35238bceSAndroid Build Coastguard Worker         glPauseTransformFeedback();
1880*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1881*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1882*35238bceSAndroid Build Coastguard Worker 
1883*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
1884*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
1885*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(2, tfID);
1886*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1887*35238bceSAndroid Build Coastguard Worker     });
1888*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(resume_transform_feedback, "Invalid glResumeTransformFeedback() usage", {
1889*35238bceSAndroid Build Coastguard Worker         GLuint tfID[2];
1890*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1891*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1892*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
1893*35238bceSAndroid Build Coastguard Worker         const char *tfVarying = "gl_Position";
1894*35238bceSAndroid Build Coastguard Worker 
1895*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
1896*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(2, tfID);
1897*35238bceSAndroid Build Coastguard Worker 
1898*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1899*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1900*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
1901*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID[0]);
1902*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1903*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1904*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1905*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1906*35238bceSAndroid Build Coastguard Worker 
1907*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if the currently bound transform "
1908*35238bceSAndroid Build Coastguard Worker                                            "feedback object is not active or is not paused.");
1909*35238bceSAndroid Build Coastguard Worker         glResumeTransformFeedback();
1910*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1911*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1912*35238bceSAndroid Build Coastguard Worker         glResumeTransformFeedback();
1913*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1914*35238bceSAndroid Build Coastguard Worker         glPauseTransformFeedback();
1915*35238bceSAndroid Build Coastguard Worker         glResumeTransformFeedback();
1916*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1917*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1918*35238bceSAndroid Build Coastguard Worker 
1919*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
1920*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
1921*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(2, tfID);
1922*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1923*35238bceSAndroid Build Coastguard Worker     });
1924*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(end_transform_feedback, "Invalid glEndTransformFeedback() usage", {
1925*35238bceSAndroid Build Coastguard Worker         GLuint tfID;
1926*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1927*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1928*35238bceSAndroid Build Coastguard Worker         uint32_t buf;
1929*35238bceSAndroid Build Coastguard Worker         const char *tfVarying = "gl_Position";
1930*35238bceSAndroid Build Coastguard Worker 
1931*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
1932*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(1, &tfID);
1933*35238bceSAndroid Build Coastguard Worker 
1934*35238bceSAndroid Build Coastguard Worker         glUseProgram(program.getProgram());
1935*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1936*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
1937*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
1938*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buf);
1939*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 32, DE_NULL, GL_DYNAMIC_DRAW);
1940*35238bceSAndroid Build Coastguard Worker         glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buf);
1941*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1942*35238bceSAndroid Build Coastguard Worker 
1943*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_OPERATION is generated if transform feedback is not active.");
1944*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
1945*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION);
1946*35238bceSAndroid Build Coastguard Worker         glBeginTransformFeedback(GL_TRIANGLES);
1947*35238bceSAndroid Build Coastguard Worker         glEndTransformFeedback();
1948*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1949*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1950*35238bceSAndroid Build Coastguard Worker 
1951*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
1952*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(1, &tfID);
1953*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1954*35238bceSAndroid Build Coastguard Worker     });
1955*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(get_transform_feedback_varying, "Invalid glGetTransformFeedbackVarying() usage", {
1956*35238bceSAndroid Build Coastguard Worker         GLuint tfID;
1957*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
1958*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
1959*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram programInvalid(m_context.getRenderContext(),
1960*35238bceSAndroid Build Coastguard Worker                                           glu::makeVtxFragSources(vertexShaderSource, ""));
1961*35238bceSAndroid Build Coastguard Worker         const char *tfVarying            = "gl_Position";
1962*35238bceSAndroid Build Coastguard Worker         int maxTransformFeedbackVaryings = 0;
1963*35238bceSAndroid Build Coastguard Worker 
1964*35238bceSAndroid Build Coastguard Worker         GLsizei length;
1965*35238bceSAndroid Build Coastguard Worker         GLsizei size;
1966*35238bceSAndroid Build Coastguard Worker         GLenum type;
1967*35238bceSAndroid Build Coastguard Worker         char name[32];
1968*35238bceSAndroid Build Coastguard Worker 
1969*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(1, &tfID);
1970*35238bceSAndroid Build Coastguard Worker 
1971*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
1972*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1973*35238bceSAndroid Build Coastguard Worker         glLinkProgram(program.getProgram());
1974*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1975*35238bceSAndroid Build Coastguard Worker 
1976*35238bceSAndroid Build Coastguard Worker         glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID);
1977*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
1978*35238bceSAndroid Build Coastguard Worker 
1979*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
1980*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_VALUE is generated if program is not the name of a program object.");
1981*35238bceSAndroid Build Coastguard Worker         glGetTransformFeedbackVarying(-1, 0, 32, &length, &size, &type, &name[0]);
1982*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1983*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1984*35238bceSAndroid Build Coastguard Worker 
1985*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if index is greater or equal to the value of "
1986*35238bceSAndroid Build Coastguard Worker                                            "GL_TRANSFORM_FEEDBACK_VARYINGS.");
1987*35238bceSAndroid Build Coastguard Worker         glGetProgramiv(program.getProgram(), GL_TRANSFORM_FEEDBACK_VARYINGS, &maxTransformFeedbackVaryings);
1988*35238bceSAndroid Build Coastguard Worker         glGetTransformFeedbackVarying(program.getProgram(), maxTransformFeedbackVaryings, 32, &length, &size, &type,
1989*35238bceSAndroid Build Coastguard Worker                                       &name[0]);
1990*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
1991*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1992*35238bceSAndroid Build Coastguard Worker 
1993*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section(
1994*35238bceSAndroid Build Coastguard Worker             "", "GL_INVALID_OPERATION or GL_INVALID_VALUE is generated program has not been linked.");
1995*35238bceSAndroid Build Coastguard Worker         glGetTransformFeedbackVarying(programInvalid.getProgram(), 0, 32, &length, &size, &type, &name[0]);
1996*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_OPERATION, GL_INVALID_VALUE);
1997*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
1998*35238bceSAndroid Build Coastguard Worker 
1999*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(1, &tfID);
2000*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2001*35238bceSAndroid Build Coastguard Worker     });
2002*35238bceSAndroid Build Coastguard Worker     ES3F_ADD_API_CASE(transform_feedback_varyings, "Invalid glTransformFeedbackVaryings() usage", {
2003*35238bceSAndroid Build Coastguard Worker         GLuint tfID;
2004*35238bceSAndroid Build Coastguard Worker         glu::ShaderProgram program(m_context.getRenderContext(),
2005*35238bceSAndroid Build Coastguard Worker                                    glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
2006*35238bceSAndroid Build Coastguard Worker         const char *tfVarying                     = "gl_Position";
2007*35238bceSAndroid Build Coastguard Worker         GLint maxTransformFeedbackSeparateAttribs = 0;
2008*35238bceSAndroid Build Coastguard Worker 
2009*35238bceSAndroid Build Coastguard Worker         glGenTransformFeedbacks(1, &tfID);
2010*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2011*35238bceSAndroid Build Coastguard Worker 
2012*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("",
2013*35238bceSAndroid Build Coastguard Worker                                        "GL_INVALID_VALUE is generated if program is not the name of a program object.");
2014*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(0, 1, &tfVarying, GL_INTERLEAVED_ATTRIBS);
2015*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2016*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
2017*35238bceSAndroid Build Coastguard Worker 
2018*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::Section("", "GL_INVALID_VALUE is generated if bufferMode is GL_SEPARATE_ATTRIBS and "
2019*35238bceSAndroid Build Coastguard Worker                                            "count is greater than GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
2020*35238bceSAndroid Build Coastguard Worker         glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTransformFeedbackSeparateAttribs);
2021*35238bceSAndroid Build Coastguard Worker         glTransformFeedbackVaryings(program.getProgram(), maxTransformFeedbackSeparateAttribs + 1, &tfVarying,
2022*35238bceSAndroid Build Coastguard Worker                                     GL_SEPARATE_ATTRIBS);
2023*35238bceSAndroid Build Coastguard Worker         expectError(GL_INVALID_VALUE);
2024*35238bceSAndroid Build Coastguard Worker         m_log << tcu::TestLog::EndSection;
2025*35238bceSAndroid Build Coastguard Worker 
2026*35238bceSAndroid Build Coastguard Worker         glDeleteTransformFeedbacks(1, &tfID);
2027*35238bceSAndroid Build Coastguard Worker         expectError(GL_NO_ERROR);
2028*35238bceSAndroid Build Coastguard Worker     });
2029*35238bceSAndroid Build Coastguard Worker }
2030*35238bceSAndroid Build Coastguard Worker 
2031*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2032*35238bceSAndroid Build Coastguard Worker } // namespace gles3
2033*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2034