<div class="gmail_quote">On Thu, Apr 28, 2011 at 5:23 AM, Brian Paul <span dir="ltr">&lt;<a href="mailto:brian.e.paul@gmail.com" target="_blank">brian.e.paul@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div>On Tue, Apr 26, 2011 at 12:26 AM, Bryan Cain &lt;<a href="mailto:bryancain3@gmail.com" target="_blank">bryancain3@gmail.com</a>&gt; wrote:<br>
&gt; Hi,<br>
&gt;<br>
&gt; In the last week or so, I&#39;ve been working on a direct translator from<br>
&gt; GLSL IR to TGSI that does not go through Mesa IR.  Although it is still<br>
&gt; a work in progress, it is now working and very usable.  So before I go<br>
&gt; on, here is a link to the branch I&#39;ve pushed to GitHub:<br>
&gt;<br>
&gt; <a href="https://github.com/Plombo/mesa/tree/glsl-130" target="_blank">https://github.com/Plombo/mesa/tree/glsl-130</a><br>
&gt;<br>
&gt; My main objective with this work is to make GLSL 1.30 support feasible<br>
&gt; on Gallium drivers.  From what I understand, it would be difficult or<br>
&gt; impossible to implement integer-specific opcodes such as shifting and<br>
&gt; bit masking in Mesa IR, since it only supports floats.  TGSI, on the<br>
&gt; other hand, doesn&#39;t have this problem, and already supports most or all<br>
&gt; of the functionality required by GLSL 1.30.<br>
<br>
</div>Unfortunately, TGSI doesn&#39;t have everything we need yet.  There&#39;s<br>
opcodes for binary AND, OR, XOR, etc. and a few integer operations,<br>
but it&#39;s incomplete.  It shouldn&#39;t be a big deal to add what&#39;s missing<br>
but it&#39;ll take a little time.<br>
<br>
I think everyone agrees that we want to eventually ditch Mesa&#39;s IR.  I<br>
_think_ that the only classic Mesa driver that uses Mesa IR and hasn&#39;t<br>
been deprecated by a Gallium driver, or already weaned from Mesa IR is<br>
swrast.  How much does the i965 driver still rely on swrast for<br>
fallbacks?  Do the Intel people see need for a GLSL IR executor for<br>
swrast?<br>
<div><br>
<br>
&gt; The translator started as a modified version of ir_to_mesa, and that<br>
&gt; origin is still obvious from reading the code.  Many parts of ir_to_mesa<br>
&gt; are still untouched - glsl_to_tgsi is still a long way away from<br>
&gt; eliminating all traces of Mesa IR.  It also contains a significant<br>
&gt; amount of code adapted from st_mesa_to_tgsi, but modified to generate<br>
&gt; TGSI code from the glsl_to_tgsi_instruction class instead of using Mesa<br>
&gt; IR.  (It actually still generates Mesa IR instructions, but that could<br>
&gt; be safely removed at some point since the generated Mesa IR instructions<br>
&gt; are not actually used for anything.)  I&#39;m planning to push more of the<br>
&gt; conversion to TGSI higher up in the stack in the future, although the<br>
&gt; remaining remnants of Mesa IR (such as the Mesa IR opcodes used by most<br>
&gt; of glsl_to_tgsi) aren&#39;t doing any harm.<br>
<br>
</div>I finally found a little time to look over your code.  As you said,<br>
it&#39;s basically a copy &amp; paste of the ir_to_mesa.cpp and<br>
st_mesa_to_tgsi.c code at this time.  Do you plan to eliminate all<br>
remnants of Mesa IR there before adding support for GLSL 1.30?  One<br>
easy step would be to replace use of Mesa IR opcodes with TGSI opcodes<br>
and add new TGSI opcodes for integer ops.<br>
<div><div></div><div><br>
<br>
&gt; Since the _mesa_optimize_program function is vital to generating<br>
&gt; optimized code with ir_to_mesa, and it is not available when not using<br>
&gt; Mesa IR, I&#39;ve written some new optimization passes for<br>
&gt; glsl_to_tgsi_visitor that perform dead code elimination and<br>
&gt; consolidation of the temporary register space.  Although they are rather<br>
&gt; simple, they do make a huge difference in the quality of the output.  As<br>
&gt; an example, here is what it generates for the vertex shader in the<br>
&gt; Mandelbrot GLSL demo from the Mesa demos repository:<br>
&gt;<br>
&gt; VERT<br>
&gt; DCL IN[0]<br>
&gt; DCL IN[1]<br>
&gt; DCL IN[2]<br>
&gt; DCL OUT[0], POSITION<br>
&gt; DCL OUT[1], GENERIC[10]<br>
&gt; DCL OUT[2], GENERIC[11]<br>
&gt; DCL CONST[0..14]<br>
&gt; DCL TEMP[0..4]<br>
&gt; IMM FLT32 {    2.0000,     0.0000,    -0.5000,     5.0000}<br>
&gt;  0: MUL TEMP[0], CONST[4], IN[0].xxxx<br>
&gt;  1: MAD TEMP[0], CONST[5], IN[0].yyyy, TEMP[0]<br>
&gt;  2: MAD TEMP[0], CONST[6], IN[0].zzzz, TEMP[0]<br>
&gt;  3: MAD TEMP[0], CONST[7], IN[0].wwww, TEMP[0]<br>
&gt;  4: MUL TEMP[1].xyz, CONST[12].xyzz, IN[1].xxxx<br>
&gt;  5: MAD TEMP[1], CONST[13].xyzz, IN[1].yyyy, TEMP[1].xyzz<br>
&gt;  6: MAD TEMP[1], CONST[14].xyzz, IN[1].zzzz, TEMP[1].xyzz<br>
&gt;  7: DP3 TEMP[2].x, TEMP[1].xyzz, TEMP[1].xyzz<br>
&gt;  8: RSQ TEMP[2].x, TEMP[2].xxxx<br>
&gt;  9: MUL TEMP[1].xyz, TEMP[1].xyzz, TEMP[2].xxxx<br>
&gt;  10: ADD TEMP[2].xyz, CONST[3].xyzz, -TEMP[0].xyzz<br>
&gt;  11: DP3 TEMP[3].x, TEMP[2].xyzz, TEMP[2].xyzz<br>
&gt;  12: RSQ TEMP[3].x, TEMP[3].xxxx<br>
&gt;  13: MUL TEMP[2].xyz, TEMP[2].xyzz, TEMP[3].xxxx<br>
&gt;  14: MOV TEMP[3].xyz, -TEMP[2].xyzx<br>
&gt;  15: MOV TEMP[0].xyz, -TEMP[0].xyzx<br>
&gt;  16: DP3 TEMP[4].x, TEMP[1].xyzz, TEMP[3].xyzz<br>
&gt;  17: MUL TEMP[4].xyz, TEMP[4].xxxx, TEMP[1].xyzz<br>
&gt;  18: MUL TEMP[4].xyz, IMM[0].xxxx, TEMP[4].xyzz<br>
&gt;  19: ADD TEMP[3].xyz, TEMP[3].xyzz, -TEMP[4].xyzz<br>
&gt;  20: DP3 TEMP[4].x, TEMP[0].xyzz, TEMP[0].xyzz<br>
&gt;  21: RSQ TEMP[4].x, TEMP[4].xxxx<br>
&gt;  22: MUL TEMP[0].xyz, TEMP[0].xyzz, TEMP[4].xxxx<br>
&gt;  23: DP3 TEMP[0].x, TEMP[3].xyzz, TEMP[0].xyzz<br>
&gt;  24: MAX TEMP[0].x, TEMP[0].xxxx, IMM[0].yyyy<br>
&gt;  25: POW TEMP[0].x, TEMP[0].xxxx, CONST[0].xxxx<br>
&gt;  26: DP3 TEMP[1].x, TEMP[2].xyzz, TEMP[1].xyzz<br>
&gt;  27: MAX TEMP[1].x, TEMP[1].xxxx, IMM[0].yyyy<br>
&gt;  28: MUL TEMP[1].x, CONST[1].xxxx, TEMP[1].xxxx<br>
&gt;  29: MAD TEMP[0], CONST[2].xxxx, TEMP[0].xxxx, TEMP[1].xxxx<br>
&gt;  30: MOV OUT[2], TEMP[0].xxxx<br>
&gt;  31: ADD TEMP[0], IN[2], IMM[0].zzzz<br>
&gt;  32: MUL TEMP[0].xyz, TEMP[0].xyzz, IMM[0].wwww<br>
&gt;  33: MOV OUT[1].xyz, TEMP[0].xyzx<br>
&gt;  34: MUL TEMP[0], CONST[8], IN[0].xxxx<br>
&gt;  35: MAD TEMP[0], CONST[9], IN[0].yyyy, TEMP[0]<br>
&gt;  36: MAD TEMP[0], CONST[10], IN[0].zzzz, TEMP[0]<br>
&gt;  37: MAD TEMP[0], CONST[11], IN[0].wwww, TEMP[0]<br>
&gt;  38: MOV OUT[0], TEMP[0]<br>
&gt;  39: END<br>
&gt;<br>
&gt; Here is the same shader as generated by ir_to_mesa and st_mesa_to_tgsi<br>
&gt; in Mesa master:<br>
&gt;<br>
&gt; VERT<br>
&gt; DCL IN[0]<br>
&gt; DCL IN[1]<br>
&gt; DCL IN[2]<br>
&gt; DCL OUT[0], POSITION<br>
&gt; DCL OUT[1], GENERIC[10]<br>
&gt; DCL OUT[2], GENERIC[11]<br>
&gt; DCL CONST[0..14]<br>
&gt; DCL TEMP[0..4]<br>
&gt; IMM FLT32 {    2.0000,     0.0000,    -0.5000,     5.0000}<br>
&gt;  0: MUL TEMP[0], CONST[4], IN[0].xxxx<br>
&gt;  1: MAD TEMP[0], CONST[5], IN[0].yyyy, TEMP[0]<br>
&gt;  2: MAD TEMP[0], CONST[6], IN[0].zzzz, TEMP[0]<br>
&gt;  3: MAD TEMP[0], CONST[7], IN[0].wwww, TEMP[0]<br>
&gt;  4: MUL TEMP[1].xyz, CONST[12].xyzz, IN[1].xxxx<br>
&gt;  5: MAD TEMP[1].xyz, CONST[13].xyzz, IN[1].yyyy, TEMP[1].xyzz<br>
&gt;  6: MAD TEMP[1].xyz, CONST[14].xyzz, IN[1].zzzz, TEMP[1].xyzz<br>
&gt;  7: DP3 TEMP[2].x, TEMP[1].xyzz, TEMP[1].xyzz<br>
&gt;  8: RSQ TEMP[2].x, TEMP[2].xxxx<br>
&gt;  9: MUL TEMP[1].xyz, TEMP[1].xyzz, TEMP[2].xxxx<br>
&gt;  10: ADD TEMP[2].xyz, CONST[3].xyzz, -TEMP[0].xyzz<br>
&gt;  11: DP3 TEMP[3].x, TEMP[2].xyzz, TEMP[2].xyzz<br>
&gt;  12: RSQ TEMP[3].x, TEMP[3].xxxx<br>
&gt;  13: MUL TEMP[2].xyz, TEMP[2].xyzz, TEMP[3].xxxx<br>
&gt;  14: MOV TEMP[3].xyz, -TEMP[2].xyzx<br>
&gt;  15: MOV TEMP[0].xyz, -TEMP[0].xyzx<br>
&gt;  16: DP3 TEMP[4].x, TEMP[1].xyzz, TEMP[3].xyzz<br>
&gt;  17: MUL TEMP[4].xyz, TEMP[4].xxxx, TEMP[1].xyzz<br>
&gt;  18: MUL TEMP[4].xyz, IMM[0].xxxx, TEMP[4].xyzz<br>
&gt;  19: ADD TEMP[3].xyz, TEMP[3].xyzz, -TEMP[4].xyzz<br>
&gt;  20: DP3 TEMP[4].x, TEMP[0].xyzz, TEMP[0].xyzz<br>
&gt;  21: RSQ TEMP[4].x, TEMP[4].xxxx<br>
&gt;  22: MUL TEMP[0].xyz, TEMP[0].xyzz, TEMP[4].xxxx<br>
&gt;  23: DP3 TEMP[0].x, TEMP[3].xyzz, TEMP[0].xyzz<br>
&gt;  24: MAX TEMP[0].x, TEMP[0].xxxx, IMM[0].yyyy<br>
&gt;  25: POW TEMP[0].x, TEMP[0].xxxx, CONST[0].xxxx<br>
&gt;  26: DP3 TEMP[1].x, TEMP[2].xyzz, TEMP[1].xyzz<br>
&gt;  27: MAX TEMP[1].x, TEMP[1].xxxx, IMM[0].yyyy<br>
&gt;  28: MUL TEMP[1].x, CONST[1].xxxx, TEMP[1].xxxx<br>
&gt;  29: MAD OUT[2], CONST[2].xxxx, TEMP[0].xxxx, TEMP[1].xxxx<br>
&gt;  30: ADD TEMP[0], IN[2], IMM[0].zzzz<br>
&gt;  31: MUL OUT[1].xyz, TEMP[0].xyzx, IMM[0].wwwx<br>
&gt;  32: MUL TEMP[0], CONST[8], IN[0].xxxx<br>
&gt;  33: MAD TEMP[0], CONST[9], IN[0].yyyy, TEMP[0]<br>
&gt;  34: MAD TEMP[0], CONST[10], IN[0].zzzz, TEMP[0]<br>
&gt;  35: MAD OUT[0], CONST[11], IN[0].wwww, TEMP[0]<br>
&gt;  36: END<br>
&gt;<br>
&gt; With neither the new optimization passes nor _mesa_optimize_program, the<br>
&gt; shader has 44 instructions and 40 temporaries.  Both optimized shaders<br>
&gt; have only 5 temporaries declared.  For every shader I&#39;ve tried, in fact,<br>
&gt; my register consolidation passes result in exactly the same number of<br>
&gt; temporaries being used as when _mesa_optimize_program is used.  In terms<br>
&gt; of instruction count, the only optimization visible that is implemented<br>
&gt; in Mesa master but not in the GLSL IR to TGSI converter is copy<br>
&gt; propagation to output registers, which accounts for 2 of the 3 extra<br>
&gt; instructions in the st_glsl_to_tgsi version of the shader.<br>
&gt;<br>
&gt; One current weakness of my new optimization passes is that they don&#39;t<br>
&gt; optimize code inside of loops as well as they should, although at least<br>
&gt; they don&#39;t break code that uses loops to the best of my knowledge and<br>
&gt; testing.<br>
&gt;<br>
&gt; I&#39;d very much appreciate any comments, feedback, patches, or testing.<br>
<br>
</div></div>I don&#39;t have any spare time to test anything right now.  The only<br>
feedback I have for now would be superficial (whitespace<br>
inconsistencies, comments, etc).  But I&#39;m glad you&#39;re taking on this<br>
project.<br></blockquote></div><br>FWIW, In order to keep all the other drivers working and especially those which can&#39;t support integer opcodes, there should be a way for a driver to report that it doesn&#39;t accept those opcodes and glsl_to_tgsi shouldn&#39;t generate them then. The cap could be e.g. PIPE_CAP_SM4 or PIPE_CAP_SHADER_MODEL returning a number &gt;=4.<br>


<br>Marek<br>