If the 'array' command line option is passed to the texsubimage test
it will now try updating subregions of 1D and 2D array textures. This
requires a shader to render.
---
 tests/all.py                  |   1 +
 tests/texturing/texsubimage.c | 122 +++++++++++++++++++++++++++++++++---------
 2 files changed, 99 insertions(+), 24 deletions(-)

diff --git a/tests/all.py b/tests/all.py
index a3c8628..0175ffc 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -2881,6 +2881,7 @@ add_concurrent_test(ext_texture_array, 
'getteximage-targets 2D_ARRAY')
 for test_mode in ['teximage', 'texsubimage']:
     test_name = 'compressed {0}'.format(test_mode)
     ext_texture_array[test_name] = 
PiglitGLTest(['ext_texture_array-{}'.format(test_name), '-fbo'])
+add_concurrent_test(ext_texture_array, 'texsubimage array')
 
 arb_texture_cube_map = {}
 spec['ARB_texture_cube_map'] = arb_texture_cube_map
diff --git a/tests/texturing/texsubimage.c b/tests/texturing/texsubimage.c
index d2aab25..126dc06 100644
--- a/tests/texturing/texsubimage.c
+++ b/tests/texturing/texsubimage.c
@@ -89,6 +89,30 @@ static const struct test_desc texsubimage_test_sets[] = {
        }
 };
 
+/* List of texture targets to test, terminated by GL_NONE */
+static const GLenum *test_targets;
+
+static const char fragment_1d_array[] =
+       "#extension GL_EXT_texture_array : require\n"
+       "uniform sampler1DArray tex;\n"
+       "void\n"
+       "main()\n"
+       "{\n"
+       "        float layer = gl_TexCoord[0].t * 64.0 - 0.5;\n"
+       "        gl_FragColor = texture1DArray(tex, vec2(gl_TexCoord[0].s,\n"
+       "                                                layer));\n"
+       "}\n";
+
+static const char fragment_2d_array[] =
+       "#extension GL_EXT_texture_array : require\n"
+       "uniform sampler2DArray tex;\n"
+       "void\n"
+       "main()\n"
+       "{\n"
+       "        float layer = gl_TexCoord[0].p * 8.0 - 0.5;\n"
+       "        gl_FragColor = texture2DArray(tex, vec3(gl_TexCoord[0].st,\n"
+       "                                                layer));\n"
+       "}\n";
 
 /**
  * XXX add this to piglit-util if useful elsewhere.
@@ -159,6 +183,7 @@ equal_images(GLenum target,
                th = 1;
                /* flow through */
        case GL_TEXTURE_2D:
+       case GL_TEXTURE_1D_ARRAY:
                tz = 0;
                td = 1;
                break;
@@ -270,17 +295,19 @@ create_texture(GLenum target,
        glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
        glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
        glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
-       if (target == GL_TEXTURE_1D) {
-               glTexImage1D(target, 0, intFormat, w, 0,
+       if (d > 1) {
+               glTexImage3D(target, 0, intFormat, w, h, d, 0,
                             srcFormat, GL_UNSIGNED_BYTE, img);
        }
-       else if (target == GL_TEXTURE_2D) {
+       else if (h > 1) {
                glTexImage2D(target, 0, intFormat, w, h, 0,
                             srcFormat, GL_UNSIGNED_BYTE, img);
        }
-       else if (target == GL_TEXTURE_3D) {
-               glTexImage3D(target, 0, intFormat, w, h, d, 0,
+       else if (w > 1) {
+               glTexImage1D(target, 0, intFormat, w, 0,
                             srcFormat, GL_UNSIGNED_BYTE, img);
+       } else {
+               assert(!"Unknown texture dimensions");
        }
 
        return tex;
@@ -319,7 +346,7 @@ test_format(GLenum target, GLenum intFormat)
        hMask = ~(bh-1);
        dMask = ~0;
 
-       if (target != GL_TEXTURE_3D)
+       if (target != GL_TEXTURE_3D && target != GL_TEXTURE_2D_ARRAY)
                d = 1;
        if (target == GL_TEXTURE_1D)
                h = 1;
@@ -353,8 +380,6 @@ test_format(GLenum target, GLenum intFormat)
                }
        }
 
-       glEnable(target);
-
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 
 
@@ -396,20 +421,20 @@ test_format(GLenum target, GLenum intFormat)
                glPixelStorei(GL_UNPACK_SKIP_PIXELS, tx);
                glPixelStorei(GL_UNPACK_SKIP_ROWS, ty);
                glPixelStorei(GL_UNPACK_SKIP_IMAGES, tz);
-               if (target == GL_TEXTURE_1D) {
-                       glTexSubImage1D(target, 0, tx, tw,
+               if (d > 1) {
+                       glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
                                        srcFormat, GL_UNSIGNED_BYTE,
                                        updated_img);
-               }
-               else if (target == GL_TEXTURE_2D) {
+               } else if (h > 1) {
                        glTexSubImage2D(target, 0, tx, ty, tw, th,
                                        srcFormat, GL_UNSIGNED_BYTE,
                                        updated_img);
-               }
-               else if (target == GL_TEXTURE_3D) {
-                       glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
+               } else if (w > 1) {
+                       glTexSubImage1D(target, 0, tx, tw,
                                        srcFormat, GL_UNSIGNED_BYTE,
                                        updated_img);
+               } else {
+                       assert(!"Unknown image dimensions");
                }
 
                /* draw test image */
@@ -433,8 +458,6 @@ test_format(GLenum target, GLenum intFormat)
                }
        }
 
-       glDisable(target);
-
        free(original_img);
        free(original_ref);
        free(updated_img);
@@ -453,8 +476,29 @@ static GLboolean
 test_formats(GLenum target)
 {
        GLboolean pass = GL_TRUE;
+       GLuint program = 0;
        int i, j;
 
+       switch (target) {
+       case GL_TEXTURE_1D_ARRAY:
+               program = piglit_build_simple_program(NULL, fragment_1d_array);
+               break;
+       case GL_TEXTURE_2D_ARRAY:
+               program = piglit_build_simple_program(NULL, fragment_2d_array);
+               break;
+       default:
+               glEnable(target);
+               break;
+       }
+
+       if (program != 0) {
+               GLuint tex_location;
+
+               glUseProgram(program);
+               tex_location = glGetUniformLocation(program, "tex");
+               glUniform1i(tex_location, 0);
+       }
+
        /* loop over the format groups */
        for (i = 0; i < ARRAY_SIZE(texsubimage_test_sets); i++) {
                const struct test_desc *set = &texsubimage_test_sets[i];
@@ -485,6 +529,13 @@ test_formats(GLenum target)
                }
        }
 
+       if (program == 0) {
+               glDisable(target);
+       } else {
+               glUseProgram(0);
+               glDeleteProgram(program);
+       }
+
        return pass;
 }
 
@@ -492,17 +543,12 @@ test_formats(GLenum target)
 enum piglit_result
 piglit_display(void)
 {
-       static const GLenum targets[] = {
-               GL_TEXTURE_1D,
-               GL_TEXTURE_2D,
-               GL_TEXTURE_3D
-       };
        GLboolean pass = GL_TRUE;
        int i;
 
        /* Loop over 1/2/3D texture targets */
-       for (i = 0; i < ARRAY_SIZE(targets); i++) {
-               pass = test_formats(targets[i]) && pass;
+       for (i = 0; test_targets[i] != GL_NONE; i++) {
+               pass = test_formats(test_targets[i]) && pass;
        }
 
        return pass ? PIGLIT_PASS : PIGLIT_FAIL;
@@ -512,6 +558,34 @@ piglit_display(void)
 void
 piglit_init(int argc, char **argv)
 {
+       static const GLenum core_targets[] = {
+               GL_TEXTURE_1D,
+               GL_TEXTURE_2D,
+               GL_TEXTURE_3D,
+               GL_NONE
+       };
+       static const GLenum array_targets[] = {
+               GL_TEXTURE_1D_ARRAY_EXT,
+               GL_TEXTURE_2D_ARRAY_EXT,
+               GL_NONE
+       };
+
+       test_targets = core_targets;
+
+       if (argc > 1) {
+               if (!strcmp(argv[1], "array")) {
+                       piglit_require_extension("GL_EXT_texture_array");
+                       piglit_require_GLSL();
+                       test_targets = array_targets;
+               } else {
+                       goto handled_targets;
+               }
+
+               argc--;
+               argv++;
+       }
+ handled_targets:
+
        fbo_formats_init(argc, argv, 0);
        (void) fbo_formats_display;
 
-- 
1.9.3

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

Reply via email to