mirror of
https://github.com/X11Libre/xf86-video-vmware.git
synced 2026-04-14 11:04:56 +00:00
Make resizing work once and for all.
This change removes the limitation on resizing larger than the initial size and removes the need for pitch-locking bu resizing the screen pixmap. Now the only limit on the screen size is the maximum width/height reported by the virtual hardware which is configured on the host side.
This commit is contained in:
56
src/vmware.c
56
src/vmware.c
@@ -280,23 +280,6 @@ vmwareSendSVGACmdUpdateFullScreen(VMWAREPtr pVMWARE)
|
||||
vmwareSendSVGACmdUpdate(pVMWARE, &BB);
|
||||
}
|
||||
|
||||
static void
|
||||
vmwareSetPitchLock(VMWAREPtr pVMWARE, unsigned long fbPitch)
|
||||
{
|
||||
CARD32 *vmwareFIFO = pVMWARE->vmwareFIFO;
|
||||
|
||||
VmwareLog(("Attempting to set pitchlock\n"));
|
||||
|
||||
if (pVMWARE->vmwareCapability & SVGA_CAP_PITCHLOCK) {
|
||||
VmwareLog(("Using PitchLock register\n"));
|
||||
vmwareWriteReg(pVMWARE, SVGA_REG_PITCHLOCK, fbPitch);
|
||||
} else if (pVMWARE->hasPitchLockFIFOReg &&
|
||||
vmwareFIFO[SVGA_FIFO_MIN] >= (vmwareReadReg(pVMWARE, SVGA_REG_MEM_REGS) << 2)) {
|
||||
VmwareLog(("Using PitchLock FIFO register\n"));
|
||||
vmwareFIFO[SVGA_FIFO_PITCHLOCK] = fbPitch;
|
||||
}
|
||||
}
|
||||
|
||||
static CARD32
|
||||
vmwareCalculateWeight(CARD32 mask)
|
||||
{
|
||||
@@ -1101,7 +1084,7 @@ VMWARERestore(ScrnInfoPtr pScrn)
|
||||
}
|
||||
|
||||
static Bool
|
||||
VMWAREModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
|
||||
VMWAREModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool rebuildPixmap)
|
||||
{
|
||||
vgaHWPtr hwp = VGAHWPTR(pScrn);
|
||||
vgaRegPtr vgaReg = &hwp->ModeReg;
|
||||
@@ -1140,6 +1123,20 @@ VMWAREModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
|
||||
VmwareLog(("fbSize: %u\n", pVMWARE->FbSize));
|
||||
VmwareLog(("New dispWidth: %u\n", pScrn->displayWidth));
|
||||
|
||||
if (rebuildPixmap) {
|
||||
pScrn->pScreen->ModifyPixmapHeader((*pScrn->pScreen->GetScreenPixmap)(pScrn->pScreen),
|
||||
pScrn->pScreen->width,
|
||||
pScrn->pScreen->height,
|
||||
pScrn->pScreen->rootDepth,
|
||||
pScrn->bitsPerPixel,
|
||||
PixmapBytePad(pScrn->displayWidth,
|
||||
pScrn->pScreen->rootDepth),
|
||||
(pointer)(pVMWARE->FbBase + pScrn->fbOffset));
|
||||
|
||||
(*pScrn->EnableDisableFBAccess)(pScrn->pScreen->myNum, FALSE);
|
||||
(*pScrn->EnableDisableFBAccess)(pScrn->pScreen->myNum, TRUE);
|
||||
}
|
||||
|
||||
vgaHWProtect(pScrn, FALSE);
|
||||
|
||||
/*
|
||||
@@ -1218,9 +1215,6 @@ VMWAREInitFIFO(ScrnInfoPtr pScrn)
|
||||
vmwareFIFO[SVGA_FIFO_NEXT_CMD] = min * sizeof(CARD32);
|
||||
vmwareFIFO[SVGA_FIFO_STOP] = min * sizeof(CARD32);
|
||||
vmwareWriteReg(pVMWARE, SVGA_REG_CONFIG_DONE, 1);
|
||||
|
||||
pVMWARE->hasPitchLockFIFOReg =
|
||||
extendedFifo && (vmwareFIFO[SVGA_FIFO_CAPABILITIES] & SVGA_FIFO_CAP_PITCHLOCK);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1252,8 +1246,6 @@ VMWARECloseScreen(int scrnIndex, ScreenPtr pScreen)
|
||||
vmwareXAACloseScreen(pScreen);
|
||||
}
|
||||
|
||||
vmwareSetPitchLock(pVMWARE, 0);
|
||||
|
||||
VMWARERestore(pScrn);
|
||||
VMWAREUnmapMem(pScrn);
|
||||
|
||||
@@ -1450,9 +1442,7 @@ VMWAREScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
|
||||
VMWAREInitFIFO(pScrn);
|
||||
|
||||
/* Initialise the first mode */
|
||||
VMWAREModeInit(pScrn, pScrn->currentMode);
|
||||
|
||||
vmwareSetPitchLock(pVMWARE, pVMWARE->fbPitch);
|
||||
VMWAREModeInit(pScrn, pScrn->currentMode, FALSE);
|
||||
|
||||
/* Set the viewport if supported */
|
||||
VMWAREAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
|
||||
@@ -1609,12 +1599,6 @@ VMWAREScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* The initial mode that fixes the framebuffer is the current mode
|
||||
* at ScreenInit time.
|
||||
*/
|
||||
pVMWARE->initialMode = pScrn->currentMode;
|
||||
|
||||
/*
|
||||
* We will lazily add the dynamic modes as the are needed when new
|
||||
* modes are requested through the control extension.
|
||||
@@ -1638,7 +1622,7 @@ VMWAREScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
|
||||
static Bool
|
||||
VMWARESwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
|
||||
{
|
||||
return VMWAREModeInit(xf86Screens[scrnIndex], mode);
|
||||
return VMWAREModeInit(xf86Screens[scrnIndex], mode, TRUE);
|
||||
}
|
||||
|
||||
static Bool
|
||||
@@ -1651,9 +1635,7 @@ VMWAREEnterVT(int scrnIndex, int flags)
|
||||
VMWAREInitFIFO(pScrn);
|
||||
}
|
||||
|
||||
vmwareSetPitchLock(pVMWARE, pVMWARE->fbPitch);
|
||||
|
||||
return VMWAREModeInit(pScrn, pScrn->currentMode);
|
||||
return VMWAREModeInit(pScrn, pScrn->currentMode, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1662,8 +1644,6 @@ VMWARELeaveVT(int scrnIndex, int flags)
|
||||
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
||||
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
|
||||
|
||||
vmwareSetPitchLock(pVMWARE, 0);
|
||||
|
||||
VMWARERestore(pScrn);
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,6 @@ typedef struct {
|
||||
VMWARERegRec SavedReg;
|
||||
VMWARERegRec ModeReg;
|
||||
|
||||
DisplayModePtr initialMode;
|
||||
DisplayModePtr dynMode1;
|
||||
DisplayModePtr dynMode2;
|
||||
|
||||
@@ -107,7 +106,6 @@ typedef struct {
|
||||
|
||||
unsigned char* mmioVirtBase;
|
||||
CARD32* vmwareFIFO;
|
||||
Bool hasPitchLockFIFOReg;
|
||||
|
||||
xf86CursorInfoPtr CursorInfoRec;
|
||||
struct {
|
||||
|
||||
@@ -113,18 +113,27 @@ VMwareCtrlQueryVersion(ClientPtr client)
|
||||
static Bool
|
||||
VMwareCtrlDoSetRes(ScrnInfoPtr pScrn,
|
||||
CARD32 x,
|
||||
CARD32 y)
|
||||
CARD32 y,
|
||||
Bool resetXinerama)
|
||||
{
|
||||
DisplayModePtr mode;
|
||||
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
|
||||
|
||||
|
||||
if (pScrn && pScrn->modes) {
|
||||
VmwareLog(("DoSetRes: %d %d\n", x, y));
|
||||
|
||||
if (resetXinerama) {
|
||||
xfree(pVMWARE->xineramaNextState);
|
||||
pVMWARE->xineramaNextState = NULL;
|
||||
pVMWARE->xineramaNextNumOutputs = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't resize larger than possible but don't
|
||||
* return an X Error either.
|
||||
*/
|
||||
if (x > pVMWARE->initialMode->HDisplay ||
|
||||
y > pVMWARE->initialMode->VDisplay) {
|
||||
if (x > pVMWARE->maxWidth ||
|
||||
y > pVMWARE->maxHeight) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -191,7 +200,7 @@ VMwareCtrlSetRes(ClientPtr client)
|
||||
return BadMatch;
|
||||
}
|
||||
|
||||
if (!VMwareCtrlDoSetRes(pScrn, stuff->x, stuff->y)) {
|
||||
if (!VMwareCtrlDoSetRes(pScrn, stuff->x, stuff->y, TRUE)) {
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
@@ -250,6 +259,8 @@ VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
|
||||
maxY = MAX(maxY, extents[i].y_org + extents[i].height);
|
||||
}
|
||||
|
||||
VmwareLog(("DoSetTopology: %d %d\n", maxX, maxY));
|
||||
|
||||
xineramaState = (VMWAREXineramaPtr)xcalloc(number, sizeof(VMWAREXineramaRec));
|
||||
if (xineramaState) {
|
||||
memcpy(xineramaState, extents, number * sizeof (VMWAREXineramaRec));
|
||||
@@ -258,7 +269,7 @@ VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
|
||||
pVMWARE->xineramaNextState = xineramaState;
|
||||
pVMWARE->xineramaNextNumOutputs = number;
|
||||
|
||||
return VMwareCtrlDoSetRes(pScrn, maxX, maxY);
|
||||
return VMwareCtrlDoSetRes(pScrn, maxX, maxY, FALSE);
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user