[Mesa-dev] [PATCH 04/18] t_dd_dmatmp: Check provoking vertex convention when rendering quads

Ian Romanick idr at freedesktop.org
Wed Sep 30 13:57:52 PDT 2015


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

When drawing quads using triangles we need to be careful to make
the provoking vertices match when flat shading.

v2: Major rebase on top of Ian other t_dd_dmatmp.h work.

Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/tnl_dd/t_dd_dmatmp.h | 46 ++++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 20 deletions(-)

diff --git a/src/mesa/tnl_dd/t_dd_dmatmp.h b/src/mesa/tnl_dd/t_dd_dmatmp.h
index 9a6f6c82..23746d5 100644
--- a/src/mesa/tnl_dd/t_dd_dmatmp.h
+++ b/src/mesa/tnl_dd/t_dd_dmatmp.h
@@ -367,28 +367,33 @@ static void TAG(render_quads_verts)(struct gl_context *ctx,
                                     GLuint count,
                                     GLuint flags)
 {
-   LOCAL_VARS;
-   GLuint j;
-
-   /* Emit whole number of quads in total. */
-   count -= count & 3;
+   if (ctx->Light.ShadeModel == GL_SMOOTH ||
+       ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION) {
+      LOCAL_VARS;
+      GLuint j;
 
-   /* Hardware doesn't have a quad primitive type -- try to simulate it using
-    * triangle primitive.  This is a win for gears, but is it useful in the
-    * broader world?
-    */
-   INIT(GL_TRIANGLES);
+      /* Emit whole number of quads in total. */
+      count -= count & 3;
 
-   for (j = 0; j + 3 < count; j += 4) {
-      void *tmp = ALLOC_VERTS(6);
-      /* Send v0, v1, v3
-       */
-      tmp = EMIT_VERTS(ctx, start + j,     2, tmp);
-      tmp = EMIT_VERTS(ctx, start + j + 3, 1, tmp);
-      /* Send v1, v2, v3
+      /* Hardware doesn't have a quad primitive type -- try to simulate it using
+       * triangle primitive.  This is a win for gears, but is it useful in the
+       * broader world?
        */
-      tmp = EMIT_VERTS(ctx, start + j + 1, 3, tmp);
-      (void) tmp;
+      INIT(GL_TRIANGLES);
+
+      for (j = 0; j + 3 < count; j += 4) {
+         void *tmp = ALLOC_VERTS(6);
+         /* Send v0, v1, v3
+          */
+         tmp = EMIT_VERTS(ctx, start + j,     2, tmp);
+         tmp = EMIT_VERTS(ctx, start + j + 3, 1, tmp);
+         /* Send v1, v2, v3
+          */
+         tmp = EMIT_VERTS(ctx, start + j + 1, 3, tmp);
+         (void) tmp;
+      }
+   } else {
+      unreachable("Cannot draw primitive");
    }
 }
 
@@ -462,7 +467,8 @@ static bool TAG(validate_render)(struct gl_context *ctx,
          ok = VB->Elts || ctx->Light.ShadeModel == GL_SMOOTH;
          break;
       case GL_QUADS:
-         ok = true; /* flatshading is ok. */
+         ok = ctx->Light.ShadeModel == GL_SMOOTH ||
+              ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION;
          break;
       default:
          break;
-- 
2.1.0



More information about the mesa-dev mailing list