1fa225cbcSrjs/*
2fa225cbcSrjs *
3fa225cbcSrjs * Copyright � 1999 Keith Packard
4fa225cbcSrjs *
5fa225cbcSrjs * Permission to use, copy, modify, distribute, and sell this software and its
6fa225cbcSrjs * documentation for any purpose is hereby granted without fee, provided that
7fa225cbcSrjs * the above copyright notice appear in all copies and that both that
8fa225cbcSrjs * copyright notice and this permission notice appear in supporting
9fa225cbcSrjs * documentation, and that the name of Keith Packard not be used in
10fa225cbcSrjs * advertising or publicity pertaining to distribution of the software without
11fa225cbcSrjs * specific, written prior permission.  Keith Packard makes no
12fa225cbcSrjs * representations about the suitability of this software for any purpose.  It
13fa225cbcSrjs * is provided "as is" without express or implied warranty.
14fa225cbcSrjs *
15fa225cbcSrjs * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16fa225cbcSrjs * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17fa225cbcSrjs * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18fa225cbcSrjs * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19fa225cbcSrjs * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20fa225cbcSrjs * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21fa225cbcSrjs * PERFORMANCE OF THIS SOFTWARE.
22fa225cbcSrjs */
23fa225cbcSrjs
24fa225cbcSrjs#include "uxa-priv.h"
25fa225cbcSrjs
26fa225cbcSrjs#ifdef RENDER
27fa225cbcSrjs#include "mipict.h"
28fa225cbcSrjs#endif
29fa225cbcSrjs
30fa225cbcSrjs/*
31fa225cbcSrjs * These functions wrap the low-level fb rendering functions and
32fa225cbcSrjs * synchronize framebuffer/accelerated drawing by stalling until
33fa225cbcSrjs * the accelerator is idle
34fa225cbcSrjs */
35fa225cbcSrjs
36fa225cbcSrjs/**
37fa225cbcSrjs * Calls uxa_prepare_access with UXA_PREPARE_SRC for the tile, if that is the
38fa225cbcSrjs * current fill style.
39fa225cbcSrjs *
40fa225cbcSrjs * Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are
41fa225cbcSrjs * 1bpp and never in fb, so we don't worry about them.
42fa225cbcSrjs * We should worry about them for completeness sake and going forward.
43fa225cbcSrjs */
44fa225cbcSrjsBool
45fa225cbcSrjsuxa_prepare_access_gc(GCPtr pGC)
46fa225cbcSrjs{
47fa225cbcSrjs    if (pGC->stipple)
48fa225cbcSrjs        if (!uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RO))
49fa225cbcSrjs	    return FALSE;
50fa225cbcSrjs    if (pGC->fillStyle == FillTiled)
51fa225cbcSrjs	if (!uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RO)) {
52fa225cbcSrjs	    if (pGC->stipple)
53fa225cbcSrjs		uxa_finish_access(&pGC->stipple->drawable);
54fa225cbcSrjs	    return FALSE;
55fa225cbcSrjs	}
56fa225cbcSrjs    return TRUE;
57fa225cbcSrjs}
58fa225cbcSrjs
59fa225cbcSrjs/**
60fa225cbcSrjs * Finishes access to the tile in the GC, if used.
61fa225cbcSrjs */
62fa225cbcSrjsvoid
63fa225cbcSrjsuxa_finish_access_gc(GCPtr pGC)
64fa225cbcSrjs{
65fa225cbcSrjs    if (pGC->fillStyle == FillTiled)
66fa225cbcSrjs	uxa_finish_access(&pGC->tile.pixmap->drawable);
67fa225cbcSrjs    if (pGC->stipple)
68fa225cbcSrjs        uxa_finish_access(&pGC->stipple->drawable);
69fa225cbcSrjs}
70fa225cbcSrjs
71fa225cbcSrjschar
72fa225cbcSrjsuxa_drawable_location(DrawablePtr pDrawable)
73fa225cbcSrjs{
74fa225cbcSrjs    return uxa_drawable_is_offscreen(pDrawable) ? 's' : 'm';
75fa225cbcSrjs}
76fa225cbcSrjs
77fa225cbcSrjsvoid
78fa225cbcSrjsuxa_check_fill_spans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
79fa225cbcSrjs		   DDXPointPtr ppt, int *pwidth, int fSorted)
80fa225cbcSrjs{
81fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
82fa225cbcSrjs
83fa225cbcSrjs    UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
84fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
85fa225cbcSrjs	if (uxa_prepare_access_gc (pGC)) {
86fa225cbcSrjs	    fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted);
87fa225cbcSrjs	    uxa_finish_access_gc (pGC);
88fa225cbcSrjs	}
89fa225cbcSrjs	uxa_finish_access (pDrawable);
90fa225cbcSrjs    }
91fa225cbcSrjs}
92fa225cbcSrjs
93fa225cbcSrjsvoid
94fa225cbcSrjsuxa_check_set_spans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
95fa225cbcSrjs		 DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
96fa225cbcSrjs{
97fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
98fa225cbcSrjs
99fa225cbcSrjs    UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
100fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
101fa225cbcSrjs	fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
102fa225cbcSrjs	uxa_finish_access (pDrawable);
103fa225cbcSrjs    }
104fa225cbcSrjs}
105fa225cbcSrjs
106fa225cbcSrjsvoid
107fa225cbcSrjsuxa_check_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth,
108fa225cbcSrjs		 int x, int y, int w, int h, int leftPad, int format,
109fa225cbcSrjs		 char *bits)
110fa225cbcSrjs{
111fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
112fa225cbcSrjs
113fa225cbcSrjs    UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
114fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
115fa225cbcSrjs	fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
116fa225cbcSrjs	uxa_finish_access (pDrawable);
117fa225cbcSrjs    }
118fa225cbcSrjs}
119fa225cbcSrjs
120fa225cbcSrjsRegionPtr
121fa225cbcSrjsuxa_check_copy_area (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
122fa225cbcSrjs		     int srcx, int srcy, int w, int h, int dstx, int dsty)
123fa225cbcSrjs{
124fa225cbcSrjs    ScreenPtr screen = pSrc->pScreen;
125fa225cbcSrjs    RegionPtr ret = NULL;
126fa225cbcSrjs
127fa225cbcSrjs    UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
128fa225cbcSrjs		  uxa_drawable_location(pSrc), uxa_drawable_location(pDst)));
129fa225cbcSrjs    if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) {
130fa225cbcSrjs	if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) {
131fa225cbcSrjs	    ret = fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
132fa225cbcSrjs	    uxa_finish_access (pSrc);
133fa225cbcSrjs	}
134fa225cbcSrjs	uxa_finish_access (pDst);
135fa225cbcSrjs    }
136fa225cbcSrjs    return ret;
137fa225cbcSrjs}
138fa225cbcSrjs
139fa225cbcSrjsRegionPtr
140fa225cbcSrjsuxa_check_copy_plane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
141fa225cbcSrjs		  int srcx, int srcy, int w, int h, int dstx, int dsty,
142fa225cbcSrjs		  unsigned long bitPlane)
143fa225cbcSrjs{
144fa225cbcSrjs    ScreenPtr screen = pSrc->pScreen;
145fa225cbcSrjs    RegionPtr ret = NULL;
146fa225cbcSrjs
147fa225cbcSrjs    UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
148fa225cbcSrjs		  uxa_drawable_location(pSrc), uxa_drawable_location(pDst)));
149fa225cbcSrjs    if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) {
150fa225cbcSrjs	if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) {
151fa225cbcSrjs	    ret = fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
152fa225cbcSrjs			       bitPlane);
153fa225cbcSrjs	    uxa_finish_access (pSrc);
154fa225cbcSrjs	}
155fa225cbcSrjs	uxa_finish_access (pDst);
156fa225cbcSrjs    }
157fa225cbcSrjs    return ret;
158fa225cbcSrjs}
159fa225cbcSrjs
160fa225cbcSrjsvoid
161fa225cbcSrjsuxa_check_poly_point (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
162fa225cbcSrjs		  DDXPointPtr pptInit)
163fa225cbcSrjs{
164fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
165fa225cbcSrjs
166fa225cbcSrjs    UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
167fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
168fa225cbcSrjs	fbPolyPoint (pDrawable, pGC, mode, npt, pptInit);
169fa225cbcSrjs	uxa_finish_access (pDrawable);
170fa225cbcSrjs    }
171fa225cbcSrjs}
172fa225cbcSrjs
173fa225cbcSrjsvoid
174fa225cbcSrjsuxa_check_poly_lines (DrawablePtr pDrawable, GCPtr pGC,
175fa225cbcSrjs		  int mode, int npt, DDXPointPtr ppt)
176fa225cbcSrjs{
177fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
178fa225cbcSrjs
179fa225cbcSrjs    UXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n",
180fa225cbcSrjs		  pDrawable, uxa_drawable_location(pDrawable),
181fa225cbcSrjs		  pGC->lineWidth, mode, npt));
182fa225cbcSrjs
183fa225cbcSrjs    if (pGC->lineWidth == 0) {
184fa225cbcSrjs	if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
185fa225cbcSrjs	    if (uxa_prepare_access_gc (pGC)) {
186fa225cbcSrjs		fbPolyLine (pDrawable, pGC, mode, npt, ppt);
187fa225cbcSrjs		uxa_finish_access_gc (pGC);
188fa225cbcSrjs	    }
189fa225cbcSrjs	    uxa_finish_access (pDrawable);
190fa225cbcSrjs	}
191fa225cbcSrjs	return;
192fa225cbcSrjs    }
193fa225cbcSrjs    /* fb calls mi functions in the lineWidth != 0 case. */
194fa225cbcSrjs    fbPolyLine (pDrawable, pGC, mode, npt, ppt);
195fa225cbcSrjs}
196fa225cbcSrjs
197fa225cbcSrjsvoid
198fa225cbcSrjsuxa_check_poly_segment (DrawablePtr pDrawable, GCPtr pGC,
199fa225cbcSrjs		    int nsegInit, xSegment *pSegInit)
200fa225cbcSrjs{
201fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
202fa225cbcSrjs
203fa225cbcSrjs    UXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable,
204fa225cbcSrjs		  uxa_drawable_location(pDrawable), pGC->lineWidth, nsegInit));
205fa225cbcSrjs    if (pGC->lineWidth == 0) {
206fa225cbcSrjs	if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
207fa225cbcSrjs	    if (uxa_prepare_access_gc (pGC)) {
208fa225cbcSrjs		fbPolySegment (pDrawable, pGC, nsegInit, pSegInit);
209fa225cbcSrjs		uxa_finish_access_gc (pGC);
210fa225cbcSrjs	    }
211fa225cbcSrjs	    uxa_finish_access (pDrawable);
212fa225cbcSrjs	}
213fa225cbcSrjs	return;
214fa225cbcSrjs    }
215fa225cbcSrjs    /* fb calls mi functions in the lineWidth != 0 case. */
216fa225cbcSrjs    fbPolySegment (pDrawable, pGC, nsegInit, pSegInit);
217fa225cbcSrjs}
218fa225cbcSrjs
219fa225cbcSrjsvoid
220fa225cbcSrjsuxa_check_poly_arc (DrawablePtr pDrawable, GCPtr pGC,
221fa225cbcSrjs		int narcs, xArc *pArcs)
222fa225cbcSrjs{
223fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
224fa225cbcSrjs
225fa225cbcSrjs    UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
226fa225cbcSrjs
227fa225cbcSrjs    /* Disable this as fbPolyArc can call miZeroPolyArc which in turn
228fa225cbcSrjs     * can call accelerated functions, that as yet, haven't been notified
229fa225cbcSrjs     * with uxa_finish_access().
230fa225cbcSrjs     */
231fa225cbcSrjs#if 0
232fa225cbcSrjs    if (pGC->lineWidth == 0)
233fa225cbcSrjs    {
234fa225cbcSrjs	if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
235fa225cbcSrjs	    if (uxa_prepare_access_gc (pGC)) {
236fa225cbcSrjs		fbPolyArc (pDrawable, pGC, narcs, pArcs);
237fa225cbcSrjs		uxa_finish_access_gc (pGC);
238fa225cbcSrjs	    }
239fa225cbcSrjs	    uxa_finish_access (pDrawable);
240fa225cbcSrjs	}
241fa225cbcSrjs	return;
242fa225cbcSrjs    }
243fa225cbcSrjs#endif
244fa225cbcSrjs    miPolyArc (pDrawable, pGC, narcs, pArcs);
245fa225cbcSrjs}
246fa225cbcSrjs
247fa225cbcSrjsvoid
248fa225cbcSrjsuxa_check_poly_fill_rect (DrawablePtr pDrawable, GCPtr pGC,
249fa225cbcSrjs		     int nrect, xRectangle *prect)
250fa225cbcSrjs{
251fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
252fa225cbcSrjs
253fa225cbcSrjs    UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
254fa225cbcSrjs
255fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
256fa225cbcSrjs	if (uxa_prepare_access_gc (pGC)) {
257fa225cbcSrjs	    fbPolyFillRect (pDrawable, pGC, nrect, prect);
258fa225cbcSrjs	    uxa_finish_access_gc (pGC);
259fa225cbcSrjs	}
260fa225cbcSrjs	uxa_finish_access (pDrawable);
261fa225cbcSrjs    }
262fa225cbcSrjs}
263fa225cbcSrjs
264fa225cbcSrjsvoid
265fa225cbcSrjsuxa_check_image_glyph_blt (DrawablePtr pDrawable, GCPtr pGC,
266fa225cbcSrjs		      int x, int y, unsigned int nglyph,
267fa225cbcSrjs		      CharInfoPtr *ppci, pointer pglyphBase)
268fa225cbcSrjs{
269fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
270fa225cbcSrjs
271fa225cbcSrjs    UXA_FALLBACK(("to %p (%c)\n", pDrawable,
272fa225cbcSrjs		  uxa_drawable_location(pDrawable)));
273fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
274fa225cbcSrjs	if (uxa_prepare_access_gc (pGC)) {
275fa225cbcSrjs	    fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
276fa225cbcSrjs	    uxa_finish_access_gc (pGC);
277fa225cbcSrjs	}
278fa225cbcSrjs	uxa_finish_access (pDrawable);
279fa225cbcSrjs    }
280fa225cbcSrjs}
281fa225cbcSrjs
282fa225cbcSrjsvoid
283fa225cbcSrjsuxa_check_poly_glyph_blt (DrawablePtr pDrawable, GCPtr pGC,
284fa225cbcSrjs		     int x, int y, unsigned int nglyph,
285fa225cbcSrjs		     CharInfoPtr *ppci, pointer pglyphBase)
286fa225cbcSrjs{
287fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
288fa225cbcSrjs
289fa225cbcSrjs    UXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable,
290fa225cbcSrjs		  uxa_drawable_location(pDrawable), pGC->fillStyle, pGC->alu));
291fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
292fa225cbcSrjs	if (uxa_prepare_access_gc (pGC)) {
293fa225cbcSrjs	    fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
294fa225cbcSrjs	    uxa_finish_access_gc (pGC);
295fa225cbcSrjs	}
296fa225cbcSrjs	uxa_finish_access (pDrawable);
297fa225cbcSrjs    }
298fa225cbcSrjs}
299fa225cbcSrjs
300fa225cbcSrjsvoid
301fa225cbcSrjsuxa_check_push_pixels (GCPtr pGC, PixmapPtr pBitmap,
302fa225cbcSrjs		   DrawablePtr pDrawable,
303fa225cbcSrjs		   int w, int h, int x, int y)
304fa225cbcSrjs{
305fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
306fa225cbcSrjs
307fa225cbcSrjs    UXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable,
308fa225cbcSrjs		  uxa_drawable_location(&pBitmap->drawable),
309fa225cbcSrjs		  uxa_drawable_location(pDrawable)));
310fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) {
311fa225cbcSrjs	if (uxa_prepare_access (&pBitmap->drawable, UXA_ACCESS_RO)) {
312fa225cbcSrjs	    if (uxa_prepare_access_gc (pGC)) {
313fa225cbcSrjs		fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y);
314fa225cbcSrjs		uxa_finish_access_gc (pGC);
315fa225cbcSrjs	    }
316fa225cbcSrjs	    uxa_finish_access (&pBitmap->drawable);
317fa225cbcSrjs	}
318fa225cbcSrjs	uxa_finish_access (pDrawable);
319fa225cbcSrjs    }
320fa225cbcSrjs}
321fa225cbcSrjs
322fa225cbcSrjsvoid
323fa225cbcSrjsuxa_check_get_spans (DrawablePtr pDrawable,
324fa225cbcSrjs		 int wMax,
325fa225cbcSrjs		 DDXPointPtr ppt,
326fa225cbcSrjs		 int *pwidth,
327fa225cbcSrjs		 int nspans,
328fa225cbcSrjs		 char *pdstStart)
329fa225cbcSrjs{
330fa225cbcSrjs    ScreenPtr screen = pDrawable->pScreen;
331fa225cbcSrjs
332fa225cbcSrjs    UXA_FALLBACK(("from %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable)));
333fa225cbcSrjs    if (uxa_prepare_access (pDrawable, UXA_ACCESS_RO)) {
334fa225cbcSrjs	fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
335fa225cbcSrjs	uxa_finish_access (pDrawable);
336fa225cbcSrjs    }
337fa225cbcSrjs}
338fa225cbcSrjs
339fa225cbcSrjsvoid
340fa225cbcSrjsuxa_check_composite (CARD8      op,
341fa225cbcSrjs                   PicturePtr pSrc,
342fa225cbcSrjs                   PicturePtr pMask,
343fa225cbcSrjs                   PicturePtr pDst,
344fa225cbcSrjs                   INT16      xSrc,
345fa225cbcSrjs                   INT16      ySrc,
346fa225cbcSrjs                   INT16      xMask,
347fa225cbcSrjs                   INT16      yMask,
348fa225cbcSrjs                   INT16      xDst,
349fa225cbcSrjs                   INT16      yDst,
350fa225cbcSrjs                   CARD16     width,
351fa225cbcSrjs                   CARD16     height)
352fa225cbcSrjs{
353fa225cbcSrjs    ScreenPtr screen = pDst->pDrawable->pScreen;
354fa225cbcSrjs
355fa225cbcSrjs    UXA_FALLBACK(("from picts %p/%p to pict %p\n",
356fa225cbcSrjs		 pSrc, pMask, pDst));
357fa225cbcSrjs
358fa225cbcSrjs    if (uxa_prepare_access (pDst->pDrawable, UXA_ACCESS_RW))
359fa225cbcSrjs    {
360fa225cbcSrjs	if (pSrc->pDrawable == NULL ||
361fa225cbcSrjs	    uxa_prepare_access (pSrc->pDrawable, UXA_ACCESS_RO))
362fa225cbcSrjs	{
363fa225cbcSrjs	    if (!pMask || pMask->pDrawable == NULL ||
364fa225cbcSrjs		uxa_prepare_access (pMask->pDrawable, UXA_ACCESS_RO))
365fa225cbcSrjs	    {
366fa225cbcSrjs		fbComposite (op,
367fa225cbcSrjs			     pSrc,
368fa225cbcSrjs			     pMask,
369fa225cbcSrjs			     pDst,
370fa225cbcSrjs			     xSrc,
371fa225cbcSrjs			     ySrc,
372fa225cbcSrjs			     xMask,
373fa225cbcSrjs			     yMask,
374fa225cbcSrjs			     xDst,
375fa225cbcSrjs			     yDst,
376fa225cbcSrjs			     width,
377fa225cbcSrjs			     height);
378fa225cbcSrjs		if (pMask && pMask->pDrawable != NULL)
379fa225cbcSrjs		    uxa_finish_access (pMask->pDrawable);
380fa225cbcSrjs	    }
381fa225cbcSrjs	    if (pSrc->pDrawable != NULL)
382fa225cbcSrjs		uxa_finish_access (pSrc->pDrawable);
383fa225cbcSrjs	}
384fa225cbcSrjs	uxa_finish_access (pDst->pDrawable);
385fa225cbcSrjs    }
386fa225cbcSrjs}
387fa225cbcSrjs
388fa225cbcSrjsvoid
389fa225cbcSrjsuxa_check_add_traps (PicturePtr	pPicture,
390fa225cbcSrjs		  INT16		x_off,
391fa225cbcSrjs		  INT16		y_off,
392fa225cbcSrjs		  int		ntrap,
393fa225cbcSrjs		  xTrap		*traps)
394fa225cbcSrjs{
395fa225cbcSrjs    ScreenPtr screen = pPicture->pDrawable->pScreen;
396fa225cbcSrjs
397fa225cbcSrjs    UXA_FALLBACK(("to pict %p (%c)\n", pPicture,
398fa225cbcSrjs		  uxa_drawable_location(pPicture->pDrawable)));
399fa225cbcSrjs    if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) {
400fa225cbcSrjs	fbAddTraps (pPicture, x_off, y_off, ntrap, traps);
401fa225cbcSrjs	uxa_finish_access(pPicture->pDrawable);
402fa225cbcSrjs    }
403fa225cbcSrjs}
404fa225cbcSrjs
405fa225cbcSrjs/**
406fa225cbcSrjs * Gets the 0,0 pixel of a pixmap.  Used for doing solid fills of tiled pixmaps
407fa225cbcSrjs * that happen to be 1x1.  Pixmap must be at least 8bpp.
408fa225cbcSrjs *
409fa225cbcSrjs * XXX This really belongs in fb, so it can be aware of tiling and etc.
410fa225cbcSrjs */
411fa225cbcSrjsCARD32
412fa225cbcSrjsuxa_get_pixmap_first_pixel (PixmapPtr pPixmap)
413fa225cbcSrjs{
414fa225cbcSrjs    CARD32 pixel;
415fa225cbcSrjs    void *fb;
416fa225cbcSrjs
417fa225cbcSrjs    if (!uxa_prepare_access (&pPixmap->drawable, UXA_ACCESS_RO))
418fa225cbcSrjs	return 0;
419fa225cbcSrjs
420fa225cbcSrjs    fb = pPixmap->devPrivate.ptr;
421fa225cbcSrjs
422fa225cbcSrjs    switch (pPixmap->drawable.bitsPerPixel) {
423fa225cbcSrjs    case 32:
424fa225cbcSrjs	pixel = *(CARD32 *)fb;
425fa225cbcSrjs	break;
426fa225cbcSrjs    case 16:
427fa225cbcSrjs	pixel = *(CARD16 *)fb;
428fa225cbcSrjs	break;
429fa225cbcSrjs    default:
430fa225cbcSrjs	pixel = *(CARD8 *)fb;
431fa225cbcSrjs	break;
432fa225cbcSrjs    }
433fa225cbcSrjs    uxa_finish_access(&pPixmap->drawable);
434fa225cbcSrjs
435fa225cbcSrjs    return pixel;
436fa225cbcSrjs}
437