Mesa (lp-binning): llvmpipe: implement scissor test in triangle setup

Brian Paul brianp at kemper.freedesktop.org
Fri Jan 15 19:06:47 UTC 2010


Module: Mesa
Branch: lp-binning
Commit: fdfe06ad804ea13e6e436d66c1bcafe0bde2f545
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fdfe06ad804ea13e6e436d66c1bcafe0bde2f545

Author: Brian Paul <brianp at vmware.com>
Date:   Fri Jan 15 12:06:00 2010 -0700

llvmpipe: implement scissor test in triangle setup

---

 src/gallium/drivers/llvmpipe/lp_setup.c            |    4 +++-
 src/gallium/drivers/llvmpipe/lp_setup.h            |    3 ++-
 src/gallium/drivers/llvmpipe/lp_setup_context.h    |    1 +
 src/gallium/drivers/llvmpipe/lp_setup_tri.c        |    7 +++++++
 src/gallium/drivers/llvmpipe/lp_state_rasterizer.c |    3 ++-
 5 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index 355c051..f52dce6 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -339,13 +339,15 @@ lp_setup_fence( struct setup_context *setup )
 void 
 lp_setup_set_triangle_state( struct setup_context *setup,
                              unsigned cull_mode,
-                             boolean ccw_is_frontface)
+                             boolean ccw_is_frontface,
+                             boolean scissor )
 {
    LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
 
    setup->ccw_is_frontface = ccw_is_frontface;
    setup->cullmode = cull_mode;
    setup->triangle = first_triangle;
+   setup->scissor_test = scissor;
 }
 
 
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.h b/src/gallium/drivers/llvmpipe/lp_setup.h
index 407f752..5081da2 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.h
+++ b/src/gallium/drivers/llvmpipe/lp_setup.h
@@ -88,7 +88,8 @@ lp_setup_bind_framebuffer( struct setup_context *setup,
 void 
 lp_setup_set_triangle_state( struct setup_context *setup,
                              unsigned cullmode,
-                             boolean front_is_ccw );
+                             boolean front_is_ccw,
+                             boolean scissor );
 
 void
 lp_setup_set_fs_inputs( struct setup_context *setup,
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h
index fc0aef1..a5fc34e 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_context.h
+++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h
@@ -87,6 +87,7 @@ struct setup_context
 
    boolean flatshade_first;
    boolean ccw_is_frontface;
+   boolean scissor_test;
    unsigned cullmode;
 
    struct pipe_framebuffer_state fb;
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
index ae354b3..018d254 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
@@ -293,6 +293,13 @@ do_triangle_ccw(struct setup_context *setup,
    miny = (MIN3(y1, y2, y3) + (FIXED_ONE-1)) >> FIXED_ORDER;
    maxy = (MAX3(y1, y2, y3) + (FIXED_ONE-1)) >> FIXED_ORDER;
    
+   if (setup->scissor_test) {
+      minx = MAX2(minx, setup->scissor.current.minx);
+      maxx = MIN2(maxx, setup->scissor.current.maxx);
+      miny = MAX2(miny, setup->scissor.current.miny);
+      maxy = MIN2(maxy, setup->scissor.current.maxy);
+   }
+
    if (miny == maxy || 
        minx == maxx) {
       lp_scene_putback_data( scene, sizeof *tri );
diff --git a/src/gallium/drivers/llvmpipe/lp_state_rasterizer.c b/src/gallium/drivers/llvmpipe/lp_state_rasterizer.c
index 7d4c310..feb0128 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_rasterizer.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_rasterizer.c
@@ -61,7 +61,8 @@ void llvmpipe_bind_rasterizer_state(struct pipe_context *pipe,
    if (llvmpipe->rasterizer) {
       lp_setup_set_triangle_state( llvmpipe->setup,
                    llvmpipe->rasterizer->cull_mode,
-                   llvmpipe->rasterizer->front_winding == PIPE_WINDING_CCW );
+                   llvmpipe->rasterizer->front_winding == PIPE_WINDING_CCW,
+                   llvmpipe->rasterizer->scissor);
    }
 
    llvmpipe->dirty |= LP_NEW_RASTERIZER;




More information about the mesa-commit mailing list