[Piglit] [PATCH] point-vertex-id: Additionally test with gl_InstanceID

Neil Roberts neil at linux.intel.com
Mon Jul 13 09:27:37 PDT 2015


The point-vertex-id test was originally created to test gl_VertexID in
combination with glPolygonMode(GL_POINT) because of a bug with the
i965 driver in Mesa. The same bug exists with gl_InstanceID and the
code for BDW has some extra complications in this case so I think it's
worth extending the test to check that as well. The test now takes a
command line argument to specify which builtin to test. It can also
take both arguments to generate a shader which relies on both.
---
 tests/all.py                    |   4 +-
 tests/general/point-vertex-id.c | 181 +++++++++++++++++++++++++++++-----------
 2 files changed, 133 insertions(+), 52 deletions(-)

diff --git a/tests/all.py b/tests/all.py
index adfcdbc..5fa5c39 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -577,7 +577,9 @@ with profile.group_manager(PiglitGLTest, 'shaders') as g:
     g(['useshaderprogram-bad-type'])
     g(['useshaderprogram-bad-program'])
     g(['useshaderprogram-flushverts-1'])
-    g(['point-vertex-id'])
+    g(['point-vertex-id', 'gl_VertexID'])
+    g(['point-vertex-id', 'gl_InstanceID'])
+    g(['point-vertex-id', 'gl_VertexID', 'gl_InstanceID'])
     g(['glsl-vs-int-attrib'])
     g(['glsl-link-test',
        os.path.join('shaders', 'glsl-link-initializer-01a.vert'),
diff --git a/tests/general/point-vertex-id.c b/tests/general/point-vertex-id.c
index 1fd314d..7a400fb 100644
--- a/tests/general/point-vertex-id.c
+++ b/tests/general/point-vertex-id.c
@@ -26,7 +26,13 @@
 /**
  * @file point-vertex-id.c
  *
- * Tests glPolygonMode(GL_POINT) used in combination with gl_VertexID.
+ * Tests glPolygonMode(GL_POINT) used in combination with gl_VertexID
+ * or gl_InstanceID or both.
+ *
+ * Specify gl_VertexID or gl_InstanceID as an argument to specify
+ * which to test. Alternatively you can specify both in order to test
+ * a combination of both.
+ *
  * See bug #84677
  */
 
@@ -40,14 +46,26 @@ PIGLIT_GL_TEST_CONFIG_END
 
 static const char
 vertex_shader[] =
-	"#version 130\n"
+	"uniform vec2 viewport_size;\n"
 	"\n"
-	"uniform vec2 pos[6];\n"
+	"#ifdef USE_VERTEX_ID\n"
+	"uniform vec2 pos_array[12];\n"
+	"#else\n"
+	"in vec2 pos;\n"
+	"#endif"
 	"\n"
 	"void\n"
 	"main()\n"
 	"{\n"
-	"        gl_Position = vec4(pos[gl_VertexID], 0.0, 1.0);\n"
+	"#ifdef USE_VERTEX_ID\n"
+	"        vec2 pos = pos_array[gl_VertexID];\n"
+	"#endif\n"
+	"        gl_Position = vec4(pos, 0.0, 1.0);\n"
+	"#ifdef USE_INSTANCE_ID\n"
+	"        gl_Position.t += float(gl_InstanceID) * 20.0;\n"
+	"#endif\n"
+	"        gl_Position.st = ((gl_Position.st + 0.5) * 2.0 /\n"
+	"                          viewport_size - 1.0);\n"
 	"        gl_FrontColor = vec4(1.0);\n"
 	"}\n";
 
@@ -56,6 +74,13 @@ struct vertex {
 	GLubyte edge_flag;
 };
 
+enum test_mode_flags {
+	TEST_MODE_VERTEX_ID = (1 << 0),
+	TEST_MODE_INSTANCE_ID = (1 << 1),
+};
+
+static enum test_mode_flags test_modes;
+
 static const struct vertex
 vertices[] = {
 	{ 10, 10, GL_TRUE },
@@ -66,77 +91,107 @@ vertices[] = {
 	{ 30, 10, GL_FALSE },
 	{ 40, 10, GL_FALSE },
 	{ 30, 20, GL_FALSE },
+	/* Copy of the above two triangles but shifted up by 20. If
+	 * instanced rendering is used these will be generated based
+	 * on the gl_InstanceID instead.
+	 */
+	{ 10, 30, GL_TRUE },
+	{ 20, 30, GL_TRUE },
+	{ 10, 40, GL_TRUE },
+	{ 30, 30, GL_FALSE },
+	{ 40, 30, GL_FALSE },
+	{ 30, 40, GL_FALSE },
 };
 
 enum piglit_result
 piglit_display(void)
 {
 	bool pass = true;
-	float black[4] = {0.0, 0.0, 0.0, 0.0};
-	float white[4] = {1.0, 1.0, 1.0, 1.0};
-	GLint pos_location;
+	char shader_buf[sizeof vertex_shader + 512];
+	GLint pos_location = 0, viewport_size_location;
 	GLuint program;
+	float *ref_image, *p;
 	int i;
 
-	program = piglit_build_simple_program(vertex_shader, NULL);
+	strcpy(shader_buf, "#version 130\n");
+	if (test_modes & TEST_MODE_INSTANCE_ID) {
+		strcat(shader_buf,
+		       "#extension GL_ARB_draw_instanced : require\n"
+		       "#define USE_INSTANCE_ID\n");
+	}
+	if (test_modes & TEST_MODE_VERTEX_ID)
+		strcat(shader_buf, "#define USE_VERTEX_ID\n");
+	strcat(shader_buf, vertex_shader);
+
+	program = piglit_build_simple_program(shader_buf, NULL);
 
 	glUseProgram(program);
 
 	glClear(GL_COLOR_BUFFER_BIT);
 
-	pos_location = glGetUniformLocation(program, "pos");
+	viewport_size_location = glGetUniformLocation(program, "viewport_size");
+	glUniform2f(viewport_size_location,
+		    piglit_width,
+		    piglit_height);
 
-	for (i = 0; i < ARRAY_SIZE(vertices); i++) {
-		glUniform2f(pos_location + i,
-			    (vertices[i].x + 0.5f) * 2.0f /
-			    piglit_width - 1.0f,
-			    (vertices[i].y + 0.5f) * 2.0f /
-			    piglit_height - 1.0f);
+	if (test_modes & TEST_MODE_VERTEX_ID) {
+		pos_location = glGetUniformLocation(program, "pos_array");
+
+		for (i = 0; i < ARRAY_SIZE(vertices); i++) {
+			glUniform2f(pos_location + i,
+				    vertices[i].x,
+				    vertices[i].y);
+		}
 	}
 
 	glEnableClientState(GL_EDGE_FLAG_ARRAY);
 	glEdgeFlagPointer(sizeof (struct vertex),
 			  &vertices[0].edge_flag);
 
+	if (!(test_modes & TEST_MODE_VERTEX_ID)) {
+		pos_location = glGetAttribLocation(program, "pos");
+		if (pos_location == -1)
+			piglit_report_result(PIGLIT_FAIL);
+		glEnableVertexAttribArray(pos_location);
+		glVertexAttribPointer(pos_location,
+				      2, /* size */
+				      GL_INT,
+				      GL_FALSE, /* normalized */
+				      sizeof (struct vertex),
+				      &vertices[0].x);
+	}
+
 	glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
-	glDrawArrays(GL_TRIANGLES, 0, ARRAY_SIZE(vertices));
-
-	/* Area below the dots */
-	pass &= piglit_probe_rect_rgba(0, 0,
-				       piglit_width,
-				       vertices[0].y,
-				       black);
-	/* Left of the dots */
-	pass &= piglit_probe_rect_rgba(0, vertices[0].y,
-				       vertices[0].x,
-				       vertices[1].y - vertices[0].y + 1,
-				       black);
-	/* In-between the dots */
-	pass &= piglit_probe_rect_rgba(vertices[0].x + 1,
-				       vertices[0].y,
-				       vertices[1].x - vertices[0].x - 1,
-				       vertices[1].y - vertices[0].y + 1,
-				       black);
-	/* Right of the dots */
-	pass &= piglit_probe_rect_rgba(vertices[1].x + 1,
-				       vertices[0].y,
-				       piglit_width - vertices[1].x - 1,
-				       vertices[1].y - vertices[0].y + 1,
-				       black);
-	/* Above the dots */
-	pass &= piglit_probe_rect_rgba(0, vertices[2].y + 1,
-				       piglit_width,
-				       piglit_height - vertices[2].y - 1,
-				       black);
-
-	/* At the dots */
+
+	if ((test_modes & TEST_MODE_INSTANCE_ID)) {
+		glDrawArraysInstanced(GL_TRIANGLES,
+				      0, /* first */
+				      ARRAY_SIZE(vertices) / 2,
+				      2 /* primcount */);
+	} else {
+		glDrawArrays(GL_TRIANGLES,
+			     0, /* first */
+			     ARRAY_SIZE(vertices));
+	}
+
+	if (!(test_modes & TEST_MODE_VERTEX_ID))
+		glDisableVertexAttribArray(pos_location);
+
+	ref_image = malloc(piglit_width * piglit_height * 3 *
+			   sizeof (float));
+	memset(ref_image, 0, piglit_width * piglit_height * 3 * sizeof (float));
 	for (i = 0; i < ARRAY_SIZE(vertices); i++) {
-		if (vertices[i].edge_flag) {
-			pass &= piglit_probe_pixel_rgba(vertices[i].x,
-							vertices[i].y,
-							white);
-		}
+		if (!vertices[i].edge_flag)
+			continue;
+
+		p = (ref_image +
+		     (vertices[i].x + vertices[i].y * piglit_width) * 3);
+		p[0] = p[1] = p[2] = 1.0f;
 	}
+	pass = piglit_probe_image_color(0, 0,
+					piglit_width, piglit_height,
+					GL_RGB,
+					ref_image);
 
 	glUseProgram(0);
 	glDeleteProgram(program);
@@ -149,5 +204,29 @@ piglit_display(void)
 void
 piglit_init(int argc, char **argv)
 {
+	int i;
+
+	for (i = 1; i < argc; i++) {
+		if (!strcmp(argv[i], "gl_VertexID")) {
+			test_modes |= TEST_MODE_VERTEX_ID;
+		} else if (!strcmp(argv[i], "gl_InstanceID")) {
+			test_modes |= TEST_MODE_INSTANCE_ID;
+		} else {
+			fprintf(stderr, "Unknown argument: %s\n", argv[i]);
+			piglit_report_result(PIGLIT_FAIL);
+		}
+	}
+
+	if (test_modes == 0) {
+		fprintf(stderr,
+			"usage: point-vertex-id [gl_VertexID] [gl_InstanceID]\n"
+			"Either one or both of the arguments must be "
+			"specified\n");
+		piglit_report_result(PIGLIT_FAIL);
+	}
+
+	if ((test_modes & TEST_MODE_INSTANCE_ID))
+		piglit_require_extension("GL_ARB_draw_instanced");
+
 	piglit_require_GLSL_version(130);
 }
-- 
1.9.3



More information about the Piglit mailing list