On 02/26/2015 08:25 AM, Neil Roberts wrote:
> Hi,
> 
> While trying to make _mesa_meta_pbo_TexSubImage understand the image
> height packing property I got stuck trying to work out whether it should
> have any affect for 1D array textures. Intuitively to me it seems like
> it shouldn't have any effect because you have to use glTexImage2D to
> specify the image so it is like the depth is always 1 and there is only
> a single image. If you wanted to put some padding between the rows you
> could always use GL_UN/PACK_ROW_LENGTH so I don't think the image height
> provides any extra functionality. I couldn't find any clear indication
> in the GL spec about it but it does explicitly say that
> GL_UN/PACK_SKIP_IMAGES should be ignored. It seems weird to ignore skip
> images but not the image height.
> 
> I made a piglit test which I'm attaching below to check what currently
> happens. If I run it on current Mesa with software fallback the image
> height is ignored for glTexImage2D but *is* used for glGetTexImage. This
> doesn't seem like it could possibly be the right behaviour because it is
> inconsistent. I also tried it on NVidia's driver and they do take the
> image height into account for both glTexImage2D and glGetTexImage which
> seems surprising to me.

IMAGE_HEIGHT is definitely used for glGetTexImage because that and
IMAGE_WIDTH allow you to get a subimage (before ARB_get_texture_sub_image).

I guess on glTexImage2D those could let you initialize a subregion of a
larger texture... kind of like doing glTexImage2D(..., NULL) followed by
glTexSubImage2D.  It does seem pretty weird.

Let me dig around in the specs and see if I can come up with a more
solid suggestion.

> Does anybody have any further insight about what's the right thing to
> do? Or perhaps someone could test it on some other drivers as well?
> 
> Regards,
> - Neil
> 
> ------- >8 --------------- (use git am --scissors to automatically chop here)
> Subject: Add a test for whether GL_UN/PACK_IMAGE_HEIGHT affects 1D_ARRAY tex
> 
> Tests setting GL_PACK_IMAGE_HEIGHT and then calling glGetTexImage for
> with GL_TEXTURE_1D_ARRAY. It also tests GL_UNPACK_IMAGE_HEIGHT with
> glTexImage2D. The image height should cause the rows to have padding
> between them. However in Mesa if it hits the software fallback path
> then the image height doesn't currently seem to affect glTexImage2D so
> the test fails.
> ---
>  tests/all.py                                    |   2 +
>  tests/texturing/CMakeLists.gl.txt               |   1 +
>  tests/texturing/array-texture-1d-image-height.c | 208 
> ++++++++++++++++++++++++
>  3 files changed, 211 insertions(+)
>  create mode 100644 tests/texturing/array-texture-1d-image-height.c
> 
> diff --git a/tests/all.py b/tests/all.py
> index 2d321c5..78535fe 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -2663,6 +2663,8 @@ for test in ('depth-clear', 'depth-layered-clear', 
> 'depth-draw', 'fs-writes-dept
>               'stencil-clear', 'stencil-layered-clear', 'stencil-draw', 
> 'fs-writes-stencil'):
>      add_concurrent_test(ext_texture_array, ['fbo-depth-array', test])
>  add_plain_test(ext_texture_array, ['array-texture'])
> +add_concurrent_test(ext_texture_array, ['array-texture-1d-image-height'])
> +add_concurrent_test(ext_texture_array, ['array-texture-1d-image-height', 
> 'pbo'])
>  add_concurrent_test(ext_texture_array, ['ext_texture_array-errors'])
>  add_concurrent_test(ext_texture_array, ['getteximage-targets', '1D_ARRAY'])
>  add_concurrent_test(ext_texture_array, ['getteximage-targets', '2D_ARRAY'])
> diff --git a/tests/texturing/CMakeLists.gl.txt 
> b/tests/texturing/CMakeLists.gl.txt
> index b77f71f..10cb789 100644
> --- a/tests/texturing/CMakeLists.gl.txt
> +++ b/tests/texturing/CMakeLists.gl.txt
> @@ -13,6 +13,7 @@ link_libraries (
>  piglit_add_executable (1-1-linear-texture 1-1-linear-texture.c)
>  piglit_add_executable (array-depth-roundtrip array-depth-roundtrip.c)
>  piglit_add_executable (array-texture array-texture.c)
> +piglit_add_executable (array-texture-1d-image-height 
> array-texture-1d-image-height.c)
>  piglit_add_executable (bptc-modes bptc-modes.c)
>  piglit_add_executable (bptc-float-modes bptc-float-modes.c)
>  piglit_add_executable (compressedteximage compressedteximage.c)
> diff --git a/tests/texturing/array-texture-1d-image-height.c 
> b/tests/texturing/array-texture-1d-image-height.c
> new file mode 100644
> index 0000000..8167bc4
> --- /dev/null
> +++ b/tests/texturing/array-texture-1d-image-height.c
> @@ -0,0 +1,208 @@
> +/*
> + * Copyright (c) 2015 Intel Corporation
> + *
> + * Permission is hereby , free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
> DEALINGS
> + * IN THE SOFTWARE.
> + *
> + *
> + * Test that GL_PACK_IMAGE_HEIGHT and GL_UNPACK_IMAGE_HEIGHT affect
> + * retrieving a GL_TEXTURE_1D_ARRAY. Setting the image height should
> + * cause gaps to be introduced between the rows.
> + *
> + * Author: Neil Roberts
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +     config.supports_gl_compat_version = 11;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +     /* Not used */
> +     return PIGLIT_FAIL;
> +}
> +
> +static bool
> +test_tex_image(bool use_pbo)
> +{
> +     /* 1x2 RGBA image, but with an extra row that should be
> +      * skipped if image height is working correctly */
> +     GLubyte src_tex_data[] = {
> +             0xff, 0x00, 0x00, 0xff,
> +             0x00, 0xff, 0x00, 0xff, /* padding row */
> +             0x00, 0x00, 0xff, 0xff,
> +             0x24, 0x24, 0x24, 0xff, /* padding row */
> +     };
> +     /* Space for a 1x2 RGBA image */
> +     GLubyte dst_tex_data[4 * 2];
> +     GLuint tex;
> +     bool pass = true;
> +     GLuint pbo = 0;
> +
> +     glGenTextures(1, &tex);
> +     glBindTexture(GL_TEXTURE_1D_ARRAY, tex);
> +
> +     if (use_pbo) {
> +             glGenBuffers(1, &pbo);
> +             glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
> +             glBufferData(GL_PIXEL_UNPACK_BUFFER,
> +                          sizeof(src_tex_data),
> +                          src_tex_data,
> +                          GL_STATIC_DRAW);
> +     }
> +
> +     /* Set the image height. This should cause the second row of
> +      * the source data to be skipped */
> +     glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 2);
> +     glTexImage2D(GL_TEXTURE_1D_ARRAY,
> +                  0, /* level */
> +                  GL_RGBA, /* internal format */
> +                  1, 2, /* width/height */
> +                  0, /* border */
> +                  GL_RGBA, /* format */
> +                  GL_UNSIGNED_BYTE,
> +                  use_pbo ? NULL : src_tex_data);
> +     glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
> +
> +     if (use_pbo) {
> +             glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
> +             glDeleteBuffers(1, &pbo);
> +     }
> +
> +     memset(dst_tex_data, 0x42, sizeof(dst_tex_data));
> +
> +     glGetTexImage(GL_TEXTURE_1D_ARRAY,
> +                   0, /* level */
> +                   GL_RGBA, GL_UNSIGNED_BYTE,
> +                   dst_tex_data);
> +
> +     if (memcmp(dst_tex_data + 4, src_tex_data + 4 * 2, 4) == 0) {
> +             printf("GL_UNPACK_IMAGE_HEIGHT *does* affect "
> +                    "glTexImage2D(GL_TEXTURE_1D_ARRAY)\n");
> +     } else if (memcmp(dst_tex_data + 4, src_tex_data + 4, 4) == 0) {
> +             printf("GL_UNPACK_IMAGE_HEIGHT *does not* affect "
> +                    "glTexImage2D(GL_TEXTURE_1D_ARRAY)\n");
> +             pass = false;
> +     } else {
> +             printf("Unexpected values read from glGetTexImage\n");
> +             pass = false;
> +     }
> +
> +     return pass;
> +}
> +
> +static bool
> +test_get_tex_image(bool use_pbo)
> +{
> +     /* 1x2 RGBA image */
> +     GLubyte src_tex_data[] = {
> +             0xff, 0x00, 0x00, 0xff,
> +             0x00, 0xff, 0x00, 0xff
> +     };
> +     /* Enough space for image padding in the destination texture */
> +     GLubyte dst_tex_data[4 * 4];
> +     GLuint tex;
> +     bool pass = true;
> +     GLuint pbo = 0;
> +
> +     glGenTextures(1, &tex);
> +     glBindTexture(GL_TEXTURE_1D_ARRAY, tex);
> +     glTexImage2D(GL_TEXTURE_1D_ARRAY,
> +                  0, /* level */
> +                  GL_RGBA, /* internal format */
> +                  1, 2, /* width/height */
> +                  0, /* border */
> +                  GL_RGBA, /* format */
> +                  GL_UNSIGNED_BYTE,
> +                  src_tex_data);
> +
> +     memset(dst_tex_data, 0x42, sizeof(dst_tex_data));
> +
> +     if (use_pbo) {
> +             glGenBuffers(1, &pbo);
> +             glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
> +             glBufferData(GL_PIXEL_PACK_BUFFER,
> +                          sizeof(dst_tex_data),
> +                          NULL,
> +                          GL_STREAM_READ);
> +     }
> +
> +     /* Set the image height. This should make the rows be padded out */
> +     glPixelStorei(GL_PACK_IMAGE_HEIGHT, 2);
> +     glGetTexImage(GL_TEXTURE_1D_ARRAY,
> +                   0, /* level */
> +                   GL_RGBA, GL_UNSIGNED_BYTE,
> +                   use_pbo ? NULL : dst_tex_data);
> +     glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0);
> +
> +     if (use_pbo) {
> +             glGetBufferSubData(GL_PIXEL_PACK_BUFFER,
> +                                0, /* offset */
> +                                sizeof(dst_tex_data),
> +                                dst_tex_data);
> +             glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
> +             glDeleteBuffers(1, &pbo);
> +     }
> +
> +     if (memcmp(dst_tex_data + 2 * 4, src_tex_data + 4, 4) == 0) {
> +             printf("GL_PACK_IMAGE_HEIGHT *does* affect "
> +                    "glGetTexImage(GL_TEXTURE_1D_ARRAY)\n");
> +     } else if (memcmp(dst_tex_data + 4, src_tex_data + 4, 4) == 0) {
> +             printf("GL_PACK_IMAGE_HEIGHT *does not* affect "
> +                    "glGetTexImage(GL_TEXTURE_1D_ARRAY)\n");
> +             pass = false;
> +     } else {
> +             printf("Unexpected values read from glGetTexImage\n");
> +             pass = false;
> +     }
> +
> +     return pass;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +     bool pass = true;
> +     bool use_pbo = false;
> +     int i;
> +
> +     for (i = 1; i < argc; i++) {
> +             if (!strcmp(argv[i], "pbo")) {
> +                     use_pbo = true;
> +             } else {
> +                     printf("Error: Unknown parameter %s\n", argv[i]);
> +                     piglit_report_result(PIGLIT_SKIP);
> +             }
> +     }
> +
> +     piglit_require_extension("GL_EXT_texture_array");
> +
> +     if (use_pbo)
> +             piglit_require_extension("GL_ARB_pixel_buffer_object");
> +
> +     pass = test_tex_image(use_pbo) && pass;
> +     pass = test_get_tex_image(use_pbo) && pass;
> +
> +     piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
> +}
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to