diff options
| author | Brian Paul <brianp@vmware.com> | 2011-09-21 12:06:17 -0600 |
|---|---|---|
| committer | Brian Paul <brianp@vmware.com> | 2011-09-22 08:26:40 -0600 |
| commit | 4465efc3bf8d755a9afb7a4bb5382e2f5bf113e1 (patch) | |
| tree | 4856a584350aec274e60838251195983b2dee6f4 /src/gallium/auxiliary/draw/draw_pt_post_vs.c | |
| parent | a5c0fb51c6b1d5f7e6ea8f089da921719ad1b6c4 (diff) | |
| download | external_mesa3d-4465efc3bf8d755a9afb7a4bb5382e2f5bf113e1.tar.gz external_mesa3d-4465efc3bf8d755a9afb7a4bb5382e2f5bf113e1.tar.bz2 external_mesa3d-4465efc3bf8d755a9afb7a4bb5382e2f5bf113e1.zip | |
draw: add support for guard-band clipping
Diffstat (limited to 'src/gallium/auxiliary/draw/draw_pt_post_vs.c')
| -rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_post_vs.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pt_post_vs.c b/src/gallium/auxiliary/draw/draw_pt_post_vs.c index 769409cfd6..a8d65fd5d7 100644 --- a/src/gallium/auxiliary/draw/draw_pt_post_vs.c +++ b/src/gallium/auxiliary/draw/draw_pt_post_vs.c @@ -39,6 +39,7 @@ #define DO_CLIP_USER 0x8 #define DO_VIEWPORT 0x10 #define DO_EDGEFLAG 0x20 +#define DO_CLIP_XY_GUARD_BAND 0x40 struct pt_post_vs { @@ -80,6 +81,10 @@ dot4(const float *a, const float *b) #define TAG(x) x##_xy_halfz_viewport #include "draw_cliptest_tmp.h" +#define FLAGS (DO_CLIP_XY_GUARD_BAND | DO_CLIP_HALF_Z | DO_VIEWPORT) +#define TAG(x) x##_xy_gb_halfz_viewport +#include "draw_cliptest_tmp.h" + #define FLAGS (DO_CLIP_FULL_Z | DO_VIEWPORT) #define TAG(x) x##_fullz_viewport #include "draw_cliptest_tmp.h" @@ -120,15 +125,33 @@ void draw_pt_post_vs_prepare( struct pt_post_vs *pvs, boolean clip_xy, boolean clip_z, boolean clip_user, + boolean guard_band, boolean bypass_viewport, boolean opengl, boolean need_edgeflags ) { pvs->flags = 0; - if (clip_xy) + /* This combination not currently tested/in use: + */ + if (opengl) + guard_band = FALSE; + + if (clip_xy && !guard_band) { pvs->flags |= DO_CLIP_XY; - + ASSIGN_4V( pvs->draw->plane[0], -1, 0, 0, 1 ); + ASSIGN_4V( pvs->draw->plane[1], 1, 0, 0, 1 ); + ASSIGN_4V( pvs->draw->plane[2], 0, -1, 0, 1 ); + ASSIGN_4V( pvs->draw->plane[3], 0, 1, 0, 1 ); + } + else if (clip_xy && guard_band) { + pvs->flags |= DO_CLIP_XY_GUARD_BAND; + ASSIGN_4V( pvs->draw->plane[0], -0.5, 0, 0, 1 ); + ASSIGN_4V( pvs->draw->plane[1], 0.5, 0, 0, 1 ); + ASSIGN_4V( pvs->draw->plane[2], 0, -0.5, 0, 1 ); + ASSIGN_4V( pvs->draw->plane[3], 0, 0.5, 0, 1 ); + } + if (clip_z && opengl) { pvs->flags |= DO_CLIP_FULL_Z; ASSIGN_4V( pvs->draw->plane[4], 0, 0, 1, 1 ); @@ -163,6 +186,10 @@ void draw_pt_post_vs_prepare( struct pt_post_vs *pvs, pvs->run = do_cliptest_xy_halfz_viewport; break; + case DO_CLIP_XY_GUARD_BAND | DO_CLIP_HALF_Z | DO_VIEWPORT: + pvs->run = do_cliptest_xy_gb_halfz_viewport; + break; + case DO_CLIP_FULL_Z | DO_VIEWPORT: pvs->run = do_cliptest_fullz_viewport; break; |
