ext_gpu_shader4: add compiler tests for everything
[piglit.git] / tests / spec / arb_clear_texture / integer.c
blob44d4342fbdf7628e63616d000dc99b289c117120
1 /*
2 * Copyright (c) 2014 Intel Corporation
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 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * 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
13 * Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
24 /** @file integer.c
26 * A test of using glClearTexSubImage to clear sub-regions of integer
27 * tetures with a range of formats. Each format is created as a 4x4
28 * texture where the first four texels are cleared to known values
29 * using separate calls to glClearTexSubImage. The values are chosen
30 * to potentially trigger problems with signed conversions. The rest
31 * of the texture is initalised to zeroes. The textures are then read
32 * back with glGetTexImage and compared with the expected values.
35 #define TEX_WIDTH 4
36 #define TEX_HEIGHT 4
38 #include "piglit-util-gl.h"
40 PIGLIT_GL_TEST_CONFIG_BEGIN
42 config.supports_gl_compat_version = 13;
44 config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
46 config.khr_no_error_support = PIGLIT_NO_ERRORS;
48 PIGLIT_GL_TEST_CONFIG_END
50 /* Values to try clearing the texture to. The number of bytes used
51 * will depend on the component size for the format. The actual value
52 * used will depend on the endianness of the architecture but this
53 * shouldn't really matter for the test */
55 static const uint32_t
56 clear_values[][4] = {
57 { 0xffffffffU, 0x00000000U, 0x12345678U, 0x78274827U },
58 { 0x00000000U, 0xffffffffU, 0x12345678U, 0x78274827U },
59 { 0x12345678U, 0x00000000U, 0xffffffffU, 0x78274827U },
60 { 0xa82748b7U, 0x12345678U, 0x00000000U, 0xffffffffU },
63 struct format {
64 GLenum internal_format;
65 GLenum format;
66 GLenum type;
67 int component_size;
68 int n_components;
71 static const struct format
72 formats[] = {
73 { GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT, 4, 4 },
74 { GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT, 4, 3 },
75 { GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, 2, 4 },
76 { GL_RGB16UI, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, 2, 3 },
77 { GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, 1, 4 },
78 { GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, 1, 3 },
79 { GL_RGBA32I, GL_RGBA_INTEGER, GL_INT, 4, 4 },
80 { GL_RGB32I, GL_RGB_INTEGER, GL_INT, 4, 3 },
81 { GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT, 2, 4 },
82 { GL_RGB16I, GL_RGB_INTEGER, GL_SHORT, 2, 3 },
83 { GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE, 1, 4 },
84 { GL_RGB8I, GL_RGB_INTEGER, GL_BYTE, 1, 3 },
87 static GLuint
88 create_texture(const struct format *format)
90 GLubyte *tex_data;
91 int texel_size;
92 GLuint tex;
94 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
96 texel_size = format->component_size * format->n_components;
97 tex_data = malloc(texel_size * TEX_WIDTH * TEX_HEIGHT);
99 memset(tex_data, 0, texel_size * TEX_WIDTH * TEX_HEIGHT);
101 glGenTextures(1, &tex);
102 glBindTexture(GL_TEXTURE_2D, tex);
103 glTexImage2D(GL_TEXTURE_2D,
104 0, /* level */
105 format->internal_format,
106 TEX_WIDTH, TEX_HEIGHT,
107 0, /* border */
108 format->format,
109 format->type,
110 tex_data);
111 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
112 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
114 free(tex_data);
116 return tex;
119 static bool
120 clear_texture(GLuint tex,
121 const struct format *format)
123 int i;
125 for (i = 0; i < ARRAY_SIZE(clear_values); i++) {
126 glClearTexSubImage(tex,
127 0, /* level */
128 i % TEX_WIDTH, /* x */
129 i / TEX_WIDTH, /* y */
130 0, /* z */
131 1, 1, 1, /* width/height/depth */
132 format->format,
133 format->type,
134 clear_values[i]);
136 if (!piglit_check_gl_error(GL_NO_ERROR))
137 return false;
140 return true;
143 static bool
144 check_texture(GLuint tex,
145 const struct format *format)
147 GLubyte *tex_data, *p;
148 int texel_size;
149 int i, j;
151 glPixelStorei(GL_PACK_ALIGNMENT, 1);
153 texel_size = format->component_size * format->n_components;
154 p = tex_data = malloc(texel_size * TEX_WIDTH * TEX_HEIGHT);
156 glGetTexImage(GL_TEXTURE_2D, 0, format->format, format->type, tex_data);
158 for (i = 0; i < ARRAY_SIZE(clear_values); i++) {
159 if (memcmp(p, clear_values[i], texel_size))
160 return false;
161 p += texel_size;
164 /* The rest of the values should be zeroes */
165 for (i = ARRAY_SIZE(clear_values); i < TEX_WIDTH * TEX_HEIGHT; i++)
166 for (j = 0; j < texel_size; j++)
167 if (*(p++) != 0)
168 return false;
170 return true;
173 void
174 piglit_init(int argc, char **argv)
176 bool pass = true;
177 GLuint tex;
178 int i;
180 /* glClearTexture is either in the GL_ARB_clear_texture
181 * extension or in core in GL 4.4
183 if (piglit_get_gl_version() < 44 &&
184 !piglit_is_extension_supported("GL_ARB_clear_texture")) {
185 printf("OpenGL 4.4 or GL_ARB_clear_texture is required.\n");
186 piglit_report_result(PIGLIT_SKIP);
189 /* Integer textures are either in GL 3.0 or GL_EXT_texture_integer
191 if (piglit_get_gl_version() < 30 &&
192 !piglit_is_extension_supported("GL_EXT_texture_integer")) {
193 printf("OpenGL 3.0 or GL_EXT_texture_integer is required.\n");
194 piglit_report_result(PIGLIT_SKIP);
197 for (i = 0; i < ARRAY_SIZE(formats); i++) {
198 tex = create_texture(formats + i);
199 pass &= clear_texture(tex, formats + i);
200 pass &= check_texture(tex, formats + i);
201 glBindTexture(GL_TEXTURE_2D, 0);
202 glDeleteTextures(1, &tex);
205 piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
208 enum piglit_result
209 piglit_display(void)
211 /* unused */
212 return PIGLIT_FAIL;