DECLCALLBACK(void) iface_VideoAccelFlush(PPDMIVMMDEVCONNECTOR pInterface) { PDRVMAINVMMDEV pDrv = PDMIVMMDEVCONNECTOR_2_MAINVMMDEV(pInterface); Console *pConsole = pDrv->pVMMDev->getParent(); Display *display = pConsole->getDisplay(); if (display) { LogSunlover(("MAIN::VMMDevInterface::iface_VideoAccelFlush\n")); display->VideoAccelFlush (); } }
/** * Periodic display refresh callback. * * @param pInterface Display connector. */ DECLCALLBACK(void) Display::displayRefreshCallback(PPDMIDISPLAYCONNECTOR pInterface) { PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface); /* Contrary to displayUpdateCallback and displayResizeCallback * the framebuffer lock must be taken since the function * pointed to by pDrv->pUpPort->pfnUpdateDisplay is unaware * of any locking issues. */ Display *pDisplay = pDrv->pDisplay; uint32_t u32ResizeStatus = pDisplay->mu32ResizeStatus; if (u32ResizeStatus == ResizeStatus_UpdateDisplayData) { #ifdef DEBUG_sunlover LogFlowFunc (("ResizeStatus_UpdateDisplayData\n")); #endif /* DEBUG_sunlover */ /* The framebuffer was resized and display data need to be updated. */ pDisplay->handleResizeCompletedEMT (); /* Continue with normal processing because the status here is ResizeStatus_Void. */ Assert (pDisplay->mu32ResizeStatus == ResizeStatus_Void); /* Repaint the display because VM continued to run during the framebuffer resize. */ pDrv->pUpPort->pfnUpdateDisplayAll(pDrv->pUpPort); /* Ignore the refresh to replay the logic. */ return; } else if (u32ResizeStatus == ResizeStatus_InProgress) { #ifdef DEBUG_sunlover LogFlowFunc (("ResizeStatus_InProcess\n")); #endif /* DEBUG_sunlover */ /* The framebuffer is being resized. Do not call the VGA device back. Immediately return. */ return; } if (pDisplay->mfPendingVideoAccelEnable) { /* Acceleration was enabled while machine was not yet running * due to restoring from saved state. Update entire display and * actually enable acceleration. */ Assert(pDisplay->mpPendingVbvaMemory); /* Acceleration can not be yet enabled.*/ Assert(pDisplay->mpVbvaMemory == NULL); Assert(!pDisplay->mfVideoAccelEnabled); if (pDisplay->mfMachineRunning) { pDisplay->VideoAccelEnable (pDisplay->mfPendingVideoAccelEnable, pDisplay->mpPendingVbvaMemory); /* Reset the pending state. */ pDisplay->mfPendingVideoAccelEnable = false; pDisplay->mpPendingVbvaMemory = NULL; } } else { Assert(pDisplay->mpPendingVbvaMemory == NULL); if (pDisplay->mfVideoAccelEnabled) { Assert(pDisplay->mpVbvaMemory); pDisplay->VideoAccelFlush (); } else { Assert(pDrv->Connector.pu8Data); pDisplay->mFramebuffer->Lock(); pDrv->pUpPort->pfnUpdateDisplay(pDrv->pUpPort); pDisplay->mFramebuffer->Unlock(); } } }