/** * Initialise VirtualBox's accelerated video extensions. * * @returns TRUE on success, FALSE on failure */ static Bool vboxSetupVRAMVbva(ScrnInfoPtr pScrn, VBOXPtr pVBox) { int rc = VINF_SUCCESS; unsigned i; uint32_t offVRAMBaseMapping, offGuestHeapMemory, cbGuestHeapMemory; void *pvGuestHeapMemory; if (!pVBox->fHaveHGSMI) return FALSE; VBoxHGSMIGetBaseMappingInfo(pScrn->videoRam * 1024, &offVRAMBaseMapping, NULL, &offGuestHeapMemory, &cbGuestHeapMemory, NULL); pvGuestHeapMemory = ((uint8_t *)pVBox->base) + offVRAMBaseMapping + offGuestHeapMemory; TRACE_LOG("video RAM: %u KB, guest heap offset: 0x%x, cbGuestHeapMemory: %u\n", pScrn->videoRam, offVRAMBaseMapping + offGuestHeapMemory, cbGuestHeapMemory); rc = VBoxHGSMISetupGuestContext(&pVBox->guestCtx, pvGuestHeapMemory, cbGuestHeapMemory, offVRAMBaseMapping + offGuestHeapMemory, &g_hgsmiEnv); if (RT_FAILURE(rc)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to set up the guest-to-host communication context, rc=%d\n", rc); return FALSE; } pVBox->cbView = pVBox->cbFBMax = offVRAMBaseMapping; pVBox->cScreens = VBoxHGSMIGetMonitorCount(&pVBox->guestCtx); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Requested monitor count: %u\n", pVBox->cScreens); for (i = 0; i < pVBox->cScreens; ++i) { pVBox->cbFBMax -= VBVA_MIN_BUFFER_SIZE; pVBox->aoffVBVABuffer[i] = pVBox->cbFBMax; TRACE_LOG("VBVA buffer offset for screen %u: 0x%lx\n", i, (unsigned long) pVBox->cbFBMax); VBoxVBVASetupBufferContext(&pVBox->aVbvaCtx[i], pVBox->aoffVBVABuffer[i], VBVA_MIN_BUFFER_SIZE); } TRACE_LOG("Maximum framebuffer size: %lu (0x%lx)\n", (unsigned long) pVBox->cbFBMax, (unsigned long) pVBox->cbFBMax); rc = VBoxHGSMISendViewInfo(&pVBox->guestCtx, pVBox->cScreens, vboxFillViewInfo, (void *)pVBox); if (RT_FAILURE(rc)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to send the view information to the host, rc=%d\n", rc); return FALSE; } return TRUE; }
/** * Initialise VirtualBox's accelerated video extensions. * * @returns TRUE on success, FALSE on failure */ static Bool vboxSetupVRAMVbva(VBOXPtr pVBox) { int rc = VINF_SUCCESS; unsigned i; pVBox->cbFBMax = pVBox->cbView; for (i = 0; i < pVBox->cScreens; ++i) { pVBox->cbFBMax -= VBVA_MIN_BUFFER_SIZE; pVBox->pScreens[i].aoffVBVABuffer = pVBox->cbFBMax; TRACE_LOG("VBVA buffer offset for screen %u: 0x%lx\n", i, (unsigned long) pVBox->cbFBMax); VBoxVBVASetupBufferContext(&pVBox->pScreens[i].aVbvaCtx, pVBox->pScreens[i].aoffVBVABuffer, VBVA_MIN_BUFFER_SIZE); } TRACE_LOG("Maximum framebuffer size: %lu (0x%lx)\n", (unsigned long) pVBox->cbFBMax, (unsigned long) pVBox->cbFBMax); rc = VBoxHGSMISendViewInfo(&pVBox->guestCtx, pVBox->cScreens, vboxFillViewInfo, (void *)pVBox); VBVXASSERT(RT_SUCCESS(rc), ("Failed to send the view information to the host, rc=%d\n", rc)); return TRUE; }
int vboxVbvaCreate(PVBOXMP_DEVEXT pDevExt, VBOXVBVAINFO *pVbva, ULONG offBuffer, ULONG cbBuffer, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) { memset(pVbva, 0, sizeof(VBOXVBVAINFO)); KeInitializeSpinLock(&pVbva->Lock); int rc = VBoxMPCmnMapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt), (void**)&pVbva->Vbva.pVBVA, offBuffer, cbBuffer); if (RT_SUCCESS(rc)) { Assert(pVbva->Vbva.pVBVA); VBoxVBVASetupBufferContext(&pVbva->Vbva, offBuffer, cbBuffer); pVbva->srcId = srcId; } else { WARN(("VBoxMPCmnMapAdapterMemory failed rc %d", rc)); } return rc; }