Separate out screen size and screen pixmap sizes in RRScreenSizeSet

This provides for separate sizes for the screen scanout and rendering
buffer and the application-visible screen size.

Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Aaron Plattner <aplattner@nvidia.com>
This commit is contained in:
Keith Packard 2010-12-05 20:57:47 -08:00
parent a88d70fb20
commit 752c368421
6 changed files with 96 additions and 41 deletions

View File

@ -1038,7 +1038,12 @@ xf86SetRootClip (ScreenPtr pScreen, Bool enable)
RegionInit(&pWin->winSize, &box, 1); RegionInit(&pWin->winSize, &box, 1);
RegionInit(&pWin->borderSize, &box, 1); RegionInit(&pWin->borderSize, &box, 1);
if (WasViewable) if (WasViewable)
{
PixmapPtr pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
box.x2 = pPixmap->drawable.width;
box.y2 = pPixmap->drawable.height;
RegionReset(&pWin->borderClip, &box); RegionReset(&pWin->borderClip, &box);
}
pWin->drawable.width = pScreen->width; pWin->drawable.width = pScreen->width;
pWin->drawable.height = pScreen->height; pWin->drawable.height = pScreen->height;
RegionBreak(&pWin->clipList); RegionBreak(&pWin->clipList);
@ -1116,7 +1121,6 @@ xf86EnableDisableFBAccess(int scrnIndex, Bool enable)
*/ */
if (!xf86Resetting) if (!xf86Resetting)
xf86SetRootClip (pScreen, TRUE); xf86SetRootClip (pScreen, TRUE);
} }
else else
{ {

View File

@ -659,10 +659,12 @@ xf86RandR12SetConfig (ScreenPtr pScreen,
static Bool static Bool
xf86RandR12ScreenSetSize (ScreenPtr pScreen, xf86RandR12ScreenSetSize (ScreenPtr pScreen,
CARD16 width, CARD16 width,
CARD16 height, CARD16 height,
CARD32 mmWidth, CARD16 pixWidth,
CARD32 mmHeight) CARD16 pixHeight,
CARD32 mmWidth,
CARD32 mmHeight)
{ {
XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen);
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
@ -670,6 +672,8 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
WindowPtr pRoot = pScreen->root; WindowPtr pRoot = pScreen->root;
PixmapPtr pScrnPix; PixmapPtr pScrnPix;
Bool ret = FALSE; Bool ret = FALSE;
Bool pixSizeChanged = FALSE;
Bool winSizeChanged = FALSE;
int c; int c;
if (xf86RandR12Key) { if (xf86RandR12Key) {
@ -677,46 +681,85 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
{ {
randrp->virtualX = pScrn->virtualX; randrp->virtualX = pScrn->virtualX;
randrp->virtualY = pScrn->virtualY; randrp->virtualY = pScrn->virtualY;
pixSizeChanged = TRUE;
} }
} }
if (pRoot && pScrn->vtSema)
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
/* Let the driver update virtualX and virtualY */ pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
if (!(*config->funcs->resize)(pScrn, width, height)) if (pixWidth != pScrnPix->drawable.width ||
goto finish; pixHeight != pScrnPix->drawable.height)
pixSizeChanged = TRUE;
if (width != pScreen->width || height != pScreen->height)
winSizeChanged = TRUE;
if (pixSizeChanged)
{
if (pRoot && pScrn->vtSema)
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, FALSE);
/* Let the driver update virtualX and virtualY */
if (!(*config->funcs->resize)(pScrn, pixWidth, pixHeight))
goto finish;
}
ret = TRUE; ret = TRUE;
/* Update panning information */
for (c = 0; c < config->num_crtc; c++) { if (winSizeChanged)
xf86CrtcPtr crtc = config->crtc[c]; {
if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 || /* Update panning information */
crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) { for (c = 0; c < config->num_crtc; c++) {
if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1) xf86CrtcPtr crtc = config->crtc[c];
crtc->panningTotalArea.x2 += width - pScreen->width; if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 ||
if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1) crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) {
crtc->panningTotalArea.y2 += height - pScreen->height; if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1)
if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1) crtc->panningTotalArea.x2 += width - pScreen->width;
crtc->panningTrackingArea.x2 += width - pScreen->width; if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1)
if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1) crtc->panningTotalArea.y2 += height - pScreen->height;
crtc->panningTrackingArea.y2 += height - pScreen->height; if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1)
xf86RandR13VerifyPanningArea (crtc, width, height); crtc->panningTrackingArea.x2 += width - pScreen->width;
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY); if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1)
crtc->panningTrackingArea.y2 += height - pScreen->height;
xf86RandR13VerifyPanningArea (crtc, width, height);
xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY);
}
} }
} }
pScrnPix = (*pScreen->GetScreenPixmap)(pScreen); pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
pScreen->width = pScrnPix->drawable.width = width; pScreen->width = width;
pScreen->height = pScrnPix->drawable.height = height; pScreen->height = height;
if (pRoot)
{
BoxRec box;
pRoot->drawable.width = width;
pRoot->drawable.height = height;
box.x1 = 0;
box.y1 = 0;
box.x2 = width;
box.y2 = height;
RegionInit(&pRoot->winSize, &box, 1);
RegionInit(&pRoot->borderSize, &box, 1);
}
pScrnPix->drawable.width = pixWidth;
pScrnPix->drawable.height = pixHeight;
randrp->mmWidth = pScreen->mmWidth = mmWidth; randrp->mmWidth = pScreen->mmWidth = mmWidth;
randrp->mmHeight = pScreen->mmHeight = mmHeight; randrp->mmHeight = pScreen->mmHeight = mmHeight;
xf86SetViewport (pScreen, pScreen->width-1, pScreen->height-1); if (winSizeChanged)
xf86SetViewport (pScreen, 0, 0); {
xf86SetViewport (pScreen, pScreen->width-1, pScreen->height-1);
xf86SetViewport (pScreen, 0, 0);
}
finish: finish:
if (pRoot && pScrn->vtSema) if (pixSizeChanged)
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE); {
if (pRoot && pScrn->vtSema)
(*pScrn->EnableDisableFBAccess) (pScreen->myNum, TRUE);
}
#if RANDR_12_INTERFACE #if RANDR_12_INTERFACE
if (xf86RandR12Key && pScreen->root && ret) if (xf86RandR12Key && pScreen->root && ret)
RRScreenSizeNotify (pScreen); RRScreenSizeNotify (pScreen);
@ -816,6 +859,8 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
pScreen->width = width; pScreen->width = width;
pScreen->height = height; pScreen->height = height;
xf86RandR12ScreenSetSize (pScreen, xf86RandR12ScreenSetSize (pScreen,
width,
height,
width, width,
height, height,
mmWidth, mmWidth,

View File

@ -28,11 +28,6 @@ miRRSetScreenConfig(ScreenPtr screen,
{ {
RRScreenConfigRec old_screen_config; RRScreenConfigRec old_screen_config;
/* XXX deal with separate pixmap/screen sizes */
if (screen_config->screen_pixmap_width != screen_config->screen_width ||
screen_config->screen_pixmap_height != screen_config->screen_height)
return FALSE;
RRScreenCurrentConfig(screen, &old_screen_config); RRScreenCurrentConfig(screen, &old_screen_config);
/* Check and see if nothing has changed */ /* Check and see if nothing has changed */
@ -47,6 +42,8 @@ miRRSetScreenConfig(ScreenPtr screen,
return RRScreenSizeSet(screen, return RRScreenSizeSet(screen,
screen_config->screen_width, screen_config->screen_width,
screen_config->screen_height, screen_config->screen_height,
screen_config->screen_pixmap_width,
screen_config->screen_pixmap_height,
screen_config->mm_width, screen_config->mm_width,
screen_config->mm_height); screen_config->mm_height);
} }

View File

@ -191,6 +191,8 @@ struct _rrOutput {
typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen, typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen,
CARD16 width, CARD16 width,
CARD16 height, CARD16 height,
CARD16 pixWidth,
CARD16 pixHeight,
CARD32 mmWidth, CARD32 mmWidth,
CARD32 mmHeight); CARD32 mmHeight);
@ -478,6 +480,8 @@ extern _X_EXPORT Bool
RRScreenSizeSet (ScreenPtr pScreen, RRScreenSizeSet (ScreenPtr pScreen,
CARD16 width, CARD16 width,
CARD16 height, CARD16 height,
CARD16 pixWidth,
CARD16 pixHeight,
CARD32 mmWidth, CARD32 mmWidth,
CARD32 mmHeight); CARD32 mmHeight);

View File

@ -435,10 +435,9 @@ RRCrtcCurrentConfig(RRCrtcPtr crtc,
crtc_config->sprite_position_f_transform = crtc->client_sprite_f_position_transform; crtc_config->sprite_position_f_transform = crtc->client_sprite_f_position_transform;
crtc_config->sprite_image_f_transform = crtc->client_sprite_f_image_transform; crtc_config->sprite_image_f_transform = crtc->client_sprite_f_image_transform;
/* XXX add pixmap stuff */ crtc_config->pixmap = crtc->scanoutPixmap;
crtc_config->pixmap = NULL; crtc_config->pixmap_x = crtc->x;
crtc_config->pixmap_x = 0; crtc_config->pixmap_y = crtc->y;
crtc_config->pixmap_y = 0;
return TRUE; return TRUE;
} }
@ -1510,6 +1509,8 @@ RRConvertCrtcConfig(ClientPtr client, ScreenPtr screen,
if (x->pixmap == None) if (x->pixmap == None)
pixmap = NULL; pixmap = NULL;
else if (x->pixmap == RR_CurrentScanoutPixmap)
pixmap = crtc->scanoutPixmap;
else else
{ {
rc = dixLookupResourceByType((pointer *) &pixmap, x->pixmap, rc = dixLookupResourceByType((pointer *) &pixmap, x->pixmap,

View File

@ -168,6 +168,8 @@ Bool
RRScreenSizeSet (ScreenPtr pScreen, RRScreenSizeSet (ScreenPtr pScreen,
CARD16 width, CARD16 width,
CARD16 height, CARD16 height,
CARD16 pixWidth,
CARD16 pixHeight,
CARD32 mmWidth, CARD32 mmWidth,
CARD32 mmHeight) CARD32 mmHeight)
{ {
@ -178,6 +180,7 @@ RRScreenSizeSet (ScreenPtr pScreen,
{ {
return (*pScrPriv->rrScreenSetSize) (pScreen, return (*pScrPriv->rrScreenSetSize) (pScreen,
width, height, width, height,
pixWidth, pixHeight,
mmWidth, mmHeight); mmWidth, mmHeight);
} }
#endif #endif
@ -317,6 +320,7 @@ ProcRRSetScreenSize (ClientPtr client)
return BadValue; return BadValue;
} }
if (!RRScreenSizeSet (pScreen, if (!RRScreenSizeSet (pScreen,
stuff->width, stuff->height,
stuff->width, stuff->height, stuff->width, stuff->height,
stuff->widthInMillimeters, stuff->widthInMillimeters,
stuff->heightInMillimeters)) stuff->heightInMillimeters))
@ -949,7 +953,7 @@ ProcRRSetScreenConfig (ClientPtr client)
goto sendReply; goto sendReply;
} }
} }
if (!RRScreenSizeSet (pScreen, width, height, if (!RRScreenSizeSet (pScreen, width, height, width, height,
pScreen->mmWidth, pScreen->mmHeight)) pScreen->mmWidth, pScreen->mmHeight))
{ {
rep.status = RRSetConfigFailed; rep.status = RRSetConfigFailed;