[PATCH 35/36] dix/randr: add a hook into screen to replace scanout pixmap
Alex Deucher
alexdeucher at gmail.com
Mon Jul 2 14:22:14 PDT 2012
On Mon, Jul 2, 2012 at 6:13 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> 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 <airlied at redhat.com>
> ---
> 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
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list