<div dir="ltr">On 24 May 2013 19:49, Fabian Bieler <span dir="ltr"><<a href="mailto:fabianbieler@fastmail.fm" target="_blank">fabianbieler@fastmail.fm</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Draw the adjacency version of a primitive in red and blend the normal version<br>
of that primitive in green on top of it. Check that the entire framebuffer is<br>
yellow or black.<br>
<br>
ARB_geometry_shader4 spec 2.6.1:<br>
"If a geometry shader is not active, the "adjacent" vertices are ignored."<br>
---<br>
 tests/all.tests                                    |   2 +<br>
 .../execution/CMakeLists.gl.txt                    |  14 ++<br>
 .../execution/ignore-adjacent-vertices-indexed.c   | 223 +++++++++++++++++++++<br>
 .../execution/ignore-adjacent-vertices.c           | 218 ++++++++++++++++++++<br>
 4 files changed, 457 insertions(+)<br>
 create mode 100644 tests/spec/arb_geometry_shader4/execution/CMakeLists.gl.txt<br>
 create mode 100644 tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices-indexed.c<br>
 create mode 100644 tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices.c<br>
<br>
diff --git a/tests/all.tests b/tests/all.tests<br>
index 785c864..294c2b6 100644<br>
--- a/tests/all.tests<br>
+++ b/tests/all.tests<br>
@@ -2297,6 +2297,8 @@ spec['ARB_map_buffer_alignment'] = arb_map_buffer_alignment<br>
 add_plain_test(arb_map_buffer_alignment, 'arb_map_buffer_alignment-sanity_test')<br>
<br>
 arb_geometry_shader4 = Group()<br>
+add_concurrent_test(arb_geometry_shader4, 'ignore-adjacent-vertices')<br>
+add_concurrent_test(arb_geometry_shader4, 'ignore-adjacent-vertices-indexed')<br>
 add_concurrent_test(arb_geometry_shader4, 'program-parameter-input-type')<br>
 add_concurrent_test(arb_geometry_shader4, 'program-parameter-input-type-draw')<br>
 add_concurrent_test(arb_geometry_shader4, 'program-parameter-output-type')<br>
diff --git a/tests/spec/arb_geometry_shader4/execution/CMakeLists.gl.txt b/tests/spec/arb_geometry_shader4/execution/CMakeLists.gl.txt<br>
new file mode 100644<br>
index 0000000..8a370b9<br>
--- /dev/null<br>
+++ b/tests/spec/arb_geometry_shader4/execution/CMakeLists.gl.txt<br>
@@ -0,0 +1,14 @@<br>
+include_directories(<br>
+       ${GLEXT_INCLUDE_DIR}<br>
+       ${OPENGL_INCLUDE_PATH}<br>
+       ${piglit_SOURCE_DIR}/tests/util<br>
+)<br>
+<br>
+link_libraries (<br>
+       piglitutil_${piglit_target_api}<br>
+       ${OPENGL_gl_LIBRARY}<br>
+       ${OPENGL_glu_LIBRARY}<br>
+)<br>
+<br>
+piglit_add_executable (ignore-adjacent-vertices ignore-adjacent-vertices.c)<br>
+piglit_add_executable (ignore-adjacent-vertices-indexed ignore-adjacent-vertices-indexed.c)<br>
diff --git a/tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices-indexed.c b/tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices-indexed.c<br>
new file mode 100644<br>
index 0000000..2ddee13<br>
--- /dev/null<br>
+++ b/tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices-indexed.c<br>
@@ -0,0 +1,223 @@<br>
+/*<br>
+ * Copyright © 2013 The Piglit project<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER<br>
+ * DEALINGS IN THE SOFTWARE.<br>
+ */<br>
+<br>
+/**<br>
+ * \file ignore-adjacent-vertices-indexed.c<br>
+ *<br>
+ * Test that adjacent vertices are ignored when no geometry shader is active.<br>
+ * Draw the adjacency primitive in red and blend the non adjacency version in<br>
+ * green on top of it. Then test that the entire framebuffer is either yellow<br>
+ * or black.<br></blockquote><div><br></div><div>I really like this yellow/black idea.  Previously we have done this sort of test by drawing images on the left and right side of the window and then using piglit_probe_rect_halves_equal_rgba() to check that they're the same, but that has two problems: (1) sometimes rounding errors in the GPU cause slight variations between the two halves, which leads to false failures.  (2) when there are subtle differences between the left and right halves, it's difficult to spot the differences visually, making debugging hard.  Your yellow/black technique neatly addresses both of these problems.<br>
<br></div><div>You might want to consider giving check_framebuffer() a more descriptive name and moving it into tests/util/piglit-util-gl-common.c so that it can be used by other tests. <br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

+ */<br>
+<br>
+#include "piglit-util-gl-common.h"<br>
+<br>
+struct primitives {<br>
+       GLenum type_adjacency;<br>
+       int count_adjacency;<br>
+       GLenum type_base;<br>
+       int count_base;<br>
+};<br>
+<br>
+static const char vs_text[] =<br>
+       "void main()\n"<br>
+       "{\n"<br>
+       "       gl_Position = ftransform();\n"<br></blockquote><div><br></div><div>I'm not thrilled with the use of ftransform() here, since it's only available in compatibility profiles.  Most piglit tests require compatibility profiles, but we're trying to gradually move ourselves away from that.<br>
<br></div><div>Considering Brian's comments about fragility with resizes, and my comments below about x_3, y_3, x2_3, and y2_3, I'd recommend just doing this instead:<br><br>attribute vec4 vertex;<br>void main()<br>
{<br></div><div>  gl_Position = vertex;<br>}<br></div> <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+       "}\n";<br>
+<br>
+static const char fs_text[] =<br>
+       "uniform vec4 color;\n"<br>
+       "void main()\n"<br>
+       "{\n"<br>
+       "       gl_FragColor = color;\n"<br>
+       "}\n";<br>
+<br>
+PIGLIT_GL_TEST_CONFIG_BEGIN<br>
+       config.supports_gl_compat_version = 20;<br>
+       config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;<br>
+PIGLIT_GL_TEST_CONFIG_END<br>
+<br>
+GLuint color_uniform;<br>
+<br>
+/* Check that the framebuffer is yellow and black. */<br>
+static bool<br>
+check_framebuffer(void)<br>
+{<br>
+       static uint32_t* buffer = 0;<br>
+       int y, x;<br>
+       if (!buffer) buffer = malloc(sizeof(uint32_t) * piglit_width * piglit_height);<br>
+<br>
+       glReadPixels(0, 0, piglit_width, piglit_height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);<br>
+<br>
+       for (y = 0; y < piglit_height; ++y) {<br>
+               for (x = 0; x < piglit_width; ++x) {<br>
+                       uint32_t val = buffer[y * piglit_width + x] & 0xFFFFFF00;<br></blockquote><div><br></div><div>This looks like it will only work on little-endian systems.  Piglit sometimes gets run on big-endian systems, so I would recommend changing buffer to a GL_uchar * and just explicitly checking each color channel individually.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+                       if (val != 0 && val != 0xFFFF0000) {<br>
+                               fprintf(stderr, "FAIL: Rendered primitives differ.\n");<br>
+                               return false;<br>
+                       }<br>
+               }<br>
+       }<br>
+<br>
+       return true;<br>
+}<br>
+<br>
+void<br>
+piglit_init(int argc, char **argv)<br>
+{<br>
+       GLuint array_bufs[2];<br>
+       GLuint array;<br>
+       GLuint vs, fs, prog;<br>
+       const int w = piglit_width;<br>
+       const int h = piglit_height;<br>
+       const float x_3 = (int)(w / 3.0) + 0.5;<br>
+       const float y_3 = (int)(h / 3.0) + 0.5;<br>
+       const float x2_3 = (int)(w * 2.0 / 3.0) + 0.5;<br>
+       const float y2_3 = (int)(h * 2.0 / 3.0) + 0.5;<br>
+       const float vertex_data[] = {<br>
+               0, h, x_3, h, x2_3, h, w, h,<br>
+               0, y2_3, x_3, y2_3, x2_3, y2_3, w, y2_3,<br>
+               0, y_3, x_3, y_3, x2_3, y_3, w, y_3,<br>
+               0, 0, x_3, 0, x2_3, 0, w, 0,<br>
+       };<br></blockquote><div><br></div><div>I find x_3, y_3, x2_3, and y2_3 unnecessarily confusing.  Instead of using piglit_ortho_projection(), why not just specify the coordinates in clip coordinates (the units used by gl_Position), which are already relative to the window?  Then this would just reduce to:<br>
<br></div><div>const float vertex_data[] = {<br>  -1, 1,<br>  -1/3.0, 1,<br>  1/3.0, 1,<br>  1, 1,<br>  -1, 1/3.0,<br>  ...<br><br></div>(Note: this would result in a slightly different image being drawn, because it doesn't round the coordinates to the nearest pixel.  But that's fine--there should be no need to round to the nearest pixel).<br>
</div><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+       const unsigned short index_data[] = {<br>
+               /* lines_adjacency */<br>
+               4, 5, 6, 7, 8, 9, 10, 11,<br>
+<br>
+               /* lines */<br>
+               5, 6, 9, 10,<br>
+<br>
+               /* line_strip_adjacency */<br>
+               4, 5, 6, 10, 9, 8,<br>
+<br>
+               /* line_strip */<br>
+               5, 6, 10, 9,<br>
+<br>
+               /* triangles_adjacency */<br>
+               9, 4, 5, 6, 10, 14, 6, 11, 10, 9, 5, 1,<br>
+<br>
+               /* triangles */<br>
+               9, 5, 10, 6, 10, 5,<br>
+<br>
+               /* triangle_strip_adjacency */<br>
+               9, 4, 5, 14, 10, 1, 6, 11,<br>
+<br>
+               /* triangle_strip */<br>
+               9, 5, 10, 6,<br>
+       };<br></blockquote><div><br></div><div>Nit pick: uploading a single index buffer containing all the test cases makes this test a little hard to follow.  I'd recommend just uploading fresh index data before each draw call.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+       /* Bind Vertex Data */<br>
+       glGenVertexArrays(1, &array);<br>
+       glBindVertexArray(array);<br>
+       glGenBuffers(2, array_bufs);<br>
+       glBindBuffer(GL_ARRAY_BUFFER, array_bufs[0]);<br>
+       glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data),<br>
+                    vertex_data, GL_STREAM_DRAW);<br>
+       glVertexPointer(2, GL_FLOAT, 0, NULL);<br></blockquote><div><br></div><div>glVertexPointer is also compatibility-mode only.  Can we use a generic attribute instead (glVertexAttribPointer/glEnableVertexAttribArray)?<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+       glBindBuffer(GL_ARRAY_BUFFER, 0);<br>
+       glEnableClientState(GL_VERTEX_ARRAY);<br>
+<br>
+       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, array_bufs[1]);<br>
+       glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(index_data),<br>
+                    index_data, GL_STREAM_DRAW);<br>
+<br>
+       /* Create shader. */<br>
+       prog = glCreateProgram();<br>
+       vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_text);<br>
+       fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_text);<br>
+       glAttachShader(prog, vs);<br>
+       glAttachShader(prog, fs);<br>
+       glDeleteShader(vs);<br>
+       glDeleteShader(fs);<br>
+       glLinkProgram(prog);<br>
+       if (!piglit_link_check_status(prog) ||<br>
+           !piglit_check_gl_error(GL_NO_ERROR)) {<br>
+               piglit_report_result(PIGLIT_FAIL);<br>
+       }<br>
+       color_uniform = glGetUniformLocation(prog, "color");<br>
+       glUseProgram(prog);<br>
+<br>
+       piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);<br>
+<br>
+       /* Enable blending. */<br>
+       glEnable(GL_BLEND);<br>
+       glBlendEquation(GL_FUNC_ADD);<br>
+       glBlendFunc(GL_ONE, GL_ONE);<br>
+}<br>
+<br>
+static bool<br>
+run_test(const struct primitives test, int *first)<br>
+{<br>
+       const float red[] = {1, 0, 0, 1};<br>
+       const float green[] = {0, 1, 0, 1};<br>
+       bool pass = true;<br>
+<br>
+       printf("Testing %s and %s.\n", piglit_get_prim_name(test.type_adjacency),<br>
+                                      piglit_get_prim_name(test.type_base));<br>
+<br>
+       glClear(GL_COLOR_BUFFER_BIT);<br>
+<br>
+       /* Draw adjacency primitive red. */<br>
+       glUniform4fv(color_uniform, 1, red);<br>
+       glDrawElements(test.type_adjacency, test.count_adjacency, GL_UNSIGNED_SHORT, NULL + *first * 2);<br>
+       *first += test.count_adjacency;<br>
+<br>
+       /* Draw normal primitive green. */<br>
+       glUniform4fv(color_uniform, 1, green);<br>
+       glDrawElements(test.type_base, test.count_base, GL_UNSIGNED_SHORT, NULL + *first * 2);<br>
+       *first += test.count_base;<br>
+<br>
+       pass = check_framebuffer() && pass;<br>
+       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;<br>
+<br>
+       return pass;<br>
+}<br>
+<br>
+enum piglit_result<br>
+piglit_display(void)<br>
+{<br>
+       bool pass = true;<br>
+       int first = 0;<br>
+       int i = 0;<br>
+       const struct primitives tests[] = {<br>
+               {GL_LINES_ADJACENCY, 8, GL_LINES, 4},<br>
+               {GL_LINE_STRIP_ADJACENCY, 6, GL_LINE_STRIP, 4},<br>
+               {GL_TRIANGLES_ADJACENCY, 12, GL_TRIANGLES, 6},<br>
+               {GL_TRIANGLE_STRIP_ADJACENCY, 8, GL_TRIANGLE_STRIP, 4},<br>
+       };<br>
+<br>
+       for (i = 0; i < ARRAY_SIZE(tests); i++) {<br>
+               pass = run_test(tests[i], &first) && pass;<br>
+<br>
+               if (!piglit_automatic && !pass) {<br>
+                       piglit_present_results();<br>
+                       return PIGLIT_FAIL;<br>
+               }<br>
+       }<br></blockquote><div><br></div><div>This loop is going to make the test much harder to debug visually, since running the test in manual mode will only show the TRIANGLE_STRIP_ADJACENCY test.  I'd recommend breaking this up into 4 sub-tests which are selectable by a command line parameter.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+       if (!piglit_automatic)<br>
+               piglit_present_results();<br>
+<br>
+       return (pass ? PIGLIT_PASS : PIGLIT_FAIL);<br>
+}<br>
diff --git a/tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices.c b/tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices.c<br>
new file mode 100644<br>
index 0000000..6136151<br>
--- /dev/null<br>
+++ b/tests/spec/arb_geometry_shader4/execution/ignore-adjacent-vertices.c<br></blockquote><div><br></div><div>I'm not comfortable with the amount of code duplication between this file and the previous.  I'd recommend either:<br>
<br>(a) consolidate the two variations of the test into a single .c file, and select whether the test uses DrawElements or DrawArrays using a command-line parameter.  Or:<br><br></div><div>(b) it seems highly unlikely that an implementation would have a bug causing it to get DrawElements right but DrawArrays wrong, or vice versa.  I think it would be ok to just eliminate ignore-adjacent-vertices.c entirely and let ignore-adjacent-vertices-indexed.c be the only test of this behaviour.<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
@@ -0,0 +1,218 @@<br>
+/*<br>
+ * Copyright © 2013 The Piglit project<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER<br>
+ * DEALINGS IN THE SOFTWARE.<br>
+ */<br>
+<br>
+/**<br>
+ * \file ignore-adjacent-vertices.c<br>
+ *<br>
+ * Test that adjacent vertices are ignored when no geometry shader is active.<br>
+ * Draw the adjacency primitive in red and blend the non adjacency version in<br>
+ * green on top of it. Then test that the entire framebuffer is either yellow<br>
+ * or black.<br>
+ */<br>
+<br>
+#include "piglit-util-gl-common.h"<br>
+<br>
+struct primitives {<br>
+       GLenum type_adjacency;<br>
+       int count_adjacency;<br>
+       GLenum type_base;<br>
+       int count_base;<br>
+};<br>
+<br>
+static const char vs_text[] =<br>
+       "void main()\n"<br>
+       "{\n"<br>
+       "       gl_Position = ftransform();\n"<br>
+       "}\n";<br>
+<br>
+static const char fs_text[] =<br>
+       "uniform vec4 color;\n"<br>
+       "void main()\n"<br>
+       "{\n"<br>
+       "       gl_FragColor = color;\n"<br>
+       "}\n";<br>
+<br>
+PIGLIT_GL_TEST_CONFIG_BEGIN<br>
+       config.supports_gl_compat_version = 20;<br>
+       config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;<br>
+PIGLIT_GL_TEST_CONFIG_END<br>
+<br>
+GLuint color_uniform;<br>
+<br>
+/* Check that the framebuffer is yellow and black. */<br>
+static bool<br>
+check_framebuffer(void)<br>
+{<br>
+       static uint32_t* buffer = 0;<br>
+       int y, x;<br>
+       if (!buffer) buffer = malloc(sizeof(uint32_t) * piglit_width * piglit_height);<br>
+<br>
+       glReadPixels(0, 0, piglit_width, piglit_height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);<br>
+<br>
+       for (y = 0; y < piglit_height; ++y) {<br>
+               for (x = 0; x < piglit_width; ++x) {<br>
+                       uint32_t val = buffer[y * piglit_width + x] & 0xFFFFFF00;<br>
+<br>
+                       if (val != 0 && val != 0xFFFF0000) {<br>
+                               fprintf(stderr, "FAIL: Rendered primitives differ.\n");<br>
+                               return false;<br>
+                       }<br>
+               }<br>
+       }<br>
+<br>
+       return true;<br>
+}<br>
+<br>
+void<br>
+piglit_init(int argc, char **argv)<br>
+{<br>
+       GLuint array_buf;<br>
+       GLuint array;<br>
+       GLuint vs, fs, prog;<br>
+       const int w = piglit_width;<br>
+       const int h = piglit_height;<br>
+       const float x_3 = (int)(w / 3.0) + 0.5;<br>
+       const float y_3 = (int)(h / 3.0) + 0.5;<br>
+       const float x2_3 = (int)(w * 2.0 / 3.0) + 0.5;<br>
+       const float y2_3 = (int)(h * 2.0 / 3.0) + 0.5;<br>
+       const float vertex_data[] = {<br>
+               /* lines_adjacency */<br>
+               0, y2_3, x_3, y2_3, x2_3, y2_3, w, y2_3,<br>
+               0, y_3, x_3, y_3, x2_3, y_3, w, y_3,<br>
+<br>
+               /* lines */<br>
+               x_3, y2_3, x2_3, y2_3,<br>
+               x_3, y_3, x2_3, y_3,<br>
+<br>
+               /* line_strip_adjacency */<br>
+               0, y2_3, x_3, y2_3, x2_3, y2_3,<br>
+               x2_3, y_3, x_3, y_3, 0, y_3,<br>
+<br>
+               /* line_strip */<br>
+               x_3, y2_3, x2_3, y2_3, x2_3, y_3, x_3, y_3,<br>
+<br>
+               /* triangles_adjacency */<br>
+               x_3, y_3, 0, y2_3, x_3, y2_3, x2_3, y2_3, x2_3, y_3, x2_3, 0,<br>
+               x2_3, y2_3, w, y_3, x2_3, y_3, x_3, y_3, x_3, y2_3, x_3, h,<br>
+<br>
+               /* triangles */<br>
+               x_3, y_3, x_3, y2_3, x2_3, y_3,<br>
+               x2_3, y2_3, x2_3, y_3, x_3, y2_3,<br>
+<br>
+               /* triangle_strip_adjacency */<br>
+               x_3, y_3, 0, y2_3, x_3, y2_3, x2_3, 0, x2_3, y_3, x_3, h, x2_3, y2_3, w, y_3,<br>
+<br>
+               /* triangle_strip */<br>
+               x_3, y_3, x_3, y2_3, x2_3, y_3, x2_3, y2_3,<br>
+       };<br>
+<br>
+       /* Bind Vertex Data */<br>
+       glGenVertexArrays(1, &array);<br>
+       glBindVertexArray(array);<br>
+       glGenBuffers(1, &array_buf);<br>
+       glBindBuffer(GL_ARRAY_BUFFER, array_buf);<br>
+       glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data),<br>
+                    vertex_data, GL_STREAM_DRAW);<br>
+       glVertexPointer(2, GL_FLOAT, 0, NULL);<br>
+       glEnableClientState(GL_VERTEX_ARRAY);<br>
+       glBindBuffer(GL_ARRAY_BUFFER, 0);<br>
+<br>
+       /* Create shader. */<br>
+       prog = glCreateProgram();<br>
+       vs = piglit_compile_shader_text(GL_VERTEX_SHADER, vs_text);<br>
+       fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fs_text);<br>
+       glAttachShader(prog, vs);<br>
+       glAttachShader(prog, fs);<br>
+       glDeleteShader(vs);<br>
+       glDeleteShader(fs);<br>
+       glLinkProgram(prog);<br>
+       if (!piglit_link_check_status(prog) ||<br>
+           !piglit_check_gl_error(GL_NO_ERROR)) {<br>
+               piglit_report_result(PIGLIT_FAIL);<br>
+       }<br>
+       color_uniform = glGetUniformLocation(prog, "color");<br>
+       glUseProgram(prog);<br>
+<br>
+       piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);<br>
+<br>
+       /* Enable blending. */<br>
+       glEnable(GL_BLEND);<br>
+       glBlendEquation(GL_FUNC_ADD);<br>
+       glBlendFunc(GL_ONE, GL_ONE);<br>
+}<br>
+<br>
+static bool<br>
+run_test(const struct primitives test, int *first)<br>
+{<br>
+       const float red[] = {1, 0, 0, 1};<br>
+       const float green[] = {0, 1, 0, 1};<br>
+       bool pass = true;<br>
+<br>
+       printf("Testing %s and %s.\n", piglit_get_prim_name(test.type_adjacency),<br>
+                                      piglit_get_prim_name(test.type_base));<br>
+<br>
+       glClear(GL_COLOR_BUFFER_BIT);<br>
+<br>
+       /* Draw adjacency primitive red. */<br>
+       glUniform4fv(color_uniform, 1, red);<br>
+       glDrawArrays(test.type_adjacency, *first, test.count_adjacency);<br>
+       *first += test.count_adjacency;<br>
+<br>
+       /* Draw normal primitive green. */<br>
+       glUniform4fv(color_uniform, 1, green);<br>
+       glDrawArrays(test.type_base, *first, test.count_base);<br>
+       *first += test.count_base;<br>
+<br>
+       pass = check_framebuffer() && pass;<br>
+       pass = piglit_check_gl_error(GL_NO_ERROR) && pass;<br>
+<br>
+       return pass;<br>
+}<br>
+<br>
+enum piglit_result<br>
+piglit_display(void)<br>
+{<br>
+       bool pass = true;<br>
+       int first = 0;<br>
+       int i = 0;<br>
+       const struct primitives tests[] = {<br>
+               {GL_LINES_ADJACENCY, 8, GL_LINES, 4},<br>
+               {GL_LINE_STRIP_ADJACENCY, 6, GL_LINE_STRIP, 4},<br>
+               {GL_TRIANGLES_ADJACENCY, 12, GL_TRIANGLES, 6},<br>
+               {GL_TRIANGLE_STRIP_ADJACENCY, 8, GL_TRIANGLE_STRIP, 4},<br>
+       };<br>
+<br>
+       for (i = 0; i < ARRAY_SIZE(tests); i++) {<br>
+               pass = run_test(tests[i], &first) && pass;<br>
+<br>
+               if (!piglit_automatic && !pass) {<br>
+                       piglit_present_results();<br>
+                       return PIGLIT_FAIL;<br>
+               }<br>
+       }<br>
+<br>
+       if (!piglit_automatic)<br>
+               piglit_present_results();<br>
+<br>
+       return (pass ? PIGLIT_PASS : PIGLIT_FAIL);<br>
+}<br>
<span class=""><font color="#888888">--<br>
1.8.1.2<br>
<br>
</font></span><br>_______________________________________________<br>
Piglit mailing list<br>
<a href="mailto:Piglit@lists.freedesktop.org">Piglit@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/piglit" target="_blank">http://lists.freedesktop.org/mailman/listinfo/piglit</a><br>
<br></blockquote></div><br></div></div>