Mesa (nvfx-next-7j): mesa/st: turn on EmitNoIfs is control flow unsupported

Luca Barbieri lb at kemper.freedesktop.org
Thu Aug 19 21:53:01 UTC 2010


Module: Mesa
Branch: nvfx-next-7j
Commit: 43a0057766a92f55526d846244e67c7af7cfaf92
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=43a0057766a92f55526d846244e67c7af7cfaf92

Author: Luca Barbieri <luca at luca-barbieri.com>
Date:   Thu Aug 19 23:48:54 2010 +0200

mesa/st: turn on EmitNoIfs is control flow unsupported

r300g is changed to falsely claim it always has control flow to
not change its behavior.

---

 src/gallium/drivers/nvfx/nvfx_screen.c |    6 +++---
 src/gallium/drivers/r300/r300_screen.c |    6 ++++--
 src/mesa/state_tracker/st_extensions.c |    5 +++++
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/nvfx/nvfx_screen.c b/src/gallium/drivers/nvfx/nvfx_screen.c
index 72cb523..1dd7b48 100644
--- a/src/gallium/drivers/nvfx/nvfx_screen.c
+++ b/src/gallium/drivers/nvfx/nvfx_screen.c
@@ -99,7 +99,7 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
 	case PIPE_CAP_MAX_FS_CONTROL_FLOW_DEPTH:
 		/* FIXME: is it the dynamic (nv30:0/nv40:24) or the static
 		   value (nv30:0/nv40:4) ? */
-		return screen->is_nv4x ? 4 : 0;
+		return 0; //screen->is_nv4x ? 4 : 0;
 	case PIPE_CAP_MAX_FS_INPUTS:
 		return 10;
 	case PIPE_CAP_MAX_FS_CONSTS:
@@ -119,7 +119,7 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
 	case PIPE_CAP_MAX_VS_CONTROL_FLOW_DEPTH:
 		/* FIXME: is it the dynamic (nv30:24/nv40:24) or the static
 		   value (nv30:1/nv40:4) ? */
-		return screen->is_nv4x ? 4 : 1;
+		return 0; //return screen->is_nv4x ? 4 : 1;
 	case PIPE_CAP_MAX_VS_INPUTS:
 		return 16;
 	case PIPE_CAP_MAX_VS_CONSTS:
@@ -155,7 +155,7 @@ nvfx_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_cap param)
 	case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
 		return screen->is_nv4x ? 16.0 : 8.0;
 	case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
-		return screen->is_nv4x ? 16.0 : 4.0;
+		return 15.0;
 	default:
 		NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
 		return 0.0;
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index 1e4edcd..66f426c 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -169,7 +169,8 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
         case PIPE_CAP_MAX_FS_TEX_INDIRECTIONS:
             return is_r500 ? 511 : 4;
         case PIPE_CAP_MAX_FS_CONTROL_FLOW_DEPTH:
-            return is_r500 ? 64 : 0; /* Actually unlimited on r500. */
+            /* it is actually 0, but we for now don't enable the GLSL2 if-to-cond pass */
+            return is_r500 ? 64 : 1; /* Actually unlimited on r500. */
         case PIPE_CAP_MAX_FS_INPUTS:
             /* 2 colors + 8 texcoords are always supported
              * (minus fog and wpos).
@@ -195,7 +196,8 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
         case PIPE_CAP_MAX_VS_TEX_INDIRECTIONS:
             return 0;
         case PIPE_CAP_MAX_VS_CONTROL_FLOW_DEPTH:
-            return is_r500 ? 4 : 0; /* For loops; not sure about conditionals. */
+            /* it is actually 0, but we for now don't enable the GLSL2 if-to-cond pass */
+            return is_r500 ? 4 : 1; /* For loops; not sure about conditionals. */
         case PIPE_CAP_MAX_VS_INPUTS:
             return 16;
         case PIPE_CAP_MAX_VS_CONSTS:
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 90e7867..72c457b 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -139,6 +139,11 @@ void st_init_limits(struct st_context *st)
    st->ctx->Shader.EmitContReturn =
       screen->get_param(screen, PIPE_CAP_TGSI_CONT_SUPPORTED);
 
+   /* XXX this should differ for VS and FS! */
+   st->ctx->Shader.EmitNoIfs =
+      !screen->get_param(screen, PIPE_CAP_MAX_VS_CONTROL_FLOW_DEPTH)
+      || !screen->get_param(screen, PIPE_CAP_MAX_FS_CONTROL_FLOW_DEPTH);
+
    /* Quads always follow GL provoking rules. */
    c->QuadsFollowProvokingVertexConvention = GL_FALSE;
 




More information about the mesa-commit mailing list