nv30: add state stipple, based on nv40 one
authorPatrice Mandin <pmandin@caramail.com>
Mon, 23 Jun 2008 19:13:27 +0000 (21:13 +0200)
committerPatrice Mandin <pmandin@caramail.com>
Mon, 23 Jun 2008 19:13:27 +0000 (21:13 +0200)
src/gallium/drivers/nv30/Makefile
src/gallium/drivers/nv30/nv30_context.h
src/gallium/drivers/nv30/nv30_state_stipple.c [new file with mode: 0644]

index 134130c0e00fcd420c15c3c1c9661a400bc3862b..91601087a347177c65f36370224c0f6d08d73183 100644 (file)
@@ -18,6 +18,7 @@ DRIVER_SOURCES = \
        nv30_state_fb.c \
        nv30_state_rasterizer.c \
        nv30_state_scissor.c \
+       nv30_state_stipple.c \
        nv30_surface.c \
        nv30_vbo.c \
        nv30_vertprog.c
index 428f17ae0d684488841cab5331dc2b43589d464f..446e43a726d3e29f2859a7207e3ed937344c3fa4 100644 (file)
@@ -91,6 +91,7 @@ struct nv30_blend_state_new {
 
 struct nv30_state {
        unsigned scissor_enabled;
+       unsigned stipple_enabled;
 
        struct nouveau_stateobj *hw[NV30_STATE_MAX];
 };
@@ -121,6 +122,7 @@ struct nv30_context {
        struct pipe_blend_color blend_colour;
        struct pipe_framebuffer_state framebuffer;
        struct nv30_rasterizer_state_new *rasterizer;
+       unsigned stipple[32];
 
        uint32_t rt_enable;
        struct pipe_buffer *rt[2];
diff --git a/src/gallium/drivers/nv30/nv30_state_stipple.c b/src/gallium/drivers/nv30/nv30_state_stipple.c
new file mode 100644 (file)
index 0000000..41b4281
--- /dev/null
@@ -0,0 +1,39 @@
+#include "nv30_context.h"
+
+static boolean
+nv30_state_stipple_validate(struct nv30_context *nv30)
+{
+       struct pipe_rasterizer_state *rast = &nv30->rasterizer->pipe;
+       struct nouveau_grobj *rankine = nv30->screen->rankine;
+       struct nouveau_stateobj *so;
+
+       if (nv30->state.hw[NV30_STATE_STIPPLE] &&
+          (rast->poly_stipple_enable == 0 && nv30->state.stipple_enabled == 0))
+               return FALSE;
+
+       if (rast->poly_stipple_enable) {
+               unsigned i;
+
+               so = so_new(35, 0);
+               so_method(so, rankine, NV34TCL_POLYGON_STIPPLE_ENABLE, 1);
+               so_data  (so, 1);
+               so_method(so, rankine, NV34TCL_POLYGON_STIPPLE_PATTERN(0), 32);
+               for (i = 0; i < 32; i++)
+                       so_data(so, nv30->stipple[i]);
+       } else {
+               so = so_new(2, 0);
+               so_method(so, rankine, NV34TCL_POLYGON_STIPPLE_ENABLE, 1);
+               so_data  (so, 0);
+       }
+
+       so_ref(so, &nv30->state.hw[NV30_STATE_STIPPLE]);
+       return TRUE;
+}
+
+struct nv30_state_entry nv30_state_stipple = {
+       .validate = nv30_state_stipple_validate,
+       .dirty = {
+               .pipe = NV30_NEW_STIPPLE | NV30_NEW_RAST,
+               .hw = NV30_STATE_STIPPLE,
+       }
+};