---
 tests/all.tests                                   |   6 +
 tests/spec/ext_texture_array/CMakeLists.gl.txt    |   1 +
 tests/spec/ext_texture_array/CMakeLists.gles3.txt |   8 +
 tests/spec/ext_texture_array/compressed.c         | 307 ++++++++++++++++++++++
 4 files changed, 322 insertions(+)
 create mode 100644 tests/spec/ext_texture_array/CMakeLists.gles3.txt
 create mode 100644 tests/spec/ext_texture_array/compressed.c

diff --git a/tests/all.tests b/tests/all.tests
index 9eacc85..d3ec020 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -1623,6 +1623,9 @@ ext_texture_array['copyteximage 2D_ARRAY'] = 
PlainExecTest(['copyteximage', '-au
 add_plain_test(ext_texture_array, 'fbo-array')
 add_plain_test(ext_texture_array, 'fbo-depth-array')
 add_plain_test(ext_texture_array, 'array-texture')
+for test_mode in ['teximage', 'texsubimage']:
+        test_name = 'compressed {0}'.format(test_mode)
+        ext_texture_array[test_name] = PlainExecTest('ext_texture_array-' + 
test_name + ' -auto -fbo')
 
 arb_texture_cube_map = Group()
 spec['ARB_texture_cube_map'] = arb_texture_cube_map
@@ -2697,6 +2700,9 @@ for tex_format in ('rgb8', 'srgb8', 'rgba8', 
'srgb8-alpha8', 'r11', 'rg11', 'rgb
        executable = '{0} -auto'.format(test_name)
        gles30[test_name] = concurrent_test(executable)
 gles30['minmax'] = concurrent_test('minmax_gles3')
+for test_mode in ['teximage', 'texsubimage']:
+        test_name = 'ext_texture_array-compressed_gles3 {0}'.format(test_mode)
+        gles30[test_name] = PlainExecTest(test_name + ' -auto -fbo')
 
 add_shader_test_dir(spec, os.path.join(generatedTestDir, 'spec'),
                    recursive=True)
diff --git a/tests/spec/ext_texture_array/CMakeLists.gl.txt 
b/tests/spec/ext_texture_array/CMakeLists.gl.txt
index 0bf4a7d..5b10962 100644
--- a/tests/spec/ext_texture_array/CMakeLists.gl.txt
+++ b/tests/spec/ext_texture_array/CMakeLists.gl.txt
@@ -10,3 +10,4 @@ link_libraries (
 )
 
 piglit_add_executable (ext_texture_array-maxlayers maxlayers.c)
+piglit_add_executable (ext_texture_array-compressed compressed.c)
diff --git a/tests/spec/ext_texture_array/CMakeLists.gles3.txt 
b/tests/spec/ext_texture_array/CMakeLists.gles3.txt
new file mode 100644
index 0000000..2e4da1b
--- /dev/null
+++ b/tests/spec/ext_texture_array/CMakeLists.gles3.txt
@@ -0,0 +1,8 @@
+link_libraries(
+       piglitutil_${piglit_target_api}
+       ${OPENGL_gles2_LIBRARY}
+       )
+
+piglit_add_executable (ext_texture_array-compressed_${piglit_target_api} 
compressed.c)
+
+# vim: ft=cmake:
diff --git a/tests/spec/ext_texture_array/compressed.c 
b/tests/spec/ext_texture_array/compressed.c
new file mode 100644
index 0000000..49ddb9c
--- /dev/null
+++ b/tests/spec/ext_texture_array/compressed.c
@@ -0,0 +1,307 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file compressed.c
+ *
+ * Confirm that the functions glCompressedTexImage3D and
+ * glCompressedTexSubImage3D work properly for 2D array textures.
+ *
+ * This test performs the following operations:
+ *
+ * - Create a 2D array texture with a width of 8 texture blocks, a
+ *   height of 8 texture blocks, and a depth of 4.
+ *
+ * - If the test is operating in "teximage" mode, use a single call to
+ *   glCompressedTexImage3D to upload a single array texture where
+ *   each compressed block has a different grayscale value.
+ *
+ * - If the test is operating in "texsubimage" mode, use multiple
+ *   calls to glCompressedTexSubImage3D to upload the texture in
+ *   pieces.
+ *
+ * - Draw each layer of the texture to a separate region on the
+ *   screen.
+ *
+ * - Verify that each portion of the drawn image matches the expected
+ *   grayscale intensity.
+ *
+ * On GLES3, this test is performed using either ETC2 textures.  On
+ * desktop GL, it is performed using FXT1 textures.
+ */
+
+#include "piglit-util-gl-common.h"
+#include "piglit-util-compressed.h"
+
+#ifdef PIGLIT_USE_OPENGL
+#define GRAYSCALE_IMAGES piglit_fxt1_grayscale_images
+#define COMPRESSED_FORMAT GL_COMPRESSED_RGB_FXT1_3DFX
+#define BLOCK_WIDTH 8
+#define BLOCK_HEIGHT 4
+#define BLOCK_BYTES 16
+#define GLSL_VERSION "120"
+#else // PIGLIT_USE_OPENGL_ES3
+#define GRAYSCALE_IMAGES piglit_etc1_grayscale_images
+#define COMPRESSED_FORMAT GL_COMPRESSED_RGB8_ETC2
+#define BLOCK_WIDTH 4
+#define BLOCK_HEIGHT 4
+#define BLOCK_BYTES 8
+#define GLSL_VERSION "300 es"
+#endif
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+#ifdef PIGLIT_USE_OPENGL
+       config.supports_gl_compat_version = 10;
+#else // PIGLIT_USE_OPENGL_ES3
+       config.supports_gl_es_version = 30;
+#endif
+
+       if (config.window_width < 4 * 8 * BLOCK_WIDTH)
+               config.window_width = 4 * 8 * BLOCK_WIDTH;
+       if (config.window_height < 8 * BLOCK_HEIGHT)
+               config.window_height = 8 * BLOCK_HEIGHT;
+       config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static const char vs_text[] =
+       "#version " GLSL_VERSION "\n"
+#ifdef PIGLIT_USE_OPENGL
+       "#define piglit_Vertex gl_Vertex\n"
+       "#define piglit_MultiTexCoord0 gl_MultiTexCoord0\n"
+       "#define piglit_in attribute\n"
+       "#define piglit_out varying\n"
+#else // PIGLIT_USE_OPENGL_ES3
+       "#define piglit_in in\n"
+       "#define piglit_out out\n"
+       "piglit_in vec4 piglit_Vertex;\n"
+       "piglit_in vec4 piglit_MultiTexCoord0;\n"
+#endif
+       "piglit_out vec3 texcoord;\n"
+       "uniform mat4 proj;\n"
+       "uniform int layer;\n"
+       "void main()\n"
+       "{\n"
+       "  gl_Position = proj * piglit_Vertex;\n"
+       "  texcoord = vec3(piglit_MultiTexCoord0.xy, float(layer));\n"
+       "}\n";
+
+static const char fs_text[] =
+       "#version " GLSL_VERSION "\n"
+#ifdef PIGLIT_USE_OPENGL
+       "#extension GL_EXT_texture_array : require\n"
+       "#define piglit_FragColor gl_FragColor\n"
+       "#define piglit_in varying\n"
+       "#define piglit_texture2DArray texture2DArray\n"
+#else // PIGLIT_USE_OPENGL_ES3
+       "#define piglit_in in\n"
+       "#define piglit_texture2DArray texture\n"
+       "out vec4 piglit_FragColor;\n"
+#endif
+       "piglit_in vec3 texcoord;\n"
+       "uniform sampler2DArray samp;\n"
+       "void main()\n"
+       "{\n"
+       "  piglit_FragColor = piglit_texture2DArray(samp, texcoord);\n"
+       "}\n";
+
+static bool test_texsubimage;
+static GLuint tex;
+static GLuint prog;
+static GLint proj_loc;
+static GLint layer_loc;
+static unsigned expected_gray_levels[8][8][4]; /* x, y, z */
+
+
+static void
+print_usage_and_exit(const char *prog_name)
+{
+       printf("Usage: %s <test_mode>\n"
+              "  where <test_mode> is one of the following:\n"
+              "    teximage: test glCompressedTexImage3D\n"
+              "    texsubimage: test glCompressedTexSubImage3D\n",
+              prog_name);
+       piglit_report_result(PIGLIT_FAIL);
+}
+
+
+static void
+compute_expected_gray_levels(unsigned width, unsigned height, unsigned depth,
+                            unsigned xoffset, unsigned yoffset,
+                            unsigned zoffset, unsigned gray_level)
+{
+       unsigned x, y, z;
+       for (z = 0; z < depth; z++) {
+               for (y = 0; y < height; y++) {
+                       for (x = 0; x < width; x++) {
+                               expected_gray_levels
+                                       [x + xoffset]
+                                       [y + yoffset]
+                                       [z + zoffset]
+                                       = gray_level++;
+                       }
+               }
+       }
+}
+
+
+void
+piglit_init(int argc, char **argv)
+{
+       /* Parse args */
+       if (argc != 2)
+               print_usage_and_exit(argv[0]);
+       if (strcmp(argv[1], "teximage") == 0)
+               test_texsubimage = false;
+       else if (strcmp(argv[1], "texsubimage") == 0)
+               test_texsubimage = true;
+       else
+               print_usage_and_exit(argv[0]);
+
+       /* Make sure required GL features are present */
+#ifdef PIGLIT_USE_OPENGL
+       piglit_require_gl_version(21);
+       piglit_require_extension("GL_ARB_texture_compression");
+       piglit_require_extension("GL_3DFX_texture_compression_FXT1");
+#endif
+
+       /* We're using texture unit 0 for this entire test */
+       glActiveTexture(GL_TEXTURE0);
+
+       /* Create the texture */
+       glGenTextures(1, &tex);
+       glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
+       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
+       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+       /* Upload the image */
+       if (!test_texsubimage) {
+               glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0,
+                                      COMPRESSED_FORMAT,
+                                      8 * BLOCK_WIDTH,
+                                      8 * BLOCK_HEIGHT,
+                                      4,
+                                      0 /* border */,
+                                      256 * BLOCK_BYTES,
+                                      GRAYSCALE_IMAGES);
+               compute_expected_gray_levels(8, 8, 4, 0, 0, 0, 0);
+       } else {
+               unsigned xoffset, yoffset, zoffset;
+               unsigned gray_level = 0;
+               glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0,
+                                      COMPRESSED_FORMAT,
+                                      8 * BLOCK_WIDTH,
+                                      8 * BLOCK_HEIGHT,
+                                      4,
+                                      0 /* border */,
+                                      8 * 8 * 4 * BLOCK_BYTES,
+                                      NULL);
+               for (xoffset = 0; xoffset < 8; xoffset += 4) {
+                       for (yoffset = 0; yoffset < 8; yoffset += 4) {
+                               for (zoffset = 0; zoffset < 4; zoffset += 2) {
+                                       glCompressedTexSubImage3D(
+                                               GL_TEXTURE_2D_ARRAY, 0,
+                                               xoffset * BLOCK_WIDTH,
+                                               yoffset * BLOCK_HEIGHT,
+                                               zoffset,
+                                               4 * BLOCK_WIDTH,
+                                               4 * BLOCK_HEIGHT,
+                                               2,
+                                               COMPRESSED_FORMAT,
+                                               4 * 4 * 2 * BLOCK_BYTES,
+                                               GRAYSCALE_IMAGES[gray_level]);
+                                       compute_expected_gray_levels(
+                                               4, 4, 2,
+                                               xoffset, yoffset, zoffset,
+                                               gray_level);
+                                       gray_level += 4 * 4 * 2;
+                               }
+                       }
+               }
+       }
+
+       /* Create the shaders */
+       prog = glCreateProgram();
+       glAttachShader(prog, piglit_compile_shader_text(GL_VERTEX_SHADER,
+                                                       vs_text));
+       glAttachShader(prog, piglit_compile_shader_text(GL_FRAGMENT_SHADER,
+                                                       fs_text));
+       glBindAttribLocation(prog, PIGLIT_ATTRIB_POS, "piglit_Vertex");
+       glBindAttribLocation(prog, PIGLIT_ATTRIB_TEX, "piglit_MultiTexCoord0");
+       glLinkProgram(prog);
+       if (!piglit_link_check_status(prog))
+               piglit_report_result(PIGLIT_FAIL);
+       proj_loc = glGetUniformLocation(prog, "proj");
+       layer_loc = glGetUniformLocation(prog, "layer");
+       if (!piglit_check_gl_error(GL_NO_ERROR))
+               piglit_report_result(PIGLIT_FAIL);
+}
+
+
+bool
+check_result(unsigned x, unsigned y, unsigned z)
+{
+       float f = expected_gray_levels[x][y][z] / 255.0;
+       float expected[] = { f, f, f };
+       return piglit_probe_rect_rgb((z * 8 + x) * BLOCK_WIDTH,
+                                    y * BLOCK_HEIGHT,
+                                    BLOCK_WIDTH,
+                                    BLOCK_HEIGHT,
+                                    expected);
+}
+
+
+enum piglit_result
+piglit_display(void)
+{
+       unsigned x, y, z;
+       bool pass = true;
+
+       /* Draw each texture level */
+       glClear(GL_COLOR_BUFFER_BIT);
+       glUseProgram(prog);
+       piglit_ortho_uniform(proj_loc, piglit_width, piglit_height);
+       for (z = 0; z < 4; z++) {
+               glUniform1i(layer_loc, z);
+               piglit_draw_rect_tex(z * 8 * BLOCK_WIDTH, 0,
+                                    8 * BLOCK_WIDTH, 8 * BLOCK_HEIGHT,
+                                    0, 0, 1, 1);
+       }
+       if (!piglit_check_gl_error(GL_NO_ERROR))
+               pass = false;
+
+       /* Check results */
+       for (z = 0; z < 4; z++) {
+               for (y = 0; y < 8; y++) {
+                       for (x = 0; x < 8; x++) {
+                               pass = check_result(x, y, z) && pass;
+                       }
+               }
+       }
+
+       piglit_present_results();
+
+       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
-- 
1.8.0.3

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to