[Piglit] [PATCH] arb_fbo: Test glBlitFramebuffer on depth textures with nonzero miplevels

Chad Versace chad.versace at linux.intel.com
Wed Aug 15 12:51:43 PDT 2012


Extend the framebuffer-blit-levels test to verify that
glBlitFramebuffer works when blitting to and from miplevels other than
zero for depth textures.

CC: Paul Berry <stereotype441 at gmail.com>
---
 .../framebuffer-blit-levels.c                      | 125 ++++++++++++++++-----
 1 file changed, 94 insertions(+), 31 deletions(-)

diff --git a/tests/spec/arb_framebuffer_object/framebuffer-blit-levels.c b/tests/spec/arb_framebuffer_object/framebuffer-blit-levels.c
index 31e0cf2..65bc497 100644
--- a/tests/spec/arb_framebuffer_object/framebuffer-blit-levels.c
+++ b/tests/spec/arb_framebuffer_object/framebuffer-blit-levels.c
@@ -70,6 +70,14 @@ GLuint aux_framebuffer;
 GLuint test_texture;
 GLuint aux_texture;
 
+GLenum texture_internal_format;
+GLenum texture_format;
+GLenum texture_type;
+
+GLbitfield blit_mask;
+GLenum framebuffer_attachment;
+
+
 #define LOG2_SIZE 7
 #define SIZE (1 << LOG2_SIZE)
 
@@ -83,8 +91,8 @@ GLuint aux_texture;
  * by taking an integer mod four different primes.
  */
 static void
-create_test_data(GLfloat *data, unsigned level,
-		 unsigned width, unsigned height)
+create_test_data_rgba(GLfloat *data, unsigned level,
+		      unsigned width, unsigned height)
 {
 	unsigned pixel;
 	unsigned num_pixels = width * height;
@@ -97,13 +105,47 @@ create_test_data(GLfloat *data, unsigned level,
 	}
 }
 
+/**
+ * Generate a block of test data where each pixel has a unique depth value in
+ * the range [0.0, 1.0).
+ */
+static void
+create_test_data_depth(GLfloat *data, unsigned level,
+		       unsigned width, unsigned height)
+{
+	unsigned pixel;
+	unsigned num_pixels = width * height;
+	double depth_delta = 0.95 / ((SIZE >> level) * (SIZE >> level));
+	double depth_value = 0;
+
+	for (pixel = 0; pixel < num_pixels; ++pixel) {
+		data[pixel] = depth_value;
+		depth_value += depth_delta;
+	}
+}
+
+static void
+create_test_data(GLfloat *data, GLenum texture_format,
+		 unsigned level, unsigned width, unsigned height)
+{
+	if (texture_format == GL_RGBA)
+		create_test_data_rgba(data, level, width, height);
+	else if (texture_format == GL_DEPTH_COMPONENT)
+		create_test_data_depth(data, level, width, height);
+	else
+		assert(0);
+}
+
 static void
 print_usage_and_exit(char *prog_name)
 {
 	printf("Usage: %s <test_mode>\n"
 	       "  where <test_mode> is one of:\n"
 	       "    draw: test blitting *to* the given texture type\n"
-	       "    read: test blitting *from* the given texture type\n",
+	       "    read: test blitting *from* the given texture type\n"
+	       "  where <format> is one of:\n"
+	       "    rgba\n"
+	       "    depth\n",
 	       prog_name);
 	piglit_report_result(PIGLIT_FAIL);
 }
@@ -113,7 +155,7 @@ piglit_init(int argc, char **argv)
 {
 	unsigned level;
 
-	if (argc != 2) {
+	if (argc != 3) {
 		print_usage_and_exit(argv[0]);
 	}
 
@@ -125,6 +167,22 @@ piglit_init(int argc, char **argv)
 		print_usage_and_exit(argv[0]);
 	}
 
+	if(strcmp(argv[2], "rgba") == 0) {
+		texture_internal_format = GL_RGBA;
+		texture_format = GL_RGBA;
+		texture_type = GL_FLOAT;
+		framebuffer_attachment = GL_COLOR_ATTACHMENT0;
+		blit_mask = GL_COLOR_BUFFER_BIT;
+	} else if (strcmp(argv[2], "depth") == 0) {
+		texture_internal_format = GL_DEPTH_COMPONENT;
+		texture_format = GL_DEPTH_COMPONENT;
+		texture_type = GL_FLOAT;
+		framebuffer_attachment = GL_DEPTH_ATTACHMENT;
+		blit_mask = GL_DEPTH_BUFFER_BIT;
+	} else {
+		print_usage_and_exit(argv[0]);
+	}
+
 	piglit_require_extension("GL_ARB_framebuffer_object");
 
 	/* Set up test framebuffer and test texture, but don't
@@ -139,9 +197,12 @@ piglit_init(int argc, char **argv)
 			GL_NEAREST);
 	for (level = 0; level < LOG2_SIZE; ++level) {
 		glTexImage2D(GL_TEXTURE_2D, level,
-			     GL_RGBA, SIZE >> level, SIZE >> level,
-			     0 /* border */, GL_RGBA,
-			     GL_BYTE /* type */, NULL /* data */);
+			     texture_internal_format,
+			     SIZE >> level, SIZE >> level,
+			     0 /* border */,
+			     texture_format,
+			     texture_type,
+			     NULL /* data */);
 	}
 
 	/* Set up aux framebuffer */
@@ -151,11 +212,11 @@ piglit_init(int argc, char **argv)
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 	glTexImage2D(GL_TEXTURE_2D, 0 /* level */,
-		     GL_RGBA, SIZE, SIZE,
-		     0 /* border */, GL_RGBA,
-		     GL_BYTE /* type */, NULL /* data */);
+		     texture_internal_format, SIZE, SIZE,
+		     0 /* border */, texture_format,
+		     texture_type, NULL /* data */);
 	glBindFramebuffer(GL_FRAMEBUFFER, aux_framebuffer);
-	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+	glFramebufferTexture2D(GL_FRAMEBUFFER, framebuffer_attachment,
 			       GL_TEXTURE_2D, aux_texture, 0 /* level */);
 }
 
@@ -170,14 +231,14 @@ piglit_display()
 	for (level = 0; level < LOG2_SIZE; ++level) {
 		unsigned width = SIZE >> level;
 		unsigned height = SIZE >> level;
-		create_test_data(data, level, width, height);
+		create_test_data(data, texture_format, level, width, height);
 		if (test_mode == TEST_MODE_READ) {
 			/* Populate directly */
 			glBindTexture(GL_TEXTURE_2D, test_texture);
 			glTexImage2D(GL_TEXTURE_2D, level,
-				     GL_RGBA, width, height,
-				     0 /* border */, GL_RGBA,
-				     GL_FLOAT /* type */, data);
+				     texture_internal_format, width, height,
+				     0 /* border */, texture_format,
+				     texture_type, data);
 		} else {
 			/* Populate via aux texture */
 			glBindFramebuffer(GL_READ_FRAMEBUFFER,
@@ -186,18 +247,18 @@ piglit_display()
 					  test_framebuffer);
 			glBindTexture(GL_TEXTURE_2D, aux_texture);
 			glTexImage2D(GL_TEXTURE_2D, 0 /* level */,
-				     GL_RGBA, width, height,
-				     0 /* border */, GL_RGBA,
-				     GL_FLOAT /* type */, data);
+				     texture_internal_format, width, height,
+				     0 /* border */, texture_format,
+				     texture_type, data);
 			glBindTexture(GL_TEXTURE_2D, test_texture);
 			glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
-					       GL_COLOR_ATTACHMENT0,
+					       framebuffer_attachment,
 					       GL_TEXTURE_2D,
 					       test_texture,
 					       level);
 			glBlitFramebuffer(0, 0, width, height,
 					  0, 0, width, height,
-					  GL_COLOR_BUFFER_BIT, GL_NEAREST);
+					  blit_mask, GL_NEAREST);
 		}
 	}
 
@@ -206,17 +267,18 @@ piglit_display()
 		unsigned width = SIZE >> level;
 		unsigned height = SIZE >> level;
 		printf("Testing level %d\n", level);
-		create_test_data(data, level, width, height);
+		create_test_data(data, texture_format, level, width, height);
 		if (test_mode == TEST_MODE_DRAW) {
 			/* Read texture data directly using glReadPixels() */
 			glBindFramebuffer(GL_READ_FRAMEBUFFER, test_texture);
 			glFramebufferTexture2D(GL_READ_FRAMEBUFFER,
-					       GL_COLOR_ATTACHMENT0,
+					       framebuffer_attachment,
 					       GL_TEXTURE_2D,
 					       test_texture,
 					       level);
-			pass = piglit_probe_image_rgba(0, 0, width, height,
-						       data) && pass;
+			pass = piglit_probe_image_color(0, 0, width, height,
+							texture_format,
+							data) && pass;
 		} else {
 			/* Read via aux texture */
 			glBindFramebuffer(GL_READ_FRAMEBUFFER,
@@ -225,22 +287,23 @@ piglit_display()
 					  aux_framebuffer);
 			glBindTexture(GL_TEXTURE_2D, test_texture);
 			glFramebufferTexture2D(GL_READ_FRAMEBUFFER,
-					       GL_COLOR_ATTACHMENT0,
+					       framebuffer_attachment,
 					       GL_TEXTURE_2D,
 					       test_texture,
 					       level);
 			glBindTexture(GL_TEXTURE_2D, aux_texture);
 			glTexImage2D(GL_TEXTURE_2D, 0 /* level */,
-				     GL_RGBA, width, height,
-				     0 /* border */, GL_RGBA,
-				     GL_BYTE /* type */, NULL);
+				     texture_internal_format, width, height,
+				     0 /* border */, texture_format,
+				     texture_type, NULL);
 			glBlitFramebuffer(0, 0, width, height,
 					  0, 0, width, height,
-					  GL_COLOR_BUFFER_BIT, GL_NEAREST);
+					  blit_mask, GL_NEAREST);
 			glBindFramebuffer(GL_READ_FRAMEBUFFER,
 					  aux_framebuffer);
-			pass = piglit_probe_image_rgba(0, 0, width, height,
-						       data) && pass;
+			pass = piglit_probe_image_color(0, 0, width, height,
+							texture_format,
+							data) && pass;
 		}
 	}
 
-- 
1.7.11.4



More information about the Piglit mailing list