[Piglit] [PATCH] getteximage-formats: test GetTexImage after rendering to textures

Marek Olšák maraeo at gmail.com
Wed Feb 6 16:06:25 PST 2013


This tests whether our GetTexImage doesn't actually rely on TexImage being
called first. In this test, TexImage is not used to store data.
---
 tests/all.tests                       |    1 +
 tests/texturing/getteximage-formats.c |   75 +++++++++++++++++++++++++--------
 2 files changed, 58 insertions(+), 18 deletions(-)

diff --git a/tests/all.tests b/tests/all.tests
index 5a76926..00756f7 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -1607,6 +1607,7 @@ add_plain_test(ext_framebuffer_object, 'fbo-readpixels-depth-formats')
 add_plain_test(ext_framebuffer_object, 'fbo-scissor-bitmap')
 add_plain_test(ext_framebuffer_object, 'fbo-storage-completeness')
 add_plain_test(ext_framebuffer_object, 'fbo-storage-formats')
+add_plain_test(ext_framebuffer_object, 'getteximage-formats init-by-rendering')
 
 
 ext_packed_depth_stencil = Group()
diff --git a/tests/texturing/getteximage-formats.c b/tests/texturing/getteximage-formats.c
index affcfd5..1643f14 100644
--- a/tests/texturing/getteximage-formats.c
+++ b/tests/texturing/getteximage-formats.c
@@ -48,9 +48,10 @@ PIGLIT_GL_TEST_CONFIG_END
 static const char *TestName = "getteximage-formats";
 
 static const GLfloat clearColor[4] = { 0.4, 0.4, 0.4, 0.0 };
+static GLuint texture_id;
+static GLboolean init_by_rendering;
 
-#define TEX_WIDTH 128
-#define TEX_HEIGHT 128
+#define TEX_SIZE 128
 
 #define DO_BLEND 1
 
@@ -64,13 +65,14 @@ static const GLfloat clearColor[4] = { 0.4, 0.4, 0.4, 0.0 };
 static GLboolean
 make_texture_image(GLenum intFormat, GLubyte upperRightTexel[4])
 {
-	GLubyte tex[TEX_HEIGHT][TEX_WIDTH][4];
+	GLubyte tex[TEX_SIZE][TEX_SIZE][4];
 	int i, j;
+	GLuint fb, status;
 
-	for (i = 0; i < TEX_HEIGHT; i++) {
-		for (j = 0; j < TEX_WIDTH; j++) {
-			tex[i][j][0] = j * 255 / TEX_WIDTH;
-			tex[i][j][1] = i * 255 / TEX_HEIGHT;
+	for (i = 0; i < TEX_SIZE; i++) {
+		for (j = 0; j < TEX_SIZE; j++) {
+			tex[i][j][0] = j * 255 / TEX_SIZE;
+			tex[i][j][1] = i * 255 / TEX_SIZE;
 			tex[i][j][2] = 128;
 			if (((i >> 4) ^ (j >> 4)) & 1)
 				tex[i][j][3] = 255;  /* opaque */
@@ -79,10 +81,38 @@ make_texture_image(GLenum intFormat, GLubyte upperRightTexel[4])
 		}
 	}
 
-	memcpy(upperRightTexel, tex[TEX_HEIGHT-1][TEX_WIDTH-1], 4);
+	memcpy(upperRightTexel, tex[TEX_SIZE-1][TEX_SIZE-1], 4);
 
-	glTexImage2D(GL_TEXTURE_2D, 0, intFormat, TEX_WIDTH, TEX_HEIGHT, 0,
-					 GL_RGBA, GL_UNSIGNED_BYTE, tex);
+	glTexImage2D(GL_TEXTURE_2D, 0, intFormat, TEX_SIZE, TEX_SIZE, 0,
+		     GL_RGBA, GL_UNSIGNED_BYTE, init_by_rendering ? NULL : tex);
+
+	if (init_by_rendering) {
+		/* Initialize the mipmap levels. */
+		for (i = TEX_SIZE >> 1, j = 1; i; i >>= 1, j++) {
+			glTexImage2D(GL_TEXTURE_2D, j, intFormat, i, i, 0,
+				     GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+		}
+
+		/* Initialize the texture with glDrawPixels. */
+		glGenFramebuffers(1, &fb);
+		glBindFramebuffer(GL_FRAMEBUFFER, fb);
+		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+				       GL_TEXTURE_2D, texture_id, 0);
+		status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+		if (status != GL_FRAMEBUFFER_COMPLETE) {
+			glDeleteFramebuffers(1, &fb);
+			return GL_FALSE;
+		}
+
+		glViewport(0, 0, TEX_SIZE, TEX_SIZE);
+
+		glWindowPos2iARB(0, 0);
+		glDrawPixels(TEX_SIZE, TEX_SIZE, GL_RGBA, GL_UNSIGNED_BYTE, tex);
+		glGenerateMipmap(GL_TEXTURE_2D);
+
+		glDeleteFramebuffers(1, &fb);
+		glViewport(0, 0, piglit_width, piglit_height);
+	}
 
 	return glGetError() == GL_NO_ERROR;
 }
@@ -324,8 +354,8 @@ test_format(const struct test_desc *test,
 	    const struct format_desc *fmt)
 {
 	int x, y;
-	int w = TEX_WIDTH, h = TEX_HEIGHT;
-	GLfloat readback[TEX_HEIGHT][TEX_WIDTH][4];
+	int w = TEX_SIZE, h = TEX_SIZE;
+	GLfloat readback[TEX_SIZE][TEX_SIZE][4];
 	GLubyte upperRightTexel[4];
 	int level;
 	GLfloat expected[4], pix[4], tolerance[4];
@@ -357,7 +387,7 @@ test_format(const struct test_desc *test,
 		glDisable(GL_TEXTURE_2D);
 		glDisable(GL_BLEND);
 
-		x += TEX_WIDTH + 20;
+		x += TEX_SIZE + 20;
 
 		level = 0;
 		while (w > 0) {
@@ -485,21 +515,30 @@ piglit_display(void)
 void
 piglit_init(int argc, char **argv)
 {
-	GLuint t;
+	int i;
 
 	if ((piglit_get_gl_version() < 14) && !piglit_is_extension_supported("GL_ARB_window_pos")) {
 		printf("Requires GL 1.4 or GL_ARB_window_pos");
 		piglit_report_result(PIGLIT_SKIP);
 	}
 
-	fbo_formats_init(argc, argv, !piglit_automatic);
+	fbo_formats_init(1, argv, !piglit_automatic);
 	(void) fbo_formats_display;
 
-	glGenTextures(1, &t);
-	glBindTexture(GL_TEXTURE_2D, t);
+	for (i = 1; i < argc; i++) {
+		if (strcmp(argv[i], "init-by-rendering") == 0) {
+			init_by_rendering = GL_TRUE;
+			puts("The textures will be initialized by rendering "
+			     "to them using glDrawPixels.");
+			break;
+		}
+	}
+
+	glGenTextures(1, &texture_id);
+	glBindTexture(GL_TEXTURE_2D, texture_id);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
+	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, !init_by_rendering);
 
 	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 
-- 
1.7.10.4



More information about the Piglit mailing list