Changeset 38982 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video
- Timestamp:
- Oct 12, 2011 8:20:21 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 74369
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
r38565 r38982 33 33 34 34 /* One would increase this whenever definitions in this file are changed */ 35 #define VBOXVIDEOIF_VERSION 1 035 #define VBOXVIDEOIF_VERSION 11 36 36 37 37 #define VBOXWDDM_NODE_ID_SYSTEM 0 … … 116 116 } VBOXWDDM_ALLOCINFO, *PVBOXWDDM_ALLOCINFO; 117 117 118 /* this resource is OpenResource'd rather than CreateResource'd */119 #define VBOXWDDM_RESOURCE_F_OPENNED 0x00000001120 /* identifies this is a resource created with CreateResource, the VBOXWDDMDISP_RESOURCE::fRcFlags is valid */121 #define VBOXWDDM_RESOURCE_F_TYPE_GENERIC 0x00000002122 123 118 typedef struct VBOXWDDM_RC_DESC 124 119 { … … 135 130 } VBOXWDDM_RC_DESC, *PVBOXWDDM_RC_DESC; 136 131 132 typedef struct VBOXWDDMDISP_RESOURCE_FLAGS 133 { 134 union 135 { 136 struct 137 { 138 UINT Opened : 1; /* this resource is OpenResource'd rather than CreateResource'd */ 139 UINT Generic : 1; /* identifies this is a resource created with CreateResource, the VBOXWDDMDISP_RESOURCE::fRcFlags is valid */ 140 UINT KmResource : 1; /* this resource has underlying km resource */ 141 UINT Reserved : 29; /* reserved */ 142 }; 143 UINT Value; 144 }; 145 } VBOXWDDMDISP_RESOURCE_FLAGS, *PVBOXWDDMDISP_RESOURCE_FLAGS; 146 137 147 typedef struct VBOXWDDM_RCINFO 138 148 { 139 uint32_tfFlags;149 VBOXWDDMDISP_RESOURCE_FLAGS fFlags; 140 150 VBOXWDDM_RC_DESC RcDesc; 141 151 uint32_t cAllocInfos; … … 426 436 VBOXWDDM_UHGSMI_BUFFER_UI_INFO_ESCAPE aBuffers[1]; 427 437 } VBOXDISPIFESCAPE_UHGSMI_SUBMIT, *PVBOXDISPIFESCAPE_UHGSMI_SUBMIT; 438 439 typedef struct VBOXDISPIFESCAPE_SHRC_REF 440 { 441 VBOXDISPIFESCAPE EscapeHdr; 442 uint64_t hAlloc; 443 } VBOXDISPIFESCAPE_SHRC_REF, *PVBOXDISPIFESCAPE_SHRC_REF; 428 444 429 445 /* query info func */ … … 504 520 case D3DDDIFMT_DXT4: 505 521 case D3DDDIFMT_DXT5: 522 case D3DDDIFMT_VERTEXDATA: 523 case D3DDDIFMT_INDEX16: /* <- yes, dx runtime treats it as such */ 524 return 8; 525 case D3DDDIFMT_INDEX32: 526 #ifdef DEBUG_misha 527 Assert(0); /* <- test correctness */ 528 #endif 506 529 return 8; 507 530 default: -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
r38930 r38982 1029 1029 } 1030 1030 1031 #define VBOX_WDDM_SHRC_WO_NOTIFY1031 //#define VBOX_WDDM_SHRC_WO_NOTIFY 1032 1032 static BOOLEAN vboxWddmDalCheckAdd(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc, BOOLEAN fWrite) 1033 1033 { … … 1512 1512 } 1513 1513 1514 static HRESULT vboxWddmSurfSynchMem(PVBOXWDDMDISP_RESOURCE pRc, PVBOXWDDMDISP_ALLOCATION pAllocation) 1514 static HRESULT vboxWddmLockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc, 1515 D3DLOCKED_RECT * pLockedRect, 1516 CONST RECT *pRect, 1517 DWORD fLockFlags) 1518 { 1519 HRESULT hr = E_FAIL; 1520 Assert(!pRc->aAllocations[iAlloc].LockInfo.cLocks); 1521 Assert(pRc->cAllocations > iAlloc); 1522 switch (pRc->aAllocations[0].enmD3DIfType) 1523 { 1524 case VBOXDISP_D3DIFTYPE_SURFACE: 1525 { 1526 IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf; 1527 Assert(pD3DIfSurf); 1528 hr = pD3DIfSurf->LockRect(pLockedRect, pRect, fLockFlags); 1529 Assert(hr == S_OK); 1530 break; 1531 } 1532 case VBOXDISP_D3DIFTYPE_TEXTURE: 1533 { 1534 IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf; 1535 Assert(pD3DIfTex); 1536 hr = pD3DIfTex->LockRect(iAlloc, pLockedRect, pRect, fLockFlags); 1537 Assert(hr == S_OK); 1538 break; 1539 } 1540 case VBOXDISP_D3DIFTYPE_CUBE_TEXTURE: 1541 { 1542 IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pRc->aAllocations[0].pD3DIf; 1543 Assert(pD3DIfCubeTex); 1544 hr = pD3DIfCubeTex->LockRect(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, iAlloc), 1545 VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, iAlloc), pLockedRect, pRect, fLockFlags); 1546 Assert(hr == S_OK); 1547 break; 1548 } 1549 case VBOXDISP_D3DIFTYPE_VERTEXBUFFER: 1550 { 1551 IDirect3DVertexBuffer9 *pD3D9VBuf = (IDirect3DVertexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf; 1552 Assert(pD3D9VBuf); 1553 hr = pD3D9VBuf->Lock(pRect ? pRect->left : 0/* offset */, 1554 pRect ? pRect->right : 0 /* size 2 lock - 0 means all */, 1555 &pLockedRect->pBits, fLockFlags); 1556 Assert(hr == S_OK); 1557 pLockedRect->Pitch = pRc->aAllocations[iAlloc].SurfDesc.pitch; 1558 break; 1559 } 1560 case VBOXDISP_D3DIFTYPE_INDEXBUFFER: 1561 { 1562 IDirect3DIndexBuffer9 *pD3D9IBuf = (IDirect3DIndexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf; 1563 Assert(pD3D9IBuf); 1564 hr = pD3D9IBuf->Lock(pRect ? pRect->left : 0/* offset */, 1565 pRect ? pRect->right : 0 /* size 2 lock - 0 means all */, 1566 &pLockedRect->pBits, fLockFlags); 1567 Assert(hr == S_OK); 1568 pLockedRect->Pitch = pRc->aAllocations[iAlloc].SurfDesc.pitch; 1569 break; 1570 } 1571 default: 1572 Assert(0); 1573 break; 1574 } 1575 return hr; 1576 } 1577 1578 static HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc) 1515 1579 { 1516 1580 HRESULT hr = S_OK; 1517 Assert(pAllocation->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE); 1518 if (pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM) 1519 { 1520 Assert(pAllocation->pvMem); 1521 D3DLOCKED_RECT lockInfo; 1522 IDirect3DSurface9 *pD3D9Surf = (IDirect3DSurface9*)pAllocation->pD3DIf; 1523 hr = pD3D9Surf->LockRect(&lockInfo, NULL, D3DLOCK_DISCARD); 1524 Assert(hr == S_OK); 1525 if (hr == S_OK) 1526 { 1527 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/); 1528 HRESULT tmpHr = pD3D9Surf->UnlockRect(); 1529 Assert(tmpHr == S_OK); 1530 } 1581 Assert(pRc->cAllocations > iAlloc); 1582 switch (pRc->aAllocations[0].enmD3DIfType) 1583 { 1584 case VBOXDISP_D3DIFTYPE_SURFACE: 1585 { 1586 IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf; 1587 Assert(pD3DIfSurf); 1588 hr = pD3DIfSurf->UnlockRect(); 1589 Assert(hr == S_OK); 1590 break; 1591 } 1592 case VBOXDISP_D3DIFTYPE_TEXTURE: 1593 { 1594 IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf; 1595 Assert(pD3DIfTex); 1596 hr = pD3DIfTex->UnlockRect(iAlloc); 1597 Assert(hr == S_OK); 1598 break; 1599 } 1600 case VBOXDISP_D3DIFTYPE_CUBE_TEXTURE: 1601 { 1602 IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pRc->aAllocations[0].pD3DIf; 1603 Assert(pD3DIfCubeTex); 1604 hr = pD3DIfCubeTex->UnlockRect(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, iAlloc), 1605 VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, iAlloc)); 1606 Assert(hr == S_OK); 1607 break; 1608 } 1609 case VBOXDISP_D3DIFTYPE_VERTEXBUFFER: 1610 { 1611 IDirect3DVertexBuffer9 *pD3D9VBuf = (IDirect3DVertexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf; 1612 Assert(pD3D9VBuf); 1613 hr = pD3D9VBuf->Unlock(); 1614 Assert(hr == S_OK); 1615 break; 1616 } 1617 case VBOXDISP_D3DIFTYPE_INDEXBUFFER: 1618 { 1619 IDirect3DIndexBuffer9 *pD3D9IBuf = (IDirect3DIndexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf; 1620 Assert(pD3D9IBuf); 1621 hr = pD3D9IBuf->Unlock(); 1622 Assert(hr == S_OK); 1623 break; 1624 } 1625 default: 1626 Assert(0); 1627 hr = E_FAIL; 1628 break; 1629 } 1630 return hr; 1631 } 1632 1633 static HRESULT vboxWddmMemsetRc(PVBOXWDDMDISP_RESOURCE pRc, char c) 1634 { 1635 for (UINT i = 0; i < pRc->cAllocations; ++i) 1636 { 1637 D3DLOCKED_RECT Rect; 1638 HRESULT hr = vboxWddmLockRect(pRc, i, &Rect, NULL, D3DLOCK_DISCARD); 1639 if (FAILED(hr)) 1640 { 1641 WARN(("vboxWddmLockRect failed, hr(0x%x)", hr)); 1642 return hr; 1643 } 1644 1645 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i]; 1646 UINT cbAllocPitch = pAlloc->SurfDesc.pitch; 1647 if(Rect.Pitch == cbAllocPitch) 1648 { 1649 memset(Rect.pBits, 0, Rect.Pitch * pAlloc->SurfDesc.height); 1650 } 1651 else 1652 { 1653 Assert(0); 1654 Assert(cbAllocPitch < (UINT)Rect.Pitch); 1655 uint8_t *pData = (uint8_t*)Rect.pBits; 1656 for (UINT j = 0; j < pAlloc->SurfDesc.height; ++j) 1657 { 1658 memset(Rect.pBits, c, cbAllocPitch); 1659 pData += Rect.Pitch; 1660 } 1661 } 1662 1663 hr = vboxWddmUnlockRect(pRc, i); 1664 Assert(SUCCEEDED(hr)); 1665 } 1666 return S_OK; 1667 } 1668 1669 static HRESULT vboxWddmSurfSynchMem(PVBOXWDDMDISP_RESOURCE pRc) 1670 { 1671 if (pRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM) 1672 { 1673 return S_OK; 1674 } 1675 1676 for (UINT i = 0; i < pRc->cAllocations; ++i) 1677 { 1678 D3DLOCKED_RECT Rect; 1679 HRESULT hr = vboxWddmLockRect(pRc, i, &Rect, NULL, D3DLOCK_DISCARD); 1680 if (FAILED(hr)) 1681 { 1682 WARN(("vboxWddmLockRect failed, hr(0x%x)", hr)); 1683 return hr; 1684 } 1685 1686 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i]; 1687 Assert(pAlloc->pvMem); 1688 1689 vboxWddmLockUnlockMemSynch(pAlloc, &Rect, NULL, true /*bool bToLockInfo*/); 1690 1691 hr = vboxWddmUnlockRect(pRc, i); 1692 Assert(SUCCEEDED(hr)); 1693 } 1694 return S_OK; 1695 } 1696 1697 #ifdef VBOXWDDMDISP_DEBUG 1698 static void vboxWddmDbgSynchMemCheck(PVBOXWDDMDISP_ALLOCATION pAlloc, D3DLOCKED_RECT *pLockInfo) 1699 { 1700 Assert(pAlloc->SurfDesc.pitch); 1701 Assert(pAlloc->pvMem); 1702 int iRc = 0; 1703 1704 if (pAlloc->SurfDesc.pitch == pLockInfo->Pitch) 1705 { 1706 iRc = memcmp(pLockInfo->pBits, pAlloc->pvMem, pAlloc->SurfDesc.pitch * pAlloc->SurfDesc.height); 1707 Assert(!iRc); 1531 1708 } 1532 1709 else 1533 1710 { 1534 Assert(!pAllocation->pvMem); 1535 } 1536 return hr; 1537 } 1711 uint8_t *pvSrc, *pvDst; 1712 uint32_t srcPitch, dstPitch; 1713 if (1) 1714 { 1715 pvSrc = (uint8_t *)pAlloc->pvMem; 1716 pvDst = (uint8_t *)pLockInfo->pBits; 1717 srcPitch = pAlloc->SurfDesc.pitch; 1718 dstPitch = pLockInfo->Pitch; 1719 } 1720 else 1721 { 1722 pvDst = (uint8_t *)pAlloc->pvMem; 1723 pvSrc = (uint8_t *)pLockInfo->pBits; 1724 dstPitch = pAlloc->SurfDesc.pitch; 1725 srcPitch = (uint32_t)pLockInfo->Pitch; 1726 } 1727 1728 Assert(pAlloc->SurfDesc.pitch <= (UINT)pLockInfo->Pitch); 1729 uint32_t pitch = RT_MIN(srcPitch, dstPitch); 1730 Assert(pitch); 1731 for (UINT j = 0; j < pAlloc->SurfDesc.height; ++j) 1732 { 1733 iRc = memcmp(pvDst, pvSrc, pitch); 1734 Assert(!iRc); 1735 pvSrc += srcPitch; 1736 pvDst += dstPitch; 1737 } 1738 } 1739 } 1740 1741 static VOID vboxWddmDbgRcSynchMemCheck(PVBOXWDDMDISP_RESOURCE pRc) 1742 { 1743 if (pRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM) 1744 { 1745 return; 1746 } 1747 1748 for (UINT i = 0; i < pRc->cAllocations; ++i) 1749 { 1750 D3DLOCKED_RECT Rect; 1751 HRESULT hr = vboxWddmLockRect(pRc, i, &Rect, NULL, D3DLOCK_READONLY); 1752 if (FAILED(hr)) 1753 { 1754 WARN(("vboxWddmLockRect failed, hr(0x%x)", hr)); 1755 return; 1756 } 1757 1758 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i]; 1759 Assert(pAlloc->pvMem); 1760 1761 vboxWddmDbgSynchMemCheck(pAlloc, &Rect); 1762 1763 hr = vboxWddmUnlockRect(pRc, i); 1764 Assert(SUCCEEDED(hr)); 1765 } 1766 } 1767 #endif 1768 1538 1769 1539 1770 static D3DFORMAT vboxDDI2D3DFormat(D3DDDIFORMAT format) … … 2077 2308 && pBbAlloc->SurfDesc.format == pRt->pAlloc->SurfDesc.format 2078 2309 && pBbAlloc->SurfDesc.VidPnSourceId == pRt->pAlloc->SurfDesc.VidPnSourceId 2310 #if 0 2079 2311 && (pBbRc == pRtRc 2080 2312 || (pBbRc->fFlags == pRtRc->fFlags … … 2082 2314 // && pBbRc->RcDesc.fFlags.Value == pRtRc->RcDesc.fFlags.Value 2083 2315 ) 2084 )) 2316 2317 ) 2318 #endif 2319 ) 2085 2320 { 2086 2321 vboxWddmSwapchainBbAddTail(pCur, pBbAlloc, TRUE); … … 2462 2697 return hr; 2463 2698 } 2699 2700 static HRESULT vboxWddmShRcRefAlloc(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc, BOOL fAddRef, DWORD *pcRefs) 2701 { 2702 D3DDDICB_ESCAPE DdiEscape = {0}; 2703 VBOXDISPIFESCAPE_SHRC_REF Data = {0}; 2704 DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext; 2705 DdiEscape.hDevice = pDevice->hDevice; 2706 DdiEscape.Flags.HardwareAccess = 1; 2707 DdiEscape.pPrivateDriverData = &Data; 2708 DdiEscape.PrivateDriverDataSize = sizeof (Data); 2709 Data.EscapeHdr.escapeCode = fAddRef ? VBOXESC_SHRC_ADDREF : VBOXESC_SHRC_RELEASE; 2710 Data.hAlloc = (uint64_t)pAlloc->hAllocation; 2711 HRESULT hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape); 2712 if (FAILED(hr)) 2713 { 2714 WARN(("pfnEscapeCb, hr (0x%x)", hr)); 2715 return TRUE; 2716 } 2717 2718 LOG(("shrc(0x%p) refs(%d)", (void*)pAlloc->hSharedHandle, Data.EscapeHdr.u32CmdSpecific)); 2719 if (pcRefs) 2720 *pcRefs = Data.EscapeHdr.u32CmdSpecific; 2721 2722 return hr; 2723 } 2724 2725 static HRESULT vboxWddmShRcRefRc(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_RESOURCE pRc, BOOL fAddRef, DWORD *pcRefs) 2726 { 2727 Assert(pRc->RcDesc.fFlags.SharedResource); 2728 DWORD cTotalRefs = 0; 2729 HRESULT hr = S_OK; 2730 for (DWORD i = 0; i < pRc->cAllocations; ++i) 2731 { 2732 DWORD cRefs = 0; 2733 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i]; 2734 if(!pAlloc->hSharedHandle) 2735 continue; 2736 2737 hr = vboxWddmShRcRefAlloc(pDevice, pAlloc, fAddRef, &cRefs); 2738 2739 if (FAILED(hr)) 2740 { 2741 WARN(("vboxWddmShRcRefAlloc failed, hr()0x%x", hr)); 2742 for (DWORD j = 0; j < i; ++j) 2743 { 2744 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i]; 2745 if(!pAlloc->hSharedHandle) 2746 continue; 2747 HRESULT tmpHr = vboxWddmShRcRefAlloc(pDevice, pAlloc, !fAddRef, NULL); 2748 Assert(SUCCEEDED(tmpHr)); 2749 } 2750 return hr; 2751 } 2752 2753 /* success! */ 2754 cTotalRefs += cRefs; 2755 } 2756 2757 Assert(cTotalRefs || !fAddRef); 2758 2759 /* success! */ 2760 if (pcRefs) 2761 *pcRefs = cTotalRefs; 2762 2763 return S_OK; 2764 } 2765 2464 2766 2465 2767 static HRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain) … … 3494 3796 if (pRc) 3495 3797 { 3798 VBOXVDBG_CHECK_SMSYNC(pRc); 3496 3799 if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE) 3497 3800 { … … 3591 3894 if (pRc) 3592 3895 { 3896 VBOXVDBG_CHECK_SMSYNC(pRc); 3593 3897 Assert(pRc->cAllocations == 1); 3594 3898 pAlloc = &pRc->aAllocations[0]; … … 3925 4229 Assert(pDstRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM); 3926 4230 HRESULT hr = S_OK; 4231 VBOXVDBG_CHECK_SMSYNC(pDstRc); 4232 VBOXVDBG_CHECK_SMSYNC(pSrcRc); 3927 4233 3928 4234 VBOXVDBG_DUMP_TEXBLT_ENTER(pSrcRc, &pData->SrcRect, pDstRc, &pData->DstPoint); … … 4269 4575 if (!pLockAlloc->LockInfo.cLocks) 4270 4576 { 4577 VBOXVDBG_CHECK_SMSYNC(pRc); 4271 4578 switch (pTexAlloc->enmD3DIfType) 4272 4579 { … … 4417 4724 if (!pAlloc->LockInfo.cLocks) 4418 4725 { 4726 VBOXVDBG_CHECK_SMSYNC(pRc); 4419 4727 if (!pData->Flags.MightDrawFromLocked || (!pData->Flags.Discard && !pData->Flags.NoOverwrite)) 4420 4728 { … … 4509 4817 if (!pAlloc->LockInfo.cLocks) 4510 4818 { 4819 VBOXVDBG_CHECK_SMSYNC(pRc); 4511 4820 if (!pData->Flags.MightDrawFromLocked || (!pData->Flags.Discard && !pData->Flags.NoOverwrite)) 4512 4821 { … … 4589 4898 else 4590 4899 { 4900 #ifdef DEBUG_misha 4901 Assert(0); 4902 #endif 4591 4903 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex]; 4592 4904 D3DDDICB_LOCK LockData; … … 4715 5027 } 4716 5028 Assert(hr == S_OK); 5029 VBOXVDBG_CHECK_SMSYNC(pRc); 4717 5030 } 4718 5031 else … … 4755 5068 hr = pD3D9VBuf->Unlock(); 4756 5069 Assert(hr == S_OK); 5070 VBOXVDBG_CHECK_SMSYNC(pRc); 4757 5071 } 4758 5072 else … … 4795 5109 hr = pD3D9IBuf->Unlock(); 4796 5110 Assert(hr == S_OK); 5111 VBOXVDBG_CHECK_SMSYNC(pRc); 4797 5112 } 4798 5113 else … … 4931 5246 pRc->hKMResource = NULL; 4932 5247 pRc->pDevice = pDevice; 4933 pRc->fFlags = VBOXWDDM_RESOURCE_F_TYPE_GENERIC; 5248 pRc->fFlags.Value = 0; 5249 pRc->fFlags.Generic = 1; 4934 5250 pRc->RcDesc.fFlags = pResource->Flags; 4935 5251 pRc->RcDesc.enmFormat = pResource->Format; … … 4969 5285 pAllocation->D3DWidth = pSurf->Width; 4970 5286 pAllocation->pvMem = (void*)pSurf->pSysMem; 4971 pAllocation->SurfDesc.pitch = pSurf->SysMemPitch;4972 5287 pAllocation->SurfDesc.slicePitch = pSurf->SysMemSlicePitch; 4973 5288 pAllocation->SurfDesc.depth = pSurf->Depth; … … 4975 5290 pAllocation->SurfDesc.height = pSurf->Height; 4976 5291 pAllocation->SurfDesc.format = pResource->Format; 5292 if (!vboxWddmFormatToFourcc(pResource->Format)) 5293 pAllocation->SurfDesc.bpp = vboxWddmCalcBitsPerPixel(pResource->Format); 5294 else 5295 pAllocation->SurfDesc.bpp = 0; 5296 5297 if (pSurf->SysMemPitch) 5298 { 5299 pAllocation->SurfDesc.pitch = pSurf->SysMemPitch; 5300 } 5301 else 5302 pAllocation->SurfDesc.pitch = vboxWddmCalcPitch(pSurf->Width, pAllocation->SurfDesc.bpp); 4977 5303 } 4978 5304 … … 5006 5332 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE; 5007 5333 pAllocation->pD3DIf = pD3D9Surf; 5008 hr = vboxWddmSurfSynchMem(pRc, pAllocation);5009 Assert(hr == S_OK);5010 5334 } 5011 5335 else … … 5016 5340 } 5017 5341 break; 5342 } 5343 } 5344 5345 if (SUCCEEDED(hr)) 5346 { 5347 if (pResource->Pool != D3DDDIPOOL_SYSTEMMEM) 5348 { 5349 vboxWddmMemsetRc(pRc, 0); 5350 } 5351 else 5352 { 5353 vboxWddmSurfSynchMem(pRc); 5018 5354 } 5019 5355 } … … 5039 5375 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_VERTEXBUFFER; 5040 5376 pAllocation->pD3DIf = pD3D9VBuf; 5041 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)5042 {5043 Assert(pAllocation->pvMem);5044 D3DLOCKED_RECT lockInfo;5045 hr = pD3D9VBuf->Lock(0, pAllocation->SurfDesc.width, &lockInfo.pBits, D3DLOCK_DISCARD);5046 Assert(hr == S_OK);5047 if (hr == S_OK)5048 {5049 lockInfo.Pitch = pAllocation->SurfDesc.pitch;5050 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/);5051 HRESULT tmpHr = pD3D9VBuf->Unlock();5052 Assert(tmpHr == S_OK);5053 }5054 }5055 else5056 {5057 Assert(!pAllocation->pvMem);5058 }5059 5377 } 5060 5378 else … … 5065 5383 } 5066 5384 break; 5385 } 5386 } 5387 5388 if (SUCCEEDED(hr)) 5389 { 5390 if (pResource->Pool != D3DDDIPOOL_SYSTEMMEM) 5391 { 5392 vboxWddmMemsetRc(pRc, 0); 5393 } 5394 else 5395 { 5396 vboxWddmSurfSynchMem(pRc); 5067 5397 } 5068 5398 } … … 5090 5420 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_INDEXBUFFER; 5091 5421 pAllocation->pD3DIf = pD3D9IBuf; 5092 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)5093 {5094 Assert(pAllocation->pvMem);5095 D3DLOCKED_RECT lockInfo;5096 hr = pD3D9IBuf->Lock(0, pAllocation->SurfDesc.width, &lockInfo.pBits, D3DLOCK_DISCARD);5097 Assert(hr == S_OK);5098 if (hr == S_OK)5099 {5100 lockInfo.Pitch = pAllocation->SurfDesc.pitch;5101 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/);5102 HRESULT tmpHr = pD3D9IBuf->Unlock();5103 Assert(tmpHr == S_OK);5104 }5105 }5106 else5107 {5108 Assert(!pAllocation->pvMem);5109 }5110 5422 } 5111 5423 else … … 5116 5428 } 5117 5429 break; 5430 } 5431 } 5432 5433 if (SUCCEEDED(hr)) 5434 { 5435 if (pResource->Pool != D3DDDIPOOL_SYSTEMMEM) 5436 { 5437 vboxWddmMemsetRc(pRc, 0); 5438 } 5439 else 5440 { 5441 vboxWddmSurfSynchMem(pRc); 5118 5442 } 5119 5443 } … … 5206 5530 #endif 5207 5531 pAllocation->hSharedHandle = hSharedHandle; 5208 #ifdef DEBUG_misha 5209 if ( pResource->Flags.SharedResource)5532 5533 if (!pavClientMem) 5210 5534 { 5211 vboxVDbgPrint(("\n\n********\nShared Texture pAlloc(0x%p) Handle(0x%x), (0n%d) CREATED, pid (0x%x), (0n%d)\n***********\n\n",5212 pAllocation, hSharedHandle, hSharedHandle, GetCurrentProcessId(), GetCurrentProcessId())); 5535 /* zero-init texture memory */ 5536 5213 5537 } 5214 #endif5215 5538 } 5216 5539 … … 5283 5606 } 5284 5607 } 5608 5609 if (SUCCEEDED(hr)) 5610 { 5611 if (pResource->Pool != D3DDDIPOOL_SYSTEMMEM) 5612 { 5613 vboxWddmMemsetRc(pRc, 0); 5614 } 5615 else 5616 { 5617 vboxWddmSurfSynchMem(pRc); 5618 } 5619 } 5285 5620 } 5286 5621 else if (pResource->Flags.RenderTarget) … … 5330 5665 #endif 5331 5666 pAllocation->hSharedHandle = hSharedHandle; 5332 hr = vboxWddmSurfSynchMem(pRc, pAllocation); 5333 Assert(hr == S_OK); 5334 if (hr == S_OK) 5335 { 5336 continue; 5337 } 5667 continue; 5338 5668 5339 5669 /* fail branch */ … … 5347 5677 break; 5348 5678 } 5679 5680 if (SUCCEEDED(hr)) 5681 { 5682 if (pResource->Pool != D3DDDIPOOL_SYSTEMMEM) 5683 { 5684 vboxWddmMemsetRc(pRc, 0); 5685 } 5686 else 5687 { 5688 Assert(0); 5689 vboxWddmSurfSynchMem(pRc); 5690 } 5691 } 5349 5692 } 5350 5693 } … … 5364 5707 if (hr == S_OK && bIssueCreateResource) 5365 5708 { 5709 pRc->fFlags.KmResource = bCreateKMResource; 5366 5710 D3DDDICB_ALLOCATE *pDdiAllocate = vboxWddmRequestAllocAlloc(pResource); 5367 5711 Assert(pDdiAllocate); … … 5371 5715 Assert(pDdiAllocate->PrivateDriverDataSize == sizeof (VBOXWDDM_RCINFO)); 5372 5716 PVBOXWDDM_RCINFO pRcInfo = (PVBOXWDDM_RCINFO)pDdiAllocate->pPrivateDriverData; 5373 pRcInfo->fFlags = VBOXWDDM_RESOURCE_F_TYPE_GENERIC;5717 pRcInfo->fFlags = pRc->fFlags; 5374 5718 pRcInfo->RcDesc = pRc->RcDesc; 5375 5719 pRcInfo->cAllocInfos = pResource->SurfCount; … … 5423 5767 } 5424 5768 5769 Assert(!pRc->fFlags.Opened); 5770 // Assert(!pRc->fFlags.KmResource); 5771 Assert(pRc->fFlags.Generic); 5772 5425 5773 if (bCreateKMResource) 5426 5774 { 5775 Assert(pRc->fFlags.KmResource); 5776 5427 5777 hr = pDevice->RtCallbacks.pfnAllocateCb(pDevice->hDevice, pDdiAllocate); 5428 5778 Assert(hr == S_OK); 5429 Assert(pDdiAllocate->hKMResource); 5779 Assert(pDdiAllocate->hKMResource 5780 || pResource->Flags.SharedResource /* for some reason shared resources 5781 * are created with zero km resource handle on Win7+ */ 5782 ); 5430 5783 } 5431 5784 else 5432 5785 { 5786 Assert(!pRc->fFlags.KmResource); 5787 5433 5788 pDdiAllocate->hResource = NULL; 5434 5789 pDdiAllocate->NumAllocations = 1; … … 5480 5835 pAllocation->pvMem = (void*)pSurf->pSysMem; 5481 5836 pAllocation->SurfDesc = pAllocInfo->SurfDesc; 5837 5838 if (pResource->Flags.SharedResource) 5839 { 5840 if (pAllocation->hSharedHandle) 5841 { 5842 vboxWddmShRcRefAlloc(pDevice, pAllocation, TRUE, NULL); 5843 } 5844 #ifdef DEBUG_misha 5845 Assert(VBOXWDDMDISP_IS_TEXTURE(pResource->Flags)); 5846 vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared CREATED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), " 5847 "Handle(0x%x), (0n%d) \n***********\n\n", 5848 GetCurrentProcessId(), GetCurrentProcessId(), 5849 pAllocation, pRc->hKMResource, pAllocation->hAllocation, 5850 pAllocation->hSharedHandle, pAllocation->hSharedHandle 5851 )); 5852 #endif 5853 } 5482 5854 } 5483 5855 … … 5532 5904 for (UINT i = 0; i < pRc->cAllocations; ++i) 5533 5905 { 5906 BOOL fSetDontDelete = FALSE; 5534 5907 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i]; 5908 if (pAlloc->hSharedHandle) 5909 { 5910 DWORD cShRcRefs; 5911 HRESULT tmpHr = vboxWddmShRcRefAlloc(pDevice, pAlloc, FALSE, &cShRcRefs); 5912 if (cShRcRefs) 5913 { 5914 fSetDontDelete = TRUE; 5915 } 5535 5916 #ifdef DEBUG_misha 5536 if (pAlloc->hSharedHandle) 5537 { 5538 vboxVDbgPrint(("\n\n********\nShared Texture pAlloc(0x%p) Handle(0x%x), (0n%d) DESTROYED, pid (0x%x), (0n%d)\n***********\n\n", 5539 pAlloc, pAlloc->hSharedHandle, pAlloc->hSharedHandle, GetCurrentProcessId(), GetCurrentProcessId())); 5540 } 5541 #endif 5917 vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared DESTROYED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), " 5918 "Handle(0x%x), (0n%d) \n***********\n\n", 5919 GetCurrentProcessId(), GetCurrentProcessId(), 5920 pAlloc, pRc->hKMResource, pAlloc->hAllocation, 5921 pAlloc->hSharedHandle, pAlloc->hSharedHandle 5922 )); 5923 #endif 5924 } 5925 5926 if (fSetDontDelete) 5927 { 5928 Assert(pAlloc->pD3DIf); 5929 pAdapter->D3D.pfnVBoxWineExD3DRc9SetDontDeleteGl((IDirect3DResource9*)pAlloc->pD3DIf); 5930 } 5931 5542 5932 if (pAlloc->pD3DIf) 5543 5933 pAlloc->pD3DIf->Release(); 5544 if (pAlloc->pSecondaryOpenedD3DIf)5545 pAlloc->pSecondaryOpenedD3DIf->Release();5546 5934 5547 5935 PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainForAlloc(pAlloc); … … 5560 5948 5561 5949 Assert(pRc->hKMResource || VBOXDISPMODE_IS_3D(pAdapter)); 5562 if (pRc->hKMResource) 5563 { 5564 if (!(pRc->fFlags & VBOXWDDM_RESOURCE_F_OPENNED)) 5565 { 5566 D3DDDICB_DEALLOCATE Dealloc; 5567 5568 Assert(pRc->hResource); 5569 5570 Dealloc.hResource = pRc->hResource; 5571 /* according to the docs the below two are ignored in case we set the hResource */ 5572 Dealloc.NumAllocations = 0; 5573 Dealloc.HandleList = NULL; 5574 hr = pDevice->RtCallbacks.pfnDeallocateCb(pDevice->hDevice, &Dealloc); 5575 Assert(hr == S_OK); 5576 } 5950 if (pRc->fFlags.KmResource) 5951 { 5952 D3DDDICB_DEALLOCATE Dealloc; 5953 Assert(pRc->hResource); 5954 Dealloc.hResource = pRc->hResource; 5955 /* according to the docs the below two are ignored in case we set the hResource */ 5956 Dealloc.NumAllocations = 0; 5957 Dealloc.HandleList = NULL; 5958 hr = pDevice->RtCallbacks.pfnDeallocateCb(pDevice->hDevice, &Dealloc); 5959 Assert(hr == S_OK); 5577 5960 } 5578 5961 else 5579 5962 { 5580 Assert(!(pRc->fFlags & VBOXWDDM_RESOURCE_F_OPENNED));5963 Assert(!(pRc->fFlags.Opened)); 5581 5964 for (UINT j = 0; j < pRc->cAllocations; ++j) 5582 5965 { … … 5622 6005 // Assert(pScreen->iRenderTargetFrontBuf == pData->SubResourceIndex); 5623 6006 5624 #if 05625 Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);5626 IDirect3DSurface9 *pSoD3DIfSurf = (IDirect3DSurface9*)pAlloc->pSecondaryOpenedD3DIf;5627 hr = pScreen->pDevice9If->SetRenderTarget(0, pSoD3DIfSurf);5628 Assert(hr == S_OK);5629 if (hr == S_OK)5630 #endif5631 6007 { 5632 6008 hr = pDevice->RtCallbacks.pfnSetDisplayModeCb(pDevice->hDevice, &DdiDm); … … 5946 6322 if (pRc) 5947 6323 { 6324 VBOXVDBG_CHECK_SMSYNC(pRc); 5948 6325 Assert(pRc->cAllocations == 1); 5949 6326 pAlloc = &pRc->aAllocations[0]; … … 6010 6387 return E_FAIL; 6011 6388 } 6012 static HRESULT vboxWddmLockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc,6013 D3DLOCKED_RECT * pLockedRect,6014 CONST RECT *pRect,6015 DWORD fLockFlags)6016 {6017 HRESULT hr = E_FAIL;6018 Assert(!pRc->aAllocations[iAlloc].LockInfo.cLocks);6019 Assert(pRc->cAllocations > iAlloc);6020 switch (pRc->aAllocations[0].enmD3DIfType)6021 {6022 case VBOXDISP_D3DIFTYPE_SURFACE:6023 {6024 IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;6025 Assert(pD3DIfSurf);6026 hr = pD3DIfSurf->LockRect(pLockedRect, pRect, fLockFlags);6027 Assert(hr == S_OK);6028 break;6029 }6030 case VBOXDISP_D3DIFTYPE_TEXTURE:6031 {6032 IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;6033 Assert(pD3DIfTex);6034 hr = pD3DIfTex->LockRect(iAlloc, pLockedRect, pRect, fLockFlags);6035 Assert(hr == S_OK);6036 break;6037 }6038 case VBOXDISP_D3DIFTYPE_CUBE_TEXTURE:6039 {6040 IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pRc->aAllocations[0].pD3DIf;6041 Assert(pD3DIfCubeTex);6042 hr = pD3DIfCubeTex->LockRect(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, iAlloc),6043 VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, iAlloc), pLockedRect, pRect, fLockFlags);6044 Assert(hr == S_OK);6045 break;6046 }6047 default:6048 Assert(0);6049 break;6050 }6051 return hr;6052 }6053 6054 static HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc)6055 {6056 HRESULT hr = S_OK;6057 Assert(pRc->cAllocations > iAlloc);6058 switch (pRc->aAllocations[0].enmD3DIfType)6059 {6060 case VBOXDISP_D3DIFTYPE_SURFACE:6061 {6062 IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;6063 Assert(pD3DIfSurf);6064 hr = pD3DIfSurf->UnlockRect();6065 Assert(hr == S_OK);6066 break;6067 }6068 case VBOXDISP_D3DIFTYPE_TEXTURE:6069 {6070 IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;6071 Assert(pD3DIfTex);6072 hr = pD3DIfTex->UnlockRect(iAlloc);6073 Assert(hr == S_OK);6074 break;6075 }6076 case VBOXDISP_D3DIFTYPE_CUBE_TEXTURE:6077 {6078 IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pRc->aAllocations[0].pD3DIf;6079 Assert(pD3DIfCubeTex);6080 hr = pD3DIfCubeTex->UnlockRect(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, iAlloc),6081 VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, iAlloc));6082 Assert(hr == S_OK);6083 break;6084 }6085 default:6086 Assert(0);6087 hr = E_FAIL;6088 break;6089 }6090 return hr;6091 }6092 6389 6093 6390 static HRESULT APIENTRY vboxWddmDDevBlt(HANDLE hDevice, CONST D3DDDIARG_BLT* pData) … … 6102 6399 PVBOXWDDMDISP_RESOURCE pDstRc = (PVBOXWDDMDISP_RESOURCE)pData->hDstResource; 6103 6400 PVBOXWDDMDISP_RESOURCE pSrcRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource; 6401 VBOXVDBG_CHECK_SMSYNC(pDstRc); 6402 VBOXVDBG_CHECK_SMSYNC(pSrcRc); 6104 6403 Assert(pDstRc->cAllocations > pData->DstSubResourceIndex); 6105 6404 Assert(pSrcRc->cAllocations > pData->SrcSubResourceIndex); … … 6186 6485 if (hr == S_OK) 6187 6486 { 6487 VBOXVDBG_CHECK_SMSYNC(pRc); 6188 6488 Assert(pSurfIf); 6189 6489 hr = pDevice9If->ColorFill(pSurfIf, &pData->DstRect, pData->Color); … … 6308 6608 IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice); 6309 6609 PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hRenderTarget; 6610 VBOXVDBG_CHECK_SMSYNC(pRc); 6310 6611 Assert(pRc); 6311 6612 Assert(pData->SubResourceIndex < pRc->cAllocations); … … 6329 6630 if (pRc) 6330 6631 { 6632 VBOXVDBG_CHECK_SMSYNC(pRc); 6331 6633 Assert(pRc->cAllocations == 1); 6332 6634 Assert(pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE); … … 6893 7195 HRESULT hr = S_OK; 6894 7196 7197 Assert(pData->hKMResource); 7198 6895 7199 Assert(pData->NumAllocations); 6896 7200 PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(pData->NumAllocations); … … 6902 7206 pRc->pDevice = pDevice; 6903 7207 pRc->RcDesc.enmRotation = pData->Rotation; 6904 pRc->fFlags = VBOXWDDM_RESOURCE_F_OPENNED; 7208 pRc->fFlags.Value = 0; 7209 pRc->fFlags.Generic = 1; 7210 pRc->fFlags.Opened = 1; 7211 pRc->fFlags.KmResource = 1; 6905 7212 if (!pData->pPrivateDriverData || !pData->PrivateDriverDataSize) 6906 7213 { … … 6948 7255 { 6949 7256 VBOXWDDM_RCINFO *pRcInfo = (VBOXWDDM_RCINFO*)pData->pPrivateDriverData; 6950 Assert(pRcInfo->fFlags == VBOXWDDM_RESOURCE_F_TYPE_GENERIC); 7257 Assert(pRcInfo->fFlags.Generic); 7258 Assert(!pRcInfo->fFlags.Opened); 6951 7259 Assert(pRcInfo->cAllocInfos == pData->NumAllocations); 6952 pRc->fFlags = pRcInfo->fFlags | VBOXWDDM_RESOURCE_F_OPENNED; 7260 pRc->fFlags = pRcInfo->fFlags; 7261 pRc->fFlags.Opened = 1; 6953 7262 pRc->RcDesc = pRcInfo->RcDesc; 6954 7263 pRc->cAllocations = pData->NumAllocations; … … 6973 7282 Assert(pAllocation->hSharedHandle); 6974 7283 #endif 7284 7285 vboxWddmShRcRefAlloc(pDevice, pAllocation, TRUE, NULL); 7286 7287 vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared OPENNED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), " 7288 "Handle(0x%x), (0n%d) \n***********\n\n", 7289 GetCurrentProcessId(), GetCurrentProcessId(), 7290 pAllocation, pRc->hKMResource, pAllocation->hAllocation, 7291 pAllocation->hSharedHandle, pAllocation->hSharedHandle 7292 )); 6975 7293 } 6976 7294 … … 6983 7301 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED 6984 7302 Assert(pAllocation->hSharedHandle); 6985 #endif6986 6987 #ifdef DEBUG_misha6988 vboxVDbgPrint(("\n\n********\nShared Texture pAlloc(0x%p) Handle(0x%x), (0n%d) OPENED, pid (0x%x), (0n%d)\n***********\n\n",6989 pAllocation, hSharedHandle, hSharedHandle, GetCurrentProcessId(), GetCurrentProcessId()));6990 6991 7303 #endif 6992 7304 … … 7030 7342 hr = E_INVALIDARG; 7031 7343 } 7032 7033 7344 hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If, 7034 7345 pAllocation->SurfDesc.width, -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h
r38903 r38982 33 33 /* maximum number of direct render targets to be used before 34 34 * switching to offscreen rendering */ 35 #define VBOXWDDMDISP_MAX_DIRECT_RTS 335 #define VBOXWDDMDISP_MAX_DIRECT_RTS 0 36 36 37 37 #define VBOXWDDMDISP_IS_TEXTURE(_f) ((_f).Texture || (_f).Value == 0) … … 240 240 /* object type is defined by enmD3DIfType enum */ 241 241 IUnknown *pD3DIf; 242 IUnknown *pSecondaryOpenedD3DIf;243 242 VBOXDISP_D3DIFTYPE enmD3DIfType; 244 243 /* list entry used to add allocation to the dirty alloc list */ … … 257 256 D3DKMT_HANDLE hKMResource; 258 257 PVBOXWDDMDISP_DEVICE pDevice; 259 uint32_tfFlags;258 VBOXWDDMDISP_RESOURCE_FLAGS fFlags; 260 259 VBOXWDDM_RC_DESC RcDesc; 261 260 UINT cAllocations; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp
r38903 r38982 37 37 #endif 38 38 Assert(pD3D->hD3DLib); 39 if (pD3D->hD3DLib) 39 if (!pD3D->hD3DLib) 40 { 41 DWORD winErr = GetLastError(); 42 WARN((__FUNCTION__": LoadLibraryW failed, winErr = (%d)", winErr)); 43 return E_FAIL; 44 } 45 46 do 40 47 { 41 48 pD3D->pfnDirect3DCreate9Ex = (PFNVBOXDISPD3DCREATE9EX)GetProcAddress(pD3D->hD3DLib, "Direct3DCreate9Ex"); 42 Assert(pD3D->pfnDirect3DCreate9Ex); 43 if (pD3D->pfnDirect3DCreate9Ex) 49 if (!pD3D->pfnDirect3DCreate9Ex) 44 50 { 45 pD3D->pfnVBoxWineExD3DDev9CreateTexture = (PFNVBOXWINEEXD3DDEV9_CREATETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateTexture"); 46 Assert(pD3D->pfnVBoxWineExD3DDev9CreateTexture); 47 if (pD3D->pfnVBoxWineExD3DDev9CreateTexture) 48 { 49 pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture = (PFNVBOXWINEEXD3DDEV9_CREATECUBETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateCubeTexture"); 50 Assert(pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture); 51 if (pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture) 52 { 53 pD3D->pfnVBoxWineExD3DDev9Flush = (PFNVBOXWINEEXD3DDEV9_FLUSH)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Flush"); 54 Assert(pD3D->pfnVBoxWineExD3DDev9Flush); 55 if (pD3D->pfnVBoxWineExD3DDev9Flush) 56 { 57 pD3D->pfnVBoxWineExD3DDev9Update = (PFNVBOXWINEEXD3DDEV9_UPDATE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Update"); 58 Assert(pD3D->pfnVBoxWineExD3DDev9Update); 59 if (pD3D->pfnVBoxWineExD3DDev9Update) 60 { 61 pD3D->pfnVBoxWineExD3DSwapchain9Present = (PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSwapchain9Present"); 62 Assert(pD3D->pfnVBoxWineExD3DSwapchain9Present); 63 if (pD3D->pfnVBoxWineExD3DSwapchain9Present) 64 { 65 return S_OK; 66 } 67 } 68 } 69 } 70 } 71 } 72 else 73 { 74 DWORD winErr = GetLastError(); 75 vboxVDbgPrintR((__FUNCTION__": GetProcAddressW (for Direct3DCreate9Ex) failed, winErr = (%d)", winErr)); 51 WARN(("no Direct3DCreate9Ex")); 52 break; 76 53 } 77 54 78 VBoxDispD3DClose(pD3D); 79 } 80 else 81 { 82 DWORD winErr = GetLastError(); 83 vboxVDbgPrintR((__FUNCTION__": LoadLibraryW failed, winErr = (%d)", winErr)); 84 } 55 pD3D->pfnVBoxWineExD3DDev9CreateTexture = (PFNVBOXWINEEXD3DDEV9_CREATETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateTexture"); 56 if (!pD3D->pfnVBoxWineExD3DDev9CreateTexture) 57 { 58 WARN(("no VBoxWineExD3DDev9CreateTexture")); 59 break; 60 } 61 62 pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture = (PFNVBOXWINEEXD3DDEV9_CREATECUBETEXTURE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9CreateCubeTexture"); 63 if (!pD3D->pfnVBoxWineExD3DDev9CreateCubeTexture) 64 { 65 WARN(("no VBoxWineExD3DDev9CreateCubeTexture")); 66 break; 67 } 68 69 pD3D->pfnVBoxWineExD3DDev9Flush = (PFNVBOXWINEEXD3DDEV9_FLUSH)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Flush"); 70 if (!pD3D->pfnVBoxWineExD3DDev9Flush) 71 { 72 WARN(("no VBoxWineExD3DDev9Flush")); 73 break; 74 } 75 76 pD3D->pfnVBoxWineExD3DDev9Update = (PFNVBOXWINEEXD3DDEV9_UPDATE)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Update"); 77 if (!pD3D->pfnVBoxWineExD3DDev9Update) 78 { 79 WARN(("no VBoxWineExD3DDev9Update")); 80 break; 81 } 82 83 pD3D->pfnVBoxWineExD3DRc9SetDontDeleteGl = (PFNVBOXWINEEXD3DRC9_SETDONTDELETEGL)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DRc9SetDontDeleteGl"); 84 if (!pD3D->pfnVBoxWineExD3DRc9SetDontDeleteGl) 85 { 86 WARN(("no VBoxWineExD3DRc9SetDontDeleteGl")); 87 break; 88 } 89 90 pD3D->pfnVBoxWineExD3DSwapchain9Present = (PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSwapchain9Present"); 91 if (!pD3D->pfnVBoxWineExD3DSwapchain9Present) 92 { 93 WARN(("no VBoxWineExD3DSwapchain9Present")); 94 break; 95 } 96 97 return S_OK; 98 99 } while (0); 100 101 VBoxDispD3DClose(pD3D); 85 102 86 103 return E_FAIL; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h
r38903 r38982 45 45 PFNVBOXWINEEXD3DDEV9_UPDATE pfnVBoxWineExD3DDev9Update; 46 46 47 PFNVBOXWINEEXD3DRC9_SETDONTDELETEGL pfnVBoxWineExD3DRc9SetDontDeleteGl; 48 47 49 PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT pfnVBoxWineExD3DSwapchain9Present; 48 50 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp
r38930 r38982 64 64 DWORD g_VBoxVDbgFBreakDdi = 0; 65 65 66 DWORD g_VBoxVDbgFLogRel = 0; 67 DWORD g_VBoxVDbgFLog = 0; 66 DWORD g_VBoxVDbgFCheckSysMemSync = 0; 67 68 DWORD g_VBoxVDbgFLogRel = 1; 69 DWORD g_VBoxVDbgFLog = 1; 68 70 DWORD g_VBoxVDbgFLogFlow = 0; 69 71 … … 561 563 switch (pExceptionRecord->ExceptionCode) 562 564 { 563 case 0xc0000005: /* only access violation and debug exceptions actually matter */ 564 case 0xc0000003: 565 case EXCEPTION_BREAKPOINT: 566 case EXCEPTION_ACCESS_VIOLATION: 567 case EXCEPTION_STACK_OVERFLOW: 568 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: 569 case EXCEPTION_FLT_DIVIDE_BY_ZERO: 570 case EXCEPTION_FLT_INVALID_OPERATION: 571 case EXCEPTION_INT_DIVIDE_BY_ZERO: 572 case EXCEPTION_ILLEGAL_INSTRUCTION: 565 573 AssertRelease(0); 566 574 break; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h
r38930 r38982 52 52 extern DWORD g_VBoxVDbgFBreakDdi; 53 53 54 extern DWORD g_VBoxVDbgFCheckSysMemSync; 54 55 55 56 /* log enable flags */ … … 146 147 } while (0) 147 148 149 #define LOG vboxVDbgPrint 150 #define LOGREL vboxVDbgPrintR 151 #define LOGFLOW vboxVDbgPrintF 152 148 153 #ifdef VBOXWDDMDISP_DEBUG 149 154 … … 191 196 ) 192 197 198 #define VBOXVDBG_IS_CHECK_ALLOWED(_type) ( \ 199 g_VBoxVDbgFCheck##_type \ 200 && (g_VBoxVDbgFCheck##_type == 1 \ 201 || VBOXVDBG_IS_DUMP_ALLOWED_PID(g_VBoxVDbgFCheck##_type) \ 202 ) \ 203 ) 204 193 205 #define VBOXVDBG_IS_DUMP_SHARED_ALLOWED(_pRc) (\ 194 206 (_pRc)->RcDesc.fFlags.SharedResource \ … … 214 226 } while (0) 215 227 228 #define VBOXVDBG_CHECK_SMSYNC(_pRc) do { \ 229 if (VBOXVDBG_IS_CHECK_ALLOWED(SysMemSync)) { \ 230 vboxWddmDbgRcSynchMemCheck((_pRc)); \ 231 } \ 232 } while (0) 233 234 #define VBOXVDBG_DEV_CHECK_SHARED(_pDevice, _pIsShared) do { \ 235 *(_pIsShared) = FALSE; \ 236 for (UINT i = 0; i < (_pDevice)->cRTs; ++i) { \ 237 PVBOXWDDMDISP_ALLOCATION pRtVar = (_pDevice)->apRTs[i]; \ 238 if (pRtVar->pRc->RcDesc.fFlags.SharedResource) { *(_pIsShared) = TRUE; break; } \ 239 } \ 240 } while (0) 241 242 #define VBOXVDBG_IS_DUMP_SHARED_ALLOWED_DEV(_pDevice, _pIsAllowed) do { \ 243 VBOXVDBG_DEV_CHECK_SHARED(_pDevice, _pIsAllowed); \ 244 if (*(_pIsAllowed)) \ 245 { \ 246 *(_pIsAllowed) = VBOXVDBG_IS_DUMP_ALLOWED(Shared); \ 247 } \ 248 } while (0) 249 216 250 #define VBOXVDBG_DUMP_DRAWPRIM_ENTER(_pDevice) do { \ 217 if (VBOXVDBG_IS_DUMP_ALLOWED(DrawPrim)) \ 251 BOOL fDumpShaded = FALSE; \ 252 VBOXVDBG_IS_DUMP_SHARED_ALLOWED_DEV(_pDevice, &fDumpShaded); \ 253 if (fDumpShaded \ 254 || VBOXVDBG_IS_DUMP_ALLOWED(DrawPrim)) \ 218 255 { \ 219 256 vboxVDbgDoDumpRt("==>"__FUNCTION__": RenderTarget Dump\n", (_pDevice), "\n"); \ … … 222 259 223 260 #define VBOXVDBG_DUMP_DRAWPRIM_LEAVE(_pDevice) do { \ 224 if (VBOXVDBG_IS_DUMP_ALLOWED(DrawPrim)) \ 261 BOOL fDumpShaded = FALSE; \ 262 VBOXVDBG_IS_DUMP_SHARED_ALLOWED_DEV(_pDevice, &fDumpShaded); \ 263 if (fDumpShaded \ 264 || VBOXVDBG_IS_DUMP_ALLOWED(DrawPrim)) \ 225 265 { \ 226 266 vboxVDbgDoDumpRt("<=="__FUNCTION__": RenderTarget Dump\n", (_pDevice), "\n"); \ … … 330 370 #define VBOXVDBG_BREAK_SHARED(_pRc) do { } while (0) 331 371 #define VBOXVDBG_BREAK_DDI() do { } while (0) 372 #define VBOXVDBG_CHECK_SMSYNC(_pRc) do { } while (0) 332 373 #endif 333 374 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r37626 r38982 106 106 BOOL bNotifyDxDpc; 107 107 108 #if 0 109 FAST_MUTEX ShRcTreeMutex; 110 AVLPVTREE ShRcTree; 111 #endif 112 108 113 VBOXWDDM_SOURCE aSources[VBOX_VIDEO_MAX_SCREENS]; 109 114 VBOXWDDM_TARGET aTargets[VBOX_VIDEO_MAX_SCREENS]; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r38930 r38982 1473 1473 } 1474 1474 } 1475 1476 #if 0 1477 VOID vboxShRcTreeInit(PVBOXMP_DEVEXT pDevExt) 1478 { 1479 ExInitializeFastMutex(&pDevExt->ShRcTreeMutex); 1480 pDevExt->ShRcTree = NULL; 1481 } 1482 1483 VOID vboxShRcTreeTerm(PVBOXMP_DEVEXT pDevExt) 1484 { 1485 Assert(!pDevExt->ShRcTree); 1486 pDevExt->ShRcTree = NULL; 1487 } 1488 1489 BOOLEAN vboxShRcTreePut(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc) 1490 { 1491 HANDLE hSharedRc = pAlloc->hSharedHandle; 1492 if (!hSharedRc) 1493 { 1494 WARN(("invalid call with zero shared handle!")); 1495 return FALSE; 1496 } 1497 pAlloc->ShRcTreeEntry.Key = (AVLPVKEY)hSharedRc; 1498 ExAcquireFastMutex(&pDevExt->ShRcTreeMutex); 1499 bool bRc = RTAvlPVInsert(&pDevExt->ShRcTree, &pAlloc->ShRcTreeEntry); 1500 ExReleaseFastMutex(&pDevExt->ShRcTreeMutex); 1501 Assert(bRc); 1502 return (BOOLEAN)bRc; 1503 } 1504 1505 #define PVBOXWDDM_ALLOCATION_FROM_SHRCTREENODE(_p) ((PVBOXWDDM_ALLOCATION)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXWDDM_ALLOCATION, ShRcTreeEntry))) 1506 PVBOXWDDM_ALLOCATION vboxShRcTreeGet(PVBOXMP_DEVEXT pDevExt, HANDLE hSharedRc) 1507 { 1508 ExAcquireFastMutex(&pDevExt->ShRcTreeMutex); 1509 PAVLPVNODECORE pNode = RTAvlPVGet(&pDevExt->ShRcTree, (AVLPVKEY)hSharedRc); 1510 ExReleaseFastMutex(&pDevExt->ShRcTreeMutex); 1511 if (!pNode) 1512 return NULL; 1513 PVBOXWDDM_ALLOCATION pAlloc = PVBOXWDDM_ALLOCATION_FROM_SHRCTREENODE(pNode); 1514 return pAlloc; 1515 } 1516 1517 BOOLEAN vboxShRcTreeRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc) 1518 { 1519 HANDLE hSharedRc = pAlloc->hSharedHandle; 1520 if (!hSharedRc) 1521 { 1522 WARN(("invalid call with zero shared handle!")); 1523 return FALSE; 1524 } 1525 ExAcquireFastMutex(&pDevExt->ShRcTreeMutex); 1526 PAVLPVNODECORE pNode = RTAvlPVRemove(&pDevExt->ShRcTree, (AVLPVKEY)hSharedRc); 1527 ExReleaseFastMutex(&pDevExt->ShRcTreeMutex); 1528 if (!pNode) 1529 return NULL; 1530 PVBOXWDDM_ALLOCATION pRetAlloc = PVBOXWDDM_ALLOCATION_FROM_SHRCTREENODE(pNode); 1531 Assert(pRetAlloc == pAlloc); 1532 return !!pRetAlloc; 1533 } 1534 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.h
r37734 r38982 151 151 VOID vboxWddmCounterU32Wait(uint32_t volatile * pu32, uint32_t u32Val); 152 152 153 #if 0 154 /* wine shrc handle -> allocation map */ 155 VOID vboxShRcTreeInit(PVBOXMP_DEVEXT pDevExt); 156 VOID vboxShRcTreeTerm(PVBOXMP_DEVEXT pDevExt); 157 BOOLEAN vboxShRcTreePut(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc); 158 PVBOXWDDM_ALLOCATION vboxShRcTreeGet(PVBOXMP_DEVEXT pDevExt, HANDLE hSharedRc); 159 BOOLEAN vboxShRcTreeRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc); 160 #endif 161 153 162 #endif /* #ifndef ___VBoxMPMisc_h__ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r37889 r38982 32 32 #include "VBoxMPVbva.h" 33 33 34 #if 0 35 #include <iprt/avl.h> 36 #endif 37 34 38 /* one page size */ 35 39 #define VBOXWDDM_C_DMA_BUFFER_SIZE 0x1000 … … 118 122 VBOXWDDM_ALLOC_TYPE enmType; 119 123 volatile uint32_t cRefs; 120 // VBOXWDDM_ALLOCUSAGE_TYPE enmCurrentUsage;121 124 D3DDDI_RESOURCEFLAGS fRcFlags; 122 125 UINT SegmentId; … … 128 131 BOOLEAN bVisible; 129 132 BOOLEAN bAssigned; 133 #ifdef DEBUG 134 /* current for shared rc handling assumes that once resource has no opens, it can not be openned agaion */ 135 BOOLEAN fAssumedDeletion; 136 #endif 130 137 VBOXWDDM_SURFACE_DESC SurfDesc; 131 138 struct VBOXWDDM_RESOURCE *pResource; … … 133 140 DXGK_ALLOCATIONUSAGEHINT UsageHint; 134 141 uint32_t iIndex; 142 uint32_t cOpens; 143 LIST_ENTRY OpenList; 144 /* helps tracking when to release wine shared resource */ 145 uint32_t cShRcRefs; 146 HANDLE hSharedHandle; 147 #if 0 148 AVLPVNODECORE ShRcTreeEntry; 149 #endif 135 150 VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType; 136 151 union … … 143 158 typedef struct VBOXWDDM_RESOURCE 144 159 { 145 uint32_tfFlags;160 VBOXWDDMDISP_RESOURCE_FLAGS fFlags; 146 161 volatile uint32_t cRefs; 147 162 VBOXWDDM_RC_DESC RcDesc; … … 251 266 } VBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD, *PVBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD; 252 267 268 typedef struct VBOXWDDM_DMA_PRIVATEDATA_ALLOCINFO_ON_SUBMIT 269 { 270 VBOXWDDM_DMA_PRIVATEDATA_BASEHDR Base; 271 VBOXWDDM_DMA_ALLOCINFO aInfos[1]; 272 } VBOXWDDM_DMA_PRIVATEDATA_ALLOCINFO_ON_SUBMIT, *PVBOXWDDM_DMA_PRIVATEDATA_ALLOCINFO_ON_SUBMIT; 273 253 274 typedef struct VBOXWDDM_OPENALLOCATION 254 275 { 276 LIST_ENTRY ListEntry; 255 277 D3DKMT_HANDLE hAllocation; 278 PVBOXWDDM_ALLOCATION pAllocation; 279 PVBOXWDDM_DEVICE pDevice; 280 uint32_t cShRcRefs; 256 281 } VBOXWDDM_OPENALLOCATION, *PVBOXWDDM_OPENALLOCATION; 257 282 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h
r38112 r38982 178 178 PVBOXWDDM_ALLOCATION pAlloc; 179 179 VBOXVIDEOOFFSET offAlloc; 180 UINT segmentIdAlloc; 180 UINT segmentIdAlloc : 31; 181 UINT fWriteOp : 1; 181 182 D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId; 182 183 } VBOXWDDM_DMA_ALLOCINFO, *PVBOXWDDM_DMA_ALLOCINFO; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r38660 r38982 51 51 } 52 52 53 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFrom OpenData(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_OPENALLOCATION pOa)53 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromHandle(PVBOXMP_DEVEXT pDevExt, D3DKMT_HANDLE hAllocation) 54 54 { 55 55 DXGKARGCB_GETHANDLEDATA GhData; 56 GhData.hObject = pOa->hAllocation;56 GhData.hObject = hAllocation; 57 57 GhData.Type = DXGK_HANDLE_ALLOCATION; 58 58 GhData.Flags.Value = 0; … … 62 62 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromAllocList(PVBOXMP_DEVEXT pDevExt, DXGK_ALLOCATIONLIST *pAllocList) 63 63 { 64 return vboxWddmGetAllocationFromOpenData(pDevExt, (PVBOXWDDM_OPENALLOCATION)pAllocList->hDeviceSpecificAllocation); 64 PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)pAllocList->hDeviceSpecificAllocation; 65 return pOa->pAllocation; 65 66 } 66 67 … … 955 956 VBoxMPCmnInitCustomVideoModes(pContext); 956 957 VBoxWddmInvalidateVideoModesInfo(pContext); 958 #if 0 959 vboxShRcTreeInit(pContext); 960 #endif 957 961 958 962 #ifdef VBOX_WITH_VIDEOHWACCEL … … 1010 1014 #ifdef VBOX_WITH_VIDEOHWACCEL 1011 1015 vboxVhwaFree(pDevExt); 1016 #endif 1017 #if 0 1018 vboxShRcTreeTerm(pDevExt); 1012 1019 #endif 1013 1020 … … 1794 1801 vboxWddmAssignPrimary(pDevExt, &pDevExt->aSources[pAllocation->SurfDesc.VidPnSourceId], NULL, pAllocation->SurfDesc.VidPnSourceId); 1795 1802 } 1803 1804 #if 0 1805 if (pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC) 1806 { 1807 if (pAllocation->hSharedHandle) 1808 { 1809 vboxShRcTreeRemove(pDevExt, pAllocation); 1810 } 1811 } 1812 #endif 1796 1813 break; 1797 1814 } … … 1903 1920 pAllocation->bVisible = FALSE; 1904 1921 pAllocation->bAssigned = FALSE; 1922 InitializeListHead(&pAllocation->OpenList); 1905 1923 1906 1924 switch (pAllocInfo->enmType) … … 1957 1975 { 1958 1976 pAllocationInfo->Flags.CpuVisible = 1; 1977 } 1978 else 1979 { 1980 pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle; 1981 #if 0 1982 if (pAllocation->hSharedHandle) 1983 { 1984 vboxShRcTreePut(pDevExt, pAllocation); 1985 } 1986 #endif 1959 1987 } 1960 1988 } … … 3212 3240 case DXGK_OPERATION_FILL: 3213 3241 { 3242 Assert(pBuildPagingBuffer->Fill.FillPattern == 0); 3243 PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->Fill.hAllocation; 3214 3244 // pBuildPagingBuffer->pDmaBuffer = (uint8_t*)pBuildPagingBuffer->pDmaBuffer + VBOXVDMACMD_SIZE(VBOXVDMACMD_DMA_BPB_FILL); 3215 3245 break; … … 3556 3586 case VBOXESC_UHGSMI_SUBMIT: 3557 3587 { 3588 /* submit UHGSMI command */ 3558 3589 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 3559 3590 PVBOXDISPIFESCAPE_UHGSMI_SUBMIT pSubmit = (PVBOXDISPIFESCAPE_UHGSMI_SUBMIT)pEscapeHdr; … … 3574 3605 case VBOXESC_UHGSMI_ALLOCATE: 3575 3606 { 3607 /* allocate UHGSMI buffer */ 3576 3608 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 3577 3609 PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE pAlocate = (PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE)pEscapeHdr; … … 3589 3621 case VBOXESC_UHGSMI_DEALLOCATE: 3590 3622 { 3623 /* deallocate UHGSMI buffer */ 3591 3624 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 3592 3625 PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE pDealocate = (PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE)pEscapeHdr; … … 3604 3637 case VBOXESC_GETVBOXVIDEOCMCMD: 3605 3638 { 3639 /* get the list of r0->r3 commands (d3d window visible regions reporting )*/ 3606 3640 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 3607 3641 PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pRegions = (PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD)pEscapeHdr; … … 3619 3653 case VBOXESC_SETVISIBLEREGION: 3620 3654 { 3655 /* visible regions for seamless */ 3621 3656 LPRGNDATA lpRgnData = VBOXDISPIFESCAPE_DATA(pEscapeHdr, RGNDATA); 3622 3657 uint32_t cbData = VBOXDISPIFESCAPE_DATA_SIZE(pEscape->PrivateDriverDataSize); … … 3682 3717 case VBOXESC_SCREENLAYOUT: 3683 3718 { 3719 /* set screen layout (unused currently) */ 3684 3720 Assert(pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT)); 3685 3721 if (pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT)) … … 3711 3747 case VBOXESC_SWAPCHAININFO: 3712 3748 { 3749 /* set swapchain information */ 3713 3750 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext; 3714 3751 Status = vboxWddmSwapchainCtxEscape(pDevExt, pContext, (PVBOXDISPIFESCAPE_SWAPCHAININFO)pEscapeHdr, pEscape->PrivateDriverDataSize); … … 3717 3754 } 3718 3755 case VBOXESC_REINITVIDEOMODES: 3756 { 3757 /* clear driver's internal videomodes cache */ 3719 3758 VBoxWddmInvalidateVideoModesInfo(pDevExt); 3720 3759 Status = STATUS_SUCCESS; 3721 3760 break; 3761 } 3762 case VBOXESC_SHRC_ADDREF: 3763 case VBOXESC_SHRC_RELEASE: 3764 { 3765 PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)pEscape->hDevice; 3766 /* query whether the allocation represanted by the given [wine-generated] shared resource handle still exists */ 3767 if (pEscape->PrivateDriverDataSize != sizeof (VBOXDISPIFESCAPE_SHRC_REF)) 3768 { 3769 WARN(("invalid buffer size for VBOXDISPIFESCAPE_SHRC_REF, was(%d), but expected (%d)", 3770 pEscape->PrivateDriverDataSize, sizeof (VBOXDISPIFESCAPE_SHRC_REF))); 3771 Status = STATUS_INVALID_PARAMETER; 3772 break; 3773 } 3774 3775 PVBOXDISPIFESCAPE_SHRC_REF pShRcRef = (PVBOXDISPIFESCAPE_SHRC_REF)pEscapeHdr; 3776 PVBOXWDDM_ALLOCATION pAlloc = vboxWddmGetAllocationFromHandle(pDevExt, (D3DKMT_HANDLE)pShRcRef->hAlloc); 3777 if (!pAlloc) 3778 { 3779 WARN(("failed to get allocation from handle")); 3780 Status = STATUS_INVALID_PARAMETER; 3781 break; 3782 } 3783 3784 PVBOXWDDM_OPENALLOCATION pOa = NULL; 3785 for (PLIST_ENTRY pCur = pAlloc->OpenList.Flink; pCur != &pAlloc->OpenList; pCur = pCur->Flink) 3786 { 3787 PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry); 3788 if (pCurOa->pDevice == pDevice) 3789 { 3790 pOa = pCurOa; 3791 break; 3792 } 3793 } 3794 3795 if (!pOa) 3796 { 3797 WARN(("failed to get open allocation from alloc")); 3798 Status = STATUS_INVALID_PARAMETER; 3799 break; 3800 } 3801 3802 Assert(pAlloc->cShRcRefs >= pOa->cShRcRefs); 3803 3804 if (pEscapeHdr->escapeCode == VBOXESC_SHRC_ADDREF) 3805 { 3806 #ifdef DEBUG 3807 Assert(!pAlloc->fAssumedDeletion); 3808 #endif 3809 ++pAlloc->cShRcRefs; 3810 ++pOa->cShRcRefs; 3811 } 3812 else 3813 { 3814 Assert(pAlloc->cShRcRefs); 3815 Assert(pOa->cShRcRefs); 3816 --pAlloc->cShRcRefs; 3817 --pOa->cShRcRefs; 3818 #ifdef DEBUG 3819 Assert(!pAlloc->fAssumedDeletion); 3820 if (!pAlloc->cShRcRefs) 3821 { 3822 pAlloc->fAssumedDeletion = TRUE; 3823 } 3824 #endif 3825 } 3826 3827 pShRcRef->EscapeHdr.u32CmdSpecific = pAlloc->cShRcRefs; 3828 Status = STATUS_SUCCESS; 3829 break; 3830 } 3722 3831 case VBOXESC_DBGPRINT: 3723 3832 { … … 4580 4689 if (Status == STATUS_SUCCESS) 4581 4690 { 4582 for (UINT i = 0; i < pOpenAllocation->NumAllocations; ++i) 4691 UINT i = 0; 4692 for (; i < pOpenAllocation->NumAllocations; ++i) 4583 4693 { 4584 4694 DXGK_OPENALLOCATIONINFO* pInfo = &pOpenAllocation->pOpenAllocation[i]; 4585 4695 Assert(pInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO)); 4586 4696 Assert(pInfo->pPrivateDriverData); 4697 PVBOXWDDM_ALLOCATION pAllocation = vboxWddmGetAllocationFromHandle(pDevExt, pInfo->hAllocation); 4698 if (!pAllocation) 4699 { 4700 WARN(("invalid handle")); 4701 Status = STATUS_INVALID_PARAMETER; 4702 break; 4703 } 4704 4587 4705 PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION)); 4706 if (!pOa) 4707 { 4708 WARN(("failed to allocation alloc info")); 4709 Status = STATUS_INSUFFICIENT_RESOURCES; 4710 break; 4711 } 4712 4713 #ifdef DEBUG 4714 for (PLIST_ENTRY pCur = pAllocation->OpenList.Flink; pCur != &pAllocation->OpenList; pCur = pCur->Flink) 4715 { 4716 PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry); 4717 if (pCurOa->pDevice == pDevice) 4718 { 4719 /* should not happen */ 4720 Assert(0); 4721 break; 4722 } 4723 } 4724 Assert(!pAllocation->fAssumedDeletion); 4725 #endif 4726 InsertHeadList(&pAllocation->OpenList, &pOa->ListEntry); 4588 4727 pOa->hAllocation = pInfo->hAllocation; 4728 pOa->pAllocation = pAllocation; 4729 pOa->pDevice = pDevice; 4589 4730 pInfo->hDeviceSpecificAllocation = pOa; 4590 4731 4732 4591 4733 if (pRcInfo) 4592 4734 { 4735 Assert(pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC); 4736 4737 if (pInfo->PrivateDriverDataSize < sizeof (VBOXWDDM_ALLOCINFO) 4738 || !pInfo->pPrivateDriverData) 4739 { 4740 WARN(("invalid data size")); 4741 vboxWddmMemFree(pOa); 4742 Status = STATUS_INVALID_PARAMETER; 4743 break; 4744 } 4745 PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData; 4746 4593 4747 #ifdef VBOX_WITH_VIDEOHWACCEL 4594 4748 if (pRcInfo->RcDesc.fFlags.Overlay) 4595 4749 { 4596 if (pInfo->PrivateDriverDataSize >= sizeof (VBOXWDDM_ALLOCINFO)) 4597 { 4598 PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData; 4599 PVBOXWDDM_ALLOCATION pAllocation = vboxWddmGetAllocationFromOpenData(pDevExt, pOa); 4600 Assert(pAllocation); 4601 if (pAllocation) 4602 { 4603 /* we have queried host for some surface info, like pitch & size, 4604 * need to return it back to the UMD (User Mode Drive) */ 4605 pAllocInfo->SurfDesc = pAllocation->SurfDesc; 4606 /* success, just continue */ 4607 continue; 4608 } 4609 else 4610 Status = STATUS_INVALID_PARAMETER; 4611 } 4612 else 4613 Status = STATUS_INVALID_PARAMETER; 4614 4615 /* we are here in case of error */ 4616 AssertBreakpoint(); 4617 4618 for (UINT j = 0; j < i; ++j) 4619 { 4620 DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j]; 4621 PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation; 4622 vboxWddmMemFree(pOa2Free); 4623 } 4750 /* we have queried host for some surface info, like pitch & size, 4751 * need to return it back to the UMD (User Mode Drive) */ 4752 pAllocInfo->SurfDesc = pAllocation->SurfDesc; 4753 /* success, just continue */ 4624 4754 } 4625 4755 #endif 4756 } 4757 4758 ++pAllocation->cOpens; 4759 } 4760 4761 if (Status != STATUS_SUCCESS) 4762 { 4763 for (UINT j = 0; j < i; ++j) 4764 { 4765 DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j]; 4766 PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation; 4767 PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation; 4768 RemoveEntryList(&pOa2Free->ListEntry); 4769 Assert(pAllocation->cOpens); 4770 --pAllocation->cOpens; 4771 vboxWddmMemFree(pOa2Free); 4626 4772 } 4627 4773 } … … 4645 4791 vboxVDbgBreakFv(); 4646 4792 4793 PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)hDevice; 4794 PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter; 4795 4647 4796 for (UINT i = 0; i < pCloseAllocation->NumAllocations; ++i) 4648 4797 { 4649 vboxWddmMemFree(pCloseAllocation->pOpenHandleList[i]); 4798 PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pCloseAllocation->pOpenHandleList[i]; 4799 PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation; 4800 RemoveEntryList(&pOa2Free->ListEntry); 4801 Assert(pAllocation->cShRcRefs >= pOa2Free->cShRcRefs); 4802 pAllocation->cShRcRefs -= pOa2Free->cShRcRefs; 4803 Assert(pAllocation->cOpens); 4804 --pAllocation->cOpens; 4805 vboxWddmMemFree(pOa2Free); 4650 4806 } 4651 4807
Note:
See TracChangeset
for help on using the changeset viewer.