1428d7b3dSmrg/*
2428d7b3dSmrg *
3428d7b3dSmrg * Copyright � 1999 Keith Packard
4428d7b3dSmrg *
5428d7b3dSmrg * Permission to use, copy, modify, distribute, and sell this software and its
6428d7b3dSmrg * documentation for any purpose is hereby granted without fee, provided that
7428d7b3dSmrg * the above copyright notice appear in all copies and that both that
8428d7b3dSmrg * copyright notice and this permission notice appear in supporting
9428d7b3dSmrg * documentation, and that the name of Keith Packard not be used in
10428d7b3dSmrg * advertising or publicity pertaining to distribution of the software without
11428d7b3dSmrg * specific, written prior permission.  Keith Packard makes no
12428d7b3dSmrg * representations about the suitability of this software for any purpose.  It
13428d7b3dSmrg * is provided "as is" without express or implied warranty.
14428d7b3dSmrg *
15428d7b3dSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16428d7b3dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17428d7b3dSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18428d7b3dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19428d7b3dSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20428d7b3dSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21428d7b3dSmrg * PERFORMANCE OF THIS SOFTWARE.
22428d7b3dSmrg */
23428d7b3dSmrg
24428d7b3dSmrg#include "uxa-priv.h"
25428d7b3dSmrg
26428d7b3dSmrg/*
27428d7b3dSmrg * These functions wrap the low-level fb rendering functions and
28428d7b3dSmrg * synchronize framebuffer/accelerated drawing by stalling until
29428d7b3dSmrg * the accelerator is idle
30428d7b3dSmrg */
31428d7b3dSmrg
32428d7b3dSmrg/**
33428d7b3dSmrg * Calls uxa_prepare_access with UXA_PREPARE_SRC for the tile, if that is the
34428d7b3dSmrg * current fill style.
35428d7b3dSmrg *
36428d7b3dSmrg * Solid doesn't use an extra pixmap source, and Stippled/OpaqueStippled are
37428d7b3dSmrg * 1bpp and never in fb, so we don't worry about them.
38428d7b3dSmrg * We should worry about them for completeness sake and going forward.
39428d7b3dSmrg */
40428d7b3dSmrgBool uxa_prepare_access_gc(GCPtr pGC)
41428d7b3dSmrg{
42428d7b3dSmrg	if (pGC->stipple)
43428d7b3dSmrg		if (!uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RO))
44428d7b3dSmrg			return FALSE;
45428d7b3dSmrg	if (pGC->fillStyle == FillTiled)
46428d7b3dSmrg		if (!uxa_prepare_access
47428d7b3dSmrg		    (&pGC->tile.pixmap->drawable, UXA_ACCESS_RO)) {
48428d7b3dSmrg			if (pGC->stipple)
49428d7b3dSmrg				uxa_finish_access(&pGC->stipple->drawable, UXA_ACCESS_RO);
50428d7b3dSmrg			return FALSE;
51428d7b3dSmrg		}
52428d7b3dSmrg	return TRUE;
53428d7b3dSmrg}
54428d7b3dSmrg
55428d7b3dSmrg/**
56428d7b3dSmrg * Finishes access to the tile in the GC, if used.
57428d7b3dSmrg */
58428d7b3dSmrgvoid uxa_finish_access_gc(GCPtr pGC)
59428d7b3dSmrg{
60428d7b3dSmrg	if (pGC->fillStyle == FillTiled)
61428d7b3dSmrg		uxa_finish_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RO);
62428d7b3dSmrg	if (pGC->stipple)
63428d7b3dSmrg		uxa_finish_access(&pGC->stipple->drawable, UXA_ACCESS_RO);
64428d7b3dSmrg}
65428d7b3dSmrg
66428d7b3dSmrgBool uxa_picture_prepare_access(PicturePtr picture, int mode)
67428d7b3dSmrg{
68428d7b3dSmrg	if (picture->pDrawable == NULL)
69428d7b3dSmrg		return TRUE;
70428d7b3dSmrg
71428d7b3dSmrg	if (!uxa_prepare_access(picture->pDrawable, mode))
72428d7b3dSmrg		return FALSE;
73428d7b3dSmrg
74428d7b3dSmrg	if (picture->alphaMap &&
75428d7b3dSmrg	    !uxa_prepare_access(picture->alphaMap->pDrawable, mode)) {
76428d7b3dSmrg		uxa_finish_access(picture->pDrawable, mode);
77428d7b3dSmrg		return FALSE;
78428d7b3dSmrg	}
79428d7b3dSmrg
80428d7b3dSmrg	return TRUE;
81428d7b3dSmrg}
82428d7b3dSmrg
83428d7b3dSmrgvoid uxa_picture_finish_access(PicturePtr picture, int mode)
84428d7b3dSmrg{
85428d7b3dSmrg	if (picture->pDrawable == NULL)
86428d7b3dSmrg		return;
87428d7b3dSmrg
88428d7b3dSmrg	uxa_finish_access(picture->pDrawable, mode);
89428d7b3dSmrg	if (picture->alphaMap)
90428d7b3dSmrg		uxa_finish_access(picture->alphaMap->pDrawable, mode);
91428d7b3dSmrg}
92428d7b3dSmrg
93428d7b3dSmrg
94428d7b3dSmrgchar uxa_drawable_location(DrawablePtr pDrawable)
95428d7b3dSmrg{
96428d7b3dSmrg	return uxa_drawable_is_offscreen(pDrawable) ? 's' : 'm';
97428d7b3dSmrg}
98428d7b3dSmrg
99428d7b3dSmrgvoid
100428d7b3dSmrguxa_check_fill_spans(DrawablePtr pDrawable, GCPtr pGC, int nspans,
101428d7b3dSmrg		     DDXPointPtr ppt, int *pwidth, int fSorted)
102428d7b3dSmrg{
103428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
104428d7b3dSmrg
105428d7b3dSmrg	UXA_FALLBACK(("to %p (%c)\n", pDrawable,
106428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
107428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
108428d7b3dSmrg		if (uxa_prepare_access_gc(pGC)) {
109428d7b3dSmrg			fbFillSpans(pDrawable, pGC, nspans, ppt, pwidth,
110428d7b3dSmrg				    fSorted);
111428d7b3dSmrg			uxa_finish_access_gc(pGC);
112428d7b3dSmrg		}
113428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
114428d7b3dSmrg	}
115428d7b3dSmrg}
116428d7b3dSmrg
117428d7b3dSmrgvoid
118428d7b3dSmrguxa_check_set_spans(DrawablePtr pDrawable, GCPtr pGC, char *psrc,
119428d7b3dSmrg		    DDXPointPtr ppt, int *pwidth, int nspans, int fSorted)
120428d7b3dSmrg{
121428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
122428d7b3dSmrg
123428d7b3dSmrg	UXA_FALLBACK(("to %p (%c)\n", pDrawable,
124428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
125428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
126428d7b3dSmrg		fbSetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted);
127428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
128428d7b3dSmrg	}
129428d7b3dSmrg}
130428d7b3dSmrg
131428d7b3dSmrgvoid
132428d7b3dSmrguxa_check_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth,
133428d7b3dSmrg		    int x, int y, int w, int h, int leftPad, int format,
134428d7b3dSmrg		    char *bits)
135428d7b3dSmrg{
136428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
137428d7b3dSmrg
138428d7b3dSmrg	UXA_FALLBACK(("to %p (%c)\n", pDrawable,
139428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
140428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
141428d7b3dSmrg		fbPutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format,
142428d7b3dSmrg			   bits);
143428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
144428d7b3dSmrg	}
145428d7b3dSmrg}
146428d7b3dSmrg
147428d7b3dSmrgRegionPtr
148428d7b3dSmrguxa_check_copy_area(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
149428d7b3dSmrg		    int srcx, int srcy, int w, int h, int dstx, int dsty)
150428d7b3dSmrg{
151428d7b3dSmrg	ScreenPtr screen = pSrc->pScreen;
152428d7b3dSmrg	RegionPtr ret = NULL;
153428d7b3dSmrg
154428d7b3dSmrg	UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
155428d7b3dSmrg		      uxa_drawable_location(pSrc),
156428d7b3dSmrg		      uxa_drawable_location(pDst)));
157428d7b3dSmrg	if (uxa_prepare_access(pDst, UXA_ACCESS_RW)) {
158428d7b3dSmrg		if (uxa_prepare_access(pSrc, UXA_ACCESS_RO)) {
159428d7b3dSmrg			ret =
160428d7b3dSmrg			    fbCopyArea(pSrc, pDst, pGC, srcx, srcy, w, h, dstx,
161428d7b3dSmrg				       dsty);
162428d7b3dSmrg			uxa_finish_access(pSrc, UXA_ACCESS_RO);
163428d7b3dSmrg		}
164428d7b3dSmrg		uxa_finish_access(pDst, UXA_ACCESS_RW);
165428d7b3dSmrg	}
166428d7b3dSmrg	return ret;
167428d7b3dSmrg}
168428d7b3dSmrg
169428d7b3dSmrgRegionPtr
170428d7b3dSmrguxa_check_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
171428d7b3dSmrg		     int srcx, int srcy, int w, int h, int dstx, int dsty,
172428d7b3dSmrg		     unsigned long bitPlane)
173428d7b3dSmrg{
174428d7b3dSmrg	ScreenPtr screen = pSrc->pScreen;
175428d7b3dSmrg	RegionPtr ret = NULL;
176428d7b3dSmrg
177428d7b3dSmrg	UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst,
178428d7b3dSmrg		      uxa_drawable_location(pSrc),
179428d7b3dSmrg		      uxa_drawable_location(pDst)));
180428d7b3dSmrg	if (uxa_prepare_access(pDst, UXA_ACCESS_RW)) {
181428d7b3dSmrg		if (uxa_prepare_access(pSrc, UXA_ACCESS_RO)) {
182428d7b3dSmrg			ret =
183428d7b3dSmrg			    fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h, dstx,
184428d7b3dSmrg					dsty, bitPlane);
185428d7b3dSmrg			uxa_finish_access(pSrc, UXA_ACCESS_RO);
186428d7b3dSmrg		}
187428d7b3dSmrg		uxa_finish_access(pDst, UXA_ACCESS_RW);
188428d7b3dSmrg	}
189428d7b3dSmrg	return ret;
190428d7b3dSmrg}
191428d7b3dSmrg
192428d7b3dSmrgvoid
193428d7b3dSmrguxa_check_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
194428d7b3dSmrg		     DDXPointPtr pptInit)
195428d7b3dSmrg{
196428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
197428d7b3dSmrg
198428d7b3dSmrg	UXA_FALLBACK(("to %p (%c)\n", pDrawable,
199428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
200428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
201428d7b3dSmrg		fbPolyPoint(pDrawable, pGC, mode, npt, pptInit);
202428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
203428d7b3dSmrg	}
204428d7b3dSmrg}
205428d7b3dSmrg
206428d7b3dSmrgvoid
207428d7b3dSmrguxa_check_poly_lines(DrawablePtr pDrawable, GCPtr pGC,
208428d7b3dSmrg		     int mode, int npt, DDXPointPtr ppt)
209428d7b3dSmrg{
210428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
211428d7b3dSmrg
212428d7b3dSmrg	UXA_FALLBACK(("to %p (%c), width %d, mode %d, count %d\n",
213428d7b3dSmrg		      pDrawable, uxa_drawable_location(pDrawable),
214428d7b3dSmrg		      pGC->lineWidth, mode, npt));
215428d7b3dSmrg
216428d7b3dSmrg	if (pGC->lineWidth == 0) {
217428d7b3dSmrg		if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
218428d7b3dSmrg			if (uxa_prepare_access_gc(pGC)) {
219428d7b3dSmrg				fbPolyLine(pDrawable, pGC, mode, npt, ppt);
220428d7b3dSmrg				uxa_finish_access_gc(pGC);
221428d7b3dSmrg			}
222428d7b3dSmrg			uxa_finish_access(pDrawable, UXA_ACCESS_RW);
223428d7b3dSmrg		}
224428d7b3dSmrg		return;
225428d7b3dSmrg	}
226428d7b3dSmrg	/* fb calls mi functions in the lineWidth != 0 case. */
227428d7b3dSmrg	fbPolyLine(pDrawable, pGC, mode, npt, ppt);
228428d7b3dSmrg}
229428d7b3dSmrg
230428d7b3dSmrgvoid
231428d7b3dSmrguxa_check_poly_segment(DrawablePtr pDrawable, GCPtr pGC,
232428d7b3dSmrg		       int nsegInit, xSegment * pSegInit)
233428d7b3dSmrg{
234428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
235428d7b3dSmrg
236428d7b3dSmrg	UXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable,
237428d7b3dSmrg		      uxa_drawable_location(pDrawable), pGC->lineWidth,
238428d7b3dSmrg		      nsegInit));
239428d7b3dSmrg	if (pGC->lineWidth == 0) {
240428d7b3dSmrg		if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
241428d7b3dSmrg			if (uxa_prepare_access_gc(pGC)) {
242428d7b3dSmrg				fbPolySegment(pDrawable, pGC, nsegInit,
243428d7b3dSmrg					      pSegInit);
244428d7b3dSmrg				uxa_finish_access_gc(pGC);
245428d7b3dSmrg			}
246428d7b3dSmrg			uxa_finish_access(pDrawable, UXA_ACCESS_RW);
247428d7b3dSmrg		}
248428d7b3dSmrg		return;
249428d7b3dSmrg	}
250428d7b3dSmrg	/* fb calls mi functions in the lineWidth != 0 case. */
251428d7b3dSmrg	fbPolySegment(pDrawable, pGC, nsegInit, pSegInit);
252428d7b3dSmrg}
253428d7b3dSmrg
254428d7b3dSmrgvoid
255428d7b3dSmrguxa_check_poly_arc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * pArcs)
256428d7b3dSmrg{
257428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
258428d7b3dSmrg
259428d7b3dSmrg	UXA_FALLBACK(("to %p (%c)\n", pDrawable,
260428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
261428d7b3dSmrg
262428d7b3dSmrg	/* Disable this as fbPolyArc can call miZeroPolyArc which in turn
263428d7b3dSmrg	 * can call accelerated functions, that as yet, haven't been notified
264428d7b3dSmrg	 * with uxa_finish_access().
265428d7b3dSmrg	 */
266428d7b3dSmrg#if 0
267428d7b3dSmrg	if (pGC->lineWidth == 0) {
268428d7b3dSmrg		if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
269428d7b3dSmrg			if (uxa_prepare_access_gc(pGC)) {
270428d7b3dSmrg				fbPolyArc(pDrawable, pGC, narcs, pArcs);
271428d7b3dSmrg				uxa_finish_access_gc(pGC);
272428d7b3dSmrg			}
273428d7b3dSmrg			uxa_finish_access(pDrawable, UXA_ACCESS_RW);
274428d7b3dSmrg		}
275428d7b3dSmrg		return;
276428d7b3dSmrg	}
277428d7b3dSmrg#endif
278428d7b3dSmrg	miPolyArc(pDrawable, pGC, narcs, pArcs);
279428d7b3dSmrg}
280428d7b3dSmrg
281428d7b3dSmrgvoid
282428d7b3dSmrguxa_check_poly_fill_rect(DrawablePtr pDrawable, GCPtr pGC,
283428d7b3dSmrg			 int nrect, xRectangle * prect)
284428d7b3dSmrg{
285428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
286428d7b3dSmrg
287428d7b3dSmrg	UXA_FALLBACK(("to %p (%c)\n", pDrawable,
288428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
289428d7b3dSmrg
290428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
291428d7b3dSmrg		if (uxa_prepare_access_gc(pGC)) {
292428d7b3dSmrg			fbPolyFillRect(pDrawable, pGC, nrect, prect);
293428d7b3dSmrg			uxa_finish_access_gc(pGC);
294428d7b3dSmrg		}
295428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
296428d7b3dSmrg	}
297428d7b3dSmrg}
298428d7b3dSmrg
299428d7b3dSmrgvoid
300428d7b3dSmrguxa_check_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
301428d7b3dSmrg			  int x, int y, unsigned int nglyph,
302428d7b3dSmrg			  CharInfoPtr * ppci, pointer pglyphBase)
303428d7b3dSmrg{
304428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
305428d7b3dSmrg
306428d7b3dSmrg	UXA_FALLBACK(("to %p (%c)\n", pDrawable,
307428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
308428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
309428d7b3dSmrg		if (uxa_prepare_access_gc(pGC)) {
310428d7b3dSmrg			fbImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci,
311428d7b3dSmrg					pglyphBase);
312428d7b3dSmrg			uxa_finish_access_gc(pGC);
313428d7b3dSmrg		}
314428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
315428d7b3dSmrg	}
316428d7b3dSmrg}
317428d7b3dSmrg
318428d7b3dSmrgvoid
319428d7b3dSmrguxa_check_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
320428d7b3dSmrg			 int x, int y, unsigned int nglyph,
321428d7b3dSmrg			 CharInfoPtr * ppci, pointer pglyphBase)
322428d7b3dSmrg{
323428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
324428d7b3dSmrg
325428d7b3dSmrg	UXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable,
326428d7b3dSmrg		      uxa_drawable_location(pDrawable), pGC->fillStyle,
327428d7b3dSmrg		      pGC->alu));
328428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
329428d7b3dSmrg		if (uxa_prepare_access_gc(pGC)) {
330428d7b3dSmrg			fbPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci,
331428d7b3dSmrg				       pglyphBase);
332428d7b3dSmrg			uxa_finish_access_gc(pGC);
333428d7b3dSmrg		}
334428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
335428d7b3dSmrg	}
336428d7b3dSmrg}
337428d7b3dSmrg
338428d7b3dSmrgvoid
339428d7b3dSmrguxa_check_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
340428d7b3dSmrg		      DrawablePtr pDrawable, int w, int h, int x, int y)
341428d7b3dSmrg{
342428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
343428d7b3dSmrg
344428d7b3dSmrg	UXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable,
345428d7b3dSmrg		      uxa_drawable_location(&pBitmap->drawable),
346428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
347428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) {
348428d7b3dSmrg		if (uxa_prepare_access(&pBitmap->drawable, UXA_ACCESS_RO)) {
349428d7b3dSmrg			if (uxa_prepare_access_gc(pGC)) {
350428d7b3dSmrg				fbPushPixels(pGC, pBitmap, pDrawable, w, h, x,
351428d7b3dSmrg					     y);
352428d7b3dSmrg				uxa_finish_access_gc(pGC);
353428d7b3dSmrg			}
354428d7b3dSmrg			uxa_finish_access(&pBitmap->drawable, UXA_ACCESS_RO);
355428d7b3dSmrg		}
356428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RW);
357428d7b3dSmrg	}
358428d7b3dSmrg}
359428d7b3dSmrg
360428d7b3dSmrgvoid
361428d7b3dSmrguxa_check_get_spans(DrawablePtr pDrawable,
362428d7b3dSmrg		    int wMax,
363428d7b3dSmrg		    DDXPointPtr ppt, int *pwidth, int nspans, char *pdstStart)
364428d7b3dSmrg{
365428d7b3dSmrg	ScreenPtr screen = pDrawable->pScreen;
366428d7b3dSmrg
367428d7b3dSmrg	UXA_FALLBACK(("from %p (%c)\n", pDrawable,
368428d7b3dSmrg		      uxa_drawable_location(pDrawable)));
369428d7b3dSmrg	if (uxa_prepare_access(pDrawable, UXA_ACCESS_RO)) {
370428d7b3dSmrg		fbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
371428d7b3dSmrg		uxa_finish_access(pDrawable, UXA_ACCESS_RO);
372428d7b3dSmrg	}
373428d7b3dSmrg}
374428d7b3dSmrg
375428d7b3dSmrgvoid
376428d7b3dSmrguxa_check_composite(CARD8 op,
377428d7b3dSmrg		    PicturePtr pSrc,
378428d7b3dSmrg		    PicturePtr pMask,
379428d7b3dSmrg		    PicturePtr pDst,
380428d7b3dSmrg		    INT16 xSrc, INT16 ySrc,
381428d7b3dSmrg		    INT16 xMask, INT16 yMask,
382428d7b3dSmrg		    INT16 xDst, INT16 yDst,
383428d7b3dSmrg		    CARD16 width, CARD16 height)
384428d7b3dSmrg{
385428d7b3dSmrg	ScreenPtr screen = pDst->pDrawable->pScreen;
386428d7b3dSmrg
387428d7b3dSmrg	UXA_FALLBACK(("from picts %p/%p to pict %p\n", pSrc, pMask, pDst));
388428d7b3dSmrg
389428d7b3dSmrg	if (uxa_picture_prepare_access(pDst, UXA_ACCESS_RW)) {
390428d7b3dSmrg		if (uxa_picture_prepare_access(pSrc, UXA_ACCESS_RO)) {
391428d7b3dSmrg			if (!pMask || uxa_picture_prepare_access(pMask, UXA_ACCESS_RO)) {
392428d7b3dSmrg				fbComposite(op, pSrc, pMask, pDst,
393428d7b3dSmrg					    xSrc, ySrc,
394428d7b3dSmrg					    xMask, yMask,
395428d7b3dSmrg					    xDst, yDst,
396428d7b3dSmrg					    width, height);
397428d7b3dSmrg				if (pMask)
398428d7b3dSmrg					uxa_picture_finish_access(pMask, UXA_ACCESS_RO);
399428d7b3dSmrg			}
400428d7b3dSmrg			uxa_picture_finish_access(pSrc, UXA_ACCESS_RO);
401428d7b3dSmrg		}
402428d7b3dSmrg		uxa_picture_finish_access(pDst, UXA_ACCESS_RW);
403428d7b3dSmrg	}
404428d7b3dSmrg}
405428d7b3dSmrg
406428d7b3dSmrgvoid
407428d7b3dSmrguxa_check_add_traps(PicturePtr pPicture,
408428d7b3dSmrg		    INT16 x_off, INT16 y_off, int ntrap, xTrap * traps)
409428d7b3dSmrg{
410428d7b3dSmrg	ScreenPtr screen = pPicture->pDrawable->pScreen;
411428d7b3dSmrg
412428d7b3dSmrg	UXA_FALLBACK(("to pict %p (%c)\n", pPicture,
413428d7b3dSmrg		      uxa_drawable_location(pPicture->pDrawable)));
414428d7b3dSmrg	if (uxa_picture_prepare_access(pPicture, UXA_ACCESS_RW)) {
415428d7b3dSmrg		fbAddTraps(pPicture, x_off, y_off, ntrap, traps);
416428d7b3dSmrg		uxa_picture_finish_access(pPicture, UXA_ACCESS_RW);
417428d7b3dSmrg	}
418428d7b3dSmrg}
419428d7b3dSmrg
420428d7b3dSmrg/**
421428d7b3dSmrg * Gets the 0,0 pixel of a pixmap.  Used for doing solid fills of tiled pixmaps
422428d7b3dSmrg * that happen to be 1x1.  Pixmap must be at least 8bpp.
423428d7b3dSmrg *
424428d7b3dSmrg * XXX This really belongs in fb, so it can be aware of tiling and etc.
425428d7b3dSmrg */
426428d7b3dSmrgCARD32 uxa_get_pixmap_first_pixel(PixmapPtr pPixmap)
427428d7b3dSmrg{
428428d7b3dSmrg	CARD32 pixel;
429428d7b3dSmrg	void *fb;
430428d7b3dSmrg
431428d7b3dSmrg	if (!uxa_prepare_access(&pPixmap->drawable, UXA_ACCESS_RO))
432428d7b3dSmrg		return 0;
433428d7b3dSmrg
434428d7b3dSmrg	fb = pPixmap->devPrivate.ptr;
435428d7b3dSmrg
436428d7b3dSmrg	switch (pPixmap->drawable.bitsPerPixel) {
437428d7b3dSmrg	case 32:
438428d7b3dSmrg		pixel = *(CARD32 *) fb;
439428d7b3dSmrg		break;
440428d7b3dSmrg	case 16:
441428d7b3dSmrg		pixel = *(CARD16 *) fb;
442428d7b3dSmrg		break;
443428d7b3dSmrg	default:
444428d7b3dSmrg		pixel = *(CARD8 *) fb;
445428d7b3dSmrg		break;
446428d7b3dSmrg	}
447428d7b3dSmrg	uxa_finish_access(&pPixmap->drawable, UXA_ACCESS_RO);
448428d7b3dSmrg
449428d7b3dSmrg	return pixel;
450428d7b3dSmrg}
451