Changeset 50628 in vbox
- Timestamp:
- Feb 27, 2014 12:39:15 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 92510
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
r49449 r50628 267 267 { 268 268 HRESULT hr = S_OK; 269 if (pData->cAllocationList && pData->cPatchLocationList && pData->cbCommandBuffer > 4) 269 Assert(pAlloc->fEverWritten || pAlloc->pRc->RcDesc.fFlags.SharedResource); 270 if (pData->cAllocationList && pData->cPatchLocationList && pData->cbCommandBuffer >= 4) 270 271 { 271 272 memset(pData->pAllocationList, 0, sizeof (D3DDDI_ALLOCATIONLIST)); … … 294 295 } 295 296 296 static BOOLEAN vboxWddmDalCheckRemove(PVBOXWDDMDISP_DEVICE pDevice,PVBOXWDDMDISP_ALLOCATION pAlloc)297 { 298 BOOLEAN fRemoved = FALSE;299 300 if (pAlloc->DirtyAllocListEntry.pNext) 301 { 302 RTListNodeRemove(&pAlloc->DirtyAllocListEntry); 303 pAlloc->fDirtyWrite = FALSE; 304 fRemoved = TRUE; 305 }306 307 return fRemoved;308 } 297 static VOID vboxWddmDalRemove(PVBOXWDDMDISP_ALLOCATION pAlloc) 298 { 299 RTListNodeRemove(&pAlloc->DirtyAllocListEntry); 300 pAlloc->fDirtyWrite = FALSE; 301 } 302 303 #ifdef DEBUG_misha 304 typedef struct VBOXWDDM_DBG_ALLOC 305 { 306 BOOLEAN fWrite; 307 PVBOXWDDMDISP_ALLOCATION pAlloc; 308 } VBOXWDDM_DBG_ALLOC; 309 #endif 309 310 310 311 static HRESULT vboxWddmDalNotifyChange(PVBOXWDDMDISP_DEVICE pDevice) … … 312 313 VBOXWDDMDISP_NSCADD NscAdd; 313 314 BOOL bReinitRenderData = TRUE; 315 #ifdef DEBUG_misha 316 uint32_t cDbgAllocs = 0; 317 VBOXWDDM_DBG_ALLOC aDbgAllocs[128]; 318 #endif 314 319 315 320 do … … 333 338 NscAdd.cbCommandBuffer -= sizeof (*pHdr); 334 339 bReinitRenderData = FALSE; 340 341 #ifdef DEBUG_misha 342 { 343 memset(aDbgAllocs, 0, sizeof (aDbgAllocs)); 344 PVBOXWDDMDISP_ALLOCATION pAlloc; 345 uint32_t cAllocs = 0; 346 RTListForEach(&pDevice->DirtyAllocList, pAlloc, VBOXWDDMDISP_ALLOCATION, DirtyAllocListEntry) 347 { 348 Assert(pAlloc->fEverWritten || pAlloc->pRc->RcDesc.fFlags.SharedResource); 349 if (cAllocs < RT_ELEMENTS(aDbgAllocs)) 350 { 351 aDbgAllocs[cAllocs].pAlloc = pAlloc; 352 aDbgAllocs[cAllocs].fWrite = pAlloc->fDirtyWrite; 353 ++cDbgAllocs; 354 } 355 ++cAllocs; 356 } 357 } 358 #endif 335 359 } 336 360 … … 339 363 { 340 364 HRESULT tmpHr = vboxWddmNSCAddAlloc(&NscAdd, pAlloc); 365 #ifdef DEBUG_misha 366 Assert(tmpHr == S_OK); 367 #endif 341 368 Assert(tmpHr == S_OK || tmpHr == S_FALSE); 342 369 if (tmpHr == S_OK) 343 370 { 344 vboxWddmDal CheckRemove(pDevice,pAlloc);371 vboxWddmDalRemove(pAlloc); 345 372 continue; 346 373 } … … 385 412 } 386 413 387 //#define VBOX_WDDM_SHRC_WO_NOTIFY 414 #ifdef VBOXWDDMDISP_DAL_CHECK_LOCK 415 static HRESULT vboxWddmDalCheckUnlock(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc) 416 { 417 if (!pAlloc->fAllocLocked || pAlloc->LockInfo.cLocks) 418 return S_OK; 419 420 Assert(pAlloc->hAllocation); 421 422 D3DDDICB_UNLOCK Unlock; 423 424 Unlock.NumAllocations = 1; 425 Unlock.phAllocations = &pAlloc->hAllocation; 426 427 HRESULT hr = pDevice->RtCallbacks.pfnUnlockCb(pDevice->hDevice, &Unlock); 428 if(hr != S_OK) 429 { 430 WARN(("pfnUnlockCb failed, hr %#x", hr)); 431 } 432 433 return hr; 434 } 435 436 static HRESULT vboxWddmDalCheckLock(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc, D3DDDI_LOCKFLAGS Flags) 437 { 438 if (!pAlloc->hAllocation || pAlloc->fAllocLocked) 439 return S_OK; 440 441 HRESULT hr; 442 443 if (pAlloc->fDirtyWrite) 444 { 445 Assert(pAlloc->DirtyAllocListEntry.pNext); 446 hr = vboxWddmDalNotifyChange(pDevice); 447 if (hr == S_OK) 448 { 449 Assert(!pAlloc->DirtyAllocListEntry.pNext); 450 } 451 else 452 { 453 WARN(("vboxWddmDalNotifyChange failed %#x, ignoring", hr)); 454 } 455 } 456 457 D3DDDICB_LOCK LockData; 458 LockData.hAllocation = pAlloc->hAllocation; 459 LockData.PrivateDriverData = 0; 460 LockData.NumPages = 0; 461 LockData.pPages = NULL; 462 LockData.pData = NULL; /* out */ 463 LockData.Flags.Value = 0; 464 LockData.Flags.Discard = Flags.Discard; 465 LockData.Flags.DonotWait = Flags.DoNotWait; 466 467 hr = pDevice->RtCallbacks.pfnLockCb(pDevice->hDevice, &LockData); 468 if (hr == S_OK) 469 { 470 if (!Flags.ReadOnly) 471 pAlloc->fEverWritten = TRUE; 472 pAlloc->fAllocLocked = TRUE; 473 return S_OK; 474 } 475 476 WARN(("pfnLockCb failed %#x, Flags %#x", hr, Flags.Value)); 477 478 return hr; 479 } 480 #endif 481 482 static BOOLEAN vboxWddmDalCheckNotifyRemove(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc) 483 { 484 if (pAlloc->DirtyAllocListEntry.pNext) 485 { 486 HRESULT hr = vboxWddmDalNotifyChange(pDevice); 487 if (hr == S_OK) 488 { 489 Assert(!pAlloc->DirtyAllocListEntry.pNext); 490 } 491 else 492 { 493 WARN(("vboxWddmDalNotifyChange failed %#x", hr)); 494 if (pAlloc->DirtyAllocListEntry.pNext) 495 vboxWddmDalRemove(pAlloc); 496 } 497 498 return TRUE; 499 } 500 501 return FALSE; 502 } 503 388 504 static BOOLEAN vboxWddmDalCheckAdd(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc, BOOLEAN fWrite) 389 505 { 390 506 if (!pAlloc->hAllocation /* only shared resources matter */ 391 #ifdef VBOX_WDDM_SHRC_WO_NOTIFY 392 || !fWrite /* only write op matter */ 393 #endif 507 || (/*!fWrite &&*/ !pAlloc->hSharedHandle) 394 508 ) 395 509 { 396 #ifdef VBOX_WDDM_SHRC_WO_NOTIFY 397 Assert(!pAlloc->DirtyAllocListEntry.pNext || (!fWrite && pAlloc->hSharedHandle && pAlloc->fDirtyWrite)); 398 #else 399 Assert(!pAlloc->DirtyAllocListEntry.pNext); 400 #endif 510 Assert(!pAlloc->DirtyAllocListEntry.pNext || pAlloc->hSharedHandle /*|| pAlloc->fDirtyWrite*/); 511 401 512 Assert(!pAlloc->hSharedHandle); 402 513 403 514 return FALSE; 404 515 } 516 517 Assert(fWrite || pAlloc->fEverWritten || pAlloc->pRc->RcDesc.fFlags.SharedResource); 405 518 406 519 if (!pAlloc->DirtyAllocListEntry.pNext) … … 409 522 RTListAppend(&pDevice->DirtyAllocList, &pAlloc->DirtyAllocListEntry); 410 523 } 524 else 525 { 526 Assert(pAlloc->fDirtyWrite == fWrite); 527 } 411 528 pAlloc->fDirtyWrite |= fWrite; 529 pAlloc->fEverWritten |= fWrite; 412 530 413 531 return TRUE; … … 425 543 } 426 544 427 static VOID vboxWddmDalCheckAddRtsSamplers(PVBOXWDDMDISP_DEVICE pDevice) 545 static VOID vboxWddmDalCheckAddDepthStencil(PVBOXWDDMDISP_DEVICE pDevice) 546 { 547 if (pDevice->pDepthStencilRc) 548 vboxWddmDalCheckAddRc(pDevice, pDevice->pDepthStencilRc, TRUE); 549 } 550 551 static VOID vboxWddmDalCheckAddRTs(PVBOXWDDMDISP_DEVICE pDevice) 428 552 { 429 553 for (UINT i = 0; i < pDevice->cRTs; ++i) … … 434 558 } 435 559 } 436 560 } 561 562 static VOID vboxWddmDalCheckAddSamplers(PVBOXWDDMDISP_DEVICE pDevice) 563 { 437 564 for (UINT i = 0, iSampler = 0; iSampler < pDevice->cSamplerTextures; ++i) 438 565 { … … 442 569 ++iSampler; 443 570 } 571 } 572 573 static VOID vboxWddmDalCheckAddOnDraw(PVBOXWDDMDISP_DEVICE pDevice) 574 { 575 vboxWddmDalCheckAddRTs(pDevice); 576 577 vboxWddmDalCheckAddDepthStencil(pDevice); 578 579 vboxWddmDalCheckAddSamplers(pDevice); 580 } 581 582 static BOOLEAN vboxWddmDalIsEmpty(PVBOXWDDMDISP_DEVICE pDevice) 583 { 584 return RTListIsEmpty(&pDevice->DirtyAllocList); 444 585 } 445 586 … … 2508 2649 } 2509 2650 2510 vboxWddmDalCheckAdd RtsSamplers(pDevice);2651 vboxWddmDalCheckAddOnDraw(pDevice); 2511 2652 2512 2653 VBOXVDBG_DUMP_DRAWPRIM_LEAVE(pDevice); … … 2639 2780 } 2640 2781 2641 vboxWddmDalCheckAdd RtsSamplers(pDevice);2782 vboxWddmDalCheckAddOnDraw(pDevice); 2642 2783 2643 2784 VBOXVDBG_DUMP_DRAWPRIM_LEAVE(pDevice); … … 2655 2796 VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice); 2656 2797 Assert(0); 2657 vboxWddmDalCheckAdd RtsSamplers(pDevice);2798 vboxWddmDalCheckAddOnDraw(pDevice); 2658 2799 vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice)); 2659 2800 return E_FAIL; … … 2668 2809 VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice); 2669 2810 Assert(0); 2670 vboxWddmDalCheckAdd RtsSamplers(pDevice);2811 vboxWddmDalCheckAddOnDraw(pDevice); 2671 2812 vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice)); 2672 2813 return E_FAIL; … … 2761 2902 #endif 2762 2903 2763 vboxWddmDalCheckAdd RtsSamplers(pDevice);2904 vboxWddmDalCheckAddOnDraw(pDevice); 2764 2905 2765 2906 VBOXVDBG_DUMP_DRAWPRIM_LEAVE(pDevice); … … 2845 2986 } 2846 2987 2847 vboxWddmDalCheckAdd RtsSamplers(pDevice);2988 vboxWddmDalCheckAddOnDraw(pDevice); 2848 2989 vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice)); 2849 2990 return hr; … … 3035 3176 pData->FillDepth, 3036 3177 pData->FillStencil); 3037 Assert(hr == S_OK); 3178 if (SUCCEEDED(hr)) 3179 { 3180 if (pData->Flags & D3DCLEAR_TARGET) 3181 vboxWddmDalCheckAddRTs(pDevice); 3182 if ((pData->Flags & D3DCLEAR_STENCIL) 3183 || (pData->Flags & D3DCLEAR_ZBUFFER)) 3184 vboxWddmDalCheckAddDepthStencil(pDevice); 3185 } 3186 else 3187 WARN(("Clear failed %#x", hr)); 3188 3038 3189 vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr)); 3039 3190 return hr; … … 3250 3401 VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice); 3251 3402 PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hResource; 3252 Assert(pData->SubResourceIndex < pRc->cAllocations);3253 3403 if (pData->SubResourceIndex >= pRc->cAllocations) 3254 3404 return E_INVALIDARG; 3405 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex]; 3406 Assert(pData->SubResourceIndex < pRc->cAllocations); 3255 3407 3256 3408 HRESULT hr = S_OK; … … 3259 3411 { 3260 3412 // Assert(pRc != pScreen->pRenderTargetRc || pScreen->iRenderTargetFrontBuf != pData->SubResourceIndex); 3413 #ifdef VBOXWDDMDISP_DAL_CHECK_LOCK 3414 hr = vboxWddmDalCheckLock(pDevice, pAlloc, pData->Flags); 3415 if (!SUCCEEDED(hr)) 3416 { 3417 WARN(("vboxWddmDalCheckLock failed %#x", hr)); 3418 return hr; 3419 } 3420 #endif 3261 3421 3262 3422 if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE … … 3266 3426 PVBOXWDDMDISP_ALLOCATION pTexAlloc = &pRc->aAllocations[0]; 3267 3427 Assert(pData->SubResourceIndex < pRc->cAllocations); 3268 PVBOXWDDMDISP_ALLOCATION pLockAlloc = &pRc->aAllocations[pData->SubResourceIndex];3269 3428 IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pTexAlloc->pD3DIf; 3270 3429 IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pTexAlloc->pD3DIf; … … 3282 3441 /* else - we lock the entire texture, pRect == NULL */ 3283 3442 3284 if (p LockAlloc->LockInfo.cLocks)3285 { 3286 Assert(p LockAlloc->LockInfo.fFlags.AreaValid == pData->Flags.AreaValid);3287 if (p LockAlloc->LockInfo.fFlags.AreaValid && pData->Flags.AreaValid)3288 { 3289 Assert(p LockAlloc->LockInfo.Area.left == pData->Area.left);3290 Assert(p LockAlloc->LockInfo.Area.top == pData->Area.top);3291 Assert(p LockAlloc->LockInfo.Area.right == pData->Area.right);3292 Assert(p LockAlloc->LockInfo.Area.bottom == pData->Area.bottom);3293 } 3294 Assert(p LockAlloc->LockInfo.LockedRect.pBits);3295 Assert((p LockAlloc->LockInfo.fFlags.Value & ~1) == (pData->Flags.Value & ~1)); /* <- 1 is "ReadOnly" flag */3296 3297 if (p LockAlloc->LockInfo.fFlags.ReadOnly && !pData->Flags.ReadOnly)3443 if (pAlloc->LockInfo.cLocks) 3444 { 3445 Assert(pAlloc->LockInfo.fFlags.AreaValid == pData->Flags.AreaValid); 3446 if (pAlloc->LockInfo.fFlags.AreaValid && pData->Flags.AreaValid) 3447 { 3448 Assert(pAlloc->LockInfo.Area.left == pData->Area.left); 3449 Assert(pAlloc->LockInfo.Area.top == pData->Area.top); 3450 Assert(pAlloc->LockInfo.Area.right == pData->Area.right); 3451 Assert(pAlloc->LockInfo.Area.bottom == pData->Area.bottom); 3452 } 3453 Assert(pAlloc->LockInfo.LockedRect.pBits); 3454 Assert((pAlloc->LockInfo.fFlags.Value & ~1) == (pData->Flags.Value & ~1)); /* <- 1 is "ReadOnly" flag */ 3455 3456 if (pAlloc->LockInfo.fFlags.ReadOnly && !pData->Flags.ReadOnly) 3298 3457 { 3299 3458 switch (pTexAlloc->enmD3DIfType) … … 3325 3484 VBOXVDBG_CHECK_SMSYNC(pRc); 3326 3485 3327 p LockAlloc->LockInfo.fFlags = pData->Flags;3486 pAlloc->LockInfo.fFlags = pData->Flags; 3328 3487 if (pRect) 3329 3488 { 3330 p LockAlloc->LockInfo.Area = *pRect;3331 Assert(p LockAlloc->LockInfo.fFlags.AreaValid == 1);3489 pAlloc->LockInfo.Area = *pRect; 3490 Assert(pAlloc->LockInfo.fFlags.AreaValid == 1); 3332 3491 } 3333 3492 else 3334 3493 { 3335 Assert(p LockAlloc->LockInfo.fFlags.AreaValid == 0);3494 Assert(pAlloc->LockInfo.fFlags.AreaValid == 0); 3336 3495 } 3337 3496 … … 3340 3499 case VBOXDISP_D3DIFTYPE_TEXTURE: 3341 3500 hr = pD3DIfTex->LockRect(pData->SubResourceIndex, 3342 &p LockAlloc->LockInfo.LockedRect,3501 &pAlloc->LockInfo.LockedRect, 3343 3502 pRect, 3344 3503 vboxDDI2D3DLockFlags(pData->Flags)); … … 3347 3506 hr = pD3DIfCubeTex->LockRect(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, pData->SubResourceIndex), 3348 3507 VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, pData->SubResourceIndex), 3349 &p LockAlloc->LockInfo.LockedRect,3508 &pAlloc->LockInfo.LockedRect, 3350 3509 pRect, 3351 3510 vboxDDI2D3DLockFlags(pData->Flags)); 3352 3511 break; 3353 3512 case VBOXDISP_D3DIFTYPE_SURFACE: 3354 hr = pD3DIfSurface->LockRect(&p LockAlloc->LockInfo.LockedRect,3513 hr = pD3DIfSurface->LockRect(&pAlloc->LockInfo.LockedRect, 3355 3514 pRect, 3356 3515 vboxDDI2D3DLockFlags(pData->Flags)); … … 3369 3528 if (SUCCEEDED(hr)) 3370 3529 { 3371 ++p LockAlloc->LockInfo.cLocks;3530 ++pAlloc->LockInfo.cLocks; 3372 3531 3373 3532 if (!pData->Flags.NotifyOnly) 3374 3533 { 3375 pData->pSurfData = p LockAlloc->LockInfo.LockedRect.pBits;3376 pData->Pitch = p LockAlloc->LockInfo.LockedRect.Pitch;3534 pData->pSurfData = pAlloc->LockInfo.LockedRect.pBits; 3535 pData->Pitch = pAlloc->LockInfo.LockedRect.Pitch; 3377 3536 pData->SlicePitch = 0; 3378 Assert(p LockAlloc->SurfDesc.slicePitch == 0);3379 Assert(!p LockAlloc->pvMem);3537 Assert(pAlloc->SurfDesc.slicePitch == 0); 3538 Assert(!pAlloc->pvMem); 3380 3539 } 3381 3540 else 3382 3541 { 3383 Assert(p LockAlloc->pvMem);3542 Assert(pAlloc->pvMem); 3384 3543 Assert(pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM); 3385 3544 } … … 3394 3553 PVBOXWDDMDISP_ALLOCATION pTexAlloc = &pRc->aAllocations[0]; 3395 3554 Assert(pData->SubResourceIndex < pRc->cAllocations); 3396 PVBOXWDDMDISP_ALLOCATION pLockAlloc = &pRc->aAllocations[pData->SubResourceIndex];3397 3555 IDirect3DVolumeTexture9 *pD3DIfTex = (IDirect3DVolumeTexture9*)pTexAlloc->pD3DIf; 3398 3556 Assert(pTexAlloc->pD3DIf); … … 3408 3566 /* else - we lock the entire texture, pBox == NULL */ 3409 3567 3410 if (p LockAlloc->LockInfo.cLocks)3411 { 3412 Assert(p LockAlloc->LockInfo.fFlags.BoxValid == pData->Flags.BoxValid);3413 if (p LockAlloc->LockInfo.fFlags.BoxValid && pData->Flags.BoxValid)3414 { 3415 Assert(p LockAlloc->LockInfo.Box.Left == pData->Box.Left);3416 Assert(p LockAlloc->LockInfo.Box.Top == pData->Box.Top);3417 Assert(p LockAlloc->LockInfo.Box.Right == pData->Box.Right);3418 Assert(p LockAlloc->LockInfo.Box.Bottom == pData->Box.Bottom);3419 Assert(p LockAlloc->LockInfo.Box.Front == pData->Box.Front);3420 Assert(p LockAlloc->LockInfo.Box.Back == pData->Box.Back);3421 } 3422 Assert(p LockAlloc->LockInfo.LockedBox.pBits);3423 Assert((p LockAlloc->LockInfo.fFlags.Value & ~1) == (pData->Flags.Value & ~1)); /* <- 1 is "ReadOnly" flag */3424 3425 if (p LockAlloc->LockInfo.fFlags.ReadOnly && !pData->Flags.ReadOnly)3568 if (pAlloc->LockInfo.cLocks) 3569 { 3570 Assert(pAlloc->LockInfo.fFlags.BoxValid == pData->Flags.BoxValid); 3571 if (pAlloc->LockInfo.fFlags.BoxValid && pData->Flags.BoxValid) 3572 { 3573 Assert(pAlloc->LockInfo.Box.Left == pData->Box.Left); 3574 Assert(pAlloc->LockInfo.Box.Top == pData->Box.Top); 3575 Assert(pAlloc->LockInfo.Box.Right == pData->Box.Right); 3576 Assert(pAlloc->LockInfo.Box.Bottom == pData->Box.Bottom); 3577 Assert(pAlloc->LockInfo.Box.Front == pData->Box.Front); 3578 Assert(pAlloc->LockInfo.Box.Back == pData->Box.Back); 3579 } 3580 Assert(pAlloc->LockInfo.LockedBox.pBits); 3581 Assert((pAlloc->LockInfo.fFlags.Value & ~1) == (pData->Flags.Value & ~1)); /* <- 1 is "ReadOnly" flag */ 3582 3583 if (pAlloc->LockInfo.fFlags.ReadOnly && !pData->Flags.ReadOnly) 3426 3584 { 3427 3585 hr = pD3DIfTex->UnlockBox(pData->SubResourceIndex); … … 3438 3596 VBOXVDBG_CHECK_SMSYNC(pRc); 3439 3597 3440 p LockAlloc->LockInfo.fFlags = pData->Flags;3598 pAlloc->LockInfo.fFlags = pData->Flags; 3441 3599 if (pBox) 3442 3600 { 3443 p LockAlloc->LockInfo.Box = *pBox;3444 Assert(p LockAlloc->LockInfo.fFlags.BoxValid == 1);3601 pAlloc->LockInfo.Box = *pBox; 3602 Assert(pAlloc->LockInfo.fFlags.BoxValid == 1); 3445 3603 } 3446 3604 else 3447 3605 { 3448 Assert(p LockAlloc->LockInfo.fFlags.BoxValid == 0);3606 Assert(pAlloc->LockInfo.fFlags.BoxValid == 0); 3449 3607 } 3450 3608 3451 3609 hr = pD3DIfTex->LockBox(pData->SubResourceIndex, 3452 &p LockAlloc->LockInfo.LockedBox,3610 &pAlloc->LockInfo.LockedBox, 3453 3611 (D3DBOX*)pBox, 3454 3612 vboxDDI2D3DLockFlags(pData->Flags)); … … 3461 3619 if (SUCCEEDED(hr)) 3462 3620 { 3463 ++p LockAlloc->LockInfo.cLocks;3621 ++pAlloc->LockInfo.cLocks; 3464 3622 3465 3623 if (!pData->Flags.NotifyOnly) 3466 3624 { 3467 pData->pSurfData = p LockAlloc->LockInfo.LockedBox.pBits;3468 pData->Pitch = p LockAlloc->LockInfo.LockedBox.RowPitch;3469 pData->SlicePitch = p LockAlloc->LockInfo.LockedBox.SlicePitch;3470 Assert(!p LockAlloc->pvMem);3625 pData->pSurfData = pAlloc->LockInfo.LockedBox.pBits; 3626 pData->Pitch = pAlloc->LockInfo.LockedBox.RowPitch; 3627 pData->SlicePitch = pAlloc->LockInfo.LockedBox.SlicePitch; 3628 Assert(!pAlloc->pvMem); 3471 3629 } 3472 3630 else 3473 3631 { 3474 Assert(p LockAlloc->pvMem);3632 Assert(pAlloc->pvMem); 3475 3633 Assert(pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM); 3476 3634 } … … 3484 3642 { 3485 3643 Assert(pData->SubResourceIndex < pRc->cAllocations); 3486 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];3487 3644 IDirect3DVertexBuffer9 *pD3D9VBuf = (IDirect3DVertexBuffer9*)pAlloc->pD3DIf; 3488 3645 BOOL bLocked = false; … … 3515 3672 Assert(pAlloc->SurfDesc.pitch == pAlloc->SurfDesc.width); 3516 3673 pAlloc->LockInfo.LockedRect.Pitch = pAlloc->SurfDesc.pitch; 3517 // Assert(p LockAlloc->LockInfo.fFlags.Value == 0);3674 // Assert(pAlloc->LockInfo.fFlags.Value == 0); 3518 3675 pAlloc->LockInfo.fFlags = pData->Flags; 3519 3676 if (pRange) … … 3578 3735 { 3579 3736 Assert(pData->SubResourceIndex < pRc->cAllocations); 3580 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];3581 3737 IDirect3DIndexBuffer9 *pD3D9IBuf = (IDirect3DIndexBuffer9*)pAlloc->pD3DIf; 3582 3738 BOOL bLocked = false; … … 3609 3765 Assert(pAlloc->SurfDesc.pitch == pAlloc->SurfDesc.width); 3610 3766 pAlloc->LockInfo.LockedRect.Pitch = pAlloc->SurfDesc.pitch; 3611 // Assert(p LockAlloc->LockInfo.fFlags.Value == 0);3767 // Assert(pAlloc->LockInfo.fFlags.Value == 0); 3612 3768 pAlloc->LockInfo.fFlags = pData->Flags; 3613 3769 if (pRange) … … 3671 3827 else 3672 3828 { 3673 Assert(0); 3674 } 3829 WARN(("not implemented %d", pRc->aAllocations[0].enmD3DIfType)); 3830 } 3831 3832 #ifdef VBOXWDDMDISP_DAL_CHECK_LOCK 3833 if (!SUCCEEDED(hr)) 3834 { 3835 WARN(("lock failed %#x", hr)); 3836 vboxWddmDalCheckUnlock(pDevice, pAlloc); 3837 } 3838 #endif 3675 3839 } 3676 3840 else /* if !VBOXDISPMODE_IS_3D(pDevice->pAdapter) */ 3677 3841 { 3678 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];3679 3842 if (pAlloc->hAllocation) 3680 3843 { … … 3773 3936 return E_INVALIDARG; 3774 3937 3938 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex]; 3939 3775 3940 if (VBOXDISPMODE_IS_3D(pDevice->pAdapter)) 3776 3941 { … … 3780 3945 { 3781 3946 Assert(pData->SubResourceIndex < pRc->cAllocations); 3782 PVBOXWDDMDISP_ALLOCATION pLockAlloc = &pRc->aAllocations[pData->SubResourceIndex];3783 3947 3784 3948 VBOXVDBG_DUMP_UNLOCK_ST(pData); 3785 3949 3786 --p LockAlloc->LockInfo.cLocks;3787 Assert(p LockAlloc->LockInfo.cLocks < UINT32_MAX);3788 if (!p LockAlloc->LockInfo.cLocks)3950 --pAlloc->LockInfo.cLocks; 3951 Assert(pAlloc->LockInfo.cLocks < UINT32_MAX); 3952 if (!pAlloc->LockInfo.cLocks) 3789 3953 { 3790 3954 PVBOXWDDMDISP_ALLOCATION pTexAlloc = &pRc->aAllocations[0]; … … 3823 3987 { 3824 3988 Assert(pData->SubResourceIndex < pRc->cAllocations); 3825 PVBOXWDDMDISP_ALLOCATION pLockAlloc = &pRc->aAllocations[pData->SubResourceIndex];3826 3989 3827 3990 VBOXVDBG_DUMP_UNLOCK_ST(pData); 3828 3991 3829 --p LockAlloc->LockInfo.cLocks;3830 Assert(p LockAlloc->LockInfo.cLocks < UINT32_MAX);3831 if (!p LockAlloc->LockInfo.cLocks)3992 --pAlloc->LockInfo.cLocks; 3993 Assert(pAlloc->LockInfo.cLocks < UINT32_MAX); 3994 if (!pAlloc->LockInfo.cLocks) 3832 3995 { 3833 3996 PVBOXWDDMDISP_ALLOCATION pTexAlloc = &pRc->aAllocations[0]; … … 3843 4006 { 3844 4007 Assert(pData->SubResourceIndex < pRc->cAllocations); 3845 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];3846 4008 3847 4009 --pAlloc->LockInfo.cLocks; … … 3884 4046 { 3885 4047 Assert(pData->SubResourceIndex < pRc->cAllocations); 3886 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];3887 4048 3888 4049 --pAlloc->LockInfo.cLocks; … … 3924 4085 else 3925 4086 { 3926 Assert(0); 3927 } 4087 WARN(("Unlock unsupported %d", pRc->aAllocations[0].enmD3DIfType)); 4088 } 4089 4090 #ifdef VBOXWDDMDISP_DAL_CHECK_LOCK 4091 if (SUCCEEDED(hr)) 4092 { 4093 hr = vboxWddmDalCheckUnlock(pDevice, pAlloc); 4094 if (!SUCCEEDED(hr)) 4095 WARN(("vboxWddmDalCheckUnlock failed %#x", hr)); 4096 } 4097 else 4098 WARN(("unlock failed %#x", hr)); 4099 #endif 3928 4100 } 3929 4101 else 3930 4102 { 3931 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];3932 3933 4103 if (pAlloc->hAllocation) 3934 4104 { … … 3975 4145 if (fDoUnlock) 3976 4146 { 3977 struct 3978 { 3979 D3DDDICB_UNLOCK Unlock; 3980 D3DKMT_HANDLE hAllocation; 3981 } UnlockData; 3982 3983 3984 UnlockData.Unlock.NumAllocations = 1; 3985 UnlockData.Unlock.phAllocations = &UnlockData.hAllocation; 3986 UnlockData.hAllocation = pAlloc->hAllocation; 3987 3988 hr = pDevice->RtCallbacks.pfnUnlockCb(pDevice->hDevice, &UnlockData.Unlock); 4147 D3DDDICB_UNLOCK Unlock; 4148 4149 Unlock.NumAllocations = 1; 4150 Unlock.phAllocations = &pAlloc->hAllocation; 4151 4152 hr = pDevice->RtCallbacks.pfnUnlockCb(pDevice->hDevice, &Unlock); 3989 4153 if(hr != S_OK) 3990 4154 { … … 4417 4581 } 4418 4582 4419 vboxWddmDalCheck Remove(pDevice, pAlloc);4583 vboxWddmDalCheckNotifyRemove(pDevice, pAlloc); 4420 4584 } 4421 4585 } … … 4497 4661 PVBOXWDDMDISP_RESOURCE pSrcRc = NULL, pDstRc = NULL; 4498 4662 PVBOXWDDMDISP_ALLOCATION pSrcAlloc = NULL, pDstAlloc = NULL; 4663 4664 Assert(vboxWddmDalIsEmpty(pDevice)); 4499 4665 4500 4666 if (pData->hSrcResource) … … 5153 5319 hr = pDevice9If->SetDepthStencilSurface(pD3D9Surf); 5154 5320 if (SUCCEEDED(hr)) 5321 { 5322 pDevice->pDepthStencilRc = pRc; 5155 5323 hr = S_OK; 5324 } 5156 5325 else 5157 5326 WARN(("VBoxD3DIfSurfGet failed, hr (0x%x)",hr)); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h
r49180 r50628 212 212 struct VBOXWDDMDISP_RESOURCE *aSamplerTextures[VBOXWDDMDISP_TOTAL_SAMPLERS]; 213 213 214 struct VBOXWDDMDISP_RESOURCE *pDepthStencilRc; 215 214 216 HMODULE hHgsmiTransportModule; 215 217 … … 270 272 /* list entry used to add allocation to the dirty alloc list */ 271 273 RTLISTNODE DirtyAllocListEntry; 274 BOOLEAN fEverWritten; 272 275 BOOLEAN fDirtyWrite; 276 BOOLEAN fAllocLocked; 273 277 HANDLE hSharedHandle; 274 278 VBOXWDDMDISP_LOCKINFO LockInfo; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r49591 r50628 150 150 KEVENT WdEvent; 151 151 #endif 152 152 BOOL bVSyncTimerEnabled; 153 volatile uint32_t fVSyncInVBlank; 154 volatile LARGE_INTEGER VSyncTime; 153 155 KTIMER VSyncTimer; 154 156 KDPC VSyncDpc; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r49591 r50628 1895 1895 NTSTATUS VBoxWddmSlEnableVSyncNotification(PVBOXMP_DEVEXT pDevExt, BOOLEAN fEnable) 1896 1896 { 1897 if (!pDevExt->bVSyncTimerEnabled == !fEnable) 1898 return STATUS_SUCCESS; 1899 1897 1900 if (!fEnable) 1898 1901 { … … 1901 1904 else 1902 1905 { 1906 KeQuerySystemTime(&pDevExt->VSyncTime); 1907 1903 1908 LARGE_INTEGER DueTime; 1904 1909 DueTime.QuadPart = -166666LL; /* 60 Hz */ 1905 1910 KeSetTimerEx(&pDevExt->VSyncTimer, DueTime, 16, &pDevExt->VSyncDpc); 1906 1911 } 1912 1913 pDevExt->bVSyncTimerEnabled = !!fEnable; 1914 1907 1915 return STATUS_SUCCESS; 1908 1916 } … … 1915 1923 Assert(pTarget->HeightVisible); 1916 1924 Assert(pTarget->HeightTotal >= pTarget->HeightVisible); 1917 Assert(pTarget->ScanLineState < pTarget->HeightTotal);1918 1925 if (pTarget->HeightTotal) 1919 1926 { 1920 uint32_t curScanLine = pTarget->ScanLineState; 1921 ++pTarget->ScanLineState; 1922 if (pTarget->ScanLineState >= pTarget->HeightTotal) 1923 pTarget->ScanLineState = 0; 1924 1925 1926 BOOL bVBlank = (!curScanLine || curScanLine > pTarget->HeightVisible); 1927 uint32_t curScanLine; 1928 BOOL bVBlank; 1929 LARGE_INTEGER DevVSyncTime; 1930 DevVSyncTime.QuadPart = ASMAtomicReadU64((volatile uint64_t*)&pDevExt->VSyncTime.QuadPart); 1931 LARGE_INTEGER VSyncTime; 1932 KeQuerySystemTime(&VSyncTime); 1933 1934 if (VSyncTime.QuadPart < DevVSyncTime.QuadPart) 1935 { 1936 WARN(("vsync time is less than the one stored in device")); 1937 curScanLine = 0; 1938 } 1939 else 1940 { 1941 VSyncTime.QuadPart = VSyncTime.QuadPart - DevVSyncTime.QuadPart; 1942 /* time is in 100ns, */ 1943 curScanLine = (uint32_t)((pTarget->HeightTotal * VSyncTime.QuadPart) / DevVSyncTime.QuadPart); 1944 if (pDevExt->bVSyncTimerEnabled) 1945 { 1946 if (curScanLine >= pTarget->HeightTotal) 1947 curScanLine = 0; 1948 } 1949 else 1950 { 1951 curScanLine %= pTarget->HeightTotal; 1952 } 1953 } 1954 1955 bVBlank = (!curScanLine || curScanLine > pTarget->HeightVisible); 1927 1956 pGetScanLine->ScanLine = curScanLine; 1928 1957 pGetScanLine->InVerticalBlank = bVBlank; … … 1934 1963 } 1935 1964 return STATUS_SUCCESS; 1965 } 1966 1967 static BOOLEAN vboxWddmSlVSyncIrqCb(PVOID pvContext) 1968 { 1969 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)pvContext; 1970 DXGKARGCB_NOTIFY_INTERRUPT_DATA notify; 1971 BOOLEAN bNeedDpc = FALSE; 1972 for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 1973 { 1974 PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[i]; 1975 if (pTarget->fConnected) 1976 { 1977 memset(¬ify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA)); 1978 notify.InterruptType = DXGK_INTERRUPT_CRTC_VSYNC; 1979 notify.CrtcVsync.VidPnTargetId = i; 1980 pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, ¬ify); 1981 bNeedDpc = TRUE; 1982 } 1983 } 1984 1985 if (bNeedDpc) 1986 { 1987 pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle); 1988 } 1989 1990 return FALSE; 1936 1991 } 1937 1992 … … 1944 1999 { 1945 2000 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)DeferredContext; 1946 DXGKARGCB_NOTIFY_INTERRUPT_DATA notify; 1947 BOOLEAN bNeedDpc = FALSE; 1948 for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 1949 { 1950 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i]; 1951 PVBOXWDDM_ALLOCATION pPrimary = vboxWddmAquirePrimary(pDevExt, pSource, i); 1952 if (pPrimary) 1953 { 1954 VBOXVIDEOOFFSET offVram = pPrimary->AllocData.Addr.offVram; 1955 if (offVram != VBOXVIDEOOFFSET_VOID) 1956 { 1957 memset(¬ify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA)); 1958 notify.InterruptType = DXGK_INTERRUPT_CRTC_VSYNC; 1959 /* @todo: !!!this is not correct in case we want source[i]->target[i!=j] mapping */ 1960 notify.CrtcVsync.VidPnTargetId = i; 1961 notify.CrtcVsync.PhysicalAddress.QuadPart = offVram; 1962 /* yes, we can report VSync at dispatch */ 1963 pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, ¬ify); 1964 bNeedDpc = TRUE; 1965 } 1966 1967 vboxWddmAllocationRelease(pPrimary); 1968 } 1969 } 1970 1971 if (bNeedDpc) 1972 { 1973 pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle); 1974 } 2001 Assert(!pDevExt->fVSyncInVBlank); 2002 ASMAtomicWriteU32(&pDevExt->fVSyncInVBlank, 1); 2003 2004 BOOLEAN bDummy; 2005 NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution( 2006 pDevExt->u.primary.DxgkInterface.DeviceHandle, 2007 vboxWddmSlVSyncIrqCb, 2008 pDevExt, 2009 0, /* IN ULONG MessageNumber */ 2010 &bDummy); 2011 if (!NT_SUCCESS(Status)) 2012 WARN(("DxgkCbSynchronizeExecution failed Status %#x", Status)); 2013 2014 LARGE_INTEGER VSyncTime; 2015 KeQuerySystemTime(&VSyncTime); 2016 ASMAtomicWriteU64((volatile uint64_t*)&pDevExt->VSyncTime.QuadPart, VSyncTime.QuadPart); 2017 2018 ASMAtomicWriteU32(&pDevExt->fVSyncInVBlank, 0); 1975 2019 } 1976 2020 1977 2021 NTSTATUS VBoxWddmSlInit(PVBOXMP_DEVEXT pDevExt) 1978 2022 { 2023 pDevExt->bVSyncTimerEnabled = FALSE; 2024 pDevExt->fVSyncInVBlank = 0; 2025 KeQuerySystemTime(&pDevExt->VSyncTime); 1979 2026 KeInitializeTimer(&pDevExt->VSyncTimer); 1980 2027 KeInitializeDpc(&pDevExt->VSyncDpc, vboxWddmSlVSyncDpc, pDevExt); … … 2035 2082 if (pSource->AllocData.Addr.offVram != PhAddr.QuadPart 2036 2083 || pSource->AllocData.Addr.SegmentId != 1) 2037 pSource-> fGhSynced = 0;2084 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 2038 2085 pSource->AllocData.Addr.SegmentId = 1; 2039 2086 pSource->AllocData.Addr.offVram = PhAddr.QuadPart; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r49591 r50628 112 112 } VBOXWDDM_ALLOC_DATA, *PVBOXWDDM_ALLOC_DATA; 113 113 114 #define VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS 0x01 115 #define VBOXWDDM_HGSYNC_F_SYNCED_LOCATION 0x02 116 #define VBOXWDDM_HGSYNC_F_SYNCED_ALL (VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS | VBOXWDDM_HGSYNC_F_SYNCED_LOCATION) 117 #define VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY (VBOXWDDM_HGSYNC_F_SYNCED_ALL & ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION) 118 114 119 typedef struct VBOXWDDM_SOURCE 115 120 { … … 119 124 #endif 120 125 VBOXWDDM_ALLOC_DATA AllocData; 126 uint8_t u8SyncState; 121 127 BOOLEAN bVisible; 122 char fGhSynced;123 128 /* specifies whether the source has 3D overlay data visible */ 124 129 BOOLEAN fHas3DVrs; … … 140 145 typedef struct VBOXWDDM_TARGET 141 146 { 142 uint32_t ScanLineState;143 147 uint32_t HeightVisible; 144 148 uint32_t HeightTotal; 145 149 /* since there coul be multiple state changes on auto-resize, 146 * we pend notifying host to avoi flickering */150 * we pend notifying host to avoid flickering */ 147 151 volatile bool fStateSyncPening; 148 152 bool fConnected; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp
r48070 r50628 2090 2090 NTSTATUS vboxVidPnSetupSourceInfo(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, PVBOXWDDM_SOURCE pSource, CONST D3DKMDT_VIDPN_SOURCE_MODE* pVidPnSourceModeInfo, PVBOXWDDM_ALLOCATION pAllocation) 2091 2091 { 2092 vboxWddmAssignPrimary(pDevExt, pSource, pAllocation, srcId);2093 2092 /* pVidPnSourceModeInfo could be null if STATUS_GRAPHICS_MODE_NOT_PINNED, 2094 2093 * see vboxVidPnCommitSourceModeForSrcId */ 2094 uint8_t fChanges = 0; 2095 2095 if (pVidPnSourceModeInfo) 2096 2096 { 2097 pSource->AllocData.SurfDesc.width = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx; 2098 pSource->AllocData.SurfDesc.height = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy; 2099 pSource->AllocData.SurfDesc.format = pVidPnSourceModeInfo->Format.Graphics.PixelFormat; 2100 pSource->AllocData.SurfDesc.bpp = vboxWddmCalcBitsPerPixel(pVidPnSourceModeInfo->Format.Graphics.PixelFormat); 2101 pSource->AllocData.SurfDesc.pitch = pVidPnSourceModeInfo->Format.Graphics.Stride; 2097 if (pSource->AllocData.SurfDesc.width != pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx) 2098 { 2099 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2100 pSource->AllocData.SurfDesc.width = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cx; 2101 } 2102 if (pSource->AllocData.SurfDesc.height != pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy) 2103 { 2104 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2105 pSource->AllocData.SurfDesc.height = pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy; 2106 } 2107 if (pSource->AllocData.SurfDesc.format != pVidPnSourceModeInfo->Format.Graphics.PixelFormat) 2108 { 2109 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2110 pSource->AllocData.SurfDesc.format = pVidPnSourceModeInfo->Format.Graphics.PixelFormat; 2111 } 2112 if (pSource->AllocData.SurfDesc.bpp != vboxWddmCalcBitsPerPixel(pVidPnSourceModeInfo->Format.Graphics.PixelFormat)) 2113 { 2114 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2115 pSource->AllocData.SurfDesc.bpp = vboxWddmCalcBitsPerPixel(pVidPnSourceModeInfo->Format.Graphics.PixelFormat); 2116 } 2117 if(pSource->AllocData.SurfDesc.pitch != pVidPnSourceModeInfo->Format.Graphics.Stride) 2118 { 2119 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2120 pSource->AllocData.SurfDesc.pitch = pVidPnSourceModeInfo->Format.Graphics.Stride; 2121 } 2102 2122 pSource->AllocData.SurfDesc.depth = 1; 2103 pSource->AllocData.SurfDesc.slicePitch = pVidPnSourceModeInfo->Format.Graphics.Stride; 2104 pSource->AllocData.SurfDesc.cbSize = pVidPnSourceModeInfo->Format.Graphics.Stride * pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy; 2123 if (pSource->AllocData.SurfDesc.slicePitch != pVidPnSourceModeInfo->Format.Graphics.Stride) 2124 { 2125 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2126 pSource->AllocData.SurfDesc.slicePitch = pVidPnSourceModeInfo->Format.Graphics.Stride; 2127 } 2128 if (pSource->AllocData.SurfDesc.cbSize != pVidPnSourceModeInfo->Format.Graphics.Stride * pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy) 2129 { 2130 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 2131 pSource->AllocData.SurfDesc.cbSize = pVidPnSourceModeInfo->Format.Graphics.Stride * pVidPnSourceModeInfo->Format.Graphics.PrimSurfSize.cy; 2132 } 2105 2133 #ifdef VBOX_WDDM_WIN8 2106 2134 if (g_VBoxDisplayOnly) … … 2113 2141 { 2114 2142 Assert(!pAllocation); 2115 } 2143 fChanges |= VBOXWDDM_HGSYNC_F_SYNCED_ALL; 2144 } 2145 2146 vboxWddmAssignPrimary(pDevExt, pSource, pAllocation, srcId); 2147 2116 2148 Assert(pSource->AllocData.SurfDesc.VidPnSourceId == srcId); 2117 pSource-> fGhSynced = 0;2149 pSource->u8SyncState &= ~fChanges; 2118 2150 return STATUS_SUCCESS; 2119 2151 } … … 2161 2193 pTarget->HeightVisible = pPinnedVidPnTargetModeInfo->VideoSignalInfo.ActiveSize.cy; 2162 2194 pTarget->HeightTotal = pPinnedVidPnTargetModeInfo->VideoSignalInfo.TotalSize.cy; 2163 pTarget->ScanLineState = 0;2164 2195 } 2165 2196 pVidPnTargetModeSetInterface->pfnReleaseModeInfo(hVidPnTargetModeSet, pPinnedVidPnTargetModeInfo); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r50313 r50628 242 242 NTSTATUS vboxWddmGhDisplayHideScreen(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId) 243 243 { 244 VBOXWDDM_SURFACE_DESC SurfDesc = {0}; 244 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnTargetId]; 245 /* this will force update on re-activation */ 246 pSource->AllocData.SurfDesc.width = 0; 247 pSource->AllocData.SurfDesc.height = 0; 245 248 POINT VScreenPos = {0}; 246 SurfDesc.VidPnSourceId = VidPnTargetId; 247 NTSTATUS Status = vboxWddmGhDisplayPostInfoScreenBySDesc(pDevExt, & SurfDesc, &VScreenPos, VBVA_SCREEN_F_ACTIVE | VBVA_SCREEN_F_DISABLED);249 250 NTSTATUS Status = vboxWddmGhDisplayPostInfoScreenBySDesc(pDevExt, &pSource->AllocData.SurfDesc, &VScreenPos, VBVA_SCREEN_F_ACTIVE | VBVA_SCREEN_F_DISABLED); 248 251 if (!NT_SUCCESS(Status)) 249 252 WARN(("vboxWddmGhDisplayPostInfoScreenBySDesc failed Status 0x%x", Status)); … … 341 344 } 342 345 343 NTSTATUS vboxWddmGhDisplaySetInfo(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pRealFbAlloc, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos) 344 { 345 NTSTATUS Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocData); 346 NTSTATUS vboxWddmGhDisplaySetInfo(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pRealFbAlloc, const VBOXWDDM_ALLOC_DATA *pAllocData, const POINT * pVScreenPos, uint8_t u8CurCyncState) 347 { 348 NTSTATUS Status; 349 350 if ((u8CurCyncState & VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY) == VBOXWDDM_HGSYNC_F_CHANGED_LOCATION_ONLY 351 && pRealFbAlloc->AllocData.hostID) 352 { 353 Status = vboxVdmaTexPresentSetAlloc(pDevExt, pRealFbAlloc); 354 if (!NT_SUCCESS(Status)) 355 WARN(("vboxVdmaTexPresentSetAlloc failed, Status 0x%x", Status)); 356 return Status; 357 } 358 359 Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocData); 346 360 if (NT_SUCCESS(Status)) 347 361 { … … 378 392 { 379 393 vboxWddmGhDisplayHideScreen(pDevExt, pSource->AllocData.SurfDesc.VidPnSourceId); 380 pSource-> fGhSynced = 1;394 pSource->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 381 395 return true; 382 396 } 383 397 384 char fGhSynced = 1;385 398 PVBOXWDDM_ALLOCATION pFbAlloc = VBOXWDDM_FB_ALLOCATION(pDevExt, pSource); 386 399 PVBOXWDDM_ALLOCATION pRealFbAlloc = pSource->pPrimaryAllocation; … … 394 407 395 408 if (!pFbAlloc) 396 { 397 pFbAlloc = VBOXWDDM_NONFB_ALLOCATION(pDevExt, pSource); 398 fGhSynced = -1; 399 } 409 pFbAlloc = pRealFbAlloc; 400 410 401 411 if (!pFbAlloc || pFbAlloc->AllocData.Addr.offVram == VBOXVIDEOOFFSET_VOID) … … 416 426 Assert(!pFbAlloc || pFbAlloc->AllocData.Addr.SegmentId == pSource->AllocData.Addr.SegmentId); 417 427 418 NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pRealFbAlloc, pFbAlloc ? &pFbAlloc->AllocData : &pSource->AllocData, &pSource->VScreenPos );428 NTSTATUS Status = vboxWddmGhDisplaySetInfo(pDevExt, pRealFbAlloc, pFbAlloc ? &pFbAlloc->AllocData : &pSource->AllocData, &pSource->VScreenPos, pSource->u8SyncState); 419 429 if (NT_SUCCESS(Status)) 420 pSource-> fGhSynced = fGhSynced;430 pSource->u8SyncState = VBOXWDDM_HGSYNC_F_SYNCED_ALL; 421 431 else 422 432 WARN(("vboxWddmGhDisplaySetInfo failed, Status (0x%x)", Status)); … … 432 442 || !pDevExt->aTargets[pSource->AllocData.SurfDesc.VidPnSourceId].HeightVisible); 433 443 434 if (pSource-> fGhSynced)444 if (pSource->u8SyncState == VBOXWDDM_HGSYNC_F_SYNCED_ALL) 435 445 return false; 436 446 … … 475 485 476 486 /* ensure we issue resize command on next update */ 477 pSource-> fGhSynced = 0;487 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 478 488 } 479 489 } … … 517 527 pContext->fRenderFromShadowDisabled = FALSE; 518 528 } 519 520 #ifdef VBOXWDDM_RENDER_FROM_SHADOW521 bool vboxWddmCheckUpdateFramebufferAddress(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource)522 {523 if (pSource->pPrimaryAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC524 || pSource->pPrimaryAllocation->AllocData.hostID)525 {526 // Assert(pSource->fGhSynced == FALSE);527 return false;528 }529 530 return vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource);531 }532 #endif533 529 534 530 PVBOXSHGSMI vboxWddmHgsmiGetHeapFromCmdOffset(PVBOXMP_DEVEXT pDevExt, HGSMIOFFSET offCmd) … … 2871 2867 { 2872 2868 /* this is a NOP, just return success */ 2873 WARN(("null data size, treating as NOP"));2869 // LOG(("null data size, treating as NOP")); 2874 2870 return STATUS_SUCCESS; 2875 2871 } … … 3004 3000 else if (pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset == pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset) 3005 3001 { 3006 WARN(("null data size, treating as NOP"));3007 3002 enmCmd = VBOXVDMACMD_TYPE_DMA_NOP; 3008 3003 } … … 3029 3024 BOOLEAN fShadowChanged = vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pS2P->Shadow2Primary.ShadowAlloc.segmentIdAlloc, pS2P->Shadow2Primary.ShadowAlloc.offAlloc); 3030 3025 if (fShadowChanged) 3031 pSource-> fGhSynced = 0;3026 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 3032 3027 vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pS2P->Shadow2Primary.VidPnSourceId); 3033 3028 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL); 3034 vboxWddm CheckUpdateFramebufferAddress(pDevExt, pSource);3029 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 3035 3030 if (pSrcAlloc->bVisible) 3036 3031 { … … 3056 3051 PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc; 3057 3052 BOOLEAN fSrcChanged; 3058 3059 vboxWddmAddrSetVram(&pDstAlloc->AllocData.Addr, pBlt->Blt.DstAlloc.segmentIdAlloc, pBlt->Blt.DstAlloc.offAlloc); 3053 BOOLEAN fDstChanged; 3054 3055 fDstChanged = vboxWddmAddrSetVram(&pDstAlloc->AllocData.Addr, pBlt->Blt.DstAlloc.segmentIdAlloc, pBlt->Blt.DstAlloc.offAlloc); 3060 3056 fSrcChanged = vboxWddmAddrSetVram(&pSrcAlloc->AllocData.Addr, pBlt->Blt.SrcAlloc.segmentIdAlloc, pBlt->Blt.SrcAlloc.offAlloc); 3061 3057 3058 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL); 3059 3062 3060 if (VBOXWDDM_IS_REAL_FB_ALLOCATION(pDevExt, pDstAlloc)) 3063 3061 { 3064 3062 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId]; 3063 3065 3064 Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS); 3066 3067 if (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) 3065 #if 0 3066 if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc) && pDstAlloc->AllocData.hostID) 3067 { 3068 if (pSource->AllocData.hostID != pDstAlloc->AllocData.hostID) 3069 { 3070 pSource->AllocData.hostID = pDstAlloc->AllocData.hostID; 3071 fDstChanged = TRUE; 3072 } 3073 3074 if (fDstChanged) 3075 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 3076 } 3077 else 3078 #endif 3079 if (pSrcAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE) 3068 3080 { 3069 3081 if (fSrcChanged) 3070 pSource-> fGhSynced = 0;3082 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 3071 3083 3072 3084 vboxWddmAssignShadow(pDevExt, pSource, pSrcAlloc, pDstAlloc->AllocData.SurfDesc.VidPnSourceId); 3073 } 3074 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL); 3075 if(pContext->enmType != VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D 3076 || pDstAlloc->enmType !=VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC) 3077 vboxWddmCheckUpdateFramebufferAddress(pDevExt, pSource); 3078 } 3079 else 3080 vboxWddmModeRenderFromShadowCheckOnSubmitCommand(pDevExt, NULL); 3085 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 3086 } 3087 3088 Assert(pSource->u8SyncState == VBOXWDDM_HGSYNC_F_SYNCED_ALL); 3089 } 3081 3090 3082 3091 Status = vboxVdmaProcessBltCmd(pDevExt, pContext, pBlt); … … 3091 3100 { 3092 3101 VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip = (VBOXWDDM_DMA_PRIVATEDATA_FLIP*)pPrivateDataBase; 3093 vboxWddmAddrSetVram(&pFlip->Flip.Alloc.pAlloc->AllocData.Addr, pFlip->Flip.Alloc.segmentIdAlloc, pFlip->Flip.Alloc.offAlloc);3094 3095 Status = vboxVdmaProcessFlipCmd(pDevExt, pContext, pFlip);3096 if (!NT_SUCCESS(Status))3097 WARN(("vboxVdmaProcessFlipCmd failed, Status 0x%x", Status));3102 PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc; 3103 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 3104 vboxWddmAddrSetVram(&pAlloc->AllocData.Addr, pFlip->Flip.Alloc.segmentIdAlloc, pFlip->Flip.Alloc.offAlloc); 3105 vboxWddmAssignPrimary(pDevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId); 3106 vboxWddmGhDisplayCheckSetInfoFromSource(pDevExt, pSource); 3098 3107 3099 3108 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, … … 3306 3315 } 3307 3316 /** @todo: add necessary bits */ 3317 WARN(("Impl!")); 3308 3318 break; 3309 3319 } … … 3352 3362 LOGF(("ENTER, context(0x%x)", hAdapter)); 3353 3363 3364 uint32_t cbCmdDma = 0; 3365 3354 3366 /* @todo: */ 3355 3367 switch (pBuildPagingBuffer->Operation) … … 3357 3369 case DXGK_OPERATION_TRANSFER: 3358 3370 { 3371 cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3359 3372 #ifdef VBOX_WITH_VDMA 3360 3373 #if 0 … … 3507 3520 case DXGK_OPERATION_FILL: 3508 3521 { 3522 cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3509 3523 Assert(pBuildPagingBuffer->Fill.FillPattern == 0); 3510 3524 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->Fill.hAllocation; … … 3519 3533 default: 3520 3534 { 3521 LOGREL(("unsupported op (%d)", pBuildPagingBuffer->Operation)); 3522 AssertBreakpoint(); 3535 WARN(("unsupported op (%d)", pBuildPagingBuffer->Operation)); 3523 3536 break; 3524 3537 } 3538 } 3539 3540 if (cbCmdDma) 3541 { 3542 pBuildPagingBuffer->pDmaBuffer = ((uint8_t*)pBuildPagingBuffer->pDmaBuffer) + cbCmdDma; 3525 3543 } 3526 3544 … … 4884 4902 4885 4903 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pSetVidPnSourceAddress->VidPnSourceId]; 4886 Status= vboxWddmDisplaySettingsQueryPos(pDevExt, pSetVidPnSourceAddress->VidPnSourceId, &pSource->VScreenPos); 4904 POINT Pos; 4905 Status= vboxWddmDisplaySettingsQueryPos(pDevExt, pSetVidPnSourceAddress->VidPnSourceId, &Pos); 4887 4906 Assert(Status == STATUS_SUCCESS); 4907 if (NT_SUCCESS(Status)) 4908 { 4909 if (memcmp(&pSource->VScreenPos, &Pos, sizeof (Pos))) 4910 { 4911 pSource->VScreenPos = Pos; 4912 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 4913 } 4914 } 4915 4888 4916 Status = STATUS_SUCCESS; 4889 4917 … … 4930 4958 } 4931 4959 4932 pSource-> fGhSynced = 0; /* force guest->host notification */4960 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; 4933 4961 4934 4962 if (pSource->bVisible) … … 4961 4989 4962 4990 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pSetVidPnSourceVisibility->VidPnSourceId]; 4963 Status= vboxWddmDisplaySettingsQueryPos(pDevExt, pSetVidPnSourceVisibility->VidPnSourceId, &pSource->VScreenPos); 4991 POINT Pos; 4992 Status= vboxWddmDisplaySettingsQueryPos(pDevExt, pSetVidPnSourceVisibility->VidPnSourceId, &Pos); 4964 4993 Assert(Status == STATUS_SUCCESS); 4994 if (NT_SUCCESS(Status)) 4995 { 4996 if (memcmp(&pSource->VScreenPos, &Pos, sizeof (Pos))) 4997 { 4998 pSource->VScreenPos = Pos; 4999 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_DIMENSIONS; 5000 } 5001 } 4965 5002 Status = STATUS_SUCCESS; 4966 5003 … … 5713 5750 if (pRender->DmaBufferPrivateDataSize < sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR)) 5714 5751 { 5715 LOGREL(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXWDDM_DMA_PRIVATEDATA_BASEHDR (%d)",5752 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXWDDM_DMA_PRIVATEDATA_BASEHDR (%d)", 5716 5753 pRender->DmaBufferPrivateDataSize , sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR))); 5717 5754 /* @todo: can this actually happen? what status to return? */ … … 5720 5757 if (pRender->CommandLength < sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR)) 5721 5758 { 5722 Assert(0); 5723 LOGREL(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXWDDM_DMA_PRIVATEDATA_BASEHDR (%d)", 5759 WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXWDDM_DMA_PRIVATEDATA_BASEHDR (%d)", 5724 5760 pRender->DmaBufferPrivateDataSize , sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR))); 5725 5761 /* @todo: can this actually happen? what status to return? */ … … 5737 5773 5738 5774 pRender->pDmaBufferPrivateData = (uint8_t*)pRender->pDmaBufferPrivateData + sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR); 5775 memset(pRender->pDmaBuffer, 0, pRender->CommandLength); 5739 5776 pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + pRender->CommandLength; 5740 5777 Assert(pRender->DmaSize >= pRender->CommandLength); … … 5920 5957 } 5921 5958 5922 pBlt->Pos.x = pPresent->DstRect.left - pPresent->SrcRect.left;5923 pBlt->Pos.y = pPresent->DstRect.top - pPresent->SrcRect.top;5959 pBlt->Pos.x = (int16_t)(pPresent->DstRect.left - pPresent->SrcRect.left); 5960 pBlt->Pos.y = (int16_t)(pPresent->DstRect.top - pPresent->SrcRect.top); 5924 5961 5925 5962 paRects = pBlt->aRects; … … 5943 5980 u32DstPatch = RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, dst.offVRAM); 5944 5981 5945 pBlt->Pos.x = pPresent->DstRect.left - pPresent->SrcRect.left;5946 pBlt->Pos.y = pPresent->DstRect.top - pPresent->SrcRect.top;5982 pBlt->Pos.x = (int16_t)(pPresent->DstRect.left - pPresent->SrcRect.left); 5983 pBlt->Pos.y = (int16_t)(pPresent->DstRect.top - pPresent->SrcRect.top); 5947 5984 5948 5985 paRects = pBlt->aRects; … … 6379 6416 for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 6380 6417 { 6381 pDevExt->aSources[i]. fGhSynced= 0;6418 pDevExt->aSources[i].u8SyncState = 0; 6382 6419 NTSTATUS tmpStatus= vboxWddmDisplaySettingsQueryPos(pDevExt, i, &pDevExt->aSources[i].VScreenPos); 6383 6420 Assert(tmpStatus == STATUS_SUCCESS); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h
r49591 r50628 134 134 } 135 135 136 if (pSource->pShadowAllocation == pAllocation && pSource->fGhSynced > 0)136 if (pSource->pShadowAllocation == pAllocation) 137 137 { 138 138 Assert(pAllocation->bAssigned); … … 162 162 163 163 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr)) 164 pSource->fGhSynced = 0; /* force guest->host notification */ 165 pSource->AllocData.Addr = pAllocation->AllocData.Addr; 166 } 164 { 165 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 166 pSource->AllocData.Addr = pAllocation->AllocData.Addr; 167 } 168 if (pSource->AllocData.hostID != pAllocation->AllocData.hostID) 169 { 170 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 171 pSource->AllocData.hostID = pAllocation->AllocData.hostID; 172 } 173 } 174 else 175 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 167 176 168 177 pSource->pShadowAllocation = pAllocation; 169 170 Assert(!pSource->AllocData.pSwapchain);171 Assert(!pSource->AllocData.hostID);172 178 } 173 179 #endif … … 197 203 198 204 if(!vboxWddmAddrVramEqual(&pSource->AllocData.Addr, &pAllocation->AllocData.Addr)) 199 pSource->fGhSynced = 0; /* force guest->host notification */ 200 pSource->AllocData.Addr = pAllocation->AllocData.Addr; 205 { 206 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 207 pSource->AllocData.Addr = pAllocation->AllocData.Addr; 208 } 209 if (pSource->AllocData.hostID != pAllocation->AllocData.hostID) 210 { 211 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 212 pSource->AllocData.hostID = pAllocation->AllocData.hostID; 213 } 201 214 202 215 vboxWddmAllocationRetain(pAllocation); 203 216 } 217 else 218 pSource->u8SyncState &= ~VBOXWDDM_HGSYNC_F_SYNCED_LOCATION; /* force guest->host notification */ 204 219 205 220 KIRQL OldIrql; … … 207 222 pSource->pPrimaryAllocation = pAllocation; 208 223 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql); 209 210 Assert(!pSource->AllocData.pSwapchain);211 Assert(!pSource->AllocData.hostID);212 224 } 213 225
Note:
See TracChangeset
for help on using the changeset viewer.