[Piglit] [PATCH piglit] texsubimage: Optionally use a PBO for the subimage upload

Anuj Phogat anuj.phogat at gmail.com
Mon Jan 12 15:27:21 PST 2015


On Mon, Dec 22, 2014 at 10:15 AM, Neil Roberts <neil at linux.intel.com> wrote:
> If the pbo option is given on the command line then the image sub-data
> will instead be uploaded from a PBO rather than directly from the
> malloc'd array. This is worth testing because the drivers often have
> different code-paths for PBO uploads.
> ---
>  tests/all.py                  |  3 +++
>  tests/texturing/texsubimage.c | 48 ++++++++++++++++++++++++++++++++-----------
>  2 files changed, 39 insertions(+), 12 deletions(-)
>
> diff --git a/tests/all.py b/tests/all.py
> index 1449551..70cb49f 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -2082,6 +2082,9 @@ add_plain_test(arb_pixel_buffer_object, 'pbo-readpixels-small')
>  add_plain_test(arb_pixel_buffer_object, 'pbo-teximage')
>  add_plain_test(arb_pixel_buffer_object, 'pbo-teximage-tiling')
>  add_plain_test(arb_pixel_buffer_object, 'pbo-teximage-tiling-2')
> +add_concurrent_test(arb_pixel_buffer_object, 'texsubimage pbo')
> +add_concurrent_test(arb_pixel_buffer_object, 'texsubimage array pbo')
> +add_concurrent_test(arb_pixel_buffer_object, 'texsubimage cube_map_array pbo')
>
>  # Group ARB_provoking_vertex
>  arb_provoking_vertex = {}
> diff --git a/tests/texturing/texsubimage.c b/tests/texturing/texsubimage.c
> index 615502f..8739f49 100644
> --- a/tests/texturing/texsubimage.c
> +++ b/tests/texturing/texsubimage.c
> @@ -92,6 +92,10 @@ static const struct test_desc texsubimage_test_sets[] = {
>  /* List of texture targets to test, terminated by GL_NONE */
>  static const GLenum *test_targets;
>
> +/* If set to GL_TRUE then the texture sub image upload will be read
> + * from a PBO */
> +static GLboolean use_pbo = GL_FALSE;
> +
>  static const char fragment_1d_array[] =
>         "#extension GL_EXT_texture_array : require\n"
>         "uniform sampler1DArray tex;\n"
> @@ -383,6 +387,7 @@ test_format(GLenum target, GLenum intFormat)
>         GLubyte *testImg;
>         GLboolean pass = GL_TRUE;
>         GLuint bw, bh, wMask, hMask, dMask;
> +       GLuint pbo = 0;
>         get_format_block_size(intFormat, &bw, &bh);
>         wMask = ~(bw-1);
>         hMask = ~(bh-1);
> @@ -427,6 +432,16 @@ test_format(GLenum target, GLenum intFormat)
>                 }
>         }
>
> +       if (use_pbo) {
> +               glGenBuffers(1, &pbo);
> +               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
> +               glBufferData(GL_PIXEL_UNPACK_BUFFER,
> +                            w * h * d * 4,
> +                            updated_img,
> +                            GL_STATIC_DRAW);
> +               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
> +       }
> +
>         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
>
>
> @@ -464,6 +479,9 @@ test_format(GLenum target, GLenum intFormat)
>                 assert(ty + th <= h);
>                 assert(tz + td <= d);
>
> +               if (use_pbo)
> +                       glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
> +
>                 /* replace texture region with data from updated image */
>                 glPixelStorei(GL_UNPACK_SKIP_PIXELS, tx);
>                 glPixelStorei(GL_UNPACK_SKIP_ROWS, ty);
> @@ -471,19 +489,22 @@ test_format(GLenum target, GLenum intFormat)
>                 if (d > 1) {
>                         glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
>                                         srcFormat, GL_UNSIGNED_BYTE,
> -                                       updated_img);
> +                                       use_pbo ? NULL : updated_img);
>                 } else if (h > 1) {
>                         glTexSubImage2D(target, 0, tx, ty, tw, th,
>                                         srcFormat, GL_UNSIGNED_BYTE,
> -                                       updated_img);
> +                                       use_pbo ? NULL : updated_img);
>                 } else if (w > 1) {
>                         glTexSubImage1D(target, 0, tx, tw,
>                                         srcFormat, GL_UNSIGNED_BYTE,
> -                                       updated_img);
> +                                       use_pbo ? NULL : updated_img);
>                 } else {
>                         assert(!"Unknown image dimensions");
>                 }
>
> +               if (use_pbo)
> +                       glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
> +
>                 /* draw test image */
>                 glClear(GL_COLOR_BUFFER_BIT);
>                 draw_and_read_texture(w, h, d, testImg);
> @@ -510,6 +531,8 @@ test_format(GLenum target, GLenum intFormat)
>         free(updated_img);
>         free(updated_ref);
>         free(testImg);
> +       if (use_pbo)
> +               glDeleteBuffers(1, &pbo);
>
>         return pass;
>  }
> @@ -624,29 +647,30 @@ piglit_init(int argc, char **argv)
>                 GL_TEXTURE_CUBE_MAP_ARRAY_ARB,
>                 GL_NONE
>         };
> +       int remaining_argc = 1;
> +       int i;
>
>         test_targets = core_targets;
>
> -       if (argc > 1) {
> -               if (!strcmp(argv[1], "array")) {
> +       for (i = 1; i < argc; i++) {
> +               if (!strcmp(argv[i], "array")) {
>                         piglit_require_extension("GL_EXT_texture_array");
>                         piglit_require_GLSL();
>                         test_targets = array_targets;
> -               } else if (!strcmp(argv[1], "cube_map_array")) {
> +               } else if (!strcmp(argv[i], "cube_map_array")) {
>                         piglit_require_extension
>                                 ("GL_ARB_texture_cube_map_array");
>                         piglit_require_GLSL();
>                         test_targets = cube_map_array_targets;
> +               } else if (!strcmp(argv[i], "pbo")) {
> +                       piglit_require_extension("GL_ARB_pixel_buffer_object");
> +                       use_pbo = GL_TRUE;
>                 } else {
> -                       goto handled_targets;
> +                       argv[remaining_argc++] = argv[i];
>                 }
> -
> -               argc--;
> -               argv++;
>         }
> - handled_targets:
>
> -       fbo_formats_init(argc, argv, 0);
> +       fbo_formats_init(remaining_argc, argv, 0);
>         (void) fbo_formats_display;
>
>         piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
> --
> 1.9.3
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the Piglit mailing list