Luca,<br><br>I&#39;d rather use what the GLSL compiler provides since, as you say, the wider community cares about it. Although the GLSL if/loop emulation hasn&#39;t been tested on r300 yet, I think the r300 compiler will handle it just fine.<br>

<br>However shader compilation should not fail if it hits an unsupported feature. Let&#39;s assume there is a GLSL shader which contains loops that cannot be emulated and a driver doesn&#39;t support loops, the shader should be sent to the driver anyway and be faked, or be emulated by a software fallback.  See the comment from Ian here:<br>

<a href="https://bugs.freedesktop.org/show_bug.cgi?id=29439#c6">https://bugs.freedesktop.org/show_bug.cgi?id=29439#c6</a><br><br>NAK.<br><br>Marek<br><br><div class="gmail_quote">On Mon, Sep 6, 2010 at 3:30 AM, Luca Barbieri <span dir="ltr">&lt;<a href="mailto:luca@luca-barbieri.com">luca@luca-barbieri.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">This purpose of this is so that loop/if emulation in the glsl compiler<br>
doesn&#39;t get enabled in the next change.<br>
<br>
Note that doing such emulation in driver-specific code is probably<br>
a bad idea, especially since the result won&#39;t be exposed to further<br>
generic optimizations, and the driver-specific code doesn&#39;t get<br>
improved by the wider community that cares about GLSL.<br>
<br>
Thus, it might be a good idea to revert this commit once/if r300g<br>
works well with the glsl compiler loop/if emulation, and possibly<br>
remove some of the emulation from the r300 compiler.<br>
<br>
The only part that makes sense to have in the driver is emulation of<br>
loops with an unknown number of iterations, since here the goal is to unroll<br>
as much as possible while staying in the instruction limits, and the glsl<br>
compiler cannot do this because it has no idea of how many instructions<br>
some IR will generate.<br>
---<br>
 src/gallium/drivers/r300/r300_screen.c |    4 ++--<br>
 1 files changed, 2 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c<br>
index 7f41ff0..8deb9d9 100644<br>
--- a/src/gallium/drivers/r300/r300_screen.c<br>
+++ b/src/gallium/drivers/r300/r300_screen.c<br>
@@ -182,7 +182,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e<br>
         case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:<br>
             return is_r500 ? 511 : 4;<br>
         case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:<br>
-            return is_r500 ? 64 : 0; /* Actually unlimited on r500. */<br>
+            return is_r500 ? 64 : 1; /* Actually unlimited on r500. */<br>
             /* Fragment shader limits. */<br>
         case PIPE_SHADER_CAP_MAX_INPUTS:<br>
             /* 2 colors + 8 texcoords are always supported<br>
@@ -216,7 +216,7 @@ static int r300_get_shader_param(struct pipe_screen *pscreen, unsigned shader, e<br>
         case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:<br>
             return 0;<br>
         case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:<br>
-            return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */<br>
+            return is_r500 ? 4 : 1; /* For loops; not sure about conditionals. */<br>
         case PIPE_SHADER_CAP_MAX_INPUTS:<br>
             return 16;<br>
         case PIPE_SHADER_CAP_MAX_CONSTS:<br>
<font color="#888888">--<br>
1.7.0.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></blockquote></div><br>