[Mesa-dev] GLSL built-in functions rewrite

Paul Berry stereotype441 at gmail.com
Sun Sep 8 20:48:37 PDT 2013


On 8 September 2013 10:05, Paul Berry <stereotype441 at gmail.com> wrote:

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

Reflecting on this further, here's something we could do that would
eliminate my reservation, and give me enough confidence to give patch 18 a
full reviewed-by:

- Add a temporary hack to the current master that causes the build system
to output the IR for every possible built-in (using ir_print_visitor), in
some canonical order.
- Add a temporary hack to your builtins-v3 branch that causes
builtin_builder to output the IR for every possible built-in (using
ir_print_visitor), in the same canonical order.
- Diff the two outputs.

What do you think?  Would that be feasible enough to be worth trying?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130908/c72a3d6b/attachment-0001.html>


More information about the mesa-dev mailing list