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