auxiliary: move Ben Skeggs' primitive splitter to common code
[mesa.git] / src / gallium / drivers / nouveau / nouveau_util.h
index a5e8537533e7d97e18ef5be296a3df0a41814a34..b165f7a611a4b922cd21612d0018a16cefe754f1 100644 (file)
@@ -88,104 +88,4 @@ static INLINE unsigned log2i(unsigned i)
        return r;
 }
 
-struct u_split_prim {
-   void *priv;
-   void (*emit)(void *priv, unsigned start, unsigned count);
-   void (*edge)(void *priv, boolean enabled);
-
-   unsigned mode;
-   unsigned start;
-   unsigned p_start;
-   unsigned p_end;
-
-   uint repeat_first:1;
-   uint close_first:1;
-   uint edgeflag_off:1;
-};
-
-static INLINE void
-u_split_prim_init(struct u_split_prim *s,
-                  unsigned mode, unsigned start, unsigned count)
-{
-   if (mode == PIPE_PRIM_LINE_LOOP) {
-      s->mode = PIPE_PRIM_LINE_STRIP;
-      s->close_first = 1;
-   } else {
-      s->mode = mode;
-      s->close_first = 0;
-   }
-   s->start = start;
-   s->p_start = start;
-   s->p_end = start + count;
-   s->edgeflag_off = 0;
-   s->repeat_first = 0;
-}
-
-static INLINE boolean
-u_split_prim_next(struct u_split_prim *s, unsigned max_verts)
-{
-   int repeat = 0;
-
-   if (s->repeat_first) {
-      s->emit(s->priv, s->start, 1);
-      max_verts--;
-      if (s->edgeflag_off) {
-         s->edge(s->priv, TRUE);
-         s->edgeflag_off = FALSE;
-      }
-   }
-
-   if (s->p_start + s->close_first + max_verts >= s->p_end) {
-      s->emit(s->priv, s->p_start, s->p_end - s->p_start);
-      if (s->close_first)
-         s->emit(s->priv, s->start, 1);
-      return TRUE;
-   }
-
-   switch (s->mode) {
-   case PIPE_PRIM_LINES:
-      max_verts &= ~1;
-      break;
-   case PIPE_PRIM_LINE_STRIP:
-      repeat = 1;
-      break;
-   case PIPE_PRIM_POLYGON:
-      max_verts--;
-      s->emit(s->priv, s->p_start, max_verts);
-      s->edge(s->priv, FALSE);
-      s->emit(s->priv, s->p_start + max_verts, 1);
-      s->p_start += max_verts;
-      s->repeat_first = TRUE;
-      s->edgeflag_off = TRUE;
-      return FALSE;
-   case PIPE_PRIM_TRIANGLES:
-      max_verts = max_verts - (max_verts % 3);
-      break;
-   case PIPE_PRIM_TRIANGLE_STRIP:
-      /* to ensure winding stays correct, always split
-       * on an even number of generated triangles
-       */
-      max_verts = max_verts & ~1;
-      repeat = 2;
-      break;
-   case PIPE_PRIM_TRIANGLE_FAN:
-      s->repeat_first = TRUE;
-      repeat = 1;
-      break;
-   case PIPE_PRIM_QUADS:
-      max_verts &= ~3;
-      break;
-   case PIPE_PRIM_QUAD_STRIP:
-      max_verts &= ~1;
-      repeat = 2;
-      break;
-   default:
-      break;
-   }
-
-   s->emit (s->priv, s->p_start, max_verts);
-   s->p_start += (max_verts - repeat);
-   return FALSE;
-}
-
 #endif