Changeset 38112 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm
- Timestamp:
- Jul 22, 2011 1:26:19 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 73064
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCm.cpp
r37734 r38112 29 29 } VBOXVIDEOCM_CMD_DR, *PVBOXVIDEOCM_CMD_DR; 30 30 31 typedef enum 32 { 33 VBOXVIDEOCM_CMD_CTL_KM_TYPE_POST_INVOKE = 1, 34 VBOXVIDEOCM_CMD_CTL_KM_TYPE_PRE_INVOKE, 35 VBOXVIDEOCM_CMD_CTL_KM_TYPE_DUMMY_32BIT = 0x7fffffff 36 } VBOXVIDEOCM_CMD_CTL_KM_TYPE; 37 38 typedef DECLCALLBACK(VOID) FNVBOXVIDEOCM_CMD_CB(PVBOXVIDEOCM_CTX pContext, struct VBOXVIDEOCM_CMD_CTL_KM *pCmd, PVOID pvContext); 39 typedef FNVBOXVIDEOCM_CMD_CB *PFNVBOXVIDEOCM_CMD_CB; 40 41 typedef struct VBOXVIDEOCM_CMD_CTL_KM 42 { 43 VBOXVIDEOCM_CMD_CTL_KM_TYPE enmType; 44 uint32_t u32Reserved; 45 PFNVBOXVIDEOCM_CMD_CB pfnCb; 46 PVOID pvCb; 47 } VBOXVIDEOCM_CMD_CTL_KM, *PVBOXVIDEOCM_CMD_CTL_KM; 48 31 49 AssertCompile(VBOXWDDM_ROUNDBOUND(RT_OFFSETOF(VBOXVIDEOCM_CMD_DR, CmdHdr), 8) == RT_OFFSETOF(VBOXVIDEOCM_CMD_DR, CmdHdr)); 32 50 … … 49 67 /* commands list */ 50 68 LIST_ENTRY CommandsList; 69 /* post process commands list */ 70 LIST_ENTRY PpCommandsList; 51 71 /* event used to notify UMD about pending commands */ 52 72 PKEVENT pUmEvent; … … 95 115 } 96 116 117 static PVBOXVIDEOCM_CMD_CTL_KM vboxVideoCmCmdCreateKm(PVBOXVIDEOCM_CTX pContext, VBOXVIDEOCM_CMD_CTL_KM_TYPE enmType, 118 PFNVBOXVIDEOCM_CMD_CB pfnCb, PVOID pvCb, 119 uint32_t cbSize) 120 { 121 PVBOXVIDEOCM_CMD_CTL_KM pCmd = (PVBOXVIDEOCM_CMD_CTL_KM)vboxVideoCmCmdCreate(pContext, cbSize + sizeof (*pCmd)); 122 pCmd->enmType = enmType; 123 pCmd->pfnCb = pfnCb; 124 pCmd->pvCb = pvCb; 125 PVBOXVIDEOCM_CMD_DR pHdr = VBOXVIDEOCM_HEAD(pCmd); 126 pHdr->CmdHdr.enmType = VBOXVIDEOCM_CMD_TYPE_CTL_KM; 127 return pCmd; 128 } 129 130 static DECLCALLBACK(VOID) vboxVideoCmCmdCbSetEventAndDereference(PVBOXVIDEOCM_CTX pContext, PVBOXVIDEOCM_CMD_CTL_KM pCmd, PVOID pvContext) 131 { 132 PKEVENT pEvent = (PKEVENT)pvContext; 133 KeSetEvent(pEvent, 0, FALSE); 134 ObDereferenceObject(pEvent); 135 vboxVideoCmCmdRelease(pCmd); 136 } 137 138 NTSTATUS vboxVideoCmCmdSubmitCompleteEvent(PVBOXVIDEOCM_CTX pContext, PKEVENT pEvent) 139 { 140 Assert(pEvent); 141 PVBOXVIDEOCM_CMD_CTL_KM pCmd = vboxVideoCmCmdCreateKm(pContext, VBOXVIDEOCM_CMD_CTL_KM_TYPE_POST_INVOKE, 142 vboxVideoCmCmdCbSetEventAndDereference, pEvent, 0); 143 if (!pCmd) 144 { 145 WARN(("vboxVideoCmCmdCreateKm failed")); 146 return STATUS_NO_MEMORY; 147 } 148 149 vboxVideoCmCmdSubmit(pCmd, VBOXVIDEOCM_SUBMITSIZE_DEFAULT); 150 151 return STATUS_SUCCESS; 152 } 153 97 154 DECLINLINE(void) vboxVideoCmCmdRetainByHdr(PVBOXVIDEOCM_CMD_DR pHdr) 98 155 { … … 162 219 } 163 220 164 NTSTATUS vboxVideoCmCmdVisit(PVBOXVIDEOCM_CTX pContext, BOOL bEntireSession, PFNVBOXVIDEOCMCMDVISITOR pfnVisitor, PVOID pvVisitor)221 NTSTATUS vboxVideoCmCmdVisit(PVBOXVIDEOCM_CTX pContext, BOOLEAN bEntireSession, PFNVBOXVIDEOCMCMDVISITOR pfnVisitor, PVOID pvVisitor) 165 222 { 166 223 PVBOXVIDEOCM_SESSION pSession = pContext->pSession; … … 179 236 if (bEntireSession || pHdr->pContext == pContext) 180 237 { 181 void * pvBody = VBOXVIDEOCM_BODY(pHdr, void); 182 UINT fRet = pfnVisitor(pHdr->pContext, pvBody, pHdr->CmdHdr.cbCmd, pvVisitor); 183 if (fRet & VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD) 238 if (pHdr->CmdHdr.enmType == VBOXVIDEOCM_CMD_TYPE_UM) 184 239 { 185 RemoveEntryList(&pHdr->QueueList); 240 void * pvBody = VBOXVIDEOCM_BODY(pHdr, void); 241 UINT fRet = pfnVisitor(pHdr->pContext, pvBody, pHdr->CmdHdr.cbCmd, pvVisitor); 242 if (fRet & VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD) 243 { 244 RemoveEntryList(&pHdr->QueueList); 245 } 246 if ((fRet & VBOXVIDEOCMCMDVISITOR_RETURN_BREAK)) 247 break; 186 248 } 187 if (!(fRet & VBOXVIDEOCMCMDVISITOR_RETURN_CONTINUE)) 188 break; 249 else 250 { 251 WARN(("non-um cmd on visit, skipping")); 252 } 189 253 } 190 254 } … … 231 295 Assert(IsListEmpty(&pSession->ContextList)); 232 296 Assert(IsListEmpty(&pSession->CommandsList)); 297 Assert(IsListEmpty(&pSession->PpCommandsList)); 233 298 RemoveEntryList(&pSession->QueueEntry); 234 299 vboxWddmMemFree(pSession); 235 300 } 236 301 302 static void vboxVideoCmSessionCtxPpList(PVBOXVIDEOCM_CTX pContext, PLIST_ENTRY pHead) 303 { 304 LIST_ENTRY *pCur; 305 for (pCur = pHead->Flink; pCur != pHead; pCur = pHead->Flink) 306 { 307 RemoveEntryList(pCur); 308 PVBOXVIDEOCM_CMD_DR pHdr = VBOXCMENTRY_2_CMD(pCur); 309 PVBOXVIDEOCM_CMD_CTL_KM pCmd = VBOXVIDEOCM_BODY(pHdr, VBOXVIDEOCM_CMD_CTL_KM); 310 pCmd->pfnCb(pContext, pCmd, pCmd->pvCb); 311 } 312 } 313 314 static void vboxVideoCmSessionCtxDetachCmdsLocked(PLIST_ENTRY pEntriesHead, PVBOXVIDEOCM_CTX pContext, PLIST_ENTRY pDstHead) 315 { 316 LIST_ENTRY *pCur; 317 LIST_ENTRY *pPrev; 318 pCur = pEntriesHead->Flink; 319 pPrev = pEntriesHead; 320 while (pCur != pEntriesHead) 321 { 322 PVBOXVIDEOCM_CMD_DR pCmd = VBOXCMENTRY_2_CMD(pCur); 323 if (pCmd->pContext == pContext) 324 { 325 RemoveEntryList(pCur); 326 InsertTailList(pDstHead, pCur); 327 pCur = pPrev; 328 /* pPrev - remains unchanged */ 329 } 330 else 331 { 332 pPrev = pCur; 333 } 334 pCur = pCur->Flink; 335 } 336 } 237 337 /** 238 338 * @return true iff the given session is destroyed … … 242 342 bool bDestroy; 243 343 LIST_ENTRY RemainedList; 344 LIST_ENTRY RemainedPpList; 244 345 LIST_ENTRY *pCur; 245 LIST_ENTRY *pPrev;246 346 InitializeListHead(&RemainedList); 347 InitializeListHead(&RemainedPpList); 247 348 Assert(KeGetCurrentIrql() < DISPATCH_LEVEL); 248 349 ExAcquireFastMutex(&pSession->Mutex); … … 254 355 { 255 356 vboxVideoLeDetach(&pSession->CommandsList, &RemainedList); 357 vboxVideoLeDetach(&pSession->PpCommandsList, &RemainedPpList); 256 358 } 257 359 else 258 360 { 259 pCur = pSession->CommandsList.Flink; 260 pPrev = &pSession->CommandsList; 261 while (pCur != &pSession->CommandsList) 262 { 263 PVBOXVIDEOCM_CMD_DR pCmd = VBOXCMENTRY_2_CMD(pCur); 264 if (pCmd->pContext == pContext) 265 { 266 RemoveEntryList(pCur); 267 InsertHeadList(&RemainedList, pCur); 268 pCur = pPrev; 269 /* pPrev - remains unchanged */ 270 } 271 else 272 { 273 pPrev = pCur; 274 } 275 pCur = pCur->Flink; 276 } 361 vboxVideoCmSessionCtxDetachCmdsLocked(&pSession->CommandsList, pContext, &RemainedList); 362 vboxVideoCmSessionCtxDetachCmdsLocked(&pSession->PpCommandsList, pContext, &RemainedPpList); 277 363 } 278 364 ExReleaseFastMutex(&pSession->Mutex); … … 284 370 vboxVideoCmCmdCancel(pCmd); 285 371 } 372 373 vboxVideoCmSessionCtxPpList(pContext, &RemainedPpList); 286 374 287 375 if (bDestroy) … … 303 391 InitializeListHead(&pSession->ContextList); 304 392 InitializeListHead(&pSession->CommandsList); 393 InitializeListHead(&pSession->PpCommandsList); 305 394 pSession->pUmEvent = pUmEvent; 306 395 Assert(KeGetCurrentIrql() < DISPATCH_LEVEL); … … 411 500 } 412 501 502 VOID vboxVideoCmProcessKm(PVBOXVIDEOCM_CTX pContext, PVBOXVIDEOCM_CMD_CTL_KM pCmd) 503 { 504 PVBOXVIDEOCM_SESSION pSession = pContext->pSession; 505 506 switch (pCmd->enmType) 507 { 508 case VBOXVIDEOCM_CMD_CTL_KM_TYPE_PRE_INVOKE: 509 { 510 pCmd->pfnCb(pContext, pCmd, pCmd->pvCb); 511 break; 512 } 513 514 case VBOXVIDEOCM_CMD_CTL_KM_TYPE_POST_INVOKE: 515 { 516 PVBOXVIDEOCM_CMD_DR pHdr = VBOXVIDEOCM_HEAD(pCmd); 517 ExAcquireFastMutex(&pSession->Mutex); 518 InsertTailList(&pSession->PpCommandsList, &pHdr->QueueList); 519 ExReleaseFastMutex(&pSession->Mutex); 520 break; 521 } 522 523 default: 524 { 525 WARN(("unsupported cmd type %d", pCmd->enmType)); 526 break; 527 } 528 } 529 } 530 413 531 NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd) 414 532 { … … 420 538 PVBOXVIDEOCM_CMD_DR pHdr; 421 539 LIST_ENTRY DetachedList; 540 LIST_ENTRY DetachedPpList; 422 541 PLIST_ENTRY pCurEntry = NULL; 423 542 uint32_t cbCmdsReturned = 0; … … 428 547 bool bDetachMode = true; 429 548 InitializeListHead(&DetachedList); 549 InitializeListHead(&DetachedPpList); 430 550 // PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR *pvCmd 431 551 432 552 Assert(KeGetCurrentIrql() < DISPATCH_LEVEL); 433 553 ExAcquireFastMutex(&pSession->Mutex); 554 555 vboxVideoCmSessionCtxDetachCmdsLocked(&pSession->PpCommandsList, pContext, &DetachedPpList); 434 556 435 557 do … … 442 564 pHdr = VBOXCMENTRY_2_CMD(pSession->CommandsList.Blink); 443 565 Assert(pHdr->CmdHdr.cbCmd); 444 if (cbData >= pHdr->CmdHdr.cbCmd) 566 uint32_t cbUserCmd = pHdr->CmdHdr.enmType == VBOXVIDEOCM_CMD_TYPE_UM ? pHdr->CmdHdr.cbCmd : 0; 567 if (cbData >= cbUserCmd) 445 568 { 446 569 RemoveEntryList(&pHdr->QueueList); 447 570 InsertHeadList(&DetachedList, &pHdr->QueueList); 448 cbData -= pHdr->CmdHdr.cbCmd;571 cbData -= cbUserCmd; 449 572 } 450 573 else 451 574 { 452 cbRemainingFirstCmd = pHdr->CmdHdr.cbCmd; 453 cbRemainingCmds = pHdr->CmdHdr.cbCmd; 575 Assert(cbUserCmd); 576 cbRemainingFirstCmd = cbUserCmd; 577 cbRemainingCmds = cbUserCmd; 454 578 pCurEntry = pHdr->QueueList.Blink; 455 579 bDetachMode = false; … … 468 592 { 469 593 pHdr = VBOXCMENTRY_2_CMD(pCurEntry); 594 uint32_t cbUserCmd = pHdr->CmdHdr.enmType == VBOXVIDEOCM_CMD_TYPE_UM ? pHdr->CmdHdr.cbCmd : 0; 470 595 Assert(cbRemainingFirstCmd); 471 cbRemainingCmds += pHdr->CmdHdr.cbCmd;596 cbRemainingCmds += cbUserCmd; 472 597 pCurEntry = pHdr->QueueList.Blink; 473 598 } … … 483 608 ExReleaseFastMutex(&pSession->Mutex); 484 609 610 vboxVideoCmSessionCtxPpList(pContext, &DetachedPpList); 611 485 612 pCmd->Hdr.cbCmdsReturned = 0; 486 613 for (pCurEntry = DetachedList.Blink; pCurEntry != &DetachedList; pCurEntry = DetachedList.Blink) 487 614 { 488 615 pHdr = VBOXCMENTRY_2_CMD(pCurEntry); 489 memcpy(pvData, &pHdr->CmdHdr, pHdr->CmdHdr.cbCmd);490 pvData += pHdr->CmdHdr.cbCmd;491 pCmd->Hdr.cbCmdsReturned += pHdr->CmdHdr.cbCmd;492 616 RemoveEntryList(pCurEntry); 493 vboxVideoCmCmdReleaseByHdr(pHdr); 617 switch (pHdr->CmdHdr.enmType) 618 { 619 case VBOXVIDEOCM_CMD_TYPE_UM: 620 { 621 memcpy(pvData, &pHdr->CmdHdr, pHdr->CmdHdr.cbCmd); 622 pvData += pHdr->CmdHdr.cbCmd; 623 pCmd->Hdr.cbCmdsReturned += pHdr->CmdHdr.cbCmd; 624 vboxVideoCmCmdReleaseByHdr(pHdr); 625 break; 626 } 627 628 case VBOXVIDEOCM_CMD_TYPE_CTL_KM: 629 { 630 vboxVideoCmProcessKm(pContext, VBOXVIDEOCM_BODY(pHdr, VBOXVIDEOCM_CMD_CTL_KM)); 631 break; 632 } 633 634 default: 635 { 636 WARN(("unsupported cmd type %d", pHdr->CmdHdr.enmType)); 637 break; 638 } 639 } 494 640 } 495 641 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCm.h
r37734 r38112 42 42 NTSTATUS vboxVideoCmTerm(PVBOXVIDEOCM_MGR pMgr); 43 43 44 NTSTATUS vboxVideoCmCmdSubmitCompleteEvent(PVBOXVIDEOCM_CTX pContext, PKEVENT pEvent); 44 45 void* vboxVideoCmCmdCreate(PVBOXVIDEOCM_CTX pContext, uint32_t cbSize); 45 46 void* vboxVideoCmCmdReinitForContext(void *pvCmd, PVBOXVIDEOCM_CTX pContext); … … 49 50 void vboxVideoCmCmdSubmit(void *pvCmd, uint32_t cbSize); 50 51 51 #define VBOXVIDEOCMCMDVISITOR_RETURN_ CONTINUE0x0000000152 #define VBOXVIDEOCMCMDVISITOR_RETURN_BREAK 0x00000001 52 53 #define VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD 0x00000002 53 54 typedef DECLCALLBACK(UINT) FNVBOXVIDEOCMCMDVISITOR(PVBOXVIDEOCM_CTX pContext, PVOID pvCmd, uint32_t cbCmd, PVOID pvVisitor); 54 55 typedef FNVBOXVIDEOCMCMDVISITOR *PFNVBOXVIDEOCMCMDVISITOR; 55 NTSTATUS vboxVideoCmCmdVisit(PVBOXVIDEOCM_CTX pContext, BOOL bEntireSession, PFNVBOXVIDEOCMCMDVISITOR pfnVisitor, PVOID pvVisitor);56 NTSTATUS vboxVideoCmCmdVisit(PVBOXVIDEOCM_CTX pContext, BOOLEAN bEntireSession, PFNVBOXVIDEOCMCMDVISITOR pfnVisitor, PVOID pvVisitor); 56 57 57 58 NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r37734 r38112 216 216 DECLINLINE(VOID) vboxWddmSwapchainRelease(PVBOXWDDM_SWAPCHAIN pSwapchain) 217 217 { 218 uint32_t cRefs = ASMAtomicDecU32(&pSwapchain->cRefs);218 const uint32_t cRefs = ASMAtomicDecU32(&pSwapchain->cRefs); 219 219 Assert(cRefs < UINT32_MAX/2); 220 220 if (!cRefs) 221 221 { 222 Assert(pSwapchain->pContext);223 if (pSwapchain->pContext)224 {225 NTSTATUS tmpStatus = vboxVdmaPostHideSwapchain(pSwapchain);226 Assert(tmpStatus == STATUS_SUCCESS);227 }228 222 vboxWddmMemFree(pSwapchain); 229 223 } … … 312 306 { 313 307 vboxWddmSwapchainAllocRemoveAllInternal(pDevExt, pSwapchain, TRUE); 308 309 Assert(pSwapchain->pContext); 310 if (pSwapchain->pContext) 311 { 312 NTSTATUS tmpStatus = vboxVdmaGgCmdCancel(pDevExt, pSwapchain->pContext, pSwapchain); 313 if (tmpStatus != STATUS_SUCCESS) 314 { 315 WARN(("vboxVdmaGgCmdCancel returned Status (0x%x)", tmpStatus)); 316 } 317 } 318 314 319 vboxWddmSwapchainRelease(pSwapchain); 315 320 } … … 397 402 return STATUS_INVALID_PARAMETER; 398 403 399 PVBOXWDDM_SWAPCHAIN pSwapchain ;404 PVBOXWDDM_SWAPCHAIN pSwapchain = NULL; 400 405 PVBOXWDDM_ALLOCATION *apAlloc = NULL; 401 if (pSwapchainInfo->SwapchainInfo.cAllocs) 402 { 403 apAlloc = (PVBOXWDDM_ALLOCATION *)vboxWddmMemAlloc(sizeof (PVBOXWDDM_ALLOCATION) * pSwapchainInfo->SwapchainInfo.cAllocs); 404 Assert(apAlloc); 405 if (!apAlloc) 406 return STATUS_NO_MEMORY; 407 for (UINT i = 0; i < pSwapchainInfo->SwapchainInfo.cAllocs; ++i) 408 { 409 DXGKARGCB_GETHANDLEDATA GhData; 410 GhData.hObject = pSwapchainInfo->SwapchainInfo.ahAllocs[i]; 411 GhData.Type = DXGK_HANDLE_ALLOCATION; 412 GhData.Flags.Value = 0; 413 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pDevExt->u.primary.DxgkInterface.DxgkCbGetHandleData(&GhData); 414 Assert(pAlloc); 415 if (!pAlloc) 416 return STATUS_INVALID_PARAMETER; 417 apAlloc[i] = pAlloc; 418 } 419 } 420 421 if (pSwapchainInfo->SwapchainInfo.hSwapchainKm) 422 { 423 ExAcquireFastMutex(&pDevExt->ContextMutex); 424 pSwapchain = (PVBOXWDDM_SWAPCHAIN)vboxWddmHTableGet(&pContext->Swapchains, (VBOXWDDM_HANDLE)pSwapchainInfo->SwapchainInfo.hSwapchainKm); 425 Assert(pSwapchain); 426 if (!pSwapchain) 427 { 428 ExReleaseFastMutex(&pDevExt->ContextMutex); 429 return STATUS_INVALID_PARAMETER; 430 } 431 Assert(pSwapchain->hSwapchainKm == pSwapchainInfo->SwapchainInfo.hSwapchainKm); 432 Assert(pSwapchain->pContext == pContext); 433 if (pSwapchain->pContext != pContext) 434 { 435 ExReleaseFastMutex(&pDevExt->ContextMutex); 436 return STATUS_INVALID_PARAMETER; 437 } 438 } 439 else if (pSwapchainInfo->SwapchainInfo.cAllocs) 440 { 441 pSwapchain = vboxWddmSwapchainCreate(); 442 if (!pSwapchain) 443 return STATUS_NO_MEMORY; 444 445 ExAcquireFastMutex(&pDevExt->ContextMutex); 446 BOOLEAN bRc = vboxWddmSwapchainCtxAddLocked(pDevExt, pContext, pSwapchain); 447 Assert(bRc); 448 } 449 else 450 return STATUS_INVALID_PARAMETER; 451 452 memset(&pSwapchain->ViewRect, 0, sizeof (pSwapchain->ViewRect)); 453 if (pSwapchain->pLastReportedRects) 454 { 455 vboxVideoCmCmdRelease(pSwapchain->pLastReportedRects); 456 pSwapchain->pLastReportedRects = NULL; 457 } 458 459 vboxWddmSwapchainAllocRemoveAll(pDevExt, pSwapchain); 460 461 if (pSwapchainInfo->SwapchainInfo.cAllocs) 462 { 463 for (UINT i = 0; i < pSwapchainInfo->SwapchainInfo.cAllocs; ++i) 464 { 465 vboxWddmSwapchainAllocAdd(pDevExt, pSwapchain, apAlloc[i]); 466 } 467 pSwapchain->hSwapchainUm = pSwapchainInfo->SwapchainInfo.hSwapchainUm; 468 } 469 else 470 { 471 vboxWddmSwapchainCtxRemoveLocked(pDevExt, pContext, pSwapchain); 472 } 473 474 ExReleaseFastMutex(&pDevExt->ContextMutex); 475 476 if (pSwapchainInfo->SwapchainInfo.cAllocs) 477 { 478 Assert(pSwapchain->pContext); 479 Assert(pSwapchain->hSwapchainKm); 480 pSwapchainInfo->SwapchainInfo.hSwapchainKm = pSwapchain->hSwapchainKm; 481 } 482 else 483 { 484 vboxWddmSwapchainDestroy(pDevExt, pSwapchain); 485 pSwapchainInfo->SwapchainInfo.hSwapchainKm = 0; 486 } 487 488 return STATUS_SUCCESS; 406 Assert(KeGetCurrentIrql() == PASSIVE_LEVEL); 407 NTSTATUS Status = STATUS_SUCCESS; 408 409 do { 410 if (pSwapchainInfo->SwapchainInfo.cAllocs) 411 { 412 apAlloc = (PVBOXWDDM_ALLOCATION *)vboxWddmMemAlloc(sizeof (PVBOXWDDM_ALLOCATION) * pSwapchainInfo->SwapchainInfo.cAllocs); 413 Assert(apAlloc); 414 if (!apAlloc) 415 { 416 Status = STATUS_NO_MEMORY; 417 break; 418 } 419 for (UINT i = 0; i < pSwapchainInfo->SwapchainInfo.cAllocs; ++i) 420 { 421 DXGKARGCB_GETHANDLEDATA GhData; 422 GhData.hObject = pSwapchainInfo->SwapchainInfo.ahAllocs[i]; 423 GhData.Type = DXGK_HANDLE_ALLOCATION; 424 GhData.Flags.Value = 0; 425 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pDevExt->u.primary.DxgkInterface.DxgkCbGetHandleData(&GhData); 426 Assert(pAlloc); 427 if (!pAlloc) 428 { 429 Status = STATUS_INVALID_PARAMETER; 430 break; 431 } 432 apAlloc[i] = pAlloc; 433 } 434 435 if (!NT_SUCCESS(Status)) 436 break; 437 } 438 439 if (pSwapchainInfo->SwapchainInfo.hSwapchainKm) 440 { 441 ExAcquireFastMutex(&pDevExt->ContextMutex); 442 pSwapchain = (PVBOXWDDM_SWAPCHAIN)vboxWddmHTableGet(&pContext->Swapchains, (VBOXWDDM_HANDLE)pSwapchainInfo->SwapchainInfo.hSwapchainKm); 443 Assert(pSwapchain); 444 if (!pSwapchain) 445 { 446 ExReleaseFastMutex(&pDevExt->ContextMutex); 447 Status = STATUS_INVALID_PARAMETER; 448 break; 449 } 450 Assert(pSwapchain->hSwapchainKm == pSwapchainInfo->SwapchainInfo.hSwapchainKm); 451 Assert(pSwapchain->pContext == pContext); 452 if (pSwapchain->pContext != pContext) 453 { 454 ExReleaseFastMutex(&pDevExt->ContextMutex); 455 Status = STATUS_INVALID_PARAMETER; 456 break; 457 } 458 } 459 else if (pSwapchainInfo->SwapchainInfo.cAllocs) 460 { 461 pSwapchain = vboxWddmSwapchainCreate(); 462 if (!pSwapchain) 463 { 464 Status = STATUS_NO_MEMORY; 465 break; 466 } 467 468 ExAcquireFastMutex(&pDevExt->ContextMutex); 469 BOOLEAN bRc = vboxWddmSwapchainCtxAddLocked(pDevExt, pContext, pSwapchain); 470 Assert(bRc); 471 } 472 else 473 { 474 Status = STATUS_INVALID_PARAMETER; 475 break; 476 } 477 478 memset(&pSwapchain->ViewRect, 0, sizeof (pSwapchain->ViewRect)); 479 if (pSwapchain->pLastReportedRects) 480 { 481 vboxVideoCmCmdRelease(pSwapchain->pLastReportedRects); 482 pSwapchain->pLastReportedRects = NULL; 483 } 484 485 vboxWddmSwapchainAllocRemoveAll(pDevExt, pSwapchain); 486 487 if (pSwapchainInfo->SwapchainInfo.cAllocs) 488 { 489 for (UINT i = 0; i < pSwapchainInfo->SwapchainInfo.cAllocs; ++i) 490 { 491 vboxWddmSwapchainAllocAdd(pDevExt, pSwapchain, apAlloc[i]); 492 } 493 pSwapchain->hSwapchainUm = pSwapchainInfo->SwapchainInfo.hSwapchainUm; 494 } 495 else 496 { 497 vboxWddmSwapchainCtxRemoveLocked(pDevExt, pContext, pSwapchain); 498 } 499 500 ExReleaseFastMutex(&pDevExt->ContextMutex); 501 502 if (pSwapchainInfo->SwapchainInfo.cAllocs) 503 { 504 Assert(pSwapchain->pContext); 505 Assert(pSwapchain->hSwapchainKm); 506 pSwapchainInfo->SwapchainInfo.hSwapchainKm = pSwapchain->hSwapchainKm; 507 } 508 else 509 { 510 vboxWddmSwapchainDestroy(pDevExt, pSwapchain); 511 pSwapchainInfo->SwapchainInfo.hSwapchainKm = 0; 512 } 513 514 Assert(Status == STATUS_SUCCESS); 515 } while (0); 516 517 /* cleanup */ 518 if (apAlloc) 519 vboxWddmMemFree(apAlloc); 520 521 return Status; 489 522 } 490 523 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
r37736 r38112 927 927 break; 928 928 } 929 929 930 default: 930 931 Assert(0); … … 1064 1065 1065 1066 return Status; 1067 } 1068 1069 static DECLCALLBACK(UINT) vboxVdmaGgCmdCancelVisitor(PVBOXVIDEOCM_CTX pContext, PVOID pvCmd, uint32_t cbCmd, PVOID pvVisitor) 1070 { 1071 PVBOXWDDM_SWAPCHAIN pSwapchain = (PVBOXWDDM_SWAPCHAIN)pvVisitor; 1072 if (!pSwapchain) 1073 return VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD; 1074 PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)pvCmd; 1075 if (pCmdInternal->hSwapchainUm == pSwapchain->hSwapchainUm) 1076 return VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD; 1077 return 0; 1066 1078 } 1067 1079 … … 1103 1115 break; 1104 1116 } 1117 case VBOXVDMAPIPE_CMD_TYPE_FINISH: 1118 { 1119 PVBOXVDMAPIPE_CMD_FINISH pCmd = (PVBOXVDMAPIPE_CMD_FINISH)pDr; 1120 PVBOXWDDM_CONTEXT pContext = pCmd->pContext; 1121 Assert(pCmd->pEvent); 1122 Status = vboxVideoCmCmdSubmitCompleteEvent(&pContext->CmContext, pCmd->pEvent); 1123 if (Status != STATUS_SUCCESS) 1124 { 1125 WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status)); 1126 } 1127 vboxVdmaGgCmdDestroy(pDevExt, &pCmd->Hdr); 1128 break; 1129 } 1130 case VBOXVDMAPIPE_CMD_TYPE_CANCEL: 1131 { 1132 PVBOXVDMAPIPE_CMD_CANCEL pCmd = (PVBOXVDMAPIPE_CMD_CANCEL)pDr; 1133 PVBOXWDDM_CONTEXT pContext = pCmd->pContext; 1134 Status = vboxVideoCmCmdVisit(&pContext->CmContext, FALSE, vboxVdmaGgCmdCancelVisitor, pCmd->pSwapchain); 1135 if (Status != STATUS_SUCCESS) 1136 { 1137 WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status)); 1138 } 1139 Assert(pCmd->pEvent); 1140 KeSetEvent(pCmd->pEvent, 0, FALSE); 1141 vboxVdmaGgCmdDestroy(pDevExt, &pCmd->Hdr); 1142 break; 1143 } 1105 1144 default: 1106 1145 AssertBreakpoint(); … … 1217 1256 #endif 1218 1257 vboxVdmaDdiCmdInit(pDdiCmd, u32NodeOrdinal, u32FenceId, pfnComplete, pvComplete); 1258 } 1259 1260 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent) 1261 { 1262 NTSTATUS Status = STATUS_SUCCESS; 1263 1264 PVBOXVDMAPIPE_CMD_FINISH pCmd = (PVBOXVDMAPIPE_CMD_FINISH)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_FINISH, sizeof (*pCmd)); 1265 if (pCmd) 1266 { 1267 pCmd->pContext = pContext; 1268 pCmd->pEvent = pEvent; 1269 Status = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr); 1270 if (!NT_SUCCESS(Status)) 1271 { 1272 WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status)); 1273 } 1274 } 1275 else 1276 { 1277 WARN(("vboxVdmaGgCmdCreate failed")); 1278 Status = STATUS_NO_MEMORY; 1279 } 1280 return Status; 1281 } 1282 1283 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain) 1284 { 1285 NTSTATUS Status = STATUS_SUCCESS; 1286 1287 PVBOXVDMAPIPE_CMD_CANCEL pCmd = (PVBOXVDMAPIPE_CMD_CANCEL)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_CANCEL, sizeof (*pCmd)); 1288 if (pCmd) 1289 { 1290 KEVENT Event; 1291 KeInitializeEvent(&Event, NotificationEvent, FALSE); 1292 pCmd->pContext = pContext; 1293 pCmd->pSwapchain = pSwapchain; 1294 pCmd->pEvent = &Event; 1295 Status = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr); 1296 if (NT_SUCCESS(Status)) 1297 { 1298 Status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); 1299 Assert(Status == STATUS_SUCCESS); 1300 } 1301 else 1302 { 1303 WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status)); 1304 } 1305 } 1306 else 1307 { 1308 WARN(("vboxVdmaGgCmdCreate failed")); 1309 Status = STATUS_NO_MEMORY; 1310 } 1311 return Status; 1219 1312 } 1220 1313 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h
r37626 r38112 161 161 VBOXVDMAPIPE_CMD_TYPE_UNDEFINED = 0, 162 162 VBOXVDMAPIPE_CMD_TYPE_RECTSINFO, 163 VBOXVDMAPIPE_CMD_TYPE_DMACMD 163 VBOXVDMAPIPE_CMD_TYPE_DMACMD, 164 VBOXVDMAPIPE_CMD_TYPE_FINISH, /* ensures all previously submitted commands are completed */ 165 VBOXVDMAPIPE_CMD_TYPE_CANCEL 164 166 } VBOXVDMAPIPE_CMD_TYPE; 165 167 … … 193 195 VBOXVDMAPIPE_RECTS ContextsRects; 194 196 } VBOXVDMAPIPE_CMD_RECTSINFO, *PVBOXVDMAPIPE_CMD_RECTSINFO; 197 198 typedef struct VBOXVDMAPIPE_CMD_FINISH 199 { 200 VBOXVDMAPIPE_CMD_DR Hdr; 201 PVBOXWDDM_CONTEXT pContext; 202 PKEVENT pEvent; 203 } VBOXVDMAPIPE_CMD_FINISH, *PVBOXVDMAPIPE_CMD_FINISH; 204 205 typedef struct VBOXVDMAPIPE_CMD_CANCEL 206 { 207 VBOXVDMAPIPE_CMD_DR Hdr; 208 PVBOXWDDM_CONTEXT pContext; 209 PVBOXWDDM_SWAPCHAIN pSwapchain; 210 PKEVENT pEvent; 211 } VBOXVDMAPIPE_CMD_CANCEL, *PVBOXVDMAPIPE_CMD_CANCEL; 195 212 196 213 typedef struct VBOXVDMAPIPE_FLAGS_DMACMD … … 313 330 PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd); 314 331 void vboxVdmaGgCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr); 332 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent); 333 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain); 315 334 316 335 NTSTATUS vboxVdmaPostHideSwapchain(PVBOXWDDM_SWAPCHAIN pSwapchain);
Note:
See TracChangeset
for help on using the changeset viewer.