On Mon, Jul 2, 2012 at 6:13 AM, Dave Airlie <[email protected]> wrote: > From: Dave Airlie <[email protected]> > > For DRI2 in some offload cases we need to set a new pixmap on the crtc, > this hook allows dri2 to call into randr to do the necessary work to set > a pixmap as the scanout pixmap for the crtc the drawable is currently on. > > This is really only to be used for unredirected full screen apps in composited > environments.
Not directly related to this patch, but are crtcs transforms handled properly with slaves? E.g., randr rotation? Alex > > Signed-off-by: Dave Airlie <[email protected]> > --- > include/scrnintstr.h | 3 +++ > randr/randr.c | 2 +- > randr/randrstr.h | 3 +++ > randr/rrcrtc.c | 58 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 65 insertions(+), 1 deletion(-) > > diff --git a/include/scrnintstr.h b/include/scrnintstr.h > index 01c22f7..2d44a46 100644 > --- a/include/scrnintstr.h > +++ b/include/scrnintstr.h > @@ -351,6 +351,8 @@ typedef Bool (*StartPixmapTrackingProcPtr)(PixmapPtr, > PixmapPtr, > > typedef Bool (*StopPixmapTrackingProcPtr)(PixmapPtr, PixmapPtr); > > +typedef Bool (*ReplaceScanoutPixmapProcPtr)(DrawablePtr, PixmapPtr, Bool); > + > typedef struct _Screen { > int myNum; /* index of this instance in Screens[] */ > ATOM id; > @@ -508,6 +510,7 @@ typedef struct _Screen { > struct xorg_list offload_slave_list; > struct xorg_list offload_head; > > + ReplaceScanoutPixmapProcPtr ReplaceScanoutPixmap; > } ScreenRec; > > static inline RegionPtr > diff --git a/randr/randr.c b/randr/randr.c > index cfcc016..f3031a0 100644 > --- a/randr/randr.c > +++ b/randr/randr.c > @@ -325,7 +325,7 @@ RRScreenInit(ScreenPtr pScreen) > wrap(pScrPriv, pScreen, CloseScreen, RRCloseScreen); > > pScreen->ConstrainCursorHarder = RRConstrainCursorHarder; > - > + pScreen->ReplaceScanoutPixmap = RRReplaceScanoutPixmap; > pScrPriv->numOutputs = 0; > pScrPriv->outputs = NULL; > pScrPriv->numCrtcs = 0; > diff --git a/randr/randrstr.h b/randr/randrstr.h > index f0f07c8..af9e2f5 100644 > --- a/randr/randrstr.h > +++ b/randr/randrstr.h > @@ -668,6 +668,9 @@ extern _X_EXPORT void > extern _X_EXPORT void > RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc); > > +extern _X_EXPORT Bool > + RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool > enable); > + > /* > * Crtc dispatch > */ > diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c > index 949ae60..1a6e593 100644 > --- a/randr/rrcrtc.c > +++ b/randr/rrcrtc.c > @@ -1641,3 +1641,61 @@ RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr > pScreen, int mode, int *x, > return; > } > } > + > +Bool > +RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable) > +{ > + rrScrPriv(pDrawable->pScreen); > + int i; > + Bool size_fits = FALSE; > + Bool changed = FALSE; > + Bool ret = TRUE; > + > + for (i = 0; i < pScrPriv->numCrtcs; i++) { > + RRCrtcPtr crtc = pScrPriv->crtcs[i]; > + > + if (!crtc->mode && enable) > + continue; > + > + changed = FALSE; > + if (crtc->mode && crtc->x == pDrawable->x && > + crtc->y == pDrawable->y && > + crtc->mode->mode.width == pDrawable->width && > + crtc->mode->mode.height == pDrawable->height) > + size_fits = TRUE; > + > + /* is the pixmap already set? */ > + if (crtc->scanout_pixmap == pPixmap) { > + /* if its a disable then don't care about size */ > + if (enable == FALSE) { > + /* set scanout to NULL */ > + crtc->scanout_pixmap = NULL; > + changed = TRUE; > + } else { > + /* if the size fits then we are already setup */ > + if (size_fits) > + return TRUE; > + /* if the size no longer fits then drop off */ > + crtc->scanout_pixmap = NULL; > + changed = TRUE; > + ret = FALSE; > + } > + } else { > + if (!size_fits) > + return FALSE; > + if (enable) { > + crtc->scanout_pixmap = pPixmap; > + pScrPriv->rrCrtcSetScanoutPixmap(crtc, pPixmap); > + changed = TRUE; > + } > + } > + > + if (changed && pScrPriv->rrCrtcSet) { > + pScrPriv->rrCrtcSetScanoutPixmap(crtc, crtc->scanout_pixmap); > + > + (*pScrPriv->rrCrtcSet) (pDrawable->pScreen, crtc, crtc->mode, > crtc->x, crtc->y, > + crtc->rotation, crtc->numOutputs, > crtc->outputs); > + } > + } > + return ret; > +} > -- > 1.7.10.2 > > _______________________________________________ > [email protected]: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
