configure.ac: Use AX_GCC_BUILTIN to check availability of __builtin_bswap32 v2
[mesa.git] / src / gallium / auxiliary / util / u_prim.h
index 94312c2f4c5dc6bbb25823f0e1358506ac725b77..fd95c0ba0cc218179b500dad28aa6e99ec94c6dc 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.
@@ -38,8 +38,8 @@ extern "C" {
 #endif
 
 struct u_prim_vertex_count {
-   int min;
-   int incr;
+   unsigned min;
+   unsigned incr;
 };
 
 /**
@@ -204,42 +204,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);
    }
 }