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:
parent
a88d70fb20
commit
752c368421
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue