From fdfe06ad804ea13e6e436d66c1bcafe0bde2f545 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 15 Jan 2010 12:06:00 -0700 Subject: 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(-) (limited to 'src/gallium/drivers') diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 355c051837..f52dce65d7 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 407f752777..5081da29d1 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 fc0aef1376..a5fc34e54a 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 ae354b3870..018d254c76 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 7d4c310aae..feb012816c 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; -- cgit v1.2.3