[Piglit] [PATCH 1/3] piglit-util-gl: add piglit_quads_texture

Nicolai Hähnle nhaehnle at gmail.com
Wed Oct 12 17:40:31 UTC 2016


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

Like checkerboard, but allows specifying different colors for each quadrant
of a 2x2 tile block; basically a superset of the checkerboard and rgbw texture
functions.
---
 tests/util/piglit-util-gl.c | 101 ++++++++++++++++++++++++++++++++++----------
 tests/util/piglit-util-gl.h |   7 +++
 2 files changed, 86 insertions(+), 22 deletions(-)

diff --git a/tests/util/piglit-util-gl.c b/tests/util/piglit-util-gl.c
index 95eadd0..d94a40f 100644
--- a/tests/util/piglit-util-gl.c
+++ b/tests/util/piglit-util-gl.c
@@ -2233,91 +2233,105 @@ piglit_draw_triangle_z(float z, float x1, float y1, float x2, float y2,
 
 	glVertexPointer(4, GL_FLOAT, 0, verts);
 	glEnableClientState(GL_VERTEX_ARRAY);
 
 	glDrawArrays(GL_TRIANGLES, 0, 3);
 
 	glDisableClientState(GL_VERTEX_ARRAY);
 }
 
 /**
- * Generate a checkerboard texture
+ * Generate an extended checkerboard texture where the color of each quadrant
+ * in a 2x2 block of tiles can be specified individually.
  *
  * \param tex                Name of the texture to be used.  If \c tex is
  *                           zero, a new texture name will be generated.
  * \param level              Mipmap level the checkerboard should be written to
  * \param width              Width of the texture image
  * \param height             Height of the texture image
  * \param horiz_square_size  Size of each checkerboard tile along the X axis
  * \param vert_square_size   Size of each checkerboard tile along the Y axis
- * \param black              RGBA color to be used for "black" tiles
- * \param white              RGBA color to be used for "white" tiles
+ * \param bl                 RGBA color to be used for "bottom-left" tiles
+ * \param br                 RGBA color to be used for "bottom-right" tiles
+ * \param tl                 RGBA color to be used for "top-left" tiles
+ * \param tr                 RGBA color to be used for "top-right" tiles
  *
- * A texture with alternating black and white squares in a checkerboard
- * pattern is generated.  The texture data is written to LOD \c level of
- * the texture \c tex.
+ * The texture data is written to LOD \c level of the texture \c tex.
  *
  * If \c tex is zero, a new texture created.  This texture will have several
  * texture parameters set to non-default values:
  *
  *  - Min and mag filter will be set to \c GL_NEAREST.
  *  - For GL:
  *    - S and T wrap modes will be set to \c GL_CLAMP_TO_BORDER.
  *    - Border color will be set to { 1.0, 0.0, 0.0, 1.0 }.
  *  - For GLES:
  *    - S and T wrap modes will be set to \c GL_CLAMP_TO_EDGE.
  *
  * \return
  * Name of the texture.  In addition, this texture will be bound to the
  * \c GL_TEXTURE_2D target of the currently active texture unit.
  */
 GLuint
-piglit_checkerboard_texture(GLuint tex, unsigned level,
-			    unsigned width, unsigned height,
-			    unsigned horiz_square_size,
-			    unsigned vert_square_size,
-			    const float *black, const float *white)
+piglit_quads_texture(GLuint tex, unsigned level,
+		     unsigned width, unsigned height,
+		     unsigned horiz_square_size,
+		     unsigned vert_square_size,
+		     const float *bl, const float *br,
+		     const float *tl, const float *tr)
 {
 	static const GLfloat border_color[4] = { 1.0, 0.0, 0.0, 1.0 };
 	unsigned i;
 	unsigned j;
 	void *tex_data;
 	char *texel;
 	unsigned pixel_size;
-	GLubyte black_b[4], white_b[4];
-	const void *black_data, *white_data;
+	GLubyte bl_b[4], br_b[4], tl_b[4], tr_b[4];
+	const void *bl_data, *br_data, *tl_data, *tr_data;
 
 	if (piglit_is_gles()) {
 		pixel_size = 4 * sizeof(GLubyte);
 		for (i = 0; i < 4; i++) {
-			black_b[i] = black[i] * 255;
-			white_b[i] = white[i] * 255;
+			bl_b[i] = bl[i] * 255;
+			br_b[i] = br[i] * 255;
+			tl_b[i] = tl[i] * 255;
+			tr_b[i] = tr[i] * 255;
 		}
-		black_data = black_b;
-		white_data = white_b;
+		bl_data = bl_b;
+		br_data = br_b;
+		tl_data = tl_b;
+		tr_data = tr_b;
 	} else {
 		pixel_size = 4 * sizeof(float);
-		black_data = black;
-		white_data = white;
+		bl_data = bl;
+		br_data = br;
+		tl_data = tl;
+		tr_data = tr;
 	}
 	texel = tex_data = malloc(width * height * pixel_size);
 
 	for (i = 0; i < height; i++) {
 		const unsigned row = i / vert_square_size;
 
 		for (j = 0; j < width; j++) {
 			const unsigned col = j / horiz_square_size;
 
-			if ((row ^ col) & 1) {
-				memcpy(texel, white_data, pixel_size);
+			if (row & 1) {
+				if (col & 1)
+					memcpy(texel, tr_data, pixel_size);
+				else
+					memcpy(texel, tl_data, pixel_size);
 			} else {
-				memcpy(texel, black_data, pixel_size);
+				if (col & 1)
+					memcpy(texel, br_data, pixel_size);
+				else
+					memcpy(texel, bl_data, pixel_size);
 			}
 
 			texel += pixel_size;
 		}
 	}
 
 	if (tex == 0) {
 		glGenTextures(1, &tex);
 
 		glBindTexture(GL_TEXTURE_2D, tex);
@@ -2343,20 +2357,63 @@ piglit_checkerboard_texture(GLuint tex, unsigned level,
 		glBindTexture(GL_TEXTURE_2D, tex);
 	}
 
 	glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, width, height, 0, GL_RGBA,
 		     piglit_is_gles() ? GL_UNSIGNED_BYTE : GL_FLOAT, tex_data);
 
 	return tex;
 }
 
 /**
+ * Generate a checkerboard texture
+ *
+ * \param tex                Name of the texture to be used.  If \c tex is
+ *                           zero, a new texture name will be generated.
+ * \param level              Mipmap level the checkerboard should be written to
+ * \param width              Width of the texture image
+ * \param height             Height of the texture image
+ * \param horiz_square_size  Size of each checkerboard tile along the X axis
+ * \param vert_square_size   Size of each checkerboard tile along the Y axis
+ * \param black              RGBA color to be used for "black" tiles
+ * \param white              RGBA color to be used for "white" tiles
+ *
+ * A texture with alternating black and white squares in a checkerboard
+ * pattern is generated.  The texture data is written to LOD \c level of
+ * the texture \c tex.
+ *
+ * If \c tex is zero, a new texture created.  This texture will have several
+ * texture parameters set to non-default values:
+ *
+ *  - Min and mag filter will be set to \c GL_NEAREST.
+ *  - For GL:
+ *    - S and T wrap modes will be set to \c GL_CLAMP_TO_BORDER.
+ *    - Border color will be set to { 1.0, 0.0, 0.0, 1.0 }.
+ *  - For GLES:
+ *    - S and T wrap modes will be set to \c GL_CLAMP_TO_EDGE.
+ *
+ * \return
+ * Name of the texture.  In addition, this texture will be bound to the
+ * \c GL_TEXTURE_2D target of the currently active texture unit.
+ */
+GLuint
+piglit_checkerboard_texture(GLuint tex, unsigned level,
+			    unsigned width, unsigned height,
+			    unsigned horiz_square_size,
+			    unsigned vert_square_size,
+			    const float *black, const float *white)
+{
+	return piglit_quads_texture(tex, level, width, height,
+				    horiz_square_size, vert_square_size,
+				    black, white, white, black);
+}
+
+/**
  * Generates a 8x8 mipmapped texture whose layers contain solid r, g, b, and w.
  */
 GLuint
 piglit_miptree_texture()
 {
 	GLfloat *data;
 	int size, i, level;
 	GLuint tex;
 
 	glGenTextures(1, &tex);
diff --git a/tests/util/piglit-util-gl.h b/tests/util/piglit-util-gl.h
index 78390c1..4fc6c57 100644
--- a/tests/util/piglit-util-gl.h
+++ b/tests/util/piglit-util-gl.h
@@ -277,20 +277,27 @@ void piglit_gen_ortho_projection(double left, double right, double bottom,
 				 double top, double near_val, double far_val,
 				 GLboolean push);
 void piglit_ortho_projection(int w, int h, GLboolean push);
 void piglit_frustum_projection(GLboolean push, double l, double r, double b,
 			       double t, double n, double f);
 void piglit_gen_ortho_uniform(GLint location, double left, double right,
 			      double bottom, double top, double near_val,
 			      double far_val);
 void piglit_ortho_uniform(GLint location, int w, int h);
 
+GLuint
+piglit_quads_texture(GLuint tex, unsigned level,
+		     unsigned width, unsigned height,
+		     unsigned horiz_square_size,
+		     unsigned vert_square_size,
+		     const float *bl, const float *br,
+		     const float *tl, const float *tr);
 GLuint piglit_checkerboard_texture(GLuint tex, unsigned level,
     unsigned width, unsigned height,
     unsigned horiz_square_size, unsigned vert_square_size,
     const float *black, const float *white);
 GLuint piglit_miptree_texture(void);
 GLfloat *piglit_rgbw_image(GLenum internalFormat, int w, int h,
                            GLboolean alpha, GLenum basetype);
 GLubyte *piglit_rgbw_image_ubyte(int w, int h, GLboolean alpha);
 GLuint piglit_rgbw_texture(GLenum internalFormat, int w, int h, GLboolean mip,
 		    GLboolean alpha, GLenum basetype);
-- 
2.7.4



More information about the Piglit mailing list