2 * Copyright (c) 2010 VMware, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NON-INFRINGEMENT. IN NO EVENT SHALL VMWARE AND/OR THEIR SUPPLIERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * Test GL_EXT_gpu_shader4's vertex attribute and uniform functions.
33 #include "piglit-util-gl.h"
35 PIGLIT_GL_TEST_CONFIG_BEGIN
37 config
.supports_gl_compat_version
= 10;
39 config
.window_visual
= PIGLIT_GL_VISUAL_RGBA
| PIGLIT_GL_VISUAL_DOUBLE
;
41 PIGLIT_GL_TEST_CONFIG_END
43 static const char *TestName
= "texture-integer";
44 static const GLuint Index
= 3;
45 static GLuint Program
;
53 check_error(const char *file
, int line
)
55 GLenum err
= glGetError();
57 fprintf(stderr
, "%s: error 0x%x at %s:%d\n", TestName
, err
, file
, line
);
66 gen_values(GLint values
[4], GLuint size
, int sign
)
68 assert(size
>= 1 && size
<=4 );
72 values
[0] = rand() % 201 - 100;
73 values
[1] = rand() % 201 - 100;
74 values
[2] = rand() % 201 - 100;
75 values
[3] = rand() % 201 - 100;
79 values
[0] = rand() % 255;
80 values
[1] = rand() % 255;
81 values
[2] = rand() % 255;
82 values
[3] = rand() % 255;
94 check_attrib(const GLint expected
[4], int sign
, const char *func
)
98 glGetVertexAttribIivEXT(Index
, GL_CURRENT_VERTEX_ATTRIB_ARB
, vals
);
99 if (expected
[0] != vals
[0] ||
100 expected
[1] != vals
[1] ||
101 expected
[2] != vals
[2] ||
102 expected
[3] != vals
[3]) {
103 fprintf(stderr
, "%s: %s failed\n", TestName
, func
);
104 fprintf(stderr
, " Expected: %d, %d, %d, %d\n",
105 expected
[0], expected
[1], expected
[2], expected
[3]);
106 fprintf(stderr
, " Found: %d, %d, %d, %d\n",
107 vals
[0], vals
[1], vals
[2], vals
[3]);
113 glGetVertexAttribIuivEXT(Index
, GL_CURRENT_VERTEX_ATTRIB_ARB
, vals
);
114 if (expected
[0] != vals
[0] ||
115 expected
[1] != vals
[1] ||
116 expected
[2] != vals
[2] ||
117 expected
[3] != vals
[3]) {
118 fprintf(stderr
, "%s: %s failed\n", TestName
, func
);
119 fprintf(stderr
, " Expected: %d, %d, %d, %d\n",
120 expected
[0], expected
[1], expected
[2], expected
[3]);
121 fprintf(stderr
, " Found: %u, %u, %u, %u\n",
122 vals
[0], vals
[1], vals
[2], vals
[3]);
132 test_attrib_funcs(void)
136 gen_values(vals
, 1, SIGNED
);
137 glVertexAttribI1iEXT(Index
, vals
[0]);
138 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI1iEXT"))
141 gen_values(vals
, 2, SIGNED
);
142 glVertexAttribI2iEXT(Index
, vals
[0], vals
[1]);
143 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI2iEXT"))
146 gen_values(vals
, 3, SIGNED
);
147 glVertexAttribI3iEXT(Index
, vals
[0], vals
[1], vals
[2]);
148 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI3iEXT"))
151 gen_values(vals
, 4, SIGNED
);
152 glVertexAttribI4iEXT(Index
, vals
[0], vals
[1], vals
[2], vals
[3]);
153 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI4iEXT"))
157 gen_values(vals
, 1, SIGNED
);
158 glVertexAttribI1ivEXT(Index
, vals
);
159 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI1ivEXT"))
162 gen_values(vals
, 2, SIGNED
);
163 glVertexAttribI2ivEXT(Index
, vals
);
164 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI2ivEXT"))
167 gen_values(vals
, 3, SIGNED
);
168 glVertexAttribI3ivEXT(Index
, vals
);
169 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI3ivEXT"))
172 gen_values(vals
, 4, SIGNED
);
173 glVertexAttribI4ivEXT(Index
, vals
);
174 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI4ivEXT"))
178 gen_values(vals
, 1, UNSIGNED
);
179 glVertexAttribI1uiEXT(Index
, vals
[0]);
180 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI1uiEXT"))
183 gen_values(vals
, 2, UNSIGNED
);
184 glVertexAttribI2uiEXT(Index
, vals
[0], vals
[1]);
185 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI2uiEXT"))
188 gen_values(vals
, 3, UNSIGNED
);
189 glVertexAttribI3uiEXT(Index
, vals
[0], vals
[1], vals
[2]);
190 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI3uiEXT"))
193 gen_values(vals
, 4, UNSIGNED
);
194 glVertexAttribI4uiEXT(Index
, vals
[0], vals
[1], vals
[2], vals
[3]);
195 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI4uiEXT"))
199 gen_values(vals
, 1, UNSIGNED
);
200 glVertexAttribI1uivEXT(Index
, (GLuint
*) vals
);
201 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI1uivEXT"))
204 gen_values(vals
, 2, UNSIGNED
);
205 glVertexAttribI2uivEXT(Index
, (GLuint
*) vals
);
206 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI2uivEXT"))
209 gen_values(vals
, 3, UNSIGNED
);
210 glVertexAttribI3uivEXT(Index
, (GLuint
*) vals
);
211 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI3uivEXT"))
214 gen_values(vals
, 4, UNSIGNED
);
215 glVertexAttribI4uivEXT(Index
, (GLuint
*) vals
);
216 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI4uivEXT"))
221 gen_values(vals
, 4, SIGNED
);
226 glVertexAttribI4bvEXT(Index
, bvals
);
227 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI4bvEXT"))
233 gen_values(vals
, 4, SIGNED
);
238 glVertexAttribI4svEXT(Index
, svals
);
239 if (!check_attrib(vals
, SIGNED
, "glVertexAttribI4svEXT"))
245 gen_values(vals
, 4, UNSIGNED
);
250 glVertexAttribI4ubvEXT(Index
, bvals
);
251 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI4ubvEXT"))
257 gen_values(vals
, 4, UNSIGNED
);
262 glVertexAttribI4usvEXT(Index
, svals
);
263 if (!check_attrib(vals
, UNSIGNED
, "glVertexAttribI4usvEXT"))
273 check_uniform(const GLint expected
[4], GLuint size
, int sign
,
274 GLint loc
, const char *func
)
276 if (sign
== SIGNED
) {
278 glGetUniformivARB(Program
, loc
, vals
);
285 if (expected
[0] != vals
[0] ||
286 expected
[1] != vals
[1] ||
287 expected
[2] != vals
[2] ||
288 expected
[3] != vals
[3]) {
289 fprintf(stderr
, "%s: %s failed\n", TestName
, func
);
290 fprintf(stderr
, " Expected: %d, %d, %d, %d\n",
291 expected
[0], expected
[1], expected
[2], expected
[3]);
292 fprintf(stderr
, " Found: %d, %d, %d, %d\n",
293 vals
[0], vals
[1], vals
[2], vals
[3]);
299 glGetUniformuivEXT(Program
, loc
, vals
);
306 if (expected
[0] != vals
[0] ||
307 expected
[1] != vals
[1] ||
308 expected
[2] != vals
[2] ||
309 expected
[3] != vals
[3]) {
310 fprintf(stderr
, "%s: %s failed\n", TestName
, func
);
311 fprintf(stderr
, " Expected: %d, %d, %d, %d\n",
312 expected
[0], expected
[1], expected
[2], expected
[3]);
313 fprintf(stderr
, " Found: %u, %u, %u, %u\n",
314 vals
[0], vals
[1], vals
[2], vals
[3]);
323 test_uniform_funcs(void)
325 static const char *signedFragText
=
326 "uniform int value1; \n"
327 "uniform ivec2 value2; \n"
328 "uniform ivec3 value3; \n"
329 "uniform ivec4 value4; \n"
332 " vec4 t = vec4(value4); \n"
333 " t += vec4(value3, 0.0); \n"
334 " t += vec4(value2, 0.0, 0.0); \n"
335 " t += vec4(value1, 0.0, 0.0, 0.0); \n"
336 " gl_FragColor = 0.01 * t; \n"
339 static const char *unsignedFragText
=
340 "#extension GL_EXT_gpu_shader4: enable \n"
341 "uniform unsigned int value1; \n"
342 "uniform uvec2 value2; \n"
343 "uniform uvec3 value3; \n"
344 "uniform uvec4 value4; \n"
347 " vec4 t = vec4(value4); \n"
348 " t += vec4(value3, 0.0); \n"
349 " t += vec4(value2, 0.0, 0.0); \n"
350 " t += vec4(value1, 0.0, 0.0, 0.0); \n"
351 " gl_FragColor = 0.01 * t; \n"
355 GLint vals
[4], loc1
, loc2
, loc3
, loc4
;
359 * Signed integer tests.
361 shader
= piglit_compile_shader_text(GL_FRAGMENT_SHADER
, signedFragText
);
364 Program
= piglit_link_simple_program(0, shader
);
367 glUseProgram(Program
);
368 check_error(__FILE__
, __LINE__
);
370 loc1
= glGetUniformLocation(Program
, "value1");
373 loc2
= glGetUniformLocation(Program
, "value2");
376 loc3
= glGetUniformLocation(Program
, "value3");
379 loc4
= glGetUniformLocation(Program
, "value4");
382 check_error(__FILE__
, __LINE__
);
384 gen_values(vals
, 1, SIGNED
);
385 glUniform1iARB(loc1
, vals
[0]);
386 if (!check_uniform(vals
, 1, SIGNED
, loc1
, "glUniform1iARB"))
389 gen_values(vals
, 2, SIGNED
);
390 glUniform2iARB(loc2
, vals
[0], vals
[1]);
391 if (!check_uniform(vals
, 2, SIGNED
, loc2
, "glUniform2iARB"))
394 gen_values(vals
, 3, SIGNED
);
395 glUniform3iARB(loc3
, vals
[0], vals
[1], vals
[2]);
396 if (!check_uniform(vals
, 3, SIGNED
, loc3
, "glUniform3iARB"))
399 gen_values(vals
, 4, SIGNED
);
400 glUniform4iARB(loc4
, vals
[0], vals
[1], vals
[2], vals
[3]);
401 if (!check_uniform(vals
, 4, SIGNED
, loc4
, "glUniform4iARB"))
406 * Unsigned integer tests.
408 shader
= piglit_compile_shader_text(GL_FRAGMENT_SHADER
, unsignedFragText
);
411 Program
= piglit_link_simple_program(0, shader
);
414 glUseProgram(Program
);
415 check_error(__FILE__
, __LINE__
);
417 loc1
= glGetUniformLocation(Program
, "value1");
420 loc2
= glGetUniformLocation(Program
, "value2");
423 loc3
= glGetUniformLocation(Program
, "value3");
426 loc4
= glGetUniformLocation(Program
, "value4");
429 check_error(__FILE__
, __LINE__
);
431 gen_values(vals
, 1, UNSIGNED
);
432 glUniform1uiEXT(loc1
, vals
[0]);
433 if (!check_uniform(vals
, 1, UNSIGNED
, loc1
, "glUniform1uiEXT"))
436 gen_values(vals
, 2, UNSIGNED
);
437 glUniform2uiEXT(loc2
, vals
[0], vals
[1]);
438 if (!check_uniform(vals
, 2, UNSIGNED
, loc2
, "glUniform2uiEXT"))
441 gen_values(vals
, 3, UNSIGNED
);
442 glUniform3uiEXT(loc3
, vals
[0], vals
[1], vals
[2]);
443 if (!check_uniform(vals
, 3, UNSIGNED
, loc3
, "glUniform3uiEXT"))
446 gen_values(vals
, 4, UNSIGNED
);
447 glUniform4uiEXT(loc4
, vals
[0], vals
[1], vals
[2], vals
[3]);
448 if (!check_uniform(vals
, 4, UNSIGNED
, loc4
, "glUniform4uiEXT"))
455 /** Check which datatypes are accepted by glVertexAttribIPointer() */
457 test_attrib_array(void)
459 static const GLenum goodTypes
[] = {
460 GL_BYTE
, GL_UNSIGNED_BYTE
,
461 GL_SHORT
, GL_UNSIGNED_SHORT
,
462 GL_INT
, GL_UNSIGNED_INT
464 static const GLenum badTypes
[] = {
465 GL_FLOAT
, GL_DOUBLE
, GL_HALF_FLOAT_ARB
, GL_BGRA
474 /* clear any prev errors */
475 while (glGetError() != GL_NO_ERROR
)
478 /* These should not generate a GL error */
479 for (i
= 0; i
< ARRAY_SIZE(goodTypes
); i
++) {
480 glVertexAttribIPointerEXT(index
, size
, goodTypes
[i
], stride
, data
);
482 if (err
!= GL_NO_ERROR
) {
484 "%s: glVertexAttribIPointer(type=0x%x) generated error 0x%x\n",
485 TestName
, goodTypes
[i
], err
);
490 for (i
= 0; i
< ARRAY_SIZE(badTypes
); i
++) {
491 glVertexAttribIPointerEXT(index
, size
, badTypes
[i
], stride
, data
);
493 if (err
!= GL_INVALID_ENUM
) {
495 "%s: glVertexAttribIPointer(type=0x%x) failed to generate "
497 TestName
, badTypes
[i
]);
509 if (!test_attrib_funcs())
512 if (!test_uniform_funcs())
515 if (!test_attrib_array())
523 piglit_init(int argc
, char **argv
)
525 piglit_require_extension("GL_EXT_gpu_shader4");
527 piglit_ortho_projection(piglit_width
, piglit_height
, GL_FALSE
);