2013-08-03 00:04:10 +00:00
|
|
|
An OpenGL and OpenGL ES shader front end and validator.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
There are two components:
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
1) A front-end library for programmatic parsing of GLSL/ESSL into an AST.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
2) A standalone wrapper, glslangValidator, that can be used as a shader
|
|
|
|
validation tool.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Things left to do: See Todo.txt
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Execution
|
|
|
|
---------
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
There are binaries in the Install/Windows and Install/Linux directories.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
To use the standalone binary form, execute glslangValidator, and it will print
|
|
|
|
a usage statement. Basic operation is to give it a file containing a shader,
|
|
|
|
and it will print out warnings/errors and optionally an AST.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
The applied stage-specific rules are based on the file extension. Currently,
|
|
|
|
either .frag or .vert, but soon to also include all stages.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Source: Build and run on linux
|
2012-12-12 21:15:54 +00:00
|
|
|
-------------------------------
|
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
A simple bash script "BuildLinux.sh" is provided at the root directory
|
|
|
|
to do the build and run a test cases. You will need a recent version of
|
|
|
|
bison installed.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
|
|
|
Once the executable is generated, it needs to be dynamically linked with the
|
2013-08-03 00:04:10 +00:00
|
|
|
shared object created in lib directory. To achieve that, "cd" to
|
2012-12-12 21:15:54 +00:00
|
|
|
StandAlone directory to update the LD_LIBRARY_PATH as follows
|
|
|
|
|
|
|
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./../glslang/MachineIndependent/lib
|
|
|
|
|
|
|
|
You can also update LD_LIBRARY_PATH in the .cshrc or .bashrc file, depending on
|
|
|
|
the shell you are using. You will need to give the complete path of "lib" directory
|
|
|
|
in .cshrc or .bashrc files.
|
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Source: Build and run on Windows
|
|
|
|
--------------------------------
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Current development is with Visual Studio verion 11 (2012). The solution
|
|
|
|
file is in the project's root directory Standalone.sln.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Building the StandAlone project (the default) will create glslangValidate.exe and
|
|
|
|
copy it into the Test directory and Install directory. This allows local
|
|
|
|
test scripts to use either the debug or release version, whichever was
|
|
|
|
built last.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Windows execution and testing is generally done from within a cygwin
|
|
|
|
shell.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
Note: Despite appearances, the use of a DLL is currently disabled; it
|
|
|
|
simply makes a standalone executable from a statically linked library.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-05 15:52:03 +00:00
|
|
|
Basic external programmatic interface
|
|
|
|
-------------------------------------
|
|
|
|
|
|
|
|
Another piece of software can programmatically translate shaders to an AST
|
|
|
|
using the C-style ShInitialize(), ShCompile(), et. al. interface. The main() in
|
|
|
|
StandAlone/StandAlone.cpp shows an example way of using these.
|
|
|
|
|
|
|
|
The Sh*() interface takes a "compiler" call-back object, which it calls after
|
|
|
|
building call back that is passed the AST and can then execute a backend on it.
|
|
|
|
|
|
|
|
The following is a simplified resulting run-time call stack:
|
|
|
|
|
|
|
|
ShCompile(shader, compiler) -> compiler(AST) -> <back end>
|
|
|
|
|
|
|
|
In practice, ShCompile() takes shader strings, default version, and
|
|
|
|
warning/error and other options for controling compilation.
|
|
|
|
|
|
|
|
Testing
|
|
|
|
-------
|
|
|
|
|
|
|
|
"Test" is an active test directory that contains test input and a
|
|
|
|
subdirectory baseResults that contains the expected results of the
|
|
|
|
tests. Both the tests and baseResults are under source-code control.
|
|
|
|
Executing the script ./runtests will generate current results in
|
|
|
|
the localResults directory and diff them against the baseResults.
|
|
|
|
When you want to update the tracked test results, they need to be
|
|
|
|
copied from localResults to baseResults
|
|
|
|
|
|
|
|
There are some tests borrowed from LunarGLASS. If LunarGLASS is
|
|
|
|
missing, those tests just won't run.
|
|
|
|
|
|
|
|
Basic Internal Operation
|
|
|
|
------------------------
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
- Initial lexical analysis is done be the preprocessor in
|
|
|
|
MachineIndependent/Preprocessor, and then refined by a GLSL scanner
|
|
|
|
in MachineIndependent/Scan.cpp. There is currently no use of flex.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
- Code is parsed using bison, with the aid of a symbol table and an AST
|
2012-12-12 21:15:54 +00:00
|
|
|
intermediate representation. The symbol table is not passed on to
|
|
|
|
the back-end; the intermediate representation stands on its own.
|
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
- The intermediate representation is very high-level, and represented
|
2012-12-12 21:15:54 +00:00
|
|
|
as an in-memory tree. This serves to lose no information from the
|
|
|
|
original program, and to have efficient transfer of the result from
|
2013-08-03 00:04:10 +00:00
|
|
|
parsing to the back-end. In the AST, constants are propogated and
|
|
|
|
folded, and a very small amount of dead code is eliminated.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
To aid linking and reflection, the last top-level branch in the AST
|
|
|
|
lists all global symbols.
|
|
|
|
|
|
|
|
- The primary algorithm of the back-end compiler is to traverse the
|
2012-12-12 21:15:54 +00:00
|
|
|
tree (high-level intermediate representation), and create an internal
|
2013-08-03 00:04:10 +00:00
|
|
|
object code representation. There is an example of how to do this
|
|
|
|
in MachineIndependent/intermOut.cpp.
|
2012-12-12 21:15:54 +00:00
|
|
|
|
2013-08-03 00:04:10 +00:00
|
|
|
- Reduction of the tree to a linear byte-code style low-level intermediate
|
2012-12-12 21:15:54 +00:00
|
|
|
representation is likely a good way to generate fully optimized code.
|