int vboxVhwaHlpOverlayCreate(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, DXGK_OVERLAYINFO *pOverlayInfo, /* OUT */ PVBOXWDDM_OVERLAY pOverlay) { int rc = vboxVhwaHlpCheckInit(pDevExt, VidPnSourceId); AssertRC(rc); if (RT_SUCCESS(rc)) { PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pOverlayInfo->hAllocation; PVBOXWDDM_RESOURCE pRc = pAlloc->pResource; Assert(pRc); for (uint32_t i = 0; i < pRc->cAllocations; ++i) { PVBOXWDDM_ALLOCATION pCurAlloc = &pRc->aAllocations[i]; rc = vboxVhwaHlpCreateSurface(pDevExt, pCurAlloc, 0, pRc->cAllocations - 1, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX, VidPnSourceId); AssertRC(rc); if (!RT_SUCCESS(rc)) { int tmpRc; for (uint32_t j = 0; j < i; ++j) { PVBOXWDDM_ALLOCATION pDestroyAlloc = &pRc->aAllocations[j]; tmpRc = vboxVhwaHlpDestroySurface(pDevExt, pDestroyAlloc, VidPnSourceId); AssertRC(tmpRc); } break; } } if (RT_SUCCESS(rc)) { pOverlay->pDevExt = pDevExt; pOverlay->pResource = pRc; pOverlay->VidPnSourceId = VidPnSourceId; vboxVhwaHlpOverlayListAdd(pDevExt, pOverlay); RECT DstRect; vboxVhwaHlpOverlayDstRectGet(pDevExt, pOverlay, &DstRect); rc = vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo, DstRect.right ? &DstRect : NULL); if (!RT_SUCCESS(rc)) { int tmpRc = vboxVhwaHlpOverlayDestroy(pOverlay); AssertRC(tmpRc); } } if (RT_FAILURE(rc)) { int tmpRc = vboxVhwaHlpCheckTerm(pDevExt, VidPnSourceId); AssertRC(tmpRc); AssertRC(rc); } } return rc; }
int vboxVhwaHlpOverlayDestroy(PVBOXWDDM_OVERLAY pOverlay) { int rc = VINF_SUCCESS; vboxVhwaHlpOverlayListRemove(pOverlay->pDevExt, pOverlay); for (uint32_t i = 0; i < pOverlay->pResource->cAllocations; ++i) { PVBOXWDDM_ALLOCATION pCurAlloc = &pOverlay->pResource->aAllocations[i]; rc = vboxVhwaHlpDestroySurface(pOverlay->pDevExt, pCurAlloc, pOverlay->VidPnSourceId); AssertRC(rc); } if (RT_SUCCESS(rc)) { int tmpRc = vboxVhwaHlpCheckTerm(pOverlay->pDevExt, pOverlay->VidPnSourceId); AssertRC(tmpRc); } return rc; }