[Piglit] [PATCH] point-vertex-id: Test using an instanced attribute
Neil Roberts
neil at linux.intel.com
Tue Jul 14 06:35:32 PDT 2015
Adds an option to use an instanced attribute so that it can be tested
in combination with glPolygonMode. This demonstrates a bug on the Mesa
i965 driver on BDW which was reported as bug #91292. The ‘divisor’
argument can be added in addition to any of the other arguments so
that all of the combinations can be test.
---
tests/all.py | 4 +++
tests/general/point-vertex-id.c | 75 ++++++++++++++++++++++++++++++++++-------
2 files changed, 67 insertions(+), 12 deletions(-)
diff --git a/tests/all.py b/tests/all.py
index 3bd7baa..114959d 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -580,6 +580,10 @@ with profile.group_manager(PiglitGLTest, 'shaders') as g:
g(['point-vertex-id', 'gl_VertexID'])
g(['point-vertex-id', 'gl_InstanceID'])
g(['point-vertex-id', 'gl_VertexID', 'gl_InstanceID'])
+ g(['point-vertex-id', 'divisor'])
+ g(['point-vertex-id', 'gl_VertexID', 'divisor'])
+ g(['point-vertex-id', 'gl_InstanceID', 'divisor'])
+ g(['point-vertex-id', 'gl_VertexID', 'gl_InstanceID', 'divisor'])
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 7a400fb..5823ff1 100644
--- a/tests/general/point-vertex-id.c
+++ b/tests/general/point-vertex-id.c
@@ -31,9 +31,10 @@
*
* 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.
+ * a combination of both. Additionally ‘divisor’ can be specified to
+ * make it use an instanced array.
*
- * See bug #84677
+ * See bug #84677 and #91292
*/
PIGLIT_GL_TEST_CONFIG_BEGIN
@@ -54,6 +55,10 @@ vertex_shader[] =
"in vec2 pos;\n"
"#endif"
"\n"
+ "#ifdef USE_DIVISOR\n"
+ "in vec2 triangle_offset;\n"
+ "#endif\n"
+ "\n"
"void\n"
"main()\n"
"{\n"
@@ -62,7 +67,14 @@ vertex_shader[] =
"#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"
+ " float instance_offset = 20.0;\n"
+ "#ifdef USE_DIVISOR\n"
+ " instance_offset = 10.0;\n"
+ "#endif\n"
+ " gl_Position.t += float(gl_InstanceID) * instance_offset;\n"
+ "#endif\n"
+ "#ifdef USE_DIVISOR\n"
+ " gl_Position.st += triangle_offset;\n"
"#endif\n"
" gl_Position.st = ((gl_Position.st + 0.5) * 2.0 /\n"
" viewport_size - 1.0);\n"
@@ -77,6 +89,7 @@ struct vertex {
enum test_mode_flags {
TEST_MODE_VERTEX_ID = (1 << 0),
TEST_MODE_INSTANCE_ID = (1 << 1),
+ TEST_MODE_DIVISOR = (1 << 2),
};
static enum test_mode_flags test_modes;
@@ -93,7 +106,7 @@ vertices[] = {
{ 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.
+ * on the gl_InstanceID or an instanced array instead.
*/
{ 10, 30, GL_TRUE },
{ 20, 30, GL_TRUE },
@@ -103,6 +116,25 @@ vertices[] = {
{ 30, 40, GL_FALSE },
};
+/* If a divisor is set then each pair of triangles will be drawn as an
+ * instance and these offsets will be added to each instance.
+ */
+static const struct vertex
+triangle_offsets[] = {
+ { 0, 0 },
+ { 0, 20 },
+};
+
+/* If both the divisor and the instance id is used then these offsets
+ * will be used instead. The remainder of the offset will be added by
+ * the instance ID.
+ */
+static const struct vertex
+triangle_offsets_with_instance_id[] = {
+ { 0, 0 },
+ { 0, 10 },
+};
+
enum piglit_result
piglit_display(void)
{
@@ -119,6 +151,8 @@ piglit_display(void)
"#extension GL_ARB_draw_instanced : require\n"
"#define USE_INSTANCE_ID\n");
}
+ if (test_modes & TEST_MODE_DIVISOR)
+ strcat(shader_buf, "#define USE_DIVISOR\n");
if (test_modes & TEST_MODE_VERTEX_ID)
strcat(shader_buf, "#define USE_VERTEX_ID\n");
strcat(shader_buf, vertex_shader);
@@ -161,9 +195,25 @@ piglit_display(void)
&vertices[0].x);
}
+ if (test_modes & TEST_MODE_DIVISOR) {
+ pos_location = glGetAttribLocation(program, "triangle_offset");
+ if (pos_location == -1)
+ piglit_report_result(PIGLIT_FAIL);
+ glEnableVertexAttribArray(pos_location);
+ glVertexAttribDivisor(pos_location, 1);
+ glVertexAttribPointer(pos_location,
+ 2, /* size */
+ GL_INT,
+ GL_FALSE, /* normalized */
+ sizeof (struct vertex),
+ (test_modes & TEST_MODE_INSTANCE_ID) ?
+ &triangle_offsets_with_instance_id[0].x :
+ &triangle_offsets[0].x);
+ }
+
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
- if ((test_modes & TEST_MODE_INSTANCE_ID)) {
+ if (test_modes & (TEST_MODE_INSTANCE_ID | TEST_MODE_DIVISOR)) {
glDrawArraysInstanced(GL_TRIANGLES,
0, /* first */
ARRAY_SIZE(vertices) / 2,
@@ -174,9 +224,6 @@ piglit_display(void)
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));
@@ -211,6 +258,8 @@ piglit_init(int argc, char **argv)
test_modes |= TEST_MODE_VERTEX_ID;
} else if (!strcmp(argv[i], "gl_InstanceID")) {
test_modes |= TEST_MODE_INSTANCE_ID;
+ } else if (!strcmp(argv[i], "divisor")) {
+ test_modes |= TEST_MODE_DIVISOR;
} else {
fprintf(stderr, "Unknown argument: %s\n", argv[i]);
piglit_report_result(PIGLIT_FAIL);
@@ -219,14 +268,16 @@ piglit_init(int argc, char **argv)
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");
+ "usage: point-vertex-id [gl_VertexID] [gl_InstanceID] "
+ "[divisor]\n"
+ "At least one of the arguments must be specified\n");
piglit_report_result(PIGLIT_FAIL);
}
- if ((test_modes & TEST_MODE_INSTANCE_ID))
+ if (test_modes & (TEST_MODE_INSTANCE_ID | TEST_MODE_DIVISOR))
piglit_require_extension("GL_ARB_draw_instanced");
+ if (test_modes & TEST_MODE_DIVISOR)
+ piglit_require_extension("GL_ARB_instanced_arrays");
piglit_require_GLSL_version(130);
}
--
1.9.3
More information about the Piglit
mailing list