[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