<div dir="ltr">On 10 September 2013 16:28, Chad Versace <span dir="ltr"><<a href="mailto:chad.versace@linux.intel.com" target="_blank">chad.versace@linux.intel.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 09/04/2013 02:22 PM, Paul Berry wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Most geometry shaders access their input arrays using a constant index<br>
(or an index that is constant after loop unrolling).  This test checks<br>
that we get the right results if we access a geometry shader input<br>
array using a non-constant index.<br>
---<br>
  .../geometry/dynamic_input_<u></u>array_index.shader_test | 67 ++++++++++++++++++++++<br>
  1 file changed, 67 insertions(+)<br>
  create mode 100644 tests/spec/glsl-1.50/<u></u>execution/geometry/dynamic_<u></u>input_array_index.shader_test<br>
<br>
diff --git a/tests/spec/glsl-1.50/<u></u>execution/geometry/dynamic_<u></u>input_array_index.shader_test b/tests/spec/glsl-1.50/<u></u>execution/geometry/dynamic_<u></u>input_array_index.shader_test<br>
new file mode 100644<br>
index 0000000..685a66a<br>
--- /dev/null<br>
+++ b/tests/spec/glsl-1.50/<u></u>execution/geometry/dynamic_<u></u>input_array_index.shader_test<br>
@@ -0,0 +1,67 @@<br>
+# Verify that a geometry shader can access an input array using a<br>
+# dynamic index rather than a constant index.<br>
+<br>
+[require]<br>
+GL >= 3.2<br>
+GLSL >= 1.50<br>
+<br>
+[vertex shader]<br>
+#version 150<br>
+<br>
+in vec4 vertex;<br>
+in vec4 color;<br>
+in int index;<br>
+out vec4 vertex_to_gs;<br>
+out vec4 color_to_gs;<br>
+out int index_to_gs;<br>
+<br>
+void main()<br>
+{<br>
+  vertex_to_gs = vertex;<br>
+  color_to_gs = color;<br>
+  index_to_gs = index;<br>
+}<br>
+<br>
+[geometry shader]<br>
+#version 150<br>
+<br>
+layout(triangles) in;<br>
+layout(triangle_strip, max_vertices = 3) out;<br>
+<br>
+in vec4 vertex_to_gs[3];<br>
+in vec4 color_to_gs[3];<br>
+in int index_to_gs[3];<br>
+out vec4 color_to_fs;<br>
+<br>
+void main()<br>
+{<br>
+  for (int i = 0; i < 3; i++) {<br>
+    gl_Position = vertex_to_gs[i];<br>
+    color_to_fs = color_to_gs[index_to_gs[i]];<br>
+    EmitVertex();<br>
+  }<br>
+}<br>
+<br>
+[fragment shader]<br>
+#version 150<br>
+<br>
+in vec4 color_to_fs;<br>
+out vec4 color;<br>
+<br>
+void main()<br>
+{<br>
+  color = color_to_fs;<br>
+}<br>
+<br>
+[vertex data]<br>
+vertex/float/2  color/float/4    index/int/1<br>
+-1.0 -1.0       1.0 0.0 0.0 1.0  1<br>
+ 1.0 -1.0       0.0 1.0 0.0 1.0  1<br>
+ 1.0  1.0       0.0 0.0 1.0 1.0  1<br>
+-1.0 -1.0       1.0 0.0 0.0 1.0  2<br>
+ 1.0  1.0       0.0 0.0 1.0 1.0  2<br>
+-1.0  1.0       0.0 1.0 0.0 1.0  2<br>
+<br>
+[test]<br>
+draw arrays GL_TRIANGLES 0 6<br>
+probe all rgba 0.0 1.0 0.0 1.0<br>
<br>
</blockquote>
<br></div></div>
Seeing that the index attribute has the same value for all vertices<br>
that belong to the same primitive, I can imagine some simple code generation<br>
bugs under which this test would produce a false positive.<br>
<br>
I'd like to see each index attribute have a unique value, and guarantee<br>
that the test fails if a single wrong index value is chosen.<br>
Here's a partial example that I think accomplishes that:<br>
<br>
[geometry shader]<br>
#version 150<br>
<br>
layout(triangles) in;<br>
layout(triangle_strip, max_vertices = 3) out;<br>
<br>
in vec4 vertex_to_gs[3];<br>
in ivec4 color_to_gs[3];<br>
in ivec4 modulus_to_gs[3];<br>
int index_to_gs[3];<br>
out vec4 color_to_fs;<br>
<br>
void main()<br>
{<div class="im"><br>
  for (int i = 0; i < 3; i++) {<br></div>
    gl_Position = vertex_to_gs[i];<br>
    color_to_fs = vec4(mod(color_to_gs[i], modulus_to_gs[index_to_gs[i]])<u></u>);<br>
    EmitVertex();<br>
  }<br>
}<br>
<br>
[vertex data]<br>
vertex/float/2  color/int/4       modulus/int/4   index/int/1<br>
-1.0 -1.0       5  7  9 10        4 7 5 2         2<br>
 1.0 -1.0       2  3  4  3        2 2 2 2         1<br>
 1.0  1.0       8 15 15 15        5 6 9 9         0<br>
-1.0 -1.0       ...<br>
 1.0  1.0       ...<br>
-1.0  1.0       ...<br>
</blockquote></div><br></div><div class="gmail_extra">Sure, I can go along with this.  It's definitely a more thorough test, and it didn't take me too long to think through all the math and convince myself that it produces the correct results.  v2 on its way.<br>
</div></div>