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