I've created a new branch in git for my new work on the GLSL compiler.
I'm basically replacing Michal's compiler back-end with a new one that
produces vertex/fragment programs like those of
GL_NV/ARB_vertex/fragment_program. With a little additional work,
this'll allow running GLSL on hardware which supports vertex/fragment
programs.
The stack-oriented interpreter formerly used for running GLSL programs
will go away (it's mostly dead now).
The current code is FAR from finished. The progs/demos/fplight demo
works though.
Here's a rough list of things that work:
1. Basic float/vector/matrix arithmetic is pretty much all working.
2. Function calls (all function calls are inlined).
3. if/then/else contructs
4. while/for loops implemented (but untested)
5. Some GL state uniforms
Thinks that don't work:
1. user-defined structs
2. arrays
3. texture sampling
4. linking of multiple vertex/fragment sub-programs
5. some constructors
6. tons of stuff I'm forgetting..
Code of interest:
slang/slang_codegen.c - this file basically traverses the AST
(Abstract Syntax Tree) produced by the parser and produces IR
(Intermediate Representation) trees. This should be familiar to
anyone who's studied compilers.
slang/slang_emit.c - traverses the IR tree and emits vertex/fragment
program instructions.
slang/slang_link2.c - new linker. Resolves storage of varying vars,
uniforms, etc.
Here's an example. This fragment shader:
//////// test fragment shader
uniform vec4 diffuse;
uniform vec3 lightPos;
uniform vec4 specular;
varying vec3 normal;
void main()
{
float dotProd = dot(lightPos, normalize(normal));
dotProd = clamp(dotProd, 0.0, 1.0);
if (dotProd > 0.5)
gl_FragColor = diffuse * dotProd + specular * pow(dotProd, 20.0);
else if (dotProd > 0.4)
gl_FragColor = diffuse + diffuse;
else
gl_FragColor = diffuse;
}
Compiles into the following fragment program:
0: DP3 TEMP[4].x, INPUT[12], INPUT[12];
1: RSQ TEMP[2].x, TEMP[4].xxxx;
2: MUL TEMP[1].xyz, INPUT[12], TEMP[2].xxxw;
3: NOP; # __endOfFunc_normalize_102
4: DP3 TEMP[0].x, UNIFORM[7], TEMP[1];
5: MAX TEMP[3].x, TEMP[0].xxxx, CONST[10];
6: MIN TEMP[0].x, TEMP[3].xxxx, CONST[11];
7: NOP; # __endOfFunc_clamp_104
8: SGT.C TEMP[5], TEMP[0].xxxx, CONST[12];
9: BRA 15 (EQ..xxxx); # __else105
10: MUL TEMP[6], UNIFORM[8], TEMP[0].xxxx;
11: POW TEMP[7].x, TEMP[0].xxxx, CONST[13];
12: MUL TEMP[8], UNIFORM[9], TEMP[7].xxxx;
13: ADD OUTPUT[0], TEMP[6], TEMP[8];
14: BRA 23 (TR.); # __endif106
15: NOP; # __else105
16: SGT.C TEMP[9], TEMP[0].xxxx, CONST[14];
17: BRA 20 (EQ..xxxx); # __else110
18: ADD OUTPUT[0], UNIFORM[8], UNIFORM[8];
19: BRA 22 (TR.); # __endif111
20: NOP; # __else110
21: MOV OUTPUT[0], UNIFORM[8];
22: NOP; # __endif111
23: NOP; # __endif106
24: NOP; # __endOfFunction_Main100
25: END;
The quality of the generated code is actually pretty decent at this
point (ignore the NOPs). Though, I've made almost no attempt at
minimizing temporary usage (some relatively simple programs blow up
simply because they use too many temps.) And at some point I'd like
to add a BURG-style code generator to do optimizations (like finding
places for MAD instructions, etc) but that's a ways off.
Anyway, there's probably enough there for people to tinker with. But
please keep in mind that it's a work in progress.
I'll be on vacation Dec 22 - Jan 2 and don't know how much progress
I'll make during that time.
-Brian
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev