u_blitter: do error checking assertions for shader caching
[mesa.git] / src / gallium / auxiliary / util / u_prim.h
index 7948dae38f712e251fc22e2fcf3810ef20144256..cf1a18f427951e3494b6f94f26e3ac294a2aef0b 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2008 VMware, Inc.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -26,8 +26,8 @@
  **************************************************************************/
 
 
-#ifndef U_BLIT_H
-#define U_BLIT_H
+#ifndef U_PRIM_H
+#define U_PRIM_H
 
 
 #include "pipe/p_defines.h"
@@ -38,8 +38,8 @@ extern "C" {
 #endif
 
 struct u_prim_vertex_count {
-   int min;
-   int incr;
+   unsigned min;
+   unsigned incr;
 };
 
 /**
@@ -136,41 +136,26 @@ u_prim_vertex_count(unsigned prim)
    return (likely(prim < PIPE_PRIM_MAX)) ? &prim_table[prim] : NULL;
 }
 
-static INLINE boolean u_validate_pipe_prim( unsigned pipe_prim, unsigned nr )
+/**
+ * Given a vertex count, return the number of primitives.
+ * For polygons, return the number of triangles.
+ */
+static INLINE unsigned
+u_prims_for_vertices(unsigned prim, unsigned num)
 {
-   boolean ok = TRUE;
+   const struct u_prim_vertex_count *info = u_prim_vertex_count(prim);
 
-   switch (pipe_prim) {
-   case PIPE_PRIM_POINTS:
-      ok = (nr >= 1);
-      break;
-   case PIPE_PRIM_LINES:
-      ok = (nr >= 2);
-      break;
-   case PIPE_PRIM_LINE_STRIP:
-   case PIPE_PRIM_LINE_LOOP:
-      ok = (nr >= 2);
-      break;
-   case PIPE_PRIM_TRIANGLES:
-      ok = (nr >= 3);
-      break;
-   case PIPE_PRIM_TRIANGLE_STRIP:
-   case PIPE_PRIM_TRIANGLE_FAN:
-   case PIPE_PRIM_POLYGON:
-      ok = (nr >= 3);
-      break;
-   case PIPE_PRIM_QUADS:
-      ok = (nr >= 4);
-      break;
-   case PIPE_PRIM_QUAD_STRIP:
-      ok = (nr >= 4);
-      break;
-   default:
-      ok = 0;
-      break;
-   }
+   if (num < info->min)
+      return 0;
 
-   return ok;
+   return 1 + ((num - info->min) / info->incr);
+}
+
+static INLINE boolean u_validate_pipe_prim( unsigned pipe_prim, unsigned nr )
+{
+   const struct u_prim_vertex_count *count = u_prim_vertex_count(pipe_prim);
+
+   return (count && nr >= count->min);
 }
 
 
@@ -234,42 +219,62 @@ u_vertices_per_prim(int primitive)
 static INLINE unsigned
 u_decomposed_prims_for_vertices(int primitive, int vertices)
 {
-   switch(primitive) {
+   switch (primitive) {
    case PIPE_PRIM_POINTS:
       return vertices;
    case PIPE_PRIM_LINES:
       return vertices / 2;
    case PIPE_PRIM_LINE_LOOP:
-      return vertices;
+      return (vertices >= 2) ? vertices : 0;
    case PIPE_PRIM_LINE_STRIP:
-      return (vertices > 1) ? vertices - 1 : 0;
+      return (vertices >= 2) ? vertices - 1 : 0;
    case PIPE_PRIM_TRIANGLES:
-      return vertices /  3;
+      return vertices / 3;
    case PIPE_PRIM_TRIANGLE_STRIP:
-      return (vertices > 2) ? vertices - 2 : 0;
+      return (vertices >= 3) ? vertices - 2 : 0;
    case PIPE_PRIM_TRIANGLE_FAN:
-      return (vertices > 2) ? vertices - 2 : 0;
+      return (vertices >= 3) ? vertices - 2 : 0;
    case PIPE_PRIM_LINES_ADJACENCY:
       return vertices / 4;
    case PIPE_PRIM_LINE_STRIP_ADJACENCY:
-      return (vertices > 3) ? vertices - 3 : 0;
+      return (vertices >= 4) ? vertices - 3 : 0;
    case PIPE_PRIM_TRIANGLES_ADJACENCY:
       return vertices / 6;
    case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
-      return (vertices > 5) ? 1 + (vertices - 6)/2 : 0;
+      return (vertices >= 6) ? 1 + (vertices - 6) / 2 : 0;
    case PIPE_PRIM_QUADS:
       return vertices / 4;
    case PIPE_PRIM_QUAD_STRIP:
-      return (vertices > 4) ? (vertices - 2) / 2 : 0;
+      return (vertices >= 4) ? (vertices - 2) / 2 : 0;
    /* Polygons can't be decomposed
     * because the number of their vertices isn't known so
     * for them and whatever else we don't recognize just
     * return 1 if the number of vertices is greater than
-    * 3 and zero otherwise */
+    * or equal to 3 and zero otherwise */
    case PIPE_PRIM_POLYGON:
    default:
       debug_printf("Invalid decomposition primitive!\n");
-      return (vertices > 3) ? 1 : 0;
+      return (vertices >= 3) ? 1 : 0;
+   }
+}
+
+/**
+ * Returns the number of reduced/tessellated primitives for the given vertex
+ * count.  Each quad is treated as two triangles.  Polygons are treated as
+ * triangle fans.
+ */
+static INLINE unsigned
+u_reduced_prims_for_vertices(int primitive, int vertices)
+{
+   switch (primitive) {
+   case PIPE_PRIM_QUADS:
+   case PIPE_PRIM_QUAD_STRIP:
+      return u_decomposed_prims_for_vertices(primitive, vertices) * 2;
+   case PIPE_PRIM_POLYGON:
+      primitive = PIPE_PRIM_TRIANGLE_FAN;
+      /* fall through */
+   default:
+      return u_decomposed_prims_for_vertices(primitive, vertices);
    }
 }