Merge remote branch 'origin/master' into nv50-compiler
[mesa.git] / src / gallium / drivers / llvmpipe / lp_state_rasterizer.c
index aa3b5a3f91ef1ce7971eccd40f166813109ba27f..0bad7320f3ef30699357849e54f26b8d57d24c1e 100644 (file)
 #include "util/u_memory.h"
 #include "lp_context.h"
 #include "lp_state.h"
+#include "lp_setup.h"
 #include "draw/draw_context.h"
 
 
 
-void *
+static void *
 llvmpipe_create_rasterizer_state(struct pipe_context *pipe,
                                  const struct pipe_rasterizer_state *rast)
 {
+   /* We do nothing special with rasterizer state.
+    * The CSO handle is just a pointer to a pipe_rasterizer_state object.
+    */
    return mem_dup(rast, sizeof(*rast));
 }
 
-void llvmpipe_bind_rasterizer_state(struct pipe_context *pipe,
-                                    void *rasterizer)
+
+
+static void
+llvmpipe_bind_rasterizer_state(struct pipe_context *pipe, void *handle)
 {
    struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
+   const struct pipe_rasterizer_state *rasterizer =
+      (const struct pipe_rasterizer_state *) handle;
 
    if (llvmpipe->rasterizer == rasterizer)
       return;
 
    /* pass-through to draw module */
-   draw_set_rasterizer_state(llvmpipe->draw, rasterizer);
+   draw_set_rasterizer_state(llvmpipe->draw, rasterizer, handle);
 
    llvmpipe->rasterizer = rasterizer;
 
+   /* Note: we can immediately set the triangle state here and
+    * not worry about binning because we handle culling during
+    * triangle setup, not when rasterizing the bins.
+    */
+   if (llvmpipe->rasterizer) {
+      lp_setup_set_triangle_state( llvmpipe->setup,
+                   llvmpipe->rasterizer->cull_face,
+                   llvmpipe->rasterizer->front_ccw,
+                   llvmpipe->rasterizer->scissor,
+                   llvmpipe->rasterizer->gl_rasterization_rules);
+      lp_setup_set_flatshade_first( llvmpipe->setup,
+                   llvmpipe->rasterizer->flatshade_first);
+      lp_setup_set_line_state( llvmpipe->setup,
+                   llvmpipe->rasterizer->line_width);
+      lp_setup_set_point_state( llvmpipe->setup,
+                   llvmpipe->rasterizer->point_size,
+                   llvmpipe->rasterizer->point_size_per_vertex,
+                   llvmpipe->rasterizer->sprite_coord_enable);
+       }
+
    llvmpipe->dirty |= LP_NEW_RASTERIZER;
 }
 
-void llvmpipe_delete_rasterizer_state(struct pipe_context *pipe,
-                                      void *rasterizer)
+
+static void
+llvmpipe_delete_rasterizer_state(struct pipe_context *pipe,
+                                 void *rasterizer)
 {
    FREE( rasterizer );
 }
 
 
+
+void
+llvmpipe_init_rasterizer_funcs(struct llvmpipe_context *llvmpipe)
+{
+   llvmpipe->pipe.create_rasterizer_state = llvmpipe_create_rasterizer_state;
+   llvmpipe->pipe.bind_rasterizer_state   = llvmpipe_bind_rasterizer_state;
+   llvmpipe->pipe.delete_rasterizer_state = llvmpipe_delete_rasterizer_state;
+}