static void radeon_glamor_finish_access_gc(GCPtr pGC) { if (pGC->fillStyle == FillTiled) radeon_glamor_finish_access_cpu(pGC->tile.pixmap); if (pGC->stipple) radeon_glamor_finish_access_cpu(pGC->stipple); }
static RegionPtr radeon_glamor_copy_area_nodstbo(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { ScreenPtr screen = pDstDrawable->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); PixmapPtr src_pixmap = get_drawable_pixmap(pSrcDrawable); PixmapPtr dst_pixmap = get_drawable_pixmap(pDstDrawable); struct radeon_pixmap *src_priv; RegionPtr ret = NULL; if (src_pixmap != dst_pixmap) { src_priv = radeon_get_pixmap_private(src_pixmap); if (!radeon_glamor_prepare_access_cpu_ro(scrn, src_pixmap, src_priv)) return ret; } ret = fbCopyArea(pSrcDrawable, pDstDrawable, pGC, srcx, srcy, width, height, dstx, dsty); if (src_pixmap != dst_pixmap) radeon_glamor_finish_access_cpu(src_pixmap); return ret; }
static RegionPtr radeon_glamor_copy_area(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { ScreenPtr screen = pDstDrawable->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); RADEONInfoPtr info = RADEONPTR(scrn); PixmapPtr src_pixmap = get_drawable_pixmap(pSrcDrawable); PixmapPtr dst_pixmap = get_drawable_pixmap(pDstDrawable); struct radeon_pixmap *src_priv = radeon_get_pixmap_private(src_pixmap); struct radeon_pixmap *dst_priv = radeon_get_pixmap_private(dst_pixmap); RegionPtr ret = NULL; if (info->accel_state->force || (src_priv && !src_priv->bo) || (dst_priv && !dst_priv->bo)) { if (!radeon_glamor_prepare_access_gpu(dst_priv)) goto fallback; if (src_priv != dst_priv && !radeon_glamor_prepare_access_gpu(src_priv)) goto fallback; ret = info->glamor.SavedCopyArea(pSrcDrawable, pDstDrawable, pGC, srcx, srcy, width, height, dstx, dsty); radeon_glamor_finish_access_gpu_rw(info, dst_priv); if (src_priv != dst_priv) radeon_glamor_finish_access_gpu_ro(info, src_priv); return ret; } fallback: if (radeon_glamor_prepare_access_cpu_rw(scrn, dst_pixmap, dst_priv)) { if (pSrcDrawable == pDstDrawable || radeon_glamor_prepare_access_cpu_ro(scrn, src_pixmap, src_priv)) { ret = fbCopyArea(pSrcDrawable, pDstDrawable, pGC, srcx, srcy, width, height, dstx, dsty); if (pSrcDrawable != pDstDrawable) radeon_glamor_finish_access_cpu(src_pixmap); } radeon_glamor_finish_access_cpu(dst_pixmap); } return ret; }
static void radeon_glamor_push_pixels(GCPtr pGC, PixmapPtr pBitmap, DrawablePtr pDrawable, int w, int h, int x, int y) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { priv = radeon_get_pixmap_private(pBitmap); if (radeon_glamor_prepare_access_cpu_ro(scrn, pBitmap, priv)) { if (radeon_glamor_prepare_access_gc(scrn, pGC)) { fbPushPixels(pGC, pBitmap, pDrawable, w, h, x, y); radeon_glamor_finish_access_gc(pGC); } radeon_glamor_finish_access_cpu(pBitmap); } radeon_glamor_finish_access_cpu(pixmap); } }
static RegionPtr radeon_glamor_bitmap_to_region(PixmapPtr pPix) { ScrnInfoPtr scrn = xf86ScreenToScrn(pPix->drawable.pScreen); struct radeon_pixmap *priv = radeon_get_pixmap_private(pPix); RegionPtr ret; if (!radeon_glamor_prepare_access_cpu_ro(scrn, pPix, priv)) return NULL; ret = fbPixmapToRegion(pPix); radeon_glamor_finish_access_cpu(pPix); return ret; }
static void radeon_glamor_copy_window(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) { ScrnInfoPtr scrn = xf86ScreenToScrn(pWin->drawable.pScreen); PixmapPtr pixmap = get_drawable_pixmap(&pWin->drawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { fbCopyWindow(pWin, ptOldOrg, prgnSrc); radeon_glamor_finish_access_cpu(pixmap); } }
static void radeon_glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h, unsigned int format, unsigned long planeMask, char *d) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_ro(scrn, pixmap, priv)) { fbGetImage(pDrawable, x, y, w, h, format, planeMask, d); radeon_glamor_finish_access_cpu(pixmap); } }
static void radeon_glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr pptInit) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { fbPolyPoint(pDrawable, pGC, mode, npt, pptInit); radeon_glamor_finish_access_cpu(pixmap); } }
static void radeon_glamor_set_spans(DrawablePtr pDrawable, GCPtr pGC, char *psrc, DDXPointPtr ppt, int *pwidth, int nspans, int fSorted) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { fbSetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted); radeon_glamor_finish_access_cpu(pixmap); } }
static void radeon_glamor_get_spans(DrawablePtr pDrawable, int wMax, DDXPointPtr ppt, int *pwidth, int nspans, char *pdstStart) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_ro(scrn, pixmap, priv)) { fbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart); radeon_glamor_finish_access_cpu(pixmap); } }
static RegionPtr radeon_glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int w, int h, int dstx, int dsty, unsigned long bitPlane) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDst->pScreen); PixmapPtr dst_pix = get_drawable_pixmap(pDst); struct radeon_pixmap *dst_priv = radeon_get_pixmap_private(dst_pix); RegionPtr ret = NULL; if (radeon_glamor_prepare_access_cpu_rw(scrn, dst_pix, dst_priv)) { PixmapPtr src_pix = get_drawable_pixmap(pSrc); struct radeon_pixmap *src_priv = radeon_get_pixmap_private(src_pix); if (radeon_glamor_prepare_access_cpu_ro(scrn, src_pix, src_priv)) { ret = fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, bitPlane); radeon_glamor_finish_access_cpu(src_pix); } radeon_glamor_finish_access_cpu(dst_pix); } return ret; }
static void radeon_glamor_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, int w, int h, int leftPad, int format, char *bits) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { fbPutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); radeon_glamor_finish_access_cpu(pixmap); } }
static void radeon_glamor_poly_fill_rect(DrawablePtr pDrawable, GCPtr pGC, int nrect, xRectangle *prect) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { if (radeon_glamor_prepare_access_gc(scrn, pGC)) { fbPolyFillRect(pDrawable, pGC, nrect, prect); radeon_glamor_finish_access_gc(pGC); } radeon_glamor_finish_access_cpu(pixmap); } }
static void radeon_glamor_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned int nglyph, CharInfoPtr *ppci, pointer pglyphBase) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { if (radeon_glamor_prepare_access_gc(scrn, pGC)) { fbPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); radeon_glamor_finish_access_gc(pGC); } radeon_glamor_finish_access_cpu(pixmap); } }
static void radeon_glamor_poly_lines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr ppt) { if (pGC->lineWidth == 0) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { if (radeon_glamor_prepare_access_gc(scrn, pGC)) { fbPolyLine(pDrawable, pGC, mode, npt, ppt); radeon_glamor_finish_access_gc(pGC); } radeon_glamor_finish_access_cpu(pixmap); } return; } /* fb calls mi functions in the lineWidth != 0 case. */ fbPolyLine(pDrawable, pGC, mode, npt, ppt); }
static Bool radeon_glamor_prepare_access_gc(ScrnInfoPtr scrn, GCPtr pGC) { struct radeon_pixmap *priv; if (pGC->stipple) { priv = radeon_get_pixmap_private(pGC->stipple); if (!radeon_glamor_prepare_access_cpu_ro(scrn, pGC->stipple, priv)) return FALSE; } if (pGC->fillStyle == FillTiled) { priv = radeon_get_pixmap_private(pGC->tile.pixmap); if (!radeon_glamor_prepare_access_cpu_ro(scrn, pGC->tile.pixmap, priv)) { if (pGC->stipple) radeon_glamor_finish_access_cpu(pGC->stipple); return FALSE; } } return TRUE; }
static void radeon_glamor_poly_fill_rect(DrawablePtr pDrawable, GCPtr pGC, int nrect, xRectangle *prect) { ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); RADEONInfoPtr info = RADEONPTR(scrn); PixmapPtr pixmap = get_drawable_pixmap(pDrawable); struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap); if ((info->accel_state->force || (priv && !priv->bo)) && radeon_glamor_prepare_access_gpu(priv)) { info->glamor.SavedPolyFillRect(pDrawable, pGC, nrect, prect); radeon_glamor_finish_access_gpu_rw(info, priv); return; } if (radeon_glamor_prepare_access_cpu_rw(scrn, pixmap, priv)) { if (radeon_glamor_prepare_access_gc(scrn, pGC)) { fbPolyFillRect(pDrawable, pGC, nrect, prect); radeon_glamor_finish_access_gc(pGC); } radeon_glamor_finish_access_cpu(pixmap); } }