[Mesa-dev] [PATCH 00/15] Compile GLSL to ir_builder

Ian Romanick idr at freedesktop.org
Thu Sep 15 22:23:24 UTC 2016


On 09/15/2016 03:12 PM, Ian Romanick wrote:
> This series makes the stand-alone GLSL compiler useful for something.
> It adds an option to generate C++ code that uses ir_builder to recreate
> the compiled GLSL shader.  I intend to use this for various lowering
> code for GL_ARB_gpu_shader_int64 and GL_ARB_gpu_shader_fp64 (on
> platforms that don't actually have double precision hardware).  See also
> Elie Tournier's "soft double" GSoC project.
> 
> As an example, I present some GLSL code that does 64-bit integer
> division:
> 
> https://people.freedesktop.org/~idr/udivmod64.glsl
> 
> and the C++ code generated:
> 
> https://people.freedesktop.org/~idr/udivmod64.cpp
> 
> This is a little bit of fib... the code in this series lacks a very
> small amount of 64-bit integer support, and the other necessary bits in
> Mesa are not yet in master.  A tree with all of that will be available
> soon.

https://cgit.freedesktop.org/~idr/mesa/log/?h=arb_gpu_shader_int64

radeonsi uses LLVM to do the 64-bit multiply and division lowering, so
ARB_gpu_shader_int64 support could land before this series.  The
rearranging and rebasing should be trivial to make that work.

> The generated code is only ~200 lines compared to ~50 lines of GLSL.
> However, I can make changes to the GLSL much easier than I can the big
> pile of ir_builder code.  It's a bit like coding in assembly.
> 
> I believe this same technique could be adapted to generate NIR builder
> too.  Then we could use the same GLSL source to lower things in NIR that
> originated from SPIR-V binaries.
> 
> The ideal work flow would be generate the C++ code while Mesa is
> building, like we do with the various lexers and parsers.  However, this
> presents the usual compiler bootstrap problems that we have managed to
> avoid all these years.  It also adds problems for cross-compiling Mesa.
> 
> I don't expect the generated code to change very often... maybe the best
> work flow that will actually work is to generate the C++ files by hand
> and commit both the C++ and the GLSL to the tree.  That seems pretty
> awful, but I'm not sure what we can do that's better.
> 
> One other change I've thought about making... the C++ can include an
> embedded version of the GLSL, possibly as a comment.  Then we could
> detect when the C++ and GLSL didn't match.
> 
> This does feel a little like "everything old is new again."  We used to
> do something similar very early in the compiler development.  We had a
> special inline "assembly" mode, and we'd embed the GLSL for built-in
> functions in the Mesa binary.  At context creation, we'd bootstrap the
> compiler by compiling the built-in functions.
> 
> This series is available at:
> 
> https://cgit.freedesktop.org/~idr/mesa/log/?h=standalone-ir_builder
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 



More information about the mesa-dev mailing list