<div dir="ltr">On Sat, Mar 22, 2014 at 5:03 AM, Jon Ashburn <span dir="ltr"><<a href="mailto:jon@lunarg.com" target="_blank">jon@lunarg.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
 tests/texturing/getteximage-targets.c | 225 +++++++++++++++++++---------------<br>
 1 file changed, 127 insertions(+), 98 deletions(-)<br>
<br>
diff --git a/tests/texturing/getteximage-targets.c b/tests/texturing/getteximage-targets.c<br>
index 383ee03..1b626db 100644<br>
--- a/tests/texturing/getteximage-targets.c<br>
+++ b/tests/texturing/getteximage-targets.c<br>
@@ -41,29 +41,34 @@ piglit_display(void)<br>
<br>
 #define IMAGE_WIDTH 32<br>
 #define IMAGE_HEIGHT 32<br>
-#define IMAGE_SIZE (IMAGE_WIDTH*IMAGE_HEIGHT*4)<br>
+#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT * 4)<br>
<br>
-static void init_layer_data(GLubyte *layer_data, int num_layers)<br>
+static void<br>
+init_layer_data(GLubyte *layer_data, int num_layers)<br>
 {<br>
        int x, y, z, i, j;<br>
<br>
        for (z = 0; z < num_layers; z++) {<br>
-               GLubyte *data = layer_data + IMAGE_SIZE*z;<br>
+               GLubyte *data = layer_data + IMAGE_SIZE * z;<br>
<br>
                for (x = 0; x < IMAGE_WIDTH; x += 4) {<br>
                        for (y = 0; y < IMAGE_HEIGHT; y += 4) {<br>
-                               int r = (x+1) * 255 / (IMAGE_WIDTH - 1);<br>
-                               int g = (y+1) * 255 / (IMAGE_HEIGHT - 1);<br>
-                               int b = (z+1) * 255 / (num_layers-1);<br>
+                               int r = (x + 1) * 255 / (IMAGE_WIDTH - 1);<br>
+                               int g = (y + 1) * 255 / (IMAGE_HEIGHT - 1);<br>
+                               int b = (z + 1) * 255 / (num_layers - 1);<br>
                                int a = x ^ y ^ z;<br>
<br>
                                /* each 4x4 block constains only one color (for S3TC) */<br>
                                for (i = 0; i < 4; i++) {<br>
                                        for (j = 0; j < 4; j++) {<br>
-                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 0] = r;<br>
-                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 1] = g;<br>
-                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 2] = b;<br>
-                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 3] = a;<br>
+                                               data[((y + j) * IMAGE_WIDTH + x<br>
+                                                     + i) * 4 + 0] = r;<br>
+                                               data[((y + j) * IMAGE_WIDTH + x<br>
+                                                     + i) * 4 + 1] = g;<br>
+                                               data[((y + j) * IMAGE_WIDTH + x<br>
+                                                     + i) * 4 + 2] = b;<br>
+                                               data[((y + j) * IMAGE_WIDTH + x<br>
+                                                     + i) * 4 + 3] = a;<br>
                                        }<br>
                                }<br>
                        }<br>
@@ -71,7 +76,8 @@ static void init_layer_data(GLubyte *layer_data, int num_layers)<br>
        }<br>
 }<br>
<br>
-static void compare_layer(int layer, int num_elements, int tolerance,<br>
+static bool<br>
+compare_layer(int layer, int num_elements, int tolerance,<br>
                          GLubyte *data, GLubyte *expected)<br>
 {<br>
        int i;<br>
@@ -84,17 +90,115 @@ static void compare_layer(int layer, int num_elements, int tolerance,<br>
                               (i / 4) / IMAGE_WIDTH, (i / 4) % IMAGE_HEIGHT, i % 4);<br>
                        printf("    expected: %i\n", expected[i]);<br>
                        printf("    got: %i\n", data[i]);<br>
-                       piglit_report_result(PIGLIT_FAIL);<br>
+                       return false;<br>
                }<br>
        }<br>
+       return true;<br>
 }<br>
<br>
-void piglit_init(int argc, char **argv)<br>
+static bool<br>
+getTexImage(GLenum target, GLubyte data[][IMAGE_SIZE],<br>
+           GLenum internalformat, int tolerance)<br>
 {<br>
-       int i, tolerance = 0, num_layers;<br>
+       int i, j;<br>
+       int num_layers=1, num_faces=1, layer_size;<br>
+       GLubyte data2[18][IMAGE_SIZE];<br>
+       bool pass = true;<br>
+<br>
+<br>
+       memset(data2, 123, sizeof(data2));<br></blockquote><div>This can be moved to just before the loops below. <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

+<br>
+       switch (target) {<br>
+       case GL_TEXTURE_1D:<br>
+               glTexImage1D(GL_TEXTURE_1D, 0, internalformat, IMAGE_WIDTH, 0,<br>
+                            GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
+               layer_size = IMAGE_WIDTH * 4;<br>
+               break;<br>
+<br>
+       case GL_TEXTURE_2D:<br>
+       case GL_TEXTURE_RECTANGLE:<br>
+               glTexImage2D(target, 0, internalformat, IMAGE_WIDTH,<br>
+                            IMAGE_HEIGHT, 0,<br>
+                            GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
+               layer_size = IMAGE_SIZE;<br>
+               break;<br>
+<br>
+       case GL_TEXTURE_3D:<br>
+               num_layers = 16;<br>
+               glTexImage3D(GL_TEXTURE_3D, 0, internalformat,<br>
+                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,<br>
+                            GL_UNSIGNED_BYTE, data);<br>
+               layer_size = IMAGE_SIZE;<br>
+               break;<br>
+<br>
+       case GL_TEXTURE_CUBE_MAP:<br>
+               num_faces = 6;<br>
+               for (i = 0; i < num_faces; i++) {<br>
+                       glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,<br>
+                                    internalformat, IMAGE_WIDTH, IMAGE_HEIGHT,<br>
+                                    0, GL_RGBA,<br>
+                                    GL_UNSIGNED_BYTE, data[i]);<br>
+               }<br>
+               target = GL_TEXTURE_CUBE_MAP_POSITIVE_X;<br>
+               layer_size = IMAGE_SIZE;<br>
+               break;<br>
+<br>
+       case GL_TEXTURE_1D_ARRAY:<br>
+               num_layers = 7;<br>
+               glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat,<br>
+                            IMAGE_WIDTH, num_layers, 0,<br>
+                            GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
+               // test as a single layer 2D image<br>
+               layer_size = IMAGE_WIDTH * 4 * num_layers;<br>
+               num_layers = 1;<br>
+               break;<br>
+<br>
+       case GL_TEXTURE_2D_ARRAY:<br>
+               num_layers = 7;<br>
+               glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat,<br>
+                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0,<br>
+                            GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
+               layer_size = IMAGE_SIZE;<br>
+               break;<br>
+<br>
+       case GL_TEXTURE_CUBE_MAP_ARRAY:<br>
+               num_layers = 6 * 3;<br>
+               glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat,<br>
+                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,<br>
+                            GL_UNSIGNED_BYTE, data);<br>
+               layer_size = IMAGE_SIZE;<br>
+               break;<br>
+<br>
+       default:<br>
+               puts("Invalid texture target.");<br>
+               return false;<br>
+<br>
+       }<br></blockquote><div>memset(data2, ...) here.  Add<br><br></div>  assert(num_layers * num_faces * layer_size <= sizeof(data2))<br><div> <br></div><div>in case some future changes require a larger data2.<br></div>
<div><br></div><div>In the second patch, you can allocate the buffer here instead of in the outer loop.<br><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

+       for (i = 0; i < num_faces; i++) {<br>
+               GLubyte *dataGet=NULL;<br>
+               glGetTexImage(target + i, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2[i]);<br>
+               dataGet = data2[i];<br>
+               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;<br>
+<br>
+               for (j = 0; j < num_layers; j++) {<br>
+                       pass = compare_layer(j + i, layer_size, tolerance, dataGet,<br>
+                                            data[j + i]) && pass;<br>
+                       dataGet += layer_size;<br>
+               }<br>
+       }<br></blockquote>I think it is better to covert the loops to<br><br></div><div class="gmail_quote">  for (i = 0; i < num_faces; i++) {<br></div><div class="gmail_quote">    glGetTexImage(...);<br>  }<br></div>
<div class="gmail_quote">  for (i = 0; i < num_layers; i++) {<br></div><div class="gmail_quote">    compare_layer(...);<br></div><div class="gmail_quote">  }    <br></div><div class="gmail_quote"><br></div><div class="gmail_quote">
since data2 is large enough.  That is, num_faces tells you how many glGetTexImage() calls are needed, and num_layers tells you how many compare_layer() calls are needed.  You will need to set num_layers to 6 when target is GL_TEXTURE_CUBE_MAP.</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">When PBO path is added, you can make the size of the buffer be (num_layers * num_faces * layer_size), and map it once after all the glGetTexImage() calls are made.  Since the PBO buffer is one-dimensional, it seems better to make data2 one-dimensional too.<br>
<br><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+       return pass;<br>
+}<br>
+<br>
+void<br>
+piglit_init(int argc, char **argv)<br>
+{<br>
+       int i;<br>
        GLenum target = GL_TEXTURE_2D;<br>
+       bool pass = true;<br>
        GLenum internalformat = GL_RGBA8;<br>
-       GLubyte data[18][IMAGE_SIZE], data2[18][IMAGE_SIZE];<br>
+       GLubyte data[18][IMAGE_SIZE];<br>
+       int tolerance = 0;<br>
<br>
        for (i = 1; i < argc; i++) {<br>
                if (strcmp(argv[i], "1D") == 0) {<br>
@@ -133,89 +237,14 @@ void piglit_init(int argc, char **argv)<br>
        }<br>
<br>
        init_layer_data(data[0], 18);<br>
-       memset(data2, 123, sizeof(data2));<br>
<br>
        printf("Testing %s\n", piglit_get_gl_enum_name(target));<br>
-<br>
-       switch (target) {<br>
-       case GL_TEXTURE_1D:<br>
-               glTexImage1D(GL_TEXTURE_1D, 0, internalformat, IMAGE_WIDTH, 0,<br>
-                            GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
-               glGetTexImage(GL_TEXTURE_1D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);<br>
-               piglit_check_gl_error(GL_NO_ERROR);<br>
-               compare_layer(0, 128, tolerance, data2[0], data[0]);<br>
-               piglit_report_result(PIGLIT_PASS);<br>
-<br>
-       case GL_TEXTURE_2D:<br>
-       case GL_TEXTURE_RECTANGLE:<br>
-               glTexImage2D(target, 0, internalformat, IMAGE_WIDTH, IMAGE_HEIGHT, 0,<br>
-                            GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
-               glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);<br>
-               piglit_check_gl_error(GL_NO_ERROR);<br>
-               compare_layer(0, IMAGE_SIZE, tolerance, data2[0], data[0]);<br>
-               piglit_report_result(PIGLIT_PASS);<br>
-<br>
-       case GL_TEXTURE_3D:<br>
-               num_layers = 16;<br>
-               glTexImage3D(GL_TEXTURE_3D, 0, internalformat,<br>
-                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,<br>
-                            GL_UNSIGNED_BYTE, data);<br>
-               glGetTexImage(GL_TEXTURE_3D, 0,<br>
-                             GL_RGBA, GL_UNSIGNED_BYTE, data2);<br>
-               piglit_check_gl_error(GL_NO_ERROR);<br>
-               for (i = 0; i < num_layers; i++) {<br>
-                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);<br>
-               }<br>
-               piglit_report_result(PIGLIT_PASS);<br>
-<br>
-       case GL_TEXTURE_CUBE_MAP:<br>
-               for (i = 0; i < 6; i++) {<br>
-                       glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,<br>
-                                    internalformat, IMAGE_WIDTH, IMAGE_HEIGHT, 0, GL_RGBA,<br>
-                                    GL_UNSIGNED_BYTE, data[i]);<br>
-               }<br>
-               for (i = 0; i < 6; i++) {<br>
-                       glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,<br>
-                                     GL_RGBA, GL_UNSIGNED_BYTE, data2[i]);<br>
-                       piglit_check_gl_error(GL_NO_ERROR);<br>
-                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);<br>
-               }<br>
-               piglit_report_result(PIGLIT_PASS);<br>
-<br>
-       case GL_TEXTURE_1D_ARRAY:<br>
-               num_layers = 7;<br>
-               glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat, IMAGE_WIDTH, num_layers, 0,<br>
-                            GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
-               glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);<br>
-               piglit_check_gl_error(GL_NO_ERROR);<br>
-               compare_layer(0, IMAGE_WIDTH*4*num_layers, tolerance, data2[0], data[0]);<br>
-               piglit_report_result(PIGLIT_PASS);<br>
-<br>
-       case GL_TEXTURE_2D_ARRAY:<br>
-               num_layers = 7;<br>
-               glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat,<br>
-                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
-               glGetTexImage(GL_TEXTURE_2D_ARRAY, 0,<br>
-                             GL_RGBA, GL_UNSIGNED_BYTE, data2);<br>
-               piglit_check_gl_error(GL_NO_ERROR);<br>
-               for (i = 0; i < num_layers; i++) {<br>
-                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);<br>
-               }<br>
-               piglit_report_result(PIGLIT_PASS);<br>
-<br>
-       case GL_TEXTURE_CUBE_MAP_ARRAY:<br>
-               num_layers = 6*3;<br>
-               glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat,<br>
-                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);<br>
-               glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0,<br>
-                             GL_RGBA, GL_UNSIGNED_BYTE, data2);<br>
-               piglit_check_gl_error(GL_NO_ERROR);<br>
-               for (i = 0; i < num_layers; i++) {<br>
-                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);<br>
-               }<br>
-               piglit_report_result(PIGLIT_PASS);<br>
-       }<br>
-<br>
-       puts("Invalid texture target.");<br>
-       piglit_report_result(PIGLIT_FAIL);<br>
+       pass = getTexImage(target, data, internalformat, tolerance) &&<br>
+                               pass;<br>
+<br>
+       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;<br>
+       if (pass)<br>
+               piglit_report_result(PIGLIT_PASS);<br>
+       else<br>
+               piglit_report_result(PIGLIT_FAIL);<br>
 }<br>
<span class=""><font color="#888888">--<br>
1.8.1.2<br>
<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br>olv@LunarG.com
</div></div>