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