diff options
author | Dave Airlie <airlied@redhat.com> | 2012-06-26 10:00:21 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-07-07 10:39:09 +0100 |
commit | c41922940adbc8891575b3321fadf01ff4cb5854 (patch) | |
tree | 8db13767d749b3c476545f83c51db18ec63e8c53 /randr | |
parent | e2fd447e76c4a1233374c9d8fa9cae54a55dad50 (diff) |
dix/randr: add a hook into screen to replace scanout pixmap
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.
Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'randr')
-rw-r--r-- | randr/randr.c | 2 | ||||
-rw-r--r-- | randr/randrstr.h | 3 | ||||
-rw-r--r-- | randr/rrcrtc.c | 58 |
3 files changed, 62 insertions, 1 deletions
diff --git a/randr/randr.c b/randr/randr.c index ae8116677..3050c54fe 100644 --- a/randr/randr.c +++ b/randr/randr.c @@ -324,7 +324,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 16e7d01b8..62b9050e9 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -673,6 +673,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 949ae6028..1a6e59350 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; +} |