nv30: add state scissor, based on nv40 one
authorPatrice Mandin <pmandin@caramail.com>
Mon, 23 Jun 2008 18:43:22 +0000 (20:43 +0200)
committerPatrice Mandin <pmandin@caramail.com>
Mon, 23 Jun 2008 18:43:22 +0000 (20:43 +0200)
src/gallium/drivers/nv30/Makefile
src/gallium/drivers/nv30/nv30_context.h
src/gallium/drivers/nv30/nv30_state_scissor.c [new file with mode: 0644]

index c5208fabf5ed3d53c02d80dcd4cfa77c4dda2dd4..134130c0e00fcd420c15c3c1c9661a400bc3862b 100644 (file)
@@ -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
index 43ee8d13a0c7529a8d739a061e1eb1d0615e2ec3..428f17ae0d684488841cab5331dc2b43589d464f 100644 (file)
@@ -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 (file)
index 0000000..1db9bc1
--- /dev/null
@@ -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
+       }
+};