/** * Inform VBox that we will stop supplying it with dirty rectangle * information. This function is intended to be called when an X * virtual terminal is disabled, or the X server is terminated. * * @returns TRUE for success, FALSE for failure * @param pScrn Pointer to a structure describing the X screen in use */ void vboxDisableVbva(ScrnInfoPtr pScrn) { unsigned i; VBOXPtr pVBox = pScrn->driverPrivate; TRACE_ENTRY(); for (i = 0; i < pVBox->cScreens; ++i) VBoxVBVADisable(&pVBox->pScreens[i].aVbvaCtx, &pVBox->guestCtx, i); }
/** * Inform VBox that we will stop supplying it with dirty rectangle * information. This function is intended to be called when an X * virtual terminal is disabled, or the X server is terminated. * * @returns TRUE for success, FALSE for failure * @param pScrn Pointer to a structure describing the X screen in use */ void vboxDisableVbva(ScrnInfoPtr pScrn) { int rc; int scrnIndex = pScrn->scrnIndex; unsigned i; VBOXPtr pVBox = pScrn->driverPrivate; TRACE_ENTRY(); if (!pVBox->fHaveHGSMI) /* Ths function should not have been called */ return; for (i = 0; i < pVBox->cScreens; ++i) VBoxVBVADisable(&pVBox->aVbvaCtx[i], &pVBox->guestCtx, i); }
/* * Public hardware buffer methods. */ RTDECL(bool) VBoxVBVAEnable(PVBVABUFFERCONTEXT pCtx, PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, VBVABUFFER *pVBVA, int32_t cScreen) { bool bRc = false; LogFlowFunc(("pVBVA %p\n", pVBVA)); #if 0 /* All callers check this */ if (ppdev->bHGSMISupported) #endif { LogFunc(("pVBVA %p vbva off 0x%x\n", pVBVA, pCtx->offVRAMBuffer)); pVBVA->hostFlags.u32HostEvents = 0; pVBVA->hostFlags.u32SupportedOrders = 0; pVBVA->off32Data = 0; pVBVA->off32Free = 0; memset(pVBVA->aRecords, 0, sizeof (pVBVA->aRecords)); pVBVA->indexRecordFirst = 0; pVBVA->indexRecordFree = 0; pVBVA->cbPartialWriteThreshold = 256; pVBVA->cbData = pCtx->cbBuffer - sizeof (VBVABUFFER) + sizeof (pVBVA->au8Data); pCtx->fHwBufferOverflow = false; pCtx->pRecord = NULL; pCtx->pVBVA = pVBVA; bRc = vboxVBVAInformHost(pCtx, pHGSMICtx, cScreen, true); } if (!bRc) { VBoxVBVADisable(pCtx, pHGSMICtx, cScreen); } return bRc; }
/* Called to reset device to default mode or to mode specified with dhpdev */ BOOL APIENTRY VBoxDispDrvAssertMode(DHPDEV dhpdev, BOOL bEnable) { PVBOXDISPDEV pDev = (PVBOXDISPDEV) dhpdev; DWORD dwrc; int rc; LOGF_ENTER(); if (!bEnable) { LOGF(("!bEnable")); #ifdef VBOX_WITH_VIDEOHWACCEL /* tells we can not process host commands any more and ensures that * we've completed processing of the host VHWA commands */ VBoxDispVHWADisable(pDev); #endif /* disable VBVA */ if (pDev->hgsmi.bSupported) { VBoxVBVADisable(&pDev->vbvaCtx, &pDev->hgsmi.ctx, -1); } /* reset the device to default mode */ rc = VBoxDispMPResetDevice(pDev->hDriver); VBOX_WARNRC_RETV(rc, FALSE); } else { LOGF(("bEnable")); /* switch device to previous pDev mode */ rc = VBoxDispMPSetCurrentMode(pDev->hDriver, pDev->mode.ulIndex); VBOX_WARNRC_RETV(rc, NULL); /* enable VBVA */ if (pDev->hgsmi.bSupported) { if (pDev->mode.ulBitsPerPel==16 || pDev->mode.ulBitsPerPel==24 || pDev->mode.ulBitsPerPel==32) { VBVABUFFER *pVBVA = (VBVABUFFER *)((uint8_t *)pDev->memInfo.VideoRamBase+pDev->layout.offVBVABuffer); pDev->hgsmi.bSupported = VBoxVBVAEnable(&pDev->vbvaCtx, &pDev->hgsmi.ctx, pVBVA, -1); LogRel(("VBoxDisp[%d]: VBVA %senabled\n", pDev->iDevice, pDev->hgsmi.bSupported? "":"not ")); } } /* inform host */ if (pDev->hgsmi.bSupported) { VBoxHGSMIProcessDisplayInfo(&pDev->hgsmi.ctx, pDev->iDevice, pDev->orgDev.x, pDev->orgDev.y, 0, abs(pDev->mode.lScanlineStride), pDev->mode.ulWidth, pDev->mode.ulHeight, (uint16_t)pDev->mode.ulBitsPerPel, VBVA_SCREEN_F_ACTIVE); } #ifdef VBOX_WITH_VIDEOHWACCEL /* tells we can process host commands */ VBoxDispVHWAEnable(pDev); #endif /* Associate back GDI bitmap residing in our framebuffer memory with GDI's handle to our device */ dwrc = EngAssociateSurface((HSURF)pDev->surface.hBitmap, pDev->hDevGDI, 0); if (dwrc != NO_ERROR) { WARN(("EngAssociateSurface on bitmap failed with %#x", dwrc)); return FALSE; } /* Associate device managed surface with GDI's handle to our device */ dwrc = EngAssociateSurface(pDev->surface.hSurface, pDev->hDevGDI, pDev->flDrawingHooks); if (dwrc != NO_ERROR) { WARN(("EngAssociateSurface on surface failed with %#x", dwrc)); return FALSE; } } LOGF_LEAVE(); return TRUE; }
int vboxVbvaDisable (PVBOXMP_DEVEXT pDevExt, VBOXVBVAINFO *pVbva) { VBoxVBVADisable(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, pVbva->srcId); return VINF_SUCCESS; }