mesa/st: Actually free the driver part of memory objects on destruction.
[mesa.git] / src / mesa / tnl_dd / t_dd_dmatmp.h
index b229f42c164dc8eaa7ca981ce15f9d2051de9f70..56fa1a382f7bbda13c0e6d67357c57c5fd3bce50 100644 (file)
@@ -85,8 +85,8 @@ static void TAG(render_points_verts)(struct gl_context *ctx,
          currentsz = dmasz;
       }
    } else {
-      fprintf(stderr, "%s - cannot draw primitive\n", __func__);
-      return;
+      unreachable("Cannot draw primitive; validate_render should have "
+                  "prevented this");
    }
 }
 
@@ -316,11 +316,12 @@ static void TAG(render_poly_verts)(struct gl_context *ctx,
       }
 
       FLUSH();
-   } else if (ctx->Light.ShadeModel == GL_SMOOTH) {
+   } else if (ctx->Light.ShadeModel == GL_SMOOTH ||
+              ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION) {
       TAG(render_tri_fan_verts)( ctx, start, count, flags );
    } else {
-      fprintf(stderr, "%s - cannot draw primitive\n", __func__);
-      return;
+      unreachable("Cannot draw primitive; validate_render should have "
+                  "prevented this");
    }
 }
 
@@ -331,14 +332,7 @@ static void TAG(render_quad_strip_verts)(struct gl_context *ctx,
 {
    GLuint j, nr;
 
-   if (ctx->Light.ShadeModel == GL_FLAT &&
-       TNL_CONTEXT(ctx)->vb.AttribPtr[_TNL_ATTRIB_COLOR0]->stride) {
-      /* Vertices won't fit in a single buffer or elts not available - should
-       * never happen.
-       */
-      fprintf(stderr, "%s - cannot draw primitive\n", __func__);
-      return;
-   } else {
+   if (ctx->Light.ShadeModel == GL_SMOOTH) {
       LOCAL_VARS;
       const unsigned dmasz = GET_SUBSEQUENT_VB_MAX_VERTS() & ~1;
       unsigned currentsz;
@@ -364,6 +358,9 @@ static void TAG(render_quad_strip_verts)(struct gl_context *ctx,
       }
 
       FLUSH();
+   } else {
+      unreachable("Cannot draw primitive; validate_render should have "
+                  "prevented this");
    }
 }
 
@@ -373,28 +370,33 @@ static void TAG(render_quads_verts)(struct gl_context *ctx,
                                     GLuint count,
                                     GLuint flags)
 {
-   LOCAL_VARS;
-   GLuint j;
+   if (ctx->Light.ShadeModel == GL_SMOOTH ||
+       ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION) {
+      LOCAL_VARS;
+      GLuint j;
 
-   /* Emit whole number of quads in total. */
-   count -= count & 3;
+      /* Emit whole number of quads in total. */
+      count -= count & 3;
 
-   /* 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);
-
-   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");
    }
 }
 
@@ -409,7 +411,7 @@ static void TAG(render_noop)(struct gl_context *ctx,
    (void) flags;
 }
 
-static tnl_render_func TAG(render_tab_verts)[GL_POLYGON+2] =
+static const tnl_render_func TAG(render_tab_verts)[GL_POLYGON+2] =
 {
    TAG(render_points_verts),
    TAG(render_lines_verts),
@@ -461,15 +463,15 @@ static bool TAG(validate_render)(struct gl_context *ctx,
          ok = true;
          break;
       case GL_POLYGON:
-         ok = (HAVE_POLYGONS) || ctx->Light.ShadeModel == GL_SMOOTH;
+         ok = (HAVE_POLYGONS) || ctx->Light.ShadeModel == GL_SMOOTH ||
+              ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION;
          break;
       case GL_QUAD_STRIP:
-         ok = VB->Elts ||
-              (ctx->Light.ShadeModel != GL_FLAT ||
-               VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride == 0);
+         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;