summaryrefslogtreecommitdiff
path: root/x11/modular-xorg-server/patches/patch-aj
blob: 7fdc464e31a111969a799579775b503883fca2e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
$NetBSD: patch-aj,v 1.3 2009/03/14 11:00:22 apb Exp $

Changes from NetBSD xsrc/external/mit/xorg-server/dist/\
hw/xfree86/xaa/xaaFillRect.c

----------------------------
revision 1.2
date: 2009/02/19 20:02:02;  author: macallan;  state: Exp;  lines: +104 -0
Actually use scanline image writes to upload images if available
----------------------------

--- hw/xfree86/xaa/xaaFillRect.c.orig	2008-06-06 12:03:10.000000000 +0200
+++ hw/xfree86/xaa/xaaFillRect.c
@@ -779,6 +779,110 @@ XAAFillCacheExpandRects(
     with reading past the edge of the pattern otherwise */
 
 static void
+WriteColumnScanlines(
+    ScrnInfoPtr pScrn,
+    unsigned char *pSrc,
+    int x, int y, int w, int h,
+    int xoff, int yoff,
+    int pHeight,
+    int srcwidth,
+    int Bpp
+) {
+    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
+    unsigned char *src;
+    int skipleft, bytes, line, sline;
+    int buffer;
+
+    pSrc += (Bpp * xoff);
+   
+    if((skipleft = (long)pSrc & 0x03L)) {
+        if(Bpp == 3)
+           skipleft = 4 - skipleft;
+        else
+           skipleft /= Bpp;
+
+        x -= skipleft;       
+        w += skipleft;
+        
+        if(Bpp == 3)
+           pSrc -= 3 * skipleft;  
+        else   /* is this Alpha friendly ? */
+           pSrc = (unsigned char*)((long)pSrc & ~0x03L);     
+    }
+
+    src = pSrc + (yoff * srcwidth);
+
+    bytes = w * Bpp;
+
+    (*infoRec->SubsequentScanlineImageWriteRect)(pScrn, x, y, w, h, skipleft);
+
+    buffer = 0;
+    sline = yoff;
+    for (line = 0; line < h; line++) {
+       memcpy(infoRec->ScanlineImageWriteBuffers[buffer], src, bytes);
+       (*infoRec->SubsequentImageWriteScanline)(pScrn, buffer);
+       buffer++;
+       src += srcwidth;
+       sline++;
+       if (sline >= pHeight) {
+           sline = 0;
+	   src = pSrc;
+       }
+       if (buffer >= infoRec->NumScanlineImageWriteBuffers)
+           buffer = 0;
+    }
+}
+
+void 
+XAAFillScanlineImageWriteRects(
+    ScrnInfoPtr pScrn,
+    int rop,
+    unsigned int planemask,
+    int nBox,
+    BoxPtr pBox,
+    int xorg, int yorg,
+    PixmapPtr pPix
+){
+    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
+    int x, phaseY, phaseX, height, width, blit_w;
+    int pHeight = pPix->drawable.height;
+    int pWidth = pPix->drawable.width;
+    int Bpp = pPix->drawable.bitsPerPixel >> 3;
+    int srcwidth = pPix->devKind;
+
+    (*infoRec->SetupForScanlineImageWrite)(pScrn, rop, planemask, -1,
+               pPix->drawable.bitsPerPixel, pPix->drawable.depth);
+
+    while(nBox--) {
+       x = pBox->x1;
+       phaseY = (pBox->y1 - yorg) % pHeight;
+       if(phaseY < 0) phaseY += pHeight;
+       phaseX = (x - xorg) % pWidth;
+       if(phaseX < 0) phaseX += pWidth;
+       height = pBox->y2 - pBox->y1;
+       width = pBox->x2 - x;
+       
+       while(1) {
+           blit_w = pWidth - phaseX;
+           if(blit_w > width) blit_w = width;
+
+           WriteColumnScanlines(pScrn, pPix->devPrivate.ptr, x, pBox->y1, 
+               blit_w, height, phaseX, phaseY, pHeight, srcwidth, Bpp);
+
+           width -= blit_w;
+           if(!width) break;
+           x += blit_w;
+           phaseX = (phaseX + blit_w) % pWidth;
+       }
+       pBox++;
+    }
+
+    if(infoRec->ScanlineImageWriteFlags & SYNC_AFTER_IMAGE_WRITE)
+        (*infoRec->Sync)(pScrn);
+    else SET_SYNC_FLAG(infoRec);
+}
+
+static void
 WriteColumn(
     ScrnInfoPtr pScrn,
     unsigned char *pSrc,