This is a work-in-progress patch series to switch texenvprogram.c from
generating ARB_fp style Mesa IR to generating GLSL IR as its product.
For drivers without native GLSL codegen, that is then turned into the
Mesa IR that can be consumed.  However, for 965 we don't use the Mesa
IR product and just use the GLSL output, producing much better code
thanks to the new backend.  This is part of a long term goal to get
Mesa drivers off of Mesa IR and producing their instruction stream
directly from the GLSL IR.

I'm not planning on committing this series immediately, as I've still
got a regression in the 965 driver with texrect-many on the last
commit.

As a comparison, here's one of the shaders from openarena before:

wm-native:
add(16)         g10<1>UW        g1.4<2,4,0>UW   0x10101010V     { align1 };
add(16)         g12<1>UW        g1.5<2,4,0>UW   0x11001100V     { align1 };
add(16)         g14<1>F         g10<8,8,1>UW    -g1<0,1,0>F     { align1 compr 
};
add(16)         g16<1>F         g12<8,8,1>UW    -g1.1<0,1,0>F   { align1 compr 
};
line(16)        null            g3.4<0,1,0>F    g14<8,8,1>F     { align1 compr 
};
mac(16)         m2<1>F          g3.5<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
send(8) 2       g10<1>F         null
                math inv mlen 1 rlen 1                          { align1 };
send(8) 3       g11<1>F         null
                math inv mlen 1 rlen 1                          { align1 
sechalf };
line(16)        null            g6<0,1,0>F      g14<8,8,1>F     { align1 compr 
};
mac(16)         g2<1>F          g6.1<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
line(16)        null            g6.4<0,1,0>F    g14<8,8,1>F     { align1 compr 
};
mac(16)         g12<1>F         g6.5<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
mul(16)         m2<1>F          g2<8,8,1>F      g10<8,8,1>F     { align1 compr 
};
mul(16)         g12<1>F         g12<8,8,1>F     g10<8,8,1>F     { align1 compr 
};
line(16)        null            g8<0,1,0>F      g14<8,8,1>F     { align1 compr 
};
mac(16)         g6<1>F          g8.1<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
line(16)        null            g8.4<0,1,0>F    g14<8,8,1>F     { align1 compr 
};
mac(16)         g18<1>F         g8.5<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
mul(16)         g6<1>F          g6<8,8,1>F      g10<8,8,1>F     { align1 compr 
};
mul(16)         g18<1>F         g18<8,8,1>F     g10<8,8,1>F     { align1 compr 
};
line(16)        null            g4<0,1,0>F      g14<8,8,1>F     { align1 compr 
};
mac(16)         g8<1>F          g4.1<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
line(16)        null            g4.4<0,1,0>F    g14<8,8,1>F     { align1 compr 
};
mac(16)         g20<1>F         g4.5<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
line(16)        null            g5<0,1,0>F      g14<8,8,1>F     { align1 compr 
};
mac(16)         g22<1>F         g5.1<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
line(16)        null            g5.4<0,1,0>F    g14<8,8,1>F     { align1 compr 
};
mac(16)         g24<1>F         g5.5<0,1,0>F    g16<8,8,1>F     { align1 compr 
};
mul(16)         g8<1>F          g8<8,8,1>F      g10<8,8,1>F     { align1 compr 
};
mul(16)         g20<1>F         g20<8,8,1>F     g10<8,8,1>F     { align1 compr 
};
mul(16)         g22<1>F         g22<8,8,1>F     g10<8,8,1>F     { align1 compr 
};
mul(16)         g24<1>F         g24<8,8,1>F     g10<8,8,1>F     { align1 compr 
};
mov(16)         m4<1>F          g12<8,8,1>F                     { align1 compr 
};
mov(8)          m1<1>UD         g0<8,8,1>UD                     { align1 nomask 
};
mov(1)          m1.2<1>UD       0x00008000UD                    { align1 nomask 
};
send(16) 1      g26<1>UW        null
                sampler (9, 0, 0, 2) mlen 5 rlen 6              { align1 };
mov(16)         m2<1>F          g6<8,8,1>F                      { align1 compr 
};
mov(16)         m4<1>F          g18<8,8,1>F                     { align1 compr 
};
mov(8)          m1<1>UD         g0<8,8,1>UD                     { align1 nomask 
};
mov(1)          m1.2<1>UD       0x00008000UD                    { align1 nomask 
};
send(16) 1      g10<1>UW        null
                sampler (10, 1, 0, 2) mlen 5 rlen 6             { align1 };
mul(16)         g2<1>F          g26<8,8,1>F     g8<8,8,1>F      { align1 compr 
};
mul(16)         g4<1>F          g28<8,8,1>F     g20<8,8,1>F     { align1 compr 
};
mul(16)         g6<1>F          g30<8,8,1>F     g22<8,8,1>F     { align1 compr 
};
add.sat(16)     g8<1>F          g10<8,8,1>F     g2<8,8,1>F      { align1 compr 
};
add.sat(16)     g16<1>F         g12<8,8,1>F     g4<8,8,1>F      { align1 compr 
};
add.sat(16)     g18<1>F         g14<8,8,1>F     g6<8,8,1>F      { align1 compr 
};
mov(16)         m2<1>F          g8<8,8,1>F                      { align1 compr4 
};
mov(16)         m3<1>F          g16<8,8,1>F                     { align1 compr4 
};
mov(16)         m4<1>F          g18<8,8,1>F                     { align1 compr4 
};
mov(16)         m5<1>F          g24<8,8,1>F                     { align1 compr4 
};
mov(8)          m1<1>F          g1<8,8,1>F                      { align1 nomask 
};
send(16) 0      null            g0<8,8,1>UW
                write (0, 8, 4, 0) mlen 10 rlen 0               { align1 EOT };
(54 instructions)

and after:
Native code for fragment shader 0:
   compute pixel centers
add(8)          g10<1>UW        g1.4<2,4,0>UW   0x10101010V     { align1 };
add(8)          g11<1>UW        g1.5<2,4,0>UW   0x11001100V     { align1 };
   compute pixel deltas from v0
add(8)          g12<1>F         g10<8,8,1>UW    -g1<0,1,0>F     { align1 };
add(8)          g13<1>F         g11<8,8,1>UW    -g1.1<0,1,0>F   { align1 };
   compute pos.w and 1/pos.w
pln(8)          g10<1>F         g3.4<0,1,0>F    g12<8,8,1>F     { align1 };
send(8) 2       g10<1>F         g10<8,8,1>F
                math inv mlen 1 rlen 1                          { align1 };
   (declare (in ) vec4 gl_co...@0x9ffe278)
pln(8)          g11<1>F         g4<0,1,0>F      g12<8,8,1>F     { align1 };
pln(8)          g16<1>F         g4.4<0,1,0>F    g12<8,8,1>F     { align1 };
pln(8)          g17<1>F         g5<0,1,0>F      g12<8,8,1>F     { align1 };
pln(8)          g14<1>F         g5.4<0,1,0>F    g12<8,8,1>F     { align1 };
mul(8)          g11<1>F         g11<8,8,1>F     g10<8,8,1>F     { align1 };
mul(8)          g16<1>F         g16<8,8,1>F     g10<8,8,1>F     { align1 };
mul(8)          g17<1>F         g17<8,8,1>F     g10<8,8,1>F     { align1 };
mul(8)          m5<1>F          g14<8,8,1>F     g10<8,8,1>F     { align1 };
   (declare (in ) (array vec4 2) gl_texco...@0x9fe8e10)
pln(8)          g14<1>F         g6<0,1,0>F      g12<8,8,1>F     { align1 };
pln(8)          g15<1>F         g6.4<0,1,0>F    g12<8,8,1>F     { align1 };
pln(8)          g18<1>F         g7.4<0,1,0>F    g12<8,8,1>F     { align1 };
mul(8)          g14<1>F         g14<8,8,1>F     g10<8,8,1>F     { align1 };
mul(8)          g15<1>F         g15<8,8,1>F     g10<8,8,1>F     { align1 };
mul(8)          g18<1>F         g18<8,8,1>F     g10<8,8,1>F     { align1 };
pln(8)          g19<1>F         g8<0,1,0>F      g12<8,8,1>F     { align1 };
pln(8)          g20<1>F         g8.4<0,1,0>F    g12<8,8,1>F     { align1 };
pln(8)          g21<1>F         g9.4<0,1,0>F    g12<8,8,1>F     { align1 };
mul(8)          g19<1>F         g19<8,8,1>F     g10<8,8,1>F     { align1 };
mul(8)          g20<1>F         g20<8,8,1>F     g10<8,8,1>F     { align1 };
mul(8)          g21<1>F         g21<8,8,1>F     g10<8,8,1>F     { align1 };
   (assign (constant bool (1)) (x) (var_ref projec...@0x9ffe3c8)  (expression 
float rcp (swiz w (array_ref (var_ref gl_texco...@0x9fe8e10) (constant uint 
(0)) ) )) ) 
send(8) 2       g10<1>F         g18<8,8,1>F
                math inv mlen 1 rlen 1                          { align1 };
   (assign (constant bool (1)) (x) (var_ref flattening_...@0x9fb9450)  
(expression float * (swiz x (var_ref channel_expressi...@0x9ffd990) )(var_ref 
projec...@0x9ffe3c8) ) ) 
mul(8)          m2<1>F          g14<8,8,1>F     g10<8,8,1>F     { align1 };
   (assign (constant bool (1)) (y) (var_ref flattening_...@0x9fb9450)  
(expression float * (swiz y (var_ref channel_expressi...@0x9ffd990) )(var_ref 
projec...@0x9ffe3c8) ) ) 
mul(8)          m3<1>F          g15<8,8,1>F     g10<8,8,1>F     { align1 };
   (assign (constant bool (1)) (xyzw) (var_ref channel_expressi...@0x9fb7510)  
(tex (var_ref sample...@0x9fbb280)  (var_ref flattening_...@0x9fb9450)  (1 0 0) 
1 () )) 
send(8) 1       g12<1>UW        g0<8,8,1>UW
                sampler (9, 0, 0, 1) mlen 3 rlen 4              { align1 };
   (assign (constant bool (1)) (x) (var_ref flattening_...@0x9fb95a8)  
(expression float * (swiz x (var_ref channel_expressi...@0x9fb7510) )(swiz x 
(var_ref gl_co...@0x9ffe278) )) ) 
mul(8)          g10<1>F         g12<8,8,1>F     g11<8,8,1>F     { align1 };
   (assign (constant bool (1)) (y) (var_ref flattening_...@0x9fb95a8)  
(expression float * (swiz y (var_ref channel_expressi...@0x9fb7510) )(swiz y 
(var_ref gl_co...@0x9ffe278) )) ) 
mul(8)          g11<1>F         g13<8,8,1>F     g16<8,8,1>F     { align1 };
   (assign (constant bool (1)) (z) (var_ref flattening_...@0x9fb95a8)  
(expression float * (swiz z (var_ref channel_expressi...@0x9fb7510) )(swiz z 
(var_ref gl_co...@0x9ffe278) )) ) 
mul(8)          g12<1>F         g14<8,8,1>F     g17<8,8,1>F     { align1 };
   (assign (constant bool (1)) (x) (var_ref projec...@0x9fb9238)  (expression 
float rcp (swiz w (array_ref (var_ref gl_texco...@0x9fe8e10) (constant uint 
(1)) ) )) ) 
send(8) 2       g13<1>F         g21<8,8,1>F
                math inv mlen 1 rlen 1                          { align1 };
   (assign (constant bool (1)) (x) (var_ref flattening_...@0x9fb9748)  
(expression float * (swiz x (var_ref channel_expressi...@0x9fb6e00) )(var_ref 
projec...@0x9fb9238) ) ) 
mul(8)          m2<1>F          g19<8,8,1>F     g13<8,8,1>F     { align1 };
   (assign (constant bool (1)) (y) (var_ref flattening_...@0x9fb9748)  
(expression float * (swiz y (var_ref channel_expressi...@0x9fb6e00) )(var_ref 
projec...@0x9fb9238) ) ) 
mul(8)          m3<1>F          g20<8,8,1>F     g13<8,8,1>F     { align1 };
   (assign (constant bool (1)) (xyzw) (var_ref channel_expressi...@0x9fb61c0)  
(tex (var_ref sample...@0x9fbb220)  (var_ref flattening_...@0x9fb9748)  (0 0 0) 
1 () )) 
send(8) 1       g13<1>UW        g0<8,8,1>UW
                sampler (10, 1, 0, 1) mlen 3 rlen 4             { align1 };
   (assign (constant bool (1)) (x) (var_ref flattening_...@0x9fb98e8)  
(expression float + (swiz x (var_ref channel_expressi...@0x9fb61c0) )(swiz x 
(var_ref texenv_comb...@0x9fe8f38) )) ) 
add.sat(8)      m2<1>F          g13<8,8,1>F     g10<8,8,1>F     { align1 };
   (assign (constant bool (1)) (y) (var_ref flattening_...@0x9fb98e8)  
(expression float + (swiz y (var_ref channel_expressi...@0x9fb61c0) )(swiz y 
(var_ref texenv_comb...@0x9fe8f38) )) ) 
add.sat(8)      m3<1>F          g14<8,8,1>F     g11<8,8,1>F     { align1 };
   (assign (constant bool (1)) (z) (var_ref flattening_...@0x9fb98e8)  
(expression float + (swiz z (var_ref channel_expressi...@0x9fb61c0) )(swiz z 
(var_ref texenv_comb...@0x9fe8f38) )) ) 
add.sat(8)      m4<1>F          g15<8,8,1>F     g12<8,8,1>F     { align1 };
   (assign (constant bool (1)) (w) (var_ref gl_fragco...@0x9ffe1d0)  (swiz w 
(var_ref texenv_comb...@0x9fe8f38) )) 
   FB write target 0
mov(8)          m1<1>F          g1<8,8,1>F                      { align1 nomask 
};
send(8) 0       null            g0<8,8,1>UW
                write (0, 12, 4, 0) mlen 6 rlen 0               { align1 EOT };
(41 instructions)

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to