On 24 October 2011 14:56, Eric Anholt <span dir="ltr">&lt;<a href="mailto:eric@anholt.net">eric@anholt.net</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Thu, 20 Oct 2011 14:12:24 -0700, Paul Berry &lt;<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>&gt; wrote:<br>
&gt; This patch adds the ability for shader_runner tests to include a<br>
&gt; &quot;[vertex data]&quot; section containing data in columnar format, for example:<br>
&gt;<br>
&gt; [vertex data]<br>
&gt; vertex/float/3 foo/uint/1 bar/int/2<br>
&gt; 0.0 0.0 0.0    0xe0000000 0 0<br>
&gt; 0.0 1.0 0.0    0x70000000 1 1<br>
&gt; 1.0 1.0 0.0    0x00000000 0 1<br>
&gt;<br>
&gt; Each column header is of the form ATTRNAME/TYPE/COUNT, where ATTRNAME<br>
&gt; is the name of the vertex attribute to be bound to this column, TYPE<br>
&gt; is the type of data that follows (&quot;float&quot;, &quot;int&quot;, or &quot;uint&quot;), and<br>
&gt; COUNT is the vector length of the data (e.g. &quot;3&quot; for vec3 data).<br>
&gt;<br>
&gt; To send vertex data to the shader, use the new shader_runner command<br>
&gt; &quot;draw arrays&quot;.  The parameters are the same as for the glDrawArrays()<br>
&gt; command, so for example to draw triangle primitives using 3 elements<br>
&gt; from the vertex data array starting at element 0, use the command:<br>
&gt;<br>
&gt; draw arrays GL_TRIANGLES 0 3<br>
&gt;<br>
&gt; More detailed examples can be found in the tests/shaders/vbo<br>
&gt; directory.<br>
&gt;<br>
&gt; The implementation is largely in a new file, piglit-vbo.cpp, so that<br>
&gt; it can be re-used by other piglit tests if necessary.<br>
<br>
</div>For the other commits,<br>
Reviewed-by: Eric Anholt &lt;<a href="mailto:eric@anholt.net">eric@anholt.net</a>&gt;<br>
<br>
For this one, comments inline.<br>
<div><div></div><div class="h5"><br>
&gt; +             } else if (sscanf(line, &quot;draw arrays %31s %d %d&quot;, s, &amp;x, &amp;y)) {<br>
&gt; +                     GLenum mode = decode_mode(s);<br>
&gt; +                     int first = x;<br>
&gt; +                     size_t count = (size_t) y;<br>
&gt; +                     if (first &lt; 0) {<br>
&gt; +                             printf(&quot;draw arrays &#39;first&#39; must be &gt;= 0\n&quot;);<br>
&gt; +                             piglit_report_result(PIGLIT_FAIL);<br>
&gt; +                     } else if ((size_t) first &gt;= num_vbo_rows) {<br>
&gt; +                             printf(&quot;draw arrays &#39;first&#39; must be &lt; %lu\n&quot;,<br>
&gt; +                                    num_vbo_rows);<br>
&gt; +                             piglit_report_result(PIGLIT_FAIL);<br>
&gt; +                     }<br>
&gt; +                     if (count &lt;= 0) {<br>
&gt; +                             printf(&quot;draw arrays &#39;count&#39; must be &gt; 0\n&quot;);<br>
&gt; +                             piglit_report_result(PIGLIT_FAIL);<br>
&gt; +                     } else if (count &gt; num_vbo_rows - (size_t) first) {<br>
&gt; +                             printf(&quot;draw arrays cannot draw beyond %lu\n&quot;,<br>
&gt; +                                    num_vbo_rows);<br>
&gt; +                             piglit_report_result(PIGLIT_FAIL);<br>
&gt; +                     }<br>
&gt; +                     /* TODO: wrapper? */<br>
&gt; +                     glDrawArrays(mode, first, count);<br>
&gt;               } else if (string_match(&quot;disable&quot;, line)) {<br>
&gt;                       do_enable_disable(line + 7, false);<br>
&gt;               } else if (string_match(&quot;enable&quot;, line)) {<br>
<br>
</div></div>Not sure what the TODO is about here.<br></blockquote><div><br>Whoops, that was a reminder to myself to see if I needed to call a piglit_DrawArrays() wrapper function instead of calling glDrawArrays() directly.  I&#39;m pretty sure I don&#39;t, since this function is part of OpenGL 2.1 and every implementation that&#39;s worth testing these days supports OpenGL 2.1.  I&#39;ll remove the comment.<br>
 </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im"><br>
&gt; @@ -1523,4 +1600,7 @@ piglit_init(int argc, char **argv)<br>
&gt;<br>
&gt;       process_test_script(argv[1]);<br>
&gt;       link_and_use_shaders();<br>
&gt; +     if (vertex_data_start != NULL)<br>
&gt; +             num_vbo_rows = setup_vbo_from_text(prog, vertex_data_start,<br>
&gt; +                                                vertex_data_end);<br>
&gt;  }<br>
&gt; diff --git a/tests/shaders/vbo/vbo-generic-float.shader_test b/tests/shaders/vbo/vbo-generic-float.shader_test<br>
&gt; new file mode 100644<br>
&gt; index 0000000..8982211<br>
&gt; --- /dev/null<br>
&gt; +++ b/tests/shaders/vbo/vbo-generic-float.shader_test<br>
<br>
</div>The 3 new testcases in here surprised me -- I expected that patch 6/6<br>
was going to be the new testcases, though I suspect you wrote these for<br>
testing this shader_runner code.<br>
<br>
I would think that vbo-generic-uint would be part of<br>
tests/spec/glsl-1.30/ and the others part of tests/spec/glsl-1.10/?  But<br>
given the other interpolation tests, it seems like generic-uint is the<br>
only interesting one here.<br></blockquote><div><br>Yes, you&#39;re right--the other tests don&#39;t really verify any interesting functionality of the GL implementation.  I only wrote them to help me verify that the new shader_runner functionality worked correctly.  I was considering dropping them entirely, but they seemed like a nice source of extra documentation for how this new shader_runner feature works.  That was my primary motivation for putting them in tests/shaders/vbo--so they would be nearer to the shader_runner.c code they were illustrating.<br>
<br>But perhaps I&#39;m overthinking things.  I&#39;d be just as happy moving vbo-generic-uint to tests/spec/glsl-1.30/ and dropping the others.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div class="im"><br>
&gt; diff --git a/tests/util/piglit-vbo.cpp b/tests/util/piglit-vbo.cpp<br>
&gt; new file mode 100644<br>
&gt; index 0000000..fdba6b1<br>
&gt; --- /dev/null<br>
&gt; +++ b/tests/util/piglit-vbo.cpp<br>
<br>
</div><div><div></div><div class="h5">&gt; +/**<br>
&gt; + * \file piglit-vbo.cpp<br>
&gt; + *<br>
&gt; + * This file adds the facility for specifying vertex data to piglit<br>
&gt; + * tests using a columnar text format, for example:<br>
&gt; + *<br>
&gt; + *   \verbatim<br>
&gt; + *   vertex/float/3 foo/uint/1 bar/int/2<br>
&gt; + *   0.0 0.0 0.0    10         0 0 # comment<br>
&gt; + *   0.0 1.0 0.0     5         1 1<br>
&gt; + *   1.0 1.0 0.0     0         0 1<br>
&gt; + *   \endverbatim<br>
&gt; + *<br>
&gt; + * The format consists of a row of column headers followed by any<br>
&gt; + * number of rows of data.  Each column header has the form<br>
&gt; + * &quot;ATTRNAME/TYPE/COUNT&quot;, where ATTRNAME is the name of the vertex<br>
&gt; + * attribute to be bound to this column, TYPE is the type of data that<br>
&gt; + * follows (&quot;float&quot;, &quot;int&quot;, or &quot;uint&quot;), and COUNT is the vector length<br>
&gt; + * of the data (e.g. &quot;3&quot; for vec3 data).<br>
&gt; + *<br>
&gt; + * The data follows the column headers in space-separated form.  &quot;#&quot;<br>
&gt; + * can be used for comments, as in shell scripts.<br>
&gt; + *<br>
&gt; + * To process textual vertex data, call the function<br>
&gt; + * setup_vbo_from_text(), passing the int identifying the linked<br>
&gt; + * program, and the string containing the vertex data.  The return<br>
&gt; + * value is the number of rows of vertex data found.<br>
&gt; + *<br>
&gt; + * If an error occurs, setup_vbo_from_text() will print out a<br>
&gt; + * description of the error and exit with PIGLIT_FAIL.<br>
&gt; + *<br>
&gt; + * For the example above, the call to setup_vbo_from_text() is roughly<br>
&gt; + * equivalent to the following GL operations:<br>
&gt; + *<br>
&gt; + * \code<br>
&gt; + * struct vertex_attributes {<br>
&gt; + *         GLfloat vertex[3];<br>
&gt; + *         GLuint foo;<br>
&gt; + *         GLint bar[2];<br>
&gt; + * } vertex_data[] = {<br>
&gt; + *         { { 0.0, 0.0, 0.0 }, 10, { 0, 0 } },<br>
&gt; + *         { { 0.0, 1.0, 0.0 },  5, { 1, 1 } },<br>
&gt; + *         { { 1.0, 1.0, 0.0 },  0, { 0, 1 } }<br>
&gt; + * };<br>
&gt; + * size_t stride = sizeof(vertex_data[0]);<br>
&gt; + * GLint vertex_index = glGetAttribLocation(prog, &quot;vertex&quot;);<br>
&gt; + * GLint foo_index = glGetAttribLocation(prog, &quot;foo&quot;);<br>
&gt; + * GLint bar_index = glGetAttribLocation(prog, &quot;bar&quot;);<br>
&gt; + * GLuint buffer_handle;<br>
&gt; + * glGenBuffers(1, &amp;buffer_handle);<br>
&gt; + * glBindBuffer(GL_ARRAY_BUFFER, buffer_handle);<br>
&gt; + * glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), &amp;vertex_data,<br>
&gt; + *              GL_STATIC_DRAW);<br>
&gt; + * glVertexAttribPointer(vertex_index, 3, GL_FLOAT, GL_FALSE, stride,<br>
&gt; + *                       (void *) offsetof(vertex_attributes, vertex));<br>
&gt; + * glVertexAttribIPointer(foo_index, 3, GL_UNSIGNED_INT, stride,<br>
&gt; + *                        (void *) offsetof(vertex_attributes, foo));<br>
&gt; + * glVertexAttribIPointer(bar_index, 3, GL_INT, stride,<br>
&gt; + *                        (void *) offsetof(vertex_attributes, bar));<br>
&gt; + * glEnableVertexAttribArray(vertex_index);<br>
&gt; + * glEnableVertexAttribArray(foo_index);<br>
&gt; + * glEnableVertexAttribArray(bar_index);<br>
&gt; + * \endcode<br>
&gt; + */<br>
<br>
</div></div>Don&#39;t we need to do something to ensure that our vertex data ends up as<br>
attribute 0?  Or that one of them does?  Or is this something that is<br>
guaranteed by the API?<br></blockquote><div><br>I don&#39;t think it matters whether our vertex data (or any of the vertex attributes) ends up as attribute 0.  The only things that are special about attribute 0 are that (a) it aliases gl_Vertex, and (b) when using the begin/end paradigm, it is the attribute that triggers the vertex shader to execute.  (a) shouldn&#39;t matter because this feature is intended to be used with shaders that don&#39;t use gl_Vertex (perhaps I should document that more clearly).  (b) shouldn&#39;t matter because this feature doesn&#39;t use the begin/end paradigm.<br>
</div></div>