[Piglit] [PATCH 2/2 v2] getteximage-targets: Add read texture image into PBO case for each target

Jon Ashburn jon at lunarg.com
Fri Mar 21 14:03:21 PDT 2014


---
 tests/texturing/getteximage-targets.c | 38 ++++++++++++++++++++++++++++-------
 1 file changed, 31 insertions(+), 7 deletions(-)

diff --git a/tests/texturing/getteximage-targets.c b/tests/texturing/getteximage-targets.c
index 1b626db..9b471c2 100644
--- a/tests/texturing/getteximage-targets.c
+++ b/tests/texturing/getteximage-targets.c
@@ -97,16 +97,24 @@ compare_layer(int layer, int num_elements, int tolerance,
 }
 
 static bool
-getTexImage(GLenum target, GLubyte data[][IMAGE_SIZE],
+getTexImage(bool doPBO, GLenum target, GLubyte data[][IMAGE_SIZE],
 	    GLenum internalformat, int tolerance)
 {
 	int i, j;
 	int num_layers=1, num_faces=1, layer_size;
 	GLubyte data2[18][IMAGE_SIZE];
+	GLuint packPBO;
 	bool pass = true;
 
-
-	memset(data2, 123, sizeof(data2));
+	/* Setup the PBO or data array to read into from glGetTexImage */
+	if (doPBO) {
+		glGenBuffers(1, &packPBO);
+		glBindBuffer(GL_PIXEL_PACK_BUFFER, packPBO);
+	} else {
+		glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+		memset(data2, 123, sizeof(data2));
+	}
+	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
 	switch (target) {
 	case GL_TEXTURE_1D:
@@ -176,8 +184,20 @@ getTexImage(GLenum target, GLubyte data[][IMAGE_SIZE],
 	}
 	for (i = 0; i < num_faces; i++) {
 		GLubyte *dataGet=NULL;
-		glGetTexImage(target + i, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2[i]);
-		dataGet = data2[i];
+		if (doPBO) {
+			glBufferData(GL_PIXEL_PACK_BUFFER, layer_size * num_layers,
+						NULL, GL_STREAM_READ);
+			glGetTexImage(target + i, 0, GL_RGBA,
+				      GL_UNSIGNED_BYTE, NULL);
+			dataGet = (GLubyte *) glMapBufferRange(
+						       GL_PIXEL_PACK_BUFFER, 0,
+						       layer_size * num_layers,
+						       GL_MAP_READ_BIT);
+		} else {
+			glGetTexImage(target + i, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+				      data2[i]);
+			dataGet = data2[i];
+		}
 		pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
 
 		for (j = 0; j < num_layers; j++) {
@@ -238,8 +258,12 @@ piglit_init(int argc, char **argv)
 
 	init_layer_data(data[0], 18);
 
-	printf("Testing %s\n", piglit_get_gl_enum_name(target));
-	pass = getTexImage(target, data, internalformat, tolerance) &&
+	printf("Testing %s into PBO\n", piglit_get_gl_enum_name(target));
+	pass = getTexImage(true, target, data, internalformat, tolerance) &&
+				pass;
+
+	printf("Testing %s into client array\n", piglit_get_gl_enum_name(target));
+	pass = getTexImage(false, target, data, internalformat, tolerance) &&
 				pass;
 
 	pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
-- 
1.8.1.2



More information about the Piglit mailing list