[Mesa-dev] Should GL_UN/PACK_IMAGE_HEIGHT affect GL_TEXTURE_1D_ARRAY?

Neil Roberts neil at linux.intel.com
Thu Feb 26 08:25:57 PST 2015


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.

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);
+}
-- 
1.9.3



More information about the mesa-dev mailing list