[Piglit] [PATCH] Add test case for existing test getteximage-targets of reading into a PBO.

Chia-I Wu olvaffe at gmail.com
Sun Mar 16 20:26:07 PDT 2014


On Tue, Mar 4, 2014 at 6:35 AM, Jon Ashburn <jon at lunarg.com> wrote:
> Initial  test always  used glGetTexImage into client memory for the various
> texture targets.  Add case of reading into PBO in addition to client memory.
Given the changes, I think it is better to split this into two
patches.  The first does the refactorings/cleanups you need.  The
second adds the PBO paths.  Another comment below.

> ---
>  tests/texturing/getteximage-targets.c | 334 ++++++++++++++++++++++++----------
>  1 file changed, 242 insertions(+), 92 deletions(-)
>
> diff --git a/tests/texturing/getteximage-targets.c b/tests/texturing/getteximage-targets.c
> index 383ee03..0e964ac 100644
> --- a/tests/texturing/getteximage-targets.c
> +++ b/tests/texturing/getteximage-targets.c
> @@ -48,22 +48,26 @@ static void init_layer_data(GLubyte *layer_data, int num_layers)
>         int x, y, z, i, j;
>
>         for (z = 0; z < num_layers; z++) {
> -               GLubyte *data = layer_data + IMAGE_SIZE*z;
> +               GLubyte *data = layer_data + IMAGE_SIZE * z;
>
>                 for (x = 0; x < IMAGE_WIDTH; x += 4) {
>                         for (y = 0; y < IMAGE_HEIGHT; y += 4) {
> -                               int r = (x+1) * 255 / (IMAGE_WIDTH - 1);
> -                               int g = (y+1) * 255 / (IMAGE_HEIGHT - 1);
> -                               int b = (z+1) * 255 / (num_layers-1);
> +                               int r = (x + 1) * 255 / (IMAGE_WIDTH - 1);
> +                               int g = (y + 1) * 255 / (IMAGE_HEIGHT - 1);
> +                               int b = (z + 1) * 255 / (num_layers - 1);
>                                 int a = x ^ y ^ z;
>
>                                 /* each 4x4 block constains only one color (for S3TC) */
>                                 for (i = 0; i < 4; i++) {
>                                         for (j = 0; j < 4; j++) {
> -                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 0] = r;
> -                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 1] = g;
> -                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 2] = b;
> -                                               data[((y+j)*IMAGE_WIDTH + x+i)*4 + 3] = a;
> +                                               data[((y + j) * IMAGE_WIDTH + x
> +                                                     + i) * 4 + 0] = r;
> +                                               data[((y + j) * IMAGE_WIDTH + x
> +                                                     + i) * 4 + 1] = g;
> +                                               data[((y + j) * IMAGE_WIDTH + x
> +                                                     + i) * 4 + 2] = b;
> +                                               data[((y + j) * IMAGE_WIDTH + x
> +                                                     + i) * 4 + 3] = a;
>                                         }
>                                 }
>                         }
> @@ -71,7 +75,8 @@ static void init_layer_data(GLubyte *layer_data, int num_layers)
>         }
>  }
>
> -static void compare_layer(int layer, int num_elements, int tolerance,
> +static bool
> +compare_layer(int layer, int num_elements, int tolerance,
>                           GLubyte *data, GLubyte *expected)
>  {
>         int i;
> @@ -84,17 +89,232 @@ static void compare_layer(int layer, int num_elements, int tolerance,
>                                (i / 4) / IMAGE_WIDTH, (i / 4) % IMAGE_HEIGHT, i % 4);
>                         printf("    expected: %i\n", expected[i]);
>                         printf("    got: %i\n", data[i]);
> -                       piglit_report_result(PIGLIT_FAIL);
> +                       return false;
>                 }
>         }
> +       return true;
>  }
>
> +bool
> +getTexImage(bool doPBO, GLenum target, GLubyte data[][IMAGE_SIZE],
> +           GLenum internalformat, int tolerance)
> +{
> +       int i, num_layers;
> +       GLubyte data2[18][IMAGE_SIZE];
> +       GLubyte *dataPBO=NULL;
> +       GLuint packPBO;
> +       bool pass = true;
> +
> +       /* Setup the PBO */
> +       if (doPBO) {
> +               glGenBuffers(1, &packPBO);
> +               glBindBuffer(GL_PIXEL_PACK_BUFFER, packPBO);
> +       } else {
> +               glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
> +               memset(data2, 123, sizeof(data2));
> +       }
> +       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +
> +       switch (target) {
> +       case GL_TEXTURE_1D:
> +               glTexImage1D(GL_TEXTURE_1D, 0, internalformat, IMAGE_WIDTH, 0,
> +                            GL_RGBA, GL_UNSIGNED_BYTE, data);
> +               if (doPBO) {
> +                       glBufferData(GL_PIXEL_PACK_BUFFER, IMAGE_WIDTH * 4,
> +                                               NULL, GL_STREAM_READ);
> +                       glGetTexImage(GL_TEXTURE_1D, 0, GL_RGBA,
> +                                     GL_UNSIGNED_BYTE, NULL);
> +                       dataPBO = (GLubyte *) glMapBufferRange(
> +                                                      GL_PIXEL_PACK_BUFFER, 0,
> +                                                      IMAGE_WIDTH * 4,
> +                                                      GL_MAP_READ_BIT);
> +               } else {
> +                       glGetTexImage(GL_TEXTURE_1D, 0, GL_RGBA,
> +                                     GL_UNSIGNED_BYTE, data2);
> +                       dataPBO = data2[0];
> +               }
> +               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +               pass = compare_layer(0, IMAGE_WIDTH * 4, tolerance,
> +                                    dataPBO, data[0]) && pass;
> +               return pass;
The use of PBO should be transparent to this (and other) switch cases
if possible.  Would it be better if you, before this big switch,

 - compute layer_size (i.e., IMAGE_WIDTH*4) and num_layers (i.e., 1)
 - call glBufferData if doPBO
 - add a void* to point to 0 or data2, for use with glGetTexImage()

Then either make compare_layer() map/unmap the pbo when doPBO, or move
all compare_layer() calls after the big switch.

The refactorings (computation of layer_size and num_layers, move
compare_layer() calls after the big switch) should be combined with
the first patch, and the addition of PBO paths should be done in the
second patch.

> +
> +       case GL_TEXTURE_2D:
> +       case GL_TEXTURE_RECTANGLE:
> +               glTexImage2D(target, 0, internalformat, IMAGE_WIDTH,
> +                            IMAGE_HEIGHT, 0,
> +                            GL_RGBA, GL_UNSIGNED_BYTE, data);
> +               if (doPBO) {
> +                       glBufferData(GL_PIXEL_PACK_BUFFER, IMAGE_SIZE,
> +                                    NULL, GL_STREAM_READ);
> +                       glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE,
> +                                     NULL);
> +                       dataPBO = (GLubyte *) glMapBufferRange(
> +                                                      GL_PIXEL_PACK_BUFFER, 0,
> +                                                      IMAGE_SIZE,
> +                                                      GL_MAP_READ_BIT);
> +               } else {
> +                       glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE,
> +                                     data2);
> +                       dataPBO = data2[0];
> +               }
> +               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +               pass = compare_layer(0, IMAGE_SIZE, tolerance, dataPBO, data[0])
> +                                               && pass;
> +               return pass;
> +
> +       case GL_TEXTURE_3D:
> +               num_layers = 16;
> +               glTexImage3D(GL_TEXTURE_3D, 0, internalformat,
> +                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,
> +                            GL_UNSIGNED_BYTE, data);
> +               if (doPBO) {
> +                       glBufferData(GL_PIXEL_PACK_BUFFER,
> +                                    IMAGE_SIZE * num_layers,
> +                                    NULL, GL_STREAM_READ);
> +                       glGetTexImage(GL_TEXTURE_3D, 0, GL_RGBA,
> +                                     GL_UNSIGNED_BYTE, NULL);
> +                       dataPBO = (GLubyte *) glMapBufferRange(
> +                                                   GL_PIXEL_PACK_BUFFER,
> +                                                   0, IMAGE_SIZE * num_layers,
> +                                                   GL_MAP_READ_BIT);
> +               } else {
> +                       glGetTexImage(GL_TEXTURE_3D, 0,
> +                                     GL_RGBA, GL_UNSIGNED_BYTE, data2);
> +                       dataPBO = data2[0];
> +               }
> +               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +               for (i = 0; i < num_layers; i++) {
> +                       pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
> +                                            data[i]) && pass;
> +                       dataPBO += IMAGE_SIZE;
> +               }
> +               return pass;
> +
> +       case GL_TEXTURE_CUBE_MAP:
> +               for (i = 0; i < 6; i++) {
> +                       glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
> +                                    internalformat, IMAGE_WIDTH, IMAGE_HEIGHT,
> +                                    0, GL_RGBA,
> +                                    GL_UNSIGNED_BYTE, data[i]);
> +               }
> +               for (i = 0; i < 6; i++) {
> +                       if (doPBO) {
> +                               glBufferData(GL_PIXEL_PACK_BUFFER, IMAGE_SIZE,
> +                                               NULL, GL_STREAM_READ);
> +                               glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i
> +                                             , 0, GL_RGBA,
> +                                             GL_UNSIGNED_BYTE, NULL);
> +                               dataPBO = (GLubyte *) glMapBufferRange(
> +                                                      GL_PIXEL_PACK_BUFFER, 0,
> +                                                      IMAGE_SIZE,
> +                                                      GL_MAP_READ_BIT);
> +                       } else {
> +                               glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i
> +                                             , 0, GL_RGBA,
> +                                             GL_UNSIGNED_BYTE, data2[i]);
> +                               dataPBO = data2[i];
> +                       }
> +                       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +                       pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
> +                                            data[i]) && pass;
> +               }
> +               return pass;
> +
> +       case GL_TEXTURE_1D_ARRAY:
> +               num_layers = 7;
> +               glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat,
> +                            IMAGE_WIDTH, num_layers, 0,
> +                            GL_RGBA, GL_UNSIGNED_BYTE, data);
> +               if (doPBO) {
> +                       glBufferData(GL_PIXEL_PACK_BUFFER,
> +                                    IMAGE_WIDTH * 4 * num_layers,
> +                                    NULL, GL_STREAM_READ);
> +                       glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
> +                                     GL_UNSIGNED_BYTE, NULL);
> +                       dataPBO = (GLubyte *) glMapBufferRange(
> +                                                  GL_PIXEL_PACK_BUFFER, 0,
> +                                                  IMAGE_WIDTH * 4 * num_layers,
> +                                                  GL_MAP_READ_BIT);
> +               } else {
> +                       glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA,
> +                                     GL_UNSIGNED_BYTE, data2);
> +                       dataPBO = data2[0];
> +               }
> +               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +               pass = compare_layer(0, IMAGE_WIDTH * 4 * num_layers,
> +                                    tolerance, dataPBO, data[0]) && pass;
> +               return pass;
> +
> +       case GL_TEXTURE_2D_ARRAY:
> +               num_layers = 7;
> +               glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat,
> +                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0,
> +                            GL_RGBA, GL_UNSIGNED_BYTE, data);
> +               if (doPBO) {
> +                       glBufferData(GL_PIXEL_PACK_BUFFER,
> +                                    IMAGE_SIZE * num_layers,
> +                                    NULL, GL_STREAM_READ);
> +                       glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA,
> +                                     GL_UNSIGNED_BYTE, NULL);
> +                       dataPBO = (GLubyte *) glMapBufferRange(
> +                                                      GL_PIXEL_PACK_BUFFER, 0,
> +                                                      IMAGE_SIZE * num_layers,
> +                                                      GL_MAP_READ_BIT);
> +               } else {
> +                       glGetTexImage(GL_TEXTURE_2D_ARRAY, 0,
> +                                     GL_RGBA, GL_UNSIGNED_BYTE, data2);
> +                       dataPBO = data2[0];
> +
> +               }
> +               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +               for (i = 0; i < num_layers; i++) {
> +                       pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
> +                                            data[i]) && pass;
> +                       dataPBO += IMAGE_SIZE;
> +               }
> +               return pass;
> +
> +       case GL_TEXTURE_CUBE_MAP_ARRAY:
> +               num_layers = 6 * 3;
> +               glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat,
> +                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,
> +                            GL_UNSIGNED_BYTE, data);
> +               if (doPBO) {
> +                       glBufferData(GL_PIXEL_PACK_BUFFER,
> +                                    IMAGE_SIZE * num_layers,
> +                                    NULL, GL_STREAM_READ);
> +                       glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0,
> +                                     GL_RGBA, GL_UNSIGNED_BYTE, NULL);
> +                       dataPBO = (GLubyte *) glMapBufferRange(
> +                                                      GL_PIXEL_PACK_BUFFER, 0,
> +                                                      IMAGE_SIZE * num_layers,
> +                                                      GL_MAP_READ_BIT);
> +               } else {
> +                       glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0,
> +                                     GL_RGBA, GL_UNSIGNED_BYTE, data2);
> +                       dataPBO = data2[0];
> +               }
> +               pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
> +               for (i = 0; i < num_layers; i++) {
> +                       pass = compare_layer(i, IMAGE_SIZE, tolerance, dataPBO,
> +                                            data[i]) && pass;
> +                       dataPBO += IMAGE_SIZE;
> +               }
> +               return pass;
> +       }
> +
> +       puts("Invalid texture target.");
> +       return false;
> +
> +}
>  void piglit_init(int argc, char **argv)
>  {
> -       int i, tolerance = 0, num_layers;
> +       int i;
>         GLenum target = GL_TEXTURE_2D;
> +       bool pass = true;
>         GLenum internalformat = GL_RGBA8;
> -       GLubyte data[18][IMAGE_SIZE], data2[18][IMAGE_SIZE];
> +       int tolerance = 0;
> +       GLubyte data[18][IMAGE_SIZE];
>
>         for (i = 1; i < argc; i++) {
>                 if (strcmp(argv[i], "1D") == 0) {
> @@ -133,89 +353,19 @@ void piglit_init(int argc, char **argv)
>         }
>
>         init_layer_data(data[0], 18);
> -       memset(data2, 123, sizeof(data2));
>
> -       printf("Testing %s\n", piglit_get_gl_enum_name(target));
> +       printf("Testing %s into PBO\n", piglit_get_gl_enum_name(target));
>
> -       switch (target) {
> -       case GL_TEXTURE_1D:
> -               glTexImage1D(GL_TEXTURE_1D, 0, internalformat, IMAGE_WIDTH, 0,
> -                            GL_RGBA, GL_UNSIGNED_BYTE, data);
> -               glGetTexImage(GL_TEXTURE_1D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);
> -               piglit_check_gl_error(GL_NO_ERROR);
> -               compare_layer(0, 128, tolerance, data2[0], data[0]);
> -               piglit_report_result(PIGLIT_PASS);
> +       pass = getTexImage(true, target, data, internalformat, tolerance) &&
> +                               pass;
> +       printf("Testing %s into client array\n", piglit_get_gl_enum_name(target));
> +       pass = getTexImage(false, target, data, internalformat, tolerance) &&
> +                               pass;
>
> -       case GL_TEXTURE_2D:
> -       case GL_TEXTURE_RECTANGLE:
> -               glTexImage2D(target, 0, internalformat, IMAGE_WIDTH, IMAGE_HEIGHT, 0,
> -                            GL_RGBA, GL_UNSIGNED_BYTE, data);
> -               glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);
> -               piglit_check_gl_error(GL_NO_ERROR);
> -               compare_layer(0, IMAGE_SIZE, tolerance, data2[0], data[0]);
> -               piglit_report_result(PIGLIT_PASS);
> +       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
>
> -       case GL_TEXTURE_3D:
> -               num_layers = 16;
> -               glTexImage3D(GL_TEXTURE_3D, 0, internalformat,
> -                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA,
> -                            GL_UNSIGNED_BYTE, data);
> -               glGetTexImage(GL_TEXTURE_3D, 0,
> -                             GL_RGBA, GL_UNSIGNED_BYTE, data2);
> -               piglit_check_gl_error(GL_NO_ERROR);
> -               for (i = 0; i < num_layers; i++) {
> -                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
> -               }
> +       if (pass)
>                 piglit_report_result(PIGLIT_PASS);
> -
> -       case GL_TEXTURE_CUBE_MAP:
> -               for (i = 0; i < 6; i++) {
> -                       glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
> -                                    internalformat, IMAGE_WIDTH, IMAGE_HEIGHT, 0, GL_RGBA,
> -                                    GL_UNSIGNED_BYTE, data[i]);
> -               }
> -               for (i = 0; i < 6; i++) {
> -                       glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
> -                                     GL_RGBA, GL_UNSIGNED_BYTE, data2[i]);
> -                       piglit_check_gl_error(GL_NO_ERROR);
> -                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
> -               }
> -               piglit_report_result(PIGLIT_PASS);
> -
> -       case GL_TEXTURE_1D_ARRAY:
> -               num_layers = 7;
> -               glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat, IMAGE_WIDTH, num_layers, 0,
> -                            GL_RGBA, GL_UNSIGNED_BYTE, data);
> -               glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);
> -               piglit_check_gl_error(GL_NO_ERROR);
> -               compare_layer(0, IMAGE_WIDTH*4*num_layers, tolerance, data2[0], data[0]);
> -               piglit_report_result(PIGLIT_PASS);
> -
> -       case GL_TEXTURE_2D_ARRAY:
> -               num_layers = 7;
> -               glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat,
> -                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
> -               glGetTexImage(GL_TEXTURE_2D_ARRAY, 0,
> -                             GL_RGBA, GL_UNSIGNED_BYTE, data2);
> -               piglit_check_gl_error(GL_NO_ERROR);
> -               for (i = 0; i < num_layers; i++) {
> -                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
> -               }
> -               piglit_report_result(PIGLIT_PASS);
> -
> -       case GL_TEXTURE_CUBE_MAP_ARRAY:
> -               num_layers = 6*3;
> -               glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat,
> -                            IMAGE_WIDTH, IMAGE_HEIGHT, num_layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
> -               glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0,
> -                             GL_RGBA, GL_UNSIGNED_BYTE, data2);
> -               piglit_check_gl_error(GL_NO_ERROR);
> -               for (i = 0; i < num_layers; i++) {
> -                       compare_layer(i, IMAGE_SIZE, tolerance, data2[i], data[i]);
> -               }
> -               piglit_report_result(PIGLIT_PASS);
> -       }
> -
> -       puts("Invalid texture target.");
> -       piglit_report_result(PIGLIT_FAIL);
> +       else
> +               piglit_report_result(PIGLIT_FAIL);
>  }
> --
> 1.8.1.2
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit



-- 
olv at LunarG.com


More information about the Piglit mailing list