First import
[xorg_rtime.git] / xorg-server-1.4 / hw / kdrive / src / kasync.c
blobcc751112ca1c5590d08af0bfe8a8c004ef001cad
1 /*
2 * Copyright © 1999 Keith Packard
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Keith Packard makes no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
23 #ifdef HAVE_CONFIG_H
24 #include <kdrive-config.h>
25 #endif
26 #include "kdrive.h"
27 #include "kaa.h"
28 #include "picturestr.h"
29 #include "mipict.h"
30 #include "fbpict.h"
33 * These functions wrap the low-level fb rendering functions and
34 * synchronize framebuffer/accelerated drawing by stalling until
35 * the accelerator is idle
38 void
39 KdCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
40 DDXPointPtr ppt, int *pwidth, int fSorted)
42 kaaWaitSync (pDrawable->pScreen);
43 kaaDrawableDirty (pDrawable);
44 fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted);
47 void
48 KdCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
49 DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
51 kaaWaitSync (pDrawable->pScreen);
52 kaaDrawableDirty (pDrawable);
53 fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
56 void
57 KdCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
58 int x, int y, int w, int h, int leftPad, int format,
59 char *bits)
61 kaaWaitSync (pDrawable->pScreen);
62 kaaDrawableDirty (pDrawable);
63 fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
66 RegionPtr
67 KdCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
68 int srcx, int srcy, int w, int h, int dstx, int dsty)
70 kaaWaitSync (pSrc->pScreen);
71 kaaDrawableDirty (pDst);
72 return fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
75 RegionPtr
76 KdCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
77 int srcx, int srcy, int w, int h, int dstx, int dsty,
78 unsigned long bitPlane)
80 kaaWaitSync (pSrc->pScreen);
81 kaaDrawableDirty (pDst);
82 return fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
83 bitPlane);
86 void
87 KdCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
88 DDXPointPtr pptInit)
90 kaaWaitSync (pDrawable->pScreen);
91 kaaDrawableDirty (pDrawable);
92 fbPolyPoint (pDrawable, pGC, mode, npt, pptInit);
95 void
96 KdCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
97 int mode, int npt, DDXPointPtr ppt)
100 if (pGC->lineWidth == 0) {
101 kaaWaitSync(pDrawable->pScreen);
102 kaaDrawableDirty (pDrawable);
104 kaaDrawableDirty (pDrawable);
105 fbPolyLine (pDrawable, pGC, mode, npt, ppt);
108 void
109 KdCheckPolySegment (DrawablePtr pDrawable, GCPtr pGC,
110 int nsegInit, xSegment *pSegInit)
112 if (pGC->lineWidth == 0) {
113 kaaWaitSync(pDrawable->pScreen);
114 kaaDrawableDirty (pDrawable);
116 kaaDrawableDirty (pDrawable);
117 fbPolySegment (pDrawable, pGC, nsegInit, pSegInit);
120 void
121 KdCheckPolyRectangle (DrawablePtr pDrawable, GCPtr pGC,
122 int nrects, xRectangle *prect)
124 if (pGC->lineWidth == 0) {
125 kaaWaitSync(pDrawable->pScreen);
126 kaaDrawableDirty (pDrawable);
128 fbPolyRectangle (pDrawable, pGC, nrects, prect);
131 void
132 KdCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
133 int narcs, xArc *pArcs)
135 if (pGC->lineWidth == 0)
137 kaaWaitSync(pDrawable->pScreen);
138 kaaDrawableDirty (pDrawable);
139 fbPolyArc (pDrawable, pGC, narcs, pArcs);
141 else
142 miPolyArc (pDrawable, pGC, narcs, pArcs);
145 #if 0
146 void
147 KdCheckFillPolygon (DrawablePtr pDrawable, GCPtr pGC,
148 int shape, int mode, int count, DDXPointPtr pPts)
150 kaaWaitSync(pDrawable->pScreen);
151 kaaDrawableDirty (pDrawable);
152 fbFillPolygon (pDrawable, pGC, mode, count, pPts);
154 #endif
156 void
157 KdCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
158 int nrect, xRectangle *prect)
160 kaaWaitSync(pDrawable->pScreen);
161 kaaDrawableDirty (pDrawable);
162 fbPolyFillRect (pDrawable, pGC, nrect, prect);
165 void
166 KdCheckPolyFillArc (DrawablePtr pDrawable, GCPtr pGC,
167 int narcs, xArc *pArcs)
169 kaaWaitSync(pDrawable->pScreen);
170 kaaDrawableDirty (pDrawable);
171 fbPolyFillArc (pDrawable, pGC, narcs, pArcs);
174 void
175 KdCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
176 int x, int y, unsigned int nglyph,
177 CharInfoPtr *ppci, pointer pglyphBase)
179 kaaWaitSync(pDrawable->pScreen);
180 kaaDrawableDirty (pDrawable);
181 fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
184 void
185 KdCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
186 int x, int y, unsigned int nglyph,
187 CharInfoPtr *ppci, pointer pglyphBase)
189 kaaWaitSync(pDrawable->pScreen);
190 kaaDrawableDirty (pDrawable);
191 fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
194 void
195 KdCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
196 DrawablePtr pDrawable,
197 int w, int h, int x, int y)
199 kaaWaitSync(pDrawable->pScreen);
200 kaaDrawableDirty (pDrawable);
201 fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
204 void
205 KdCheckGetImage (DrawablePtr pDrawable,
206 int x, int y, int w, int h,
207 unsigned int format, unsigned long planeMask,
208 char *d)
210 kaaWaitSync(pDrawable->pScreen);
211 fbGetImage (pDrawable, x, y, w, h, format, planeMask, d);
214 void
215 KdCheckGetSpans (DrawablePtr pDrawable,
216 int wMax,
217 DDXPointPtr ppt,
218 int *pwidth,
219 int nspans,
220 char *pdstStart)
222 kaaWaitSync(pDrawable->pScreen);
223 fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
226 void
227 KdCheckSaveAreas (PixmapPtr pPixmap,
228 RegionPtr prgnSave,
229 int xorg,
230 int yorg,
231 WindowPtr pWin)
233 kaaWaitSync(pWin->drawable.pScreen);
234 kaaDrawableDirty (&pPixmap->drawable);
235 fbSaveAreas (pPixmap, prgnSave, xorg, yorg, pWin);
238 void
239 KdCheckRestoreAreas (PixmapPtr pPixmap,
240 RegionPtr prgnSave,
241 int xorg,
242 int yorg,
243 WindowPtr pWin)
245 kaaWaitSync(pWin->drawable.pScreen);
246 kaaDrawableDirty ((DrawablePtr)pWin);
247 fbRestoreAreas (pPixmap, prgnSave, xorg, yorg, pWin);
250 void
251 KdCheckPaintWindow (WindowPtr pWin, RegionPtr pRegion, int what)
253 kaaWaitSync (pWin->drawable.pScreen);
254 kaaDrawableDirty ((DrawablePtr)pWin);
255 fbPaintWindow (pWin, pRegion, what);
258 void
259 KdCheckCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
261 kaaWaitSync (pWin->drawable.pScreen);
262 kaaDrawableDirty ((DrawablePtr)pWin);
263 fbCopyWindow (pWin, ptOldOrg, prgnSrc);
266 #if KD_MAX_FB > 1
267 void
268 KdCheckPaintKey(DrawablePtr pDrawable,
269 RegionPtr pRegion,
270 CARD32 pixel,
271 int layer)
273 kaaWaitSync (pDrawable->pScreen);
274 kaaDrawableDirty (pDrawable);
275 fbOverlayPaintKey (pDrawable, pRegion, pixel, layer);
278 void
279 KdCheckOverlayCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
281 kaaWaitSync (pWin->drawable.pScreen);
282 kaaDrawableDirty ((DrawablePtr)pWin);
283 fbOverlayCopyWindow (pWin, ptOldOrg, prgnSrc);
285 #endif
287 void
288 KdScreenInitAsync (ScreenPtr pScreen)
290 pScreen->GetImage = KdCheckGetImage;
291 pScreen->GetSpans = KdCheckGetSpans;
292 pScreen->PaintWindowBackground = KdCheckPaintWindow;
293 pScreen->PaintWindowBorder = KdCheckPaintWindow;
294 pScreen->CopyWindow = KdCheckCopyWindow;
296 pScreen->BackingStoreFuncs.SaveAreas = KdCheckSaveAreas;
297 pScreen->BackingStoreFuncs.RestoreAreas = KdCheckRestoreAreas;
298 #ifdef RENDER
299 KdPictureInitAsync (pScreen);
300 #endif
303 void
304 KdCheckComposite (CARD8 op,
305 PicturePtr pSrc,
306 PicturePtr pMask,
307 PicturePtr pDst,
308 INT16 xSrc,
309 INT16 ySrc,
310 INT16 xMask,
311 INT16 yMask,
312 INT16 xDst,
313 INT16 yDst,
314 CARD16 width,
315 CARD16 height)
317 kaaWaitSync (pDst->pDrawable->pScreen);
318 kaaDrawableDirty (pDst->pDrawable);
319 fbComposite (op,
320 pSrc,
321 pMask,
322 pDst,
323 xSrc,
324 ySrc,
325 xMask,
326 yMask,
327 xDst,
328 yDst,
329 width,
330 height);
333 void
334 KdCheckRasterizeTrapezoid(PicturePtr pMask,
335 xTrapezoid *trap,
336 int x_off,
337 int y_off)
339 kaaWaitSync (pMask->pDrawable->pScreen);
340 kaaDrawableDirty (pMask->pDrawable);
341 fbRasterizeTrapezoid (pMask, trap, x_off, y_off);
345 * Only need to stall for copyarea/copyplane
347 const GCOps kdAsyncPixmapGCOps = {
348 fbFillSpans,
349 fbSetSpans,
350 fbPutImage,
351 KdCheckCopyArea,
352 KdCheckCopyPlane,
353 fbPolyPoint,
354 fbPolyLine,
355 fbPolySegment,
356 fbPolyRectangle,
357 fbPolyArc,
358 fbFillPolygon,
359 fbPolyFillRect,
360 fbPolyFillArc,
361 miPolyText8,
362 miPolyText16,
363 miImageText8,
364 miImageText16,
365 fbImageGlyphBlt,
366 fbPolyGlyphBlt,
367 fbPushPixels
370 void
371 KdPictureInitAsync (ScreenPtr pScreen)
373 PictureScreenPtr ps;
375 ps = GetPictureScreen(pScreen);
376 ps->Composite = KdCheckComposite;
377 ps->RasterizeTrapezoid = KdCheckRasterizeTrapezoid;