[Piglit] [PATCH] copyteximage: Add testing for all texture targets and internal formats

Anuj Phogat anuj.phogat at gmail.com
Mon Apr 9 21:00:58 PDT 2012


Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
---
 tests/texturing/copyteximage.c |  354 ++++++++++++++++++++++++++++------------
 1 files changed, 253 insertions(+), 101 deletions(-)

diff --git a/tests/texturing/copyteximage.c b/tests/texturing/copyteximage.c
index e358f67..2cc6de8 100644
--- a/tests/texturing/copyteximage.c
+++ b/tests/texturing/copyteximage.c
@@ -21,128 +21,280 @@
  * IN THE SOFTWARE.
  */
 
-/**
- * Basic test of glCopyTexImage() for various internal formats.
+/*
+ * file copyteximage.c
+ *
+ * Test to verify functionality of  glCopyTexImage() with various texture
+ * targets and texture internal formats.
  */
 
 
 #include "piglit-util.h"
 
-#define TEX_SIZE 64
+#define IMAGE_SIZE 16
 
-static const GLenum formats[] = { GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY };
+int piglit_window_mode = GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_ALPHA;
 
-#define NUM_FORMATS (sizeof(formats) / sizeof(formats[0])) 
+static const GLfloat fcolor[8][4] = {
+	/* GL_RED */
+	{0.5, 0.0, 0.0, 1.0},
+	/* GL_RG */
+	{0.5, 0.2, 0.0, 1.0},
+	/* GL_RGB */
+	{0.5, 0.2, 0.8, 1.0},
+	/* GL_RGBA8, GL_RGBA16, GL_RGBA16F, GL_RGBA32F */
+	{0.5, 0.2, 0.8, 0.4},
+	/* GL_LUMINANCE */
+	{0.5, 0.5, 0.5, 1},
+	/* GL_LUMINANCE_ALPHA */
+	{0.5, 0.5, 0.5, 0.4},
+	/* GL_INTENSITY */
+	{0.5, 0.5, 0.5, 0.5},
+	/* GL_DEPTH_COMPONENT */
+	{0.75, 0.75, 0.75, 1.0} };
 
-int piglit_width = TEX_SIZE*(NUM_FORMATS+1), piglit_height = TEX_SIZE;
-int piglit_window_mode = GLUT_DOUBLE | GLUT_RGB;
+static const struct {
+	GLenum format;
+	const GLvoid *expected;
+} test_vectors[] = {
+	{ GL_RED,		fcolor[0] },
+	{ GL_RG,		fcolor[1] },
 
+	/* Clamps the color values to [0, 1] */
+	{ GL_RGB8,		fcolor[2] },
+	{ GL_RGB16,		fcolor[2] },
 
-static GLboolean
-test(void)
-{
-   static const GLfloat expected[NUM_FORMATS][2][4] = {
-      /* GL_RGBA */
-      {
-         {0, 0, 0, 0},
-         {1, 1, 1, 1}
-      },
-      /* GL_LUMINANCE */
-      {
-         {0, 0, 0, 0},
-         {1, 1, 1, 1}
-      },
-      /* GL_LUMINANCE_ALPHA */
-      {
-         {0, 0, 0, 0},
-         {1, 1, 1, 1}
-      },
-      /* GL_INTENSITY */
-      {
-         {0, 0, 0, 0},
-         {1, 1, 1, 1}
-      }
-   };
-   GLubyte buf[TEX_SIZE][TEX_SIZE][4];
-   GLuint tex;
-   GLboolean pass = GL_TRUE;
-   int i, j;
-
-   for (i = 0; i < TEX_SIZE; i++) {
-      for (j = 0; j < TEX_SIZE; j++) {
-         buf[i][j][0] = (i * 255) / (TEX_SIZE - 1);
-         buf[i][j][1] = (j * 255) / (TEX_SIZE - 1);
-         buf[i][j][2] = (buf[i][j][0] * buf[i][j][1]) / 255;
-         buf[i][j][3] = 255;
-      }
-   }
+	/* Don't clamp color values to [0, 1] */
+	{ GL_RGB16F,		fcolor[2] },
+	{ GL_RGB32F,		fcolor[2] },
 
-   /* glDrawPixels the image on left */
-   glWindowPos2iARB(0, 0);
-   glDrawPixels(TEX_SIZE, TEX_SIZE, GL_RGBA, GL_UNSIGNED_BYTE, buf);
-
-   glGenTextures(1, &tex);
-   glBindTexture(GL_TEXTURE_2D, tex);
-   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
-   /* Do glCopyPixels and draw a texture quad for each format */
-   for (i = 0; i < NUM_FORMATS; i++) {
-      GLint x = TEX_SIZE * (i + 1);
-      GLint y = 0;
-      GLenum intFormat = formats[i];
-
-      glCopyTexImage2D(GL_TEXTURE_2D, 0, intFormat, 0, 0, TEX_SIZE, TEX_SIZE, 0);
-      if (glGetError()) {
-         printf("Unexpected error for format 0x%x\n", intFormat);
-         return GL_FALSE;
-      }
-
-      glViewport(x, y, TEX_SIZE, TEX_SIZE);
-
-      glEnable(GL_TEXTURE_2D);
-      glBegin(GL_POLYGON);
-      glTexCoord2f(0, 0);
-      glVertex2f(-1, -1);
-      glTexCoord2f(1, 0);
-      glVertex2f(1, -1);
-      glTexCoord2f(1, 1);
-      glVertex2f(1, 1);
-      glTexCoord2f(0, 1);
-      glVertex2f(-1, 1);
-      glEnd();
-
-      glDisable(GL_TEXTURE_2D);
-
-      /* test lower-left pixel */
-      if (!piglit_probe_pixel_rgb(x, y, expected[i][0]))
-         pass = GL_FALSE;
-      /* test upper-right pixel */
-      if (!piglit_probe_pixel_rgb(x + TEX_SIZE - 1, y + TEX_SIZE - 1, expected[i][1]))
-         pass = GL_FALSE;
-   }
+	/* Clamps the color values to [0, 1] */
+	{ GL_RGBA8,	  	fcolor[3] },
+	{ GL_RGBA16,	  	fcolor[3] },
 
-   glutSwapBuffers();
+	/* Don't clamp color values to [0, 1] */
+	{ GL_RGBA16F,	  	fcolor[3] },
+	{ GL_RGBA32F,	  	fcolor[3] },
 
-   return pass;
-}
+	{ GL_COMPRESSED_RED,	fcolor[0] },
+	{ GL_COMPRESSED_RG,	fcolor[1] },
+	{ GL_COMPRESSED_RGB,	fcolor[2] },
+	{ GL_COMPRESSED_RGBA,	fcolor[3] },
+
+	{ GL_LUMINANCE,	  	fcolor[4] },
+	{ GL_LUMINANCE_ALPHA,	fcolor[5] },
+
+	{ GL_INTENSITY,	  	fcolor[6] },
+
+	{ GL_DEPTH_COMPONENT,  	fcolor[7] },
+	{ GL_DEPTH_COMPONENT16, fcolor[7] },
+	{ GL_DEPTH_COMPONENT24, fcolor[7] },
+	{ GL_DEPTH_COMPONENT32F, fcolor[7] },
+};
+
+static const GLenum target[] = {
+	GL_TEXTURE_1D,
+	GL_TEXTURE_2D,
+	GL_TEXTURE_CUBE_MAP };
 
+int piglit_width = IMAGE_SIZE * (ARRAY_SIZE(test_vectors) + 1);
+int piglit_height = IMAGE_SIZE;
+
+static const float texCoords_1d[2] = { 0.0, 1.0 };
+static const float texCoords_2d[4][2] = {
+	{ 0.0, 0.0 },
+	{ 1.0, 0.0 },
+	{ 1.0, 1.0 },
+	{ 0.0, 1.0 } };
+
+GLboolean
+is_compressed_format(GLenum format)
+{
+   switch (format) {
+   case GL_COMPRESSED_RED:
+   case GL_COMPRESSED_RG:
+   case GL_COMPRESSED_RGB:
+   case GL_COMPRESSED_RGBA:
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
 
 enum piglit_result
 piglit_display(void)
 {
-   if (test())
-      return PIGLIT_PASS;
-   else
-      return PIGLIT_FAIL;
-}
+	GLfloat buf_fcolor[IMAGE_SIZE][IMAGE_SIZE][4];
+	GLuint tex;
+	GLboolean pass = GL_TRUE;
+	GLenum format;
+	const GLfloat *expected;
+	int i, j;
+
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+	/* Image data setup */
+	for (i = 0; i < IMAGE_SIZE; i++) {
+		for (j = 0; j < IMAGE_SIZE; j++) {
+			buf_fcolor[i][j][0] = 0.5;
+			buf_fcolor[i][j][1] = 0.2;
+			buf_fcolor[i][j][2] = 0.8;
+			buf_fcolor[i][j][3] = 0.4;
+		}
+	}
+
+	/* Do glCopyPixels and draw a textured rectangle for each format
+	 * and each texture target
+	 */
+	for (j = 0; j < ARRAY_SIZE(target); j++) {
+
+		/* Draw a pixel rectangle with float color data. As per OpenGL 3.0
+		 * specification integer formats are not allowed in glDrawPixels
+		 */
+		glDrawPixels(IMAGE_SIZE, IMAGE_SIZE, GL_RGBA,
+			     GL_FLOAT, buf_fcolor);
+
+		/* Texture setup */
+		glGenTextures(1, &tex);
+		glBindTexture(target[j], tex);
+		glTexParameteri(target[j],
+				GL_TEXTURE_MIN_FILTER,
+				GL_NEAREST);
+		glTexParameteri(target[j],
+				GL_TEXTURE_MAG_FILTER,
+				GL_NEAREST);
+		glTexParameteri(target[j],
+				GL_GENERATE_MIPMAP,
+				GL_FALSE);
 
+		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+		for (i = 0; i < ARRAY_SIZE(test_vectors); i++) {
+			GLint x = IMAGE_SIZE * (i + 1);
+			GLint y = 0;
+			GLfloat vertices_1d[2][2] = { {x, y},
+						      {x + IMAGE_SIZE, y} };
+
+			format = test_vectors[i].format;
+			expected = (const float*)test_vectors[i].expected;
+
+			if(!piglit_automatic)
+				printf("Texture target = %s, Internal"
+				       " format = %s\n",
+				       piglit_get_gl_enum_name(target[j]),
+				       piglit_get_gl_enum_name(format));
+
+			if (((format == GL_RGBA16F ||
+			      format == GL_RGBA32F) &&
+			     !piglit_is_extension_supported(
+			     "GL_ARB_texture_float")) ||
+
+			    ((format == GL_RG) &&
+			     !piglit_is_extension_supported(
+			     "GL_ARB_texture_rg"))) {
+				if (!piglit_automatic)
+					printf("Internal format = %s skipped\n",
+					       piglit_get_gl_enum_name(format));
+				   continue;
+			}
+
+			/* To avoid failures not related to this test case,
+			 * loosen up the tolerence for compressed texture
+			 * formats
+			 */
+			if (is_compressed_format(format))
+				piglit_set_tolerance_for_bits(7, 7, 7, 7);
+			else
+				piglit_set_tolerance_for_bits(8, 8, 8, 8);
+
+			switch(target[j]) {
+
+			case GL_TEXTURE_1D:
+				glCopyTexImage1D(GL_TEXTURE_1D, 0,
+						 format,
+						 0, 0, IMAGE_SIZE, 0);
+				pass = piglit_check_gl_error(GL_NO_ERROR)
+				       && pass;
+
+				glEnable(target[j]);
+				glEnableClientState(GL_VERTEX_ARRAY);
+				glTexCoordPointer(1, GL_FLOAT, 0, texCoords_1d);
+				glVertexPointer(2, GL_FLOAT, 0, vertices_1d);
+
+				glDrawArrays(GL_LINES, 0, 2);
+				pass = piglit_probe_pixel_rgba(x, 0, expected)
+				       && pass;
+				pass = piglit_probe_pixel_rgba(x + IMAGE_SIZE - 1,
+							       0, expected)
+				       && pass;
+				break;
+
+			case GL_TEXTURE_2D:
+				glCopyTexImage2D(GL_TEXTURE_2D, 0, format, 0, 0,
+						 IMAGE_SIZE, IMAGE_SIZE, 0);
+				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+				glEnable(target[j]);
+				glTexCoordPointer(2, GL_FLOAT, 0, texCoords_2d);
+
+				piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+				pass = piglit_probe_rect_rgba(x, y, IMAGE_SIZE,
+							      IMAGE_SIZE,
+							      expected)
+				       && pass;
+				break;
+
+			case GL_TEXTURE_CUBE_MAP:
+				glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
+						 0, format, 0, 0,
+						 IMAGE_SIZE, IMAGE_SIZE, 0);
+				glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+						 0, format, 0, 0,
+						 IMAGE_SIZE, IMAGE_SIZE, 0);
+				glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+						 0, format, 0, 0,
+						 IMAGE_SIZE, IMAGE_SIZE, 0);
+				glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+						 0, format, 0, 0,
+						 IMAGE_SIZE, IMAGE_SIZE, 0);
+				glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+						 0, format, 0, 0,
+						 IMAGE_SIZE, IMAGE_SIZE, 0);
+				glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
+						 0, format, 0, 0,
+						 IMAGE_SIZE, IMAGE_SIZE, 0);
+				pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
+
+				glEnable(target[j]);
+
+				/* Draw a rect with +X cubemap face as texture */
+				glTexCoordPointer(3, GL_FLOAT, 0,
+						  cube_face_texcoords[0]);
+				piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+				pass = piglit_probe_rect_rgba(x, y,
+				       IMAGE_SIZE, IMAGE_SIZE, expected)
+				       && pass;
+
+				/* Draw a rect with +Z cubemap face as texture */
+				glTexCoordPointer(3, GL_FLOAT, 0,
+						  cube_face_texcoords[2]);
+				piglit_draw_rect(x, y, IMAGE_SIZE, IMAGE_SIZE);
+				pass = piglit_probe_rect_rgba(x, y,
+				       IMAGE_SIZE, IMAGE_SIZE, expected)
+				       && pass;
+				break;
+			}
+			glDisable(target[j]);
+		}
+		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+		glDeleteTextures(1, &tex);
+	}
+	return (pass ? PIGLIT_PASS : PIGLIT_FAIL);
+}
 
 void
 piglit_init(int argc, char **argv)
 {
-   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);
-   }
+	glClearColor(0.0, 0.0, 0.0, 1.0);
+	glClearDepth(0.75);
+	piglit_ortho_projection(piglit_width, piglit_height, GL_TRUE);
 }
-- 
1.7.7.6



More information about the Piglit mailing list