[Piglit] [PATCH] tfp: Also test with GL_TEXTURE_RECTANGLE

Jason Ekstrand jason at jlekstrand.net
Tue Jul 10 18:12:21 UTC 2018


---
 tests/glx/glx-tfp.c | 102 +++++++++++++++++++++++++++-----------------
 1 file changed, 62 insertions(+), 40 deletions(-)

diff --git a/tests/glx/glx-tfp.c b/tests/glx/glx-tfp.c
index 26408741a..46e317adc 100644
--- a/tests/glx/glx-tfp.c
+++ b/tests/glx/glx-tfp.c
@@ -48,9 +48,12 @@ GLfloat tex_data[4][4] = {
 };
 
 #define WIN_WIDTH	256
-#define WIN_HEIGHT	128
+#define WIN_HEIGHT	256
+#define PIXMAP_WIDTH	2
+#define PIXMAP_HEIGHT	2
 
-static GLXPixmap rgb_pixmap, rgba_pixmap;
+static GLXPixmap rgb_2d_pixmap, rgba_2d_pixmap;
+static GLXPixmap rgb_rect_pixmap, rgba_rect_pixmap;
 static Display *dpy;
 static Window win;
 int piglit_width = WIN_WIDTH;
@@ -95,7 +98,7 @@ check_results(GLboolean has_alpha, int x, int y, int w, int h)
 }
 
 static void
-draw_pixmap(GLXPixmap pixmap, int x, int y, int w, int h)
+draw_pixmap(GLXPixmap pixmap, GLenum target, int x, int y, int w, int h)
 {
 	GLuint texname;
 	GLfloat tex_coords[] = {
@@ -106,6 +109,13 @@ draw_pixmap(GLXPixmap pixmap, int x, int y, int w, int h)
 	};
 	GLfloat vertex_coords[4][2];
 
+	if (target == GL_TEXTURE_RECTANGLE) {
+		for (int i = 0; i < 4; i++) {
+			tex_coords[i * 2 + 0] *= PIXMAP_WIDTH;
+			tex_coords[i * 2 + 1] *= PIXMAP_HEIGHT;
+		}
+	}
+
 	vertex_coords[0][0] = x;
 	vertex_coords[0][1] = y;
 	vertex_coords[1][0] = x + w;
@@ -117,13 +127,13 @@ draw_pixmap(GLXPixmap pixmap, int x, int y, int w, int h)
 
 	/* Create the texture. */
 	glGenTextures(1, &texname);
-	glBindTexture(GL_TEXTURE_2D, texname);
-	glEnable(GL_TEXTURE_2D);
+	glBindTexture(target, texname);
+	glEnable(target);
 
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+	glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP);
+	glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP);
 
 	/* Set the texture combiner to give {r*a, g*a, b*a, a} so we can see
 	 * the effect of the alpha channel in terms of color.
@@ -154,29 +164,35 @@ draw_pixmap(GLXPixmap pixmap, int x, int y, int w, int h)
 	glDeleteTextures(1, &texname);
 	glDisableClientState(GL_VERTEX_ARRAY);
 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-	glDisable(GL_TEXTURE_2D);
+	glDisable(target);
 }
 
 static enum piglit_result
 draw(Display *dpy)
 {
 	GLboolean pass = GL_TRUE;
-	int draw_w = piglit_width / 4;
-	int draw_h = piglit_height / 2;
-	int rgb_x = piglit_width / 8;
-	int rgb_y = piglit_height / 4;
-	int rgba_x = piglit_width * 5 / 8;
-	int rgba_y = piglit_height / 4;
+	int unit_x = piglit_width / 8;
+	int unit_y = piglit_width / 8;
+	int draw_w = 2 * unit_x;
+	int draw_h = 2 * unit_y;
 
 	/* Clear background to gray */
 	glClearColor(0.5, 0.5, 0.5, 1.0);
 	glClear(GL_COLOR_BUFFER_BIT);
 
-	draw_pixmap(rgb_pixmap, rgb_x, rgb_y, draw_w, draw_h);
-	draw_pixmap(rgba_pixmap, rgba_x, rgba_y, draw_w, draw_h);
+	draw_pixmap(rgb_2d_pixmap, GL_TEXTURE_2D,
+		    unit_x, unit_y, draw_w, draw_h);
+	draw_pixmap(rgba_2d_pixmap, GL_TEXTURE_2D,
+		    5 * unit_x, unit_y, draw_w, draw_h);
+	draw_pixmap(rgb_rect_pixmap, GL_TEXTURE_RECTANGLE,
+		    unit_x, 5 * unit_y, draw_w, draw_h);
+	draw_pixmap(rgba_rect_pixmap, GL_TEXTURE_RECTANGLE,
+		    5 * unit_x, 5 * unit_y, draw_w, draw_h);
 
-	pass &= check_results(GL_FALSE, rgb_x, rgb_y, draw_w, draw_h);
-	pass &= check_results(GL_TRUE, rgba_x, rgba_y, draw_w, draw_h);
+	pass &= check_results(GL_FALSE, unit_x, unit_y, draw_w, draw_h);
+	pass &= check_results(GL_TRUE, 5 * unit_x, unit_y, draw_w, draw_h);
+	pass &= check_results(GL_FALSE, unit_x, 5 * unit_y, draw_w, draw_h);
+	pass &= check_results(GL_TRUE, 5 * unit_x, 5 * unit_y, draw_w, draw_h);
 
 	glXSwapBuffers(dpy, win);
 
@@ -201,7 +217,7 @@ set_pixel(Display *dpy, Picture picture, int x, int y, GLfloat *color)
  * Creates a Pixmap and GLXPixmap with tex_data as the contents.
  */
 static GLXPixmap
-create_pixmap(GLenum format)
+create_pixmap(GLenum format, GLenum target)
 {
 	static const int rgb_fb_config_attribs[] = {
 		GLX_RENDER_TYPE, GLX_RGBA_BIT,
@@ -223,17 +239,7 @@ create_pixmap(GLenum format)
 		GLX_BIND_TO_TEXTURE_RGBA_EXT, 1,
 		None
 	};
-	static const int rgb_pixmap_attribs[] =	{
-		GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
-		GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT,
-		None
-	};
-	static const int rgba_pixmap_attribs[] =	{
-		GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
-		GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT,
-		None
-	};
-	static const int *fb_config_attribs, *pixmap_attribs;
+	const int *fb_config_attribs;
 	GLXFBConfig *fb_configs;
 	GLXFBConfig fb_config;
 	int n_fb_configs;
@@ -243,14 +249,25 @@ create_pixmap(GLenum format)
 	XRenderPictFormat *render_format;
 	Picture picture;
 
+	int pixmap_attribs[] = {
+		GLX_TEXTURE_TARGET_EXT, None,
+		GLX_TEXTURE_FORMAT_EXT, None,
+		None
+	};
+
+	if (target == GL_TEXTURE_2D)
+		pixmap_attribs[1] = GLX_TEXTURE_2D_EXT;
+	else
+		pixmap_attribs[1] = GLX_TEXTURE_RECTANGLE_EXT;
+
 	if (format == GL_RGBA) {
 		fb_config_attribs = rgba_fb_config_attribs;
-		pixmap_attribs = rgba_pixmap_attribs;
+		pixmap_attribs[3] = GLX_TEXTURE_FORMAT_RGBA_EXT;
 		render_format = XRenderFindStandardFormat(dpy,
 							  PictStandardARGB32);
 	} else {
 		fb_config_attribs = rgb_fb_config_attribs;
-		pixmap_attribs = rgb_pixmap_attribs;
+		pixmap_attribs[3] = GLX_TEXTURE_FORMAT_RGB_EXT;
 		render_format = XRenderFindStandardFormat(dpy,
 							  PictStandardRGB24);
 	}
@@ -268,7 +285,7 @@ create_pixmap(GLenum format)
 	fb_config = fb_configs[n_fb_configs - 1];
 
 	pixmap = XCreatePixmap(dpy, RootWindow(dpy, DefaultScreen(dpy)),
-			       2, 2, render_format->depth);
+			       PIXMAP_WIDTH, PIXMAP_HEIGHT, render_format->depth);
 	picture = XRenderCreatePicture(dpy, pixmap, render_format, 0, NULL);
 
 	glx_pixmap = glXCreatePixmap(dpy, fb_config, pixmap, pixmap_attribs);
@@ -290,8 +307,10 @@ static void init(void)
 {
 	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
 
-	rgb_pixmap = create_pixmap(GL_RGB);
-	rgba_pixmap = create_pixmap(GL_RGBA);
+	rgb_2d_pixmap = create_pixmap(GL_RGB, GL_TEXTURE_2D);
+	rgba_2d_pixmap = create_pixmap(GL_RGBA, GL_TEXTURE_2D);
+	rgb_rect_pixmap = create_pixmap(GL_RGB, GL_TEXTURE_RECTANGLE);
+	rgba_rect_pixmap = create_pixmap(GL_RGBA, GL_TEXTURE_RECTANGLE);
 }
 
 int main(int argc, char**argv)
@@ -346,9 +365,12 @@ int main(int argc, char**argv)
 	init();
 
 	if (!piglit_automatic) {
-		printf("Left rectangle (RGB) should be green on the top and\n"
-		       "red on the bottom.  The right rectangle (RGBA) should\n"
-		       "be the same, but darker on the right half.\n");
+		printf("Left rectangles (RGB) should be green on the top and\n"
+		       "red on the bottom.  The right rectangles (RGBA) should\n"
+		       "be the same, but darker on the right half.  The top\n"
+		       "rectangles are rendered with GL_TEXTURE_RECTANGLE while\n"
+		       "the bottom are rendered with GL_TEXTURE_2D; they should\n"
+		       "render the same\n");
 		printf("Press Escape to quit\n");
 	}
 
-- 
2.17.1



More information about the Piglit mailing list