make llvm draw paths compile with the latest changes
[mesa.git] / src / gallium / auxiliary / draw / draw_pt.c
index 895224c9527184d073ff17c8d13b21d1906bd015..9f8e8d3d62e9448578b6234b2f1fd7a89e6340f4 100644 (file)
@@ -44,7 +44,7 @@
  *     - pipeline -- the prim pipeline: clipping, wide lines, etc 
  *     - backend  -- the vbuf_render provided by the driver.
  */
-boolean
+static boolean
 draw_pt_arrays(struct draw_context *draw, 
                unsigned prim,
                unsigned start, 
@@ -54,10 +54,9 @@ draw_pt_arrays(struct draw_context *draw,
    struct draw_pt_middle_end *middle = NULL;
    unsigned opt = 0;
 
-   if (!draw->render)
-      return FALSE;
-   /*debug_printf("XXXXXXXXXX needs_pipeline = %d\n", pipeline);*/
-
+   if (!draw->render) {
+      opt |= PT_PIPELINE;
+   }
 
    if (draw_need_pipeline(draw, prim)) {
       opt |= PT_PIPELINE;
@@ -69,24 +68,18 @@ draw_pt_arrays(struct draw_context *draw,
 
    if (!draw->rasterizer->bypass_vs) {
       opt |= PT_SHADE;
-
-      if (!draw->use_pt_shaders)
-        return FALSE;
    }
 
+   if (opt)
+      middle = draw->pt.middle.general;
+   else
+      middle = draw->pt.middle.fetch_emit;
 
-   if (draw->pt.middle.opt[opt] == NULL) {
-      opt = PT_PIPELINE | PT_CLIPTEST | PT_SHADE;
-   }
-
-   middle = draw->pt.middle.opt[opt];
-   assert(middle);
 
    /* May create a short-circuited version of this for small primitives:
     */
    frontend = draw->pt.front.vcache;
 
-
    frontend->prepare( frontend, prim, middle, opt );
 
    frontend->run( frontend,
@@ -106,15 +99,12 @@ boolean draw_pt_init( struct draw_context *draw )
    if (!draw->pt.front.vcache)
       return FALSE;
 
-   draw->pt.middle.opt[0] = draw_pt_fetch_emit( draw );
-   draw->pt.middle.opt[PT_PIPELINE] = draw_pt_fetch_pipeline( draw );
-//   draw->pt.middle.opt[PT_SHADE] = draw_pt_shade_emit( draw );
-//   draw->pt.middle.opt[PT_SHADE | PT_PIPELINE] = draw_pt_shade_pipeline( draw );
-//   draw->pt.middle.opt[PT_SHADE | PT_CLIPTEST] = draw_pt_shade_clip_either( draw );
-   draw->pt.middle.opt[PT_SHADE | PT_CLIPTEST | PT_PIPELINE] = 
-      draw_pt_fetch_pipeline_or_emit( draw );
+   draw->pt.middle.fetch_emit = draw_pt_fetch_emit( draw );
+   if (!draw->pt.middle.fetch_emit)
+      return FALSE;
 
-   if (!draw->pt.middle.opt[PT_SHADE | PT_CLIPTEST | PT_PIPELINE])
+   draw->pt.middle.general = draw_pt_fetch_pipeline_or_emit( draw );
+   if (!draw->pt.middle.general)
       return FALSE;
 
    return TRUE;
@@ -123,16 +113,63 @@ boolean draw_pt_init( struct draw_context *draw )
 
 void draw_pt_destroy( struct draw_context *draw )
 {
-   int i;
+   if (draw->pt.middle.general) {
+      draw->pt.middle.general->destroy( draw->pt.middle.general );
+      draw->pt.middle.general = NULL;
+   }
 
-   for (i = 0; i < PT_MAX_MIDDLE; i++)
-      if (draw->pt.middle.opt[i]) {
-        draw->pt.middle.opt[i]->destroy( draw->pt.middle.opt[i] );
-        draw->pt.middle.opt[i] = NULL;
-      }
+   if (draw->pt.middle.fetch_emit) {
+      draw->pt.middle.fetch_emit->destroy( draw->pt.middle.fetch_emit );
+      draw->pt.middle.fetch_emit = NULL;
+   }
 
    if (draw->pt.front.vcache) {
       draw->pt.front.vcache->destroy( draw->pt.front.vcache );
       draw->pt.front.vcache = NULL;
    }
 }
+
+
+
+static unsigned reduced_prim[PIPE_PRIM_POLYGON + 1] = {
+   PIPE_PRIM_POINTS,
+   PIPE_PRIM_LINES,
+   PIPE_PRIM_LINES,
+   PIPE_PRIM_LINES,
+   PIPE_PRIM_TRIANGLES,
+   PIPE_PRIM_TRIANGLES,
+   PIPE_PRIM_TRIANGLES,
+   PIPE_PRIM_TRIANGLES,
+   PIPE_PRIM_TRIANGLES,
+   PIPE_PRIM_TRIANGLES
+};
+
+
+/**
+ * Draw vertex arrays
+ * This is the main entrypoint into the drawing module.
+ * \param prim  one of PIPE_PRIM_x
+ * \param start  index of first vertex to draw
+ * \param count  number of vertices to draw
+ */
+void
+draw_arrays(struct draw_context *draw, unsigned prim,
+            unsigned start, unsigned count)
+{
+   if (reduced_prim[prim] != draw->reduced_prim) {
+      draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
+      draw->reduced_prim = reduced_prim[prim];
+   }
+
+   /* drawing done here: */
+   draw_pt_arrays(draw, prim, start, count);
+}
+
+boolean draw_pt_get_edgeflag( struct draw_context *draw,
+                              unsigned idx )
+{
+   if (draw->pt.user.edgeflag)
+      return (draw->pt.user.edgeflag[idx/32] & (1 << (idx%32))) != 0;
+   else
+      return 1;
+}