static void vrdpReportDirtyClip(PVBOXDISPDEV pDev, CLIPOBJ *pco, RECTL *prcl) { if (prcl) { vrdpReportDirtyRect(pDev, prcl); } else if (pco) { vrdpReportDirtyRect(pDev, &pco->rclBounds); } }
static void vrdpReportDirtyPathBounds(PVBOXDISPDEV pDev, CLIPOBJ *pco, PATHOBJ *ppo) { RECTFX rcfxBounds; RECTL rclBounds; PATHOBJ_vGetBounds(ppo, &rcfxBounds); rclBounds.left = FXTOLFLOOR(rcfxBounds.xLeft); rclBounds.right = FXTOLCEILING(rcfxBounds.xRight); rclBounds.top = FXTOLFLOOR(rcfxBounds.yTop); rclBounds.bottom = FXTOLCEILING(rcfxBounds.yBottom); vrdpIntersectRects(&rclBounds, &rclBounds, &pco->rclBounds); vrdpReportDirtyRect(pDev, &rclBounds); }
static void vrdpReportDirtyRects(PVBOXDISPDEV pDev, VRDPCLIPRECTS *pClipRects) { /* Ignore rects, report entire area. */ vrdpReportDirtyRect (pDev, &pClipRects->rclDst); }
/* Unlock previously locked surface */ DWORD APIENTRY VBoxDispDDUnlock(PDD_UNLOCKDATA lpUnlock) { PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpUnlock->lpDD->dhpdev; LOGF_ENTER(); DD_SURFACE_LOCAL *pSurf = lpUnlock->lpDDSurface; lpUnlock->ddRVal = DD_OK; #ifdef VBOX_WITH_VIDEOHWACCEL if(pDev->vhwa.bEnabled) { PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC) pSurf->lpGbl->dwReserved1; if (!pDesc) { WARN(("!pDesc, memory overwrite somewhere?")); lpUnlock->ddRVal = DDERR_GENERIC; return DDHAL_DRIVER_HANDLED; } if((pSurf->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && pDesc->UpdatedMemRegion.bValid /* && VBoxVBVABufferBeginUpdate(&pDev->vbvaCtx, &pDev->hgsmi.ctx)*/) { vbvaReportDirtyRect(pDev, &pDesc->UpdatedMemRegion.Rect); if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) { vrdpReset(pDev); pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents &= ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; } if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_VRDP) { vrdpReportDirtyRect(pDev, &pDesc->UpdatedMemRegion.Rect); } #if 0 VBoxVBVABufferEndUpdate(&pDev->vbvaCtx); #endif } else if ((pSurf->ddsCaps.dwCaps & DDSCAPS_VISIBLE) || ((pSurf->ddsCaps.dwCaps & DDSCAPS_OVERLAY) && pDesc->bVisible)) { VBOXVHWACMD *pCmd; pCmd = VBoxDispVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_UNLOCK, sizeof(VBOXVHWACMD_SURF_UNLOCK)); if(pCmd) { VBOXVHWACMD_SURF_UNLOCK *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_UNLOCK); memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_UNLOCK)); pBody->u.in.hSurf = pDesc->hHostHandle; if(pDesc->UpdatedMemRegion.bValid) { pBody->u.in.xUpdatedMemValid = 1; VBoxDispVHWAFromRECTL(&pBody->u.in.xUpdatedMemRect, &pDesc->UpdatedMemRegion.Rect); VBoxDispVHWARegionClear(&pDesc->UpdatedMemRegion); } VBoxDispVHWACommandSubmitAsynchAndComplete(pDev, pCmd); } else { WARN(("VBoxDispVHWACommandCreate failed!")); lpUnlock->ddRVal = DDERR_GENERIC; } } return DDHAL_DRIVER_NOTHANDLED; } #endif /*VBOX_WITH_VIDEOHWACCEL*/ if (pDev->ddpsLock.bLocked) { pDev->ddpsLock.bLocked = FALSE; if (pDev->hgsmi.bSupported /* && VBoxVBVABufferBeginUpdate(&pDev->vbvaCtx, &pDev->hgsmi.ctx)*/) { vbvaReportDirtyRect(pDev, &pDev->ddpsLock.rect); if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) { vrdpReset(pDev); pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents &= ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; } if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_VRDP) { vrdpReportDirtyRect(pDev, &pDev->ddpsLock.rect); } #if 0 VBoxVBVABufferEndUpdate(&pDev->vbvaCtx); #endif } } LOGF_LEAVE(); return DDHAL_DRIVER_NOTHANDLED; }