nv40: respect rasterizer cso bypass_clipping flag
authorBen Skeggs <skeggsb@gmail.com>
Mon, 24 Mar 2008 02:41:40 +0000 (13:41 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Mon, 24 Mar 2008 02:41:40 +0000 (13:41 +1100)
src/gallium/drivers/nv40/nv40_context.h
src/gallium/drivers/nv40/nv40_state_viewport.c

index 02ca20b8014c192dd5b2e2d8cf28d5c6c12f8b83..b50f6f8fefcd8025d60d750e9814a198757414b5 100644 (file)
@@ -97,6 +97,7 @@ struct nv40_blend_state {
 struct nv40_state {
        unsigned scissor_enabled;
        unsigned stipple_enabled;
+       unsigned viewport_bypass;
        unsigned fp_samplers;
 
        uint64_t dirty;
index 9e5c7a72a7f069fad72f993307636e1e11248b21..1b6248e5b8e0c07740194acc0bb5b2606d885749 100644 (file)
@@ -5,8 +5,20 @@ nv40_state_viewport_validate(struct nv40_context *nv40)
 {
        struct nouveau_stateobj *so = so_new(11, 0);
        struct pipe_viewport_state *vpt = &nv40->viewport;
+       unsigned bypass;
 
-       if (nv40->render_mode == HW) {
+       if (nv40->render_mode == HW && !nv40->rasterizer->pipe.bypass_clipping)
+               bypass = 0;
+       else
+               bypass = 1;
+
+       if (nv40->state.hw[NV40_STATE_VIEWPORT] &&
+           (bypass || !(nv40->dirty & NV40_NEW_VIEWPORT)) &&
+           nv40->state.viewport_bypass == bypass)
+               return FALSE;
+       nv40->state.viewport_bypass = bypass;
+
+       if (!bypass) {
                so_method(so, nv40->screen->curie,
                          NV40TCL_VIEWPORT_TRANSLATE_X, 8);
                so_data  (so, fui(vpt->translate[0]));
@@ -48,7 +60,7 @@ nv40_state_viewport_validate(struct nv40_context *nv40)
 struct nv40_state_entry nv40_state_viewport = {
        .validate = nv40_state_viewport_validate,
        .dirty = {
-               .pipe = NV40_NEW_VIEWPORT,
+               .pipe = NV40_NEW_VIEWPORT | NV40_NEW_RAST,
                .hw = NV40_STATE_VIEWPORT
        }
 };