<div dir="ltr">On 4 September 2013 15:22, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</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">Hello!<br>
<br>
This series (at long last!) rewrites the GLSL built-in function handling,<br>
for the third time.  It's available on the builtins-v3 branch of ~kwg/mesa.<br>
<br>
The existing built-in function code had a lot of drawbacks:<br>
<br>
1. Writing new built-ins in the S-Expression style IR was painful:<br>
<br>
   Something as simple as x^2 + 1 turned into:<br>
<br>
   (expression vec4 + (expression vec4 * (var_ref x) (var_ref x))<br>
                      (constant float (1)))<br>
<br>
   which is extremely wordy, and makes it difficult to follow the<br>
   algorithm.  IR builder's add(mul(x, x), imm(1.0f)) is much nicer.<br>
<br>
2. Writing new built-ins in GLSL kind of worked some of the time:<br>
<br>
   To combat the above, we added support for writing built-ins in GLSL.<br>
   Unfortunately, they couldn't reliably use other built-in functions,<br>
   including essentials like dot(), so this approach was pretty limited.<br>
<br>
3. Myriads of cut and pasted prototypes:<br>
<br>
   Adding support for a new GLSL version meant cut and pasting the previous<br>
   version's prototypes, and adjusting a few tiny things.  This resulted in<br>
   thousands of duplicated lines, which as we support more and more GLSL<br>
   versions means propagating bug fixes is a nightmare.<br>
<br>
4. Poor control over built-in availability:<br>
<br>
   Whether foo() is available depends on the language version, shader stage,<br>
   and enabled extensions...in some arbitrary combination.  The old system<br>
   worked for simple constraints, but didn't adequately handle things like<br>
   "extensions A /and/ B enabled, or extension A and shading language X..."<br>
<br>
5. Build system nightmare.<br>
<br>
   First, it had to build builtin_compiler for the host architecture.  Next,<br>
   it would invoke Python scripts to read IR files, invoke builtin_compiler,<br>
   and generate a several megabyte C++ source file containing giant strings<br>
   of S-Expressions.  Then it had to recompile the compiler with the actual<br>
   built-in functions, this time for the target architecture.  When not<br>
   cross-compiling, it would skip some of the recompiling.<br>
<br>
   We had to make all that work with Autotools, SCons, and Android.<br>
<br>
   We broke cross-compiling so many times.<br>
<br>
   When you inevitably broke the GLSL compiler, you couldn't even compile<br>
   Mesa (the built-ins wouldn't compile), making debugging a challenge.<br>
<br>
6. Slow startup time.<br>
<br>
   When requesting a built-in function, we had to parse the strings into<br>
   S-Expressions, then parse those to generate actual IR.  This took a while.<br>
<br>
7. Finding a matching built-in was complicated.<br>
<br>
   Built-ins were spread across multiple gl_shader objects, so the code to<br>
   find a matching signature had to loop over all of them.  Worse, one of<br>
   the early shaders might define an inexact match, while a later one had<br>
   an exact match.  Multiple passes, huzzah!<br>
<br>
But I digress.<br>
<br>
This series takes a significantly different approach: it implements the<br>
built-in functions directly in C++, using ir_builder.  All signatures are<br>
stored in a single shader object.  Availability is expressed via boolean<br>
predicates, which can be arbitrary expressions using _mesa_glsl_parse_state<br>
fields.  Unavailable functions are simply filtered out when looking for<br>
matching built-ins and importing prototypes.<br>
<br>
It's significantly less code:<br>
<br>
   166 files changed, 3774 insertions(+), 11918 deletions(-)<br>
<br>
   (we could possibly scrap more...the S-Expression code and IR reader<br>
    still exist for unit testing purposes.)<br>
<br>
It's also faster:<br>
<br>
   $ piglit-run.py -t glslparsertest tests/quick.tests r<br>
<br>
takes about 12% less time.<br>
<br>
There's no crazy two-stage compilation process: no builtin_compiler,<br>
no Python scripts, no cross compiling headaches.<br>
<br>
I'd appreciate any feedback you might have.  Testing with non-Autotools<br>
would be appreciated as well.<br>
<br>
I found no Piglit or Khronos ES3 conformance regressions on i965/IVB.<br>
<br>
--Ken<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div><div class="gmail_extra">I sent comments on patches 1, 4, 5, and 18.  Patches 20 and 21 are:<br><br>Acked-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
<br></div><div class="gmail_extra">(20 because I'm not an expert on Mesa's build system, 21 because I didn't delve into detail to make sure you had deleted exactly the right set of files).<br><br>The remainder are:<br>
<br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br><br></div><div class="gmail_extra">My one major reservation about the series is the texturing functions.  I doubt anyone is going to review them carefully, and we know that there is woefully inadequate piglit testing for texturing.  But I still think it's worth moving forward with this series because:<br>
<br></div><div class="gmail_extra">(a) it's such a tremendous improvement on what we have now that I'm willing to put up with the risk of introducing some texturing bugs for the sake of this much code cleanup.<br>
</div><div class="gmail_extra"><br>(b) we are at a good point in the release cycle to make a change like this--there is a lot of time for texturing bugs to be discovered and fixed.<br><br></div><div class="gmail_extra">(c) if we do discover texturing bugs between now and the next release, that will be a good opportunity to improve our piglit testing of texturing functions.<br>
</div></div>