[Mesa-dev] [PATCH 06/20] t_dd_dmatmp: Fix render_quad_strip_elts

ville.syrjala at linux.intel.com ville.syrjala at linux.intel.com
Mon Mar 23 05:47:22 PDT 2015


From: Ville Syrjälä <ville.syrjala at linux.intel.com>

Split the tri vs. tristrip paths in render_quad_strip_elts apart
and add the appropriate smooth vs. flat shading and provoking
vertex checks. Add the same checks to validate_render to make
sure we don't end up there under the wrong circumstances.

Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 src/mesa/tnl_dd/t_dd_dmatmp.h | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/src/mesa/tnl_dd/t_dd_dmatmp.h b/src/mesa/tnl_dd/t_dd_dmatmp.h
index 82493a3..2132c07 100644
--- a/src/mesa/tnl_dd/t_dd_dmatmp.h
+++ b/src/mesa/tnl_dd/t_dd_dmatmp.h
@@ -906,7 +906,8 @@ static void TAG(render_quad_strip_elts)( struct gl_context *ctx,
 {
    if (HAVE_QUAD_STRIPS && 0) {
    }
-   else if (HAVE_TRI_STRIPS) {
+   else if ((HAVE_TRIANGLES || HAVE_TRI_STRIPS) &&
+	    ctx->Light.ShadeModel == GL_SMOOTH) {
       LOCAL_VARS;
       GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
       int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
@@ -925,7 +926,16 @@ static void TAG(render_quad_strip_elts)( struct gl_context *ctx,
       if (currentsz < 12)
 	 currentsz = dmasz;
 
-      if (ctx->Light.ShadeModel == GL_FLAT) {
+      if (HAVE_TRI_STRIPS) {
+	 ELT_INIT( GL_TRIANGLE_STRIP );
+
+	 for (j = start; j + 3 < count; j += nr - 2 ) {
+	    nr = MIN2( currentsz, count - j );
+	    TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
+	    FLUSH();
+	    currentsz = dmasz;
+	 }
+      } else {
 	 ELT_INIT( GL_TRIANGLES );
 
 	 currentsz = currentsz/6*2;
@@ -934,8 +944,7 @@ static void TAG(render_quad_strip_elts)( struct gl_context *ctx,
 	 for (j = start; j + 3 < count; j += nr - 2 ) {
 	    nr = MIN2( currentsz, count - j );
 
-	    if (nr >= 4)
-	    {
+	    if (nr >= 4) {
 	       GLint i;
 	       GLint quads = (nr/2)-1;
 	       ELTS_VARS( ALLOC_ELTS( quads*6 ) );
@@ -948,22 +957,12 @@ static void TAG(render_quad_strip_elts)( struct gl_context *ctx,
 	       }
 
 	       FLUSH();
-	    }
-
-	    currentsz = dmasz;
 	 }
-      }
-      else {
-	 ELT_INIT( GL_TRIANGLE_STRIP );
 
-	 for (j = start; j + 3 < count; j += nr - 2 ) {
-	    nr = MIN2( currentsz, count - j );
-	    TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
-	    FLUSH();
-	    currentsz = dmasz;
-	 }
+	 currentsz = dmasz;
       }
    }
+
 }
 
 
@@ -1124,8 +1123,10 @@ static GLboolean TAG(validate_render)( struct gl_context *ctx,
 	 break;
       case GL_QUAD_STRIP:
 	 if (VB->Elts) {
-	    ok = HAVE_TRI_STRIPS;
-	 } else if (HAVE_QUAD_STRIPS) {
+	    ok = ((HAVE_TRI_STRIPS || HAVE_TRIANGLES) &&
+		  ctx->Light.ShadeModel == GL_SMOOTH);
+	 }
+	 else if (HAVE_QUAD_STRIPS) {
 	    ok = GL_TRUE;
 	 } else {
 	    ok = (HAVE_TRI_STRIPS && ctx->Light.ShadeModel == GL_SMOOTH);
-- 
2.0.5



More information about the mesa-dev mailing list