From patchwork Wed Jun 1 07:02:54 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Eric Anholt X-Patchwork-Id: 841392 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter2.kernel.org (8.14.4/8.14.3) with ESMTP id p51IWL6G003853 for ; Wed, 1 Jun 2011 18:32:41 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 280779EAF3 for ; Wed, 1 Jun 2011 11:32:21 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from annarchy.freedesktop.org (annarchy.freedesktop.org [131.252.210.176]) by gabe.freedesktop.org (Postfix) with ESMTP id C21CB9E7C8; Wed, 1 Jun 2011 11:28:32 -0700 (PDT) Received: from pollan.anholt.net (annarchy.freedesktop.org [127.0.0.1]) by annarchy.freedesktop.org (Postfix) with ESMTP id AD98D13004E; Wed, 1 Jun 2011 11:28:32 -0700 (PDT) Received: by pollan.anholt.net (Postfix, from userid 1000) id 8A8654015EF; Wed, 1 Jun 2011 00:02:57 -0700 (PDT) From: Eric Anholt To: intel-gfx@lists.freedesktop.org Date: Wed, 1 Jun 2011 00:02:54 -0700 Message-Id: <1306911776-18301-2-git-send-email-eric@anholt.net> X-Mailer: git-send-email 1.7.5.1 In-Reply-To: <1306911776-18301-1-git-send-email-eric@anholt.net> References: <1306911776-18301-1-git-send-email-eric@anholt.net> MIME-Version: 1.0 Subject: [Intel-gfx] =?utf-8?q?=5BPATCH_1/3=5D_uxa=3A_Simplify_BLT_solid_a?= =?utf-8?q?cceleration_for_spans_filling_by_only_clipping_once=2E?= X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Wed, 01 Jun 2011 18:32:41 +0000 (UTC) X-MIME-Autoconverted: from base64 to 8bit by demeter2.kernel.org id p51IWL6G003853 We were clipping each span against the bounds of the clip, throwing out the span early if it was all clipped, and then walked the clip box clipping against each of the cliprects. We would expect spans to typically be clipped against one box, and not thrown out, so we were not saving any work there. For multiple cliprects, we were adding work. Only for many spans clipped entirely out of a complicated clip region would it have saved work, and it clearly didn't save bugs as evidenced by the many fix attempts here. --- uxa/uxa-accel.c | 65 +++++++++++++++++------------------------------------- 1 files changed, 21 insertions(+), 44 deletions(-) diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c index 0650ac2..31c37e8 100644 --- a/uxa/uxa-accel.c +++ b/uxa/uxa-accel.c @@ -1,3 +1,4 @@ + /* * Copyright ® 2001 Keith Packard * @@ -65,7 +66,7 @@ uxa_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int n, BoxPtr pextent, pbox; int nbox; int extentX1, extentX2, extentY1, extentY2; - int fullX1, fullX2, fullY1; + int x1, x2, y, fullX1, fullX2, fullY1; int partX1, partX2; int off_x, off_y; xRenderColor color; @@ -216,58 +217,34 @@ solid: pGC->fgPixel)) goto fallback; - pextent = REGION_EXTENTS(pGC->screen, pClip); - extentX1 = pextent->x1; - extentY1 = pextent->y1; - extentX2 = pextent->x2; - extentY2 = pextent->y2; while (n--) { - fullX1 = ppt->x; - fullY1 = ppt->y; - fullX2 = fullX1 + (int)*pwidth; + x1 = ppt->x; + y = ppt->y; + x2 = x1 + (int)*pwidth; ppt++; pwidth++; - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; + nbox = REGION_NUM_RECTS(pClip); + pbox = REGION_RECTS(pClip); + while (nbox--) { + if (pbox->y1 > y || pbox->y2 <= y) + continue; - if (fullX1 < extentX1) - fullX1 = extentX1; + if (x1 < pbox->x1) + x1 = pbox->x1; - if (fullX2 > extentX2) - fullX2 = extentX2; + if (x2 > pbox->x2) + x2 = pbox->x2; - if (fullX1 >= fullX2) - continue; + if (x2 <= x1) + continue; - nbox = REGION_NUM_RECTS(pClip); - if (nbox == 1) { (*uxa_screen->info->solid) (dst_pixmap, - fullX1 + off_x, - fullY1 + off_y, - fullX2 + off_x, - fullY1 + 1 + off_y); - } else { - pbox = REGION_RECTS(pClip); - while (nbox--) { - if (pbox->y1 <= fullY1 && fullY1 < pbox->y2) { - partX1 = pbox->x1; - if (partX1 < fullX1) - partX1 = fullX1; - partX2 = pbox->x2; - if (partX2 > fullX2) - partX2 = fullX2; - if (partX2 > partX1) { - (*uxa_screen->info-> - solid) (dst_pixmap, - partX1 + off_x, - fullY1 + off_y, - partX2 + off_x, - fullY1 + 1 + off_y); - } - } - pbox++; - } + x1 + off_x, + y + off_y, + x2 + off_x, + y + 1 + off_y); + pbox++; } } (*uxa_screen->info->done_solid) (dst_pixmap);