diff options
author | Patrice Mandin <pmandin@caramail.com> | 2008-06-23 20:43:22 +0200 |
---|---|---|
committer | Patrice Mandin <pmandin@caramail.com> | 2008-06-23 20:43:22 +0200 |
commit | e5bbb18441f34824dc4f9f857b30c71c4ff6466f (patch) | |
tree | 04286bf00f873c474dcbd23077a089878ef85bc4 /src/gallium/drivers/nv30/nv30_state_scissor.c | |
parent | 8b72737a0ba33343673111261265c59546b408c6 (diff) |
nv30: add state scissor, based on nv40 one
Diffstat (limited to 'src/gallium/drivers/nv30/nv30_state_scissor.c')
-rw-r--r-- | src/gallium/drivers/nv30/nv30_state_scissor.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/gallium/drivers/nv30/nv30_state_scissor.c b/src/gallium/drivers/nv30/nv30_state_scissor.c new file mode 100644 index 0000000000..1db9bc1795 --- /dev/null +++ b/src/gallium/drivers/nv30/nv30_state_scissor.c @@ -0,0 +1,35 @@ +#include "nv30_context.h" + +static boolean +nv30_state_scissor_validate(struct nv30_context *nv30) +{ + struct pipe_rasterizer_state *rast = &nv30->rasterizer->pipe; + struct pipe_scissor_state *s = &nv30->scissor; + struct nouveau_stateobj *so; + + if (nv30->state.hw[NV30_STATE_SCISSOR] && + (rast->scissor == 0 && nv30->state.scissor_enabled == 0)) + return FALSE; + nv30->state.scissor_enabled = rast->scissor; + + so = so_new(3, 0); + so_method(so, nv30->screen->rankine, NV34TCL_SCISSOR_HORIZ, 2); + if (nv30->state.scissor_enabled) { + so_data (so, ((s->maxx - s->minx) << 16) | s->minx); + so_data (so, ((s->maxy - s->miny) << 16) | s->miny); + } else { + so_data (so, 4096 << 16); + so_data (so, 4096 << 16); + } + + so_ref(so, &nv30->state.hw[NV30_STATE_SCISSOR]); + return TRUE; +} + +struct nv30_state_entry nv30_state_scissor = { + .validate = nv30_state_scissor_validate, + .dirty = { + .pipe = NV30_NEW_SCISSOR | NV30_NEW_RAST, + .hw = NV30_STATE_SCISSOR + } +}; |