mesa/st: recognize no-op scissor state when checking clear_with_quads
authorKeith Whitwell <keithw@vmware.com>
Tue, 28 Jul 2009 17:45:22 +0000 (18:45 +0100)
committerKeith Whitwell <keithw@vmware.com>
Wed, 29 Jul 2009 11:48:04 +0000 (12:48 +0100)
Some apps enable scissor but set the rectangle to the dimensions of
the window.  Don't let this force us onto a slower clear path.

src/mesa/state_tracker/st_cb_clear.c

index 668acbccb88525d4c8ffc297cd0e88bb6a426792..8a8c99f7e171e5ee1368e8c6991a26aa964949ca 100644 (file)
@@ -280,7 +280,11 @@ clear_with_quad(GLcontext *ctx,
 static INLINE GLboolean
 check_clear_color_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
 {
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    if (!ctx->Color.ColorMask[0] ||
@@ -300,7 +304,11 @@ check_clear_depth_stencil_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
    GLboolean maskStencil
       = (ctx->Stencil.WriteMask[0] & stencilMax) != stencilMax;
 
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    if (maskStencil)
@@ -319,7 +327,11 @@ check_clear_depth_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
    const struct st_renderbuffer *strb = st_renderbuffer(rb);
    const GLboolean isDS = pf_is_depth_and_stencil(strb->surface->format);
 
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    if (isDS && 
@@ -345,7 +357,11 @@ check_clear_stencil_with_quad(GLcontext *ctx, struct gl_renderbuffer *rb)
    if (maskStencil) 
       return TRUE;
 
-   if (ctx->Scissor.Enabled)
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
       return TRUE;
 
    /* This is correct, but it is necessary to look at the depth clear