mesa: avoid redundant viewport changes in meta code
authorBrian Paul <brianp@vmware.com>
Thu, 27 Aug 2009 20:47:24 +0000 (14:47 -0600)
committerBrian Paul <brianp@vmware.com>
Sun, 30 Aug 2009 15:10:36 +0000 (09:10 -0600)
src/mesa/drivers/common/meta.c

index e42beabc9ba0fce900cc1c60d950e1e297a2d703..f086112ec5590f2543bd302f1a6771753d714bf1 100644 (file)
@@ -432,13 +432,23 @@ _mesa_meta_begin(GLcontext *ctx, GLbitfield state)
    }
 
    if (state & META_VIEWPORT) {
+      /* save viewport state */
       save->ViewportX = ctx->Viewport.X;
       save->ViewportY = ctx->Viewport.Y;
       save->ViewportW = ctx->Viewport.Width;
       save->ViewportH = ctx->Viewport.Height;
-      _mesa_Viewport(0, 0, ctx->DrawBuffer->Width, ctx->DrawBuffer->Height);
+      /* set viewport to match window size */
+      if (ctx->Viewport.X != 0 ||
+          ctx->Viewport.Y != 0 ||
+          ctx->Viewport.Width != ctx->DrawBuffer->Width ||
+          ctx->Viewport.Height != ctx->DrawBuffer->Height) {
+         _mesa_set_viewport(ctx, 0, 0,
+                            ctx->DrawBuffer->Width, ctx->DrawBuffer->Height);
+      }
+      /* save depth range state */
       save->DepthNear = ctx->Viewport.Near;
       save->DepthFar = ctx->Viewport.Far;
+      /* set depth range to default */
       _mesa_DepthRange(0.0, 1.0);
    }
 
@@ -642,8 +652,13 @@ _mesa_meta_end(GLcontext *ctx)
    }
 
    if (state & META_VIEWPORT) {
-      _mesa_Viewport(save->ViewportX, save->ViewportY,
-                     save->ViewportW, save->ViewportH);
+      if (save->ViewportX != ctx->Viewport.X ||
+          save->ViewportY != ctx->Viewport.Y ||
+          save->ViewportW != ctx->Viewport.Width ||
+          save->ViewportH != ctx->Viewport.Height) {
+         _mesa_set_viewport(ctx, save->ViewportX, save->ViewportY,
+                            save->ViewportW, save->ViewportH);
+      }
       _mesa_DepthRange(save->DepthNear, save->DepthFar);
    }