From: Ian Romanick <[email protected]>

Use a single vertex shader with outputs with non-contiguous explicit
locations.  Specify transform feedback with the vertex shader outputs
landing in a different order than the explicit locations specify.
Verify that the order specified by glTransformFeedbackVaryings is used.

Signed-off-by: Ian Romanick <[email protected]>
---
 tests/all.py                                       |   1 +
 .../arb_separate_shader_objects/CMakeLists.gl.txt  |   1 +
 .../xfb-rendezvous_by_location.c                   | 172 +++++++++++++++++++++
 3 files changed, 174 insertions(+)
 create mode 100644 
tests/spec/arb_separate_shader_objects/xfb-rendezvous_by_location.c

diff --git a/tests/all.py b/tests/all.py
index 5230cb8..d38f60e 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -1809,6 +1809,7 @@ arb_separate_shader_objects['400 combinations by name'] = 
plain_test('arb_separa
 arb_separate_shader_objects['active sampler conflict'] = 
concurrent_test('arb_separate_shader_object-active-sampler-conflict')
 arb_separate_shader_objects['dlist'] = 
concurrent_test('arb_separate_shader_object-dlist')
 arb_separate_shader_objects['misc. API error checks'] = 
concurrent_test('arb_separate_shader_object-api-errors')
+arb_separate_shader_objects['Transform feedback with rendezvous by location'] 
= concurrent_test('arb_separate_shader_object-xfb-rendezvous_by_location')
 
 # Group ARB_sampler_objects
 arb_sampler_objects = {}
diff --git a/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt 
b/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt
index b049e3e..cc2fcee 100644
--- a/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt
+++ b/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt
@@ -22,3 +22,4 @@ piglit_add_executable 
(arb_separate_shader_object-rendezvous_by_location rendezv
 piglit_add_executable (arb_separate_shader_object-uniform-namespace 
uniform-namespace.c sso-common.c)
 piglit_add_executable 
(arb_separate_shader_object-UseProgramStages-non-separable 
UseProgramStages-non-separable.c)
 piglit_add_executable (arb_separate_shader_object-ValidateProgramPipeline 
ValidateProgramPipeline.c)
+piglit_add_executable (arb_separate_shader_object-xfb-rendezvous_by_location 
xfb-rendezvous_by_location.c sso-common.c)
diff --git 
a/tests/spec/arb_separate_shader_objects/xfb-rendezvous_by_location.c 
b/tests/spec/arb_separate_shader_objects/xfb-rendezvous_by_location.c
new file mode 100644
index 0000000..b37e621
--- /dev/null
+++ b/tests/spec/arb_separate_shader_objects/xfb-rendezvous_by_location.c
@@ -0,0 +1,172 @@
+/*
+ * Copyright © 2014 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+/**
+ * \file xfb-rendezvous_by_location.c
+ * Verify that transform feedback data lands in the correct place when
+ * rendezvous-by-location is used.
+ *
+ * Use a single vertex shader with outputs with non-contiguous explicit
+ * locations.  Specify transform feedback with the vertex shader outputs
+ * landing in a different order than the explicit locations specify.  Verify
+ * that the order specified by glTransformFeedbackVaryings is used.
+ */
+#include "piglit-util-gl-common.h"
+#include "sso-common.h"
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+       config.supports_gl_compat_version = 21;
+       config.supports_gl_core_version = 31;
+       config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+static const char *vs_template =
+       "#version %d\n"
+       "#extension GL_ARB_separate_shader_objects: require\n"
+       "#extension GL_ARB_explicit_attrib_location: require\n"
+       "\n"
+       "layout(location = 0) in vec4 piglit_vertex;\n"
+       "\n"
+       "layout(location = 1) out vec3 a;\n"
+       "layout(location = 3) out vec3 b;\n"
+       "\n"
+       "void main()\n"
+       "{\n"
+       "    gl_Position = piglit_vertex;\n"
+       "    a = piglit_vertex.xyz;\n"
+       "    b = vec3(3, 5, 7);\n"
+       "}\n"
+       ;
+
+void piglit_init(int argc, char **argv)
+{
+       unsigned glsl_version;
+       GLuint vs_prog = 0;
+       GLuint buf = 0;
+       GLuint xfb = 0;
+       GLuint pipe = 0;
+       char *source;
+       float *data;
+       unsigned i;
+       bool pass = true;
+       static const char *varyings[] = {"b", "a"};
+
+       /* The vertex data is expected in this order because piglit_draw_rect
+        * uses a GL_TRIANGLE_STRIP to draw the rectangle.
+        */
+       static const float expected_data[6 * 6] = {
+               3, 5, 7, -1, -1, 0,
+               3, 5, 7,  1, -1, 0,
+               3, 5, 7, -1,  1, 0,
+               3, 5, 7, -1,  1, 0,
+               3, 5, 7,  1, -1, 0,
+               3, 5, 7,  1,  1, 0
+       };
+
+       piglit_require_extension("GL_ARB_separate_shader_objects");
+       piglit_require_extension("GL_ARB_explicit_attrib_location");
+       piglit_require_extension("GL_ARB_transform_feedback2");
+
+       glsl_version = pick_a_glsl_version();
+
+       /* The vertex shader must be created using the "traditional" method
+        * because we the call glTransformFeedbackVaryings before linking.
+        */
+       asprintf(&source, vs_template, glsl_version);
+
+       if (!CreateShaderProgram_with_xfb(source, varyings,
+                                         ARRAY_SIZE(varyings), &vs_prog)) {
+               pass = false;
+               goto done;
+       }
+
+       glGenProgramPipelines(1, &pipe);
+       glBindProgramPipeline(pipe);
+       glUseProgramStages(pipe,
+                          GL_VERTEX_SHADER_BIT,
+                          vs_prog);
+
+       configure_transform_feedback_object(&xfb, &buf);
+
+       glEnable(GL_RASTERIZER_DISCARD);
+       
+       /* This will generate 4 vertices worth of transform feedback data.
+        */
+       glBeginTransformFeedback(GL_TRIANGLES);
+       piglit_draw_rect(-1, -1, 2, 2);
+       glEndTransformFeedback();
+
+       /* Verify that the correct data landed in the correct places.
+        */
+       data = glMapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_ONLY);
+
+       for (i = 0; i < 6; i++) {
+               if (memcmp(&data[i * 6], &expected_data[i * 6],
+                          sizeof(float) * 6) != 0) {
+                       printf("Incorrect XFB data for veretx %d.  Got\n", i);
+                       printf("    %f %f %f %f %f %f\n",
+                              data[(i * 6) + 0],
+                              data[(i * 6) + 1],
+                              data[(i * 6) + 2],
+                              data[(i * 6) + 3],
+                              data[(i * 6) + 4],
+                              data[(i * 6) + 5]);
+                       printf("but expected\n");
+                       printf("    %f %f %f %f %f %f\n\n",
+                              expected_data[(i * 6) + 0],
+                              expected_data[(i * 6) + 1],
+                              expected_data[(i * 6) + 2],
+                              expected_data[(i * 6) + 3],
+                              expected_data[(i * 6) + 4],
+                              expected_data[(i * 6) + 5]);
+               }
+       }
+
+       glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
+
+       pass = piglit_check_gl_error(0) && pass;
+
+ done:
+       free(source);
+
+       glBindProgramPipeline(0);
+       glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
+       glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
+
+       glDeleteBuffers(1, &buf);
+       glDeleteTransformFeedbacks(1, &xfb);
+       glDeleteProgramPipelines(1, &pipe);
+       glDeleteProgram(vs_prog);
+
+       pass = piglit_check_gl_error(0) && pass;
+
+       piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL);
+}
+
+enum piglit_result
+piglit_display(void)
+{
+       return PIGLIT_FAIL;
+}
-- 
1.8.1.4

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to