gallium/draw: use correct rasterization state for wide/AA points/lines
[mesa.git] / src / gallium / drivers / llvmpipe / lp_state_rasterizer.c
index aa3b5a3f91ef1ce7971eccd40f166813109ba27f..8592da0d9d9faaa59276319b4fa91ba6759008d4 100644 (file)
@@ -29,6 +29,7 @@
 #include "util/u_memory.h"
 #include "lp_context.h"
 #include "lp_state.h"
+#include "lp_setup.h"
 #include "draw/draw_context.h"
 
 
@@ -37,25 +38,44 @@ 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)
+
+
+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_mode,
+                   llvmpipe->rasterizer->front_winding == PIPE_WINDING_CCW,
+                   llvmpipe->rasterizer->scissor);
+   }
+
    llvmpipe->dirty |= LP_NEW_RASTERIZER;
 }
 
+
 void llvmpipe_delete_rasterizer_state(struct pipe_context *pipe,
                                       void *rasterizer)
 {