diff options
| -rw-r--r-- | src/gallium/drivers/nv30/Makefile | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/nv30/nv30_context.h | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/nv30/nv30_state_scissor.c | 35 | 
3 files changed, 39 insertions, 0 deletions
| diff --git a/src/gallium/drivers/nv30/Makefile b/src/gallium/drivers/nv30/Makefile index c5208fabf5..134130c0e0 100644 --- a/src/gallium/drivers/nv30/Makefile +++ b/src/gallium/drivers/nv30/Makefile @@ -17,6 +17,7 @@ DRIVER_SOURCES = \  	nv30_state_emit.c \  	nv30_state_fb.c \  	nv30_state_rasterizer.c \ +	nv30_state_scissor.c \  	nv30_surface.c \  	nv30_vbo.c \  	nv30_vertprog.c diff --git a/src/gallium/drivers/nv30/nv30_context.h b/src/gallium/drivers/nv30/nv30_context.h index 43ee8d13a0..428f17ae0d 100644 --- a/src/gallium/drivers/nv30/nv30_context.h +++ b/src/gallium/drivers/nv30/nv30_context.h @@ -90,6 +90,8 @@ struct nv30_blend_state_new {  struct nv30_state { +	unsigned scissor_enabled; +  	struct nouveau_stateobj *hw[NV30_STATE_MAX];  }; @@ -104,6 +106,7 @@ struct nv30_context {  	/* HW state derived from pipe states */  	struct nv30_state state; +	struct pipe_scissor_state scissor;  	uint32_t dirty; 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 +	} +}; | 
