Changeset 38982 in vbox for trunk/src/VBox/Additions/WINNT/Graphics
- Timestamp:
- Oct 12, 2011 8:20:21 PM (13 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics
- Files:
-
- 36 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 -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d8/device.c
r33656 r38982 30 30 31 31 #include "config.h" 32 #include "d3d8_private.h" 32 33 33 34 #include <math.h> … … 41 42 #include "wingdi.h" 42 43 #include "wine/debug.h" 43 44 #include "d3d8_private.h"45 44 46 45 WINE_DEFAULT_DEBUG_CHANNEL(d3d8); -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d8/directx.c
r33656 r38982 31 31 32 32 #include "config.h" 33 #include "d3d8_private.h" 33 34 34 35 #include <stdarg.h> … … 42 43 #include "wine/debug.h" 43 44 #include "wine/unicode.h" 44 45 #include "d3d8_private.h"46 45 47 46 WINE_DEFAULT_DEBUG_CHANNEL(d3d8); -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/d3d9wddm.def
r38903 r38982 17 17 VBoxWineExD3DDev9Update 18 18 VBoxWineExD3DSwapchain9Present 19 VBoxWineExD3DRc9SetDontDeleteGl -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/device.c
r38363 r38982 506 506 IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; 507 507 IDirect3DSwapChain9Impl *newSwapchain; 508 HRESULT hr = IDirect3DDevice9Impl_DoCreateAdditionalSwapChain(iface, present_parameters, &newSwapchain);508 HRESULT hr = IDirect3DDevice9Impl_DoCreateAdditionalSwapChain(iface, present_parameters, (IDirect3DSwapChain9**)&newSwapchain); 509 509 if (FAILED(hr)) 510 510 { … … 520 520 { 521 521 ERR("Failed to add additional swapchain, hr %#x.\n", hr); 522 IUnknown_Release( newSwapchain);522 IUnknown_Release((IDirect3DSwapChain9*)newSwapchain); 523 523 return hr; 524 524 } … … 3152 3152 return D3D_OK; 3153 3153 } 3154 3155 #ifdef VBOX_WITH_WDDM 3156 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DRc9SetDontDeleteGl(IDirect3DResource9 *iface) 3157 { 3158 D3DRESOURCETYPE enmType = IDirect3DResource9_GetType(iface); 3159 HRESULT hr; 3160 switch (enmType) 3161 { 3162 case D3DRTYPE_SURFACE: 3163 { 3164 IDirect3DSurface9Impl *This = (IDirect3DSurface9Impl*)iface ; 3165 wined3d_mutex_lock(); 3166 hr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->wineD3DSurface); 3167 wined3d_mutex_unlock(); 3168 break; 3169 } 3170 case D3DRTYPE_VOLUME: 3171 { 3172 IDirect3DVolume9Impl *This = (IDirect3DVolume9Impl*)iface ; 3173 wined3d_mutex_lock(); 3174 hr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->wineD3DVolume); 3175 wined3d_mutex_unlock(); 3176 break; 3177 } 3178 case D3DRTYPE_TEXTURE: 3179 { 3180 IDirect3DTexture9Impl *This = (IDirect3DTexture9Impl*)iface ; 3181 wined3d_mutex_lock(); 3182 hr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->wineD3DTexture); 3183 wined3d_mutex_unlock(); 3184 break; 3185 } 3186 case D3DRTYPE_VOLUMETEXTURE: 3187 { 3188 IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl*)iface ; 3189 wined3d_mutex_lock(); 3190 hr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->wineD3DVolumeTexture); 3191 wined3d_mutex_unlock(); 3192 break; 3193 } 3194 case D3DRTYPE_CUBETEXTURE: 3195 { 3196 IDirect3DCubeTexture9Impl *This = (IDirect3DCubeTexture9Impl*)iface ; 3197 wined3d_mutex_lock(); 3198 hr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->wineD3DCubeTexture); 3199 wined3d_mutex_unlock(); 3200 break; 3201 } 3202 case D3DRTYPE_VERTEXBUFFER: 3203 { 3204 IDirect3DVertexBuffer9Impl *This = (IDirect3DVertexBuffer9Impl*)iface ; 3205 wined3d_mutex_lock(); 3206 hr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->wineD3DVertexBuffer); 3207 wined3d_mutex_unlock(); 3208 break; 3209 } 3210 case D3DRTYPE_INDEXBUFFER: 3211 { 3212 IDirect3DIndexBuffer9Impl *This = (IDirect3DIndexBuffer9Impl*)iface ; 3213 wined3d_mutex_lock(); 3214 hr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->wineD3DIndexBuffer); 3215 wined3d_mutex_unlock(); 3216 break; 3217 } 3218 default: 3219 ERR("invalid arg"); 3220 hr = E_INVALIDARG; 3221 break; 3222 } 3223 return hr; 3224 } 3225 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/include/wine/debug.h
r38147 r38982 31 31 #define __WINE_WINE_DEBUG_H 32 32 33 #if defined(VBOX_WITH_WDDM) || defined(VBOX_WINE_WITHOUT_LIBWINE) 34 # error "unexpected include!!" 35 #endif 36 33 37 #include <stdarg.h> 34 38 #include <windef.h> … … 317 321 #endif 318 322 323 324 #ifdef DEBUG_misha 325 //# define VBOXWINEDBG_SHADERS 326 #endif 327 328 #ifdef VBOXWINEDBG_SHADERS 329 330 void vboxWDbgPrintF(char * szString, ...); 331 332 # define WDLOG(_m) do {\ 333 vboxWDbgPrintF _m ; \ 334 } while (0) 335 #else 336 337 # define WDLOG(_m) do { } while (0) 338 #endif 339 319 340 #endif /* __WINE_WINE_DEBUG_H */ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/include/wine/wined3d.h
r38903 r38982 6 6 #ifndef __WIDL_WINED3D_H 7 7 #define __WIDL_WINED3D_H 8 9 #if defined(VBOX_WITH_WDDM) || defined(VBOX_WINE_WITHOUT_LIBWINE) 10 # error "unexpected include!!" 11 #endif 8 12 9 13 #ifdef __cplusplus … … 3429 3433 IWineD3DResource* This); 3430 3434 3435 #ifdef VBOX_WITH_WDDM 3436 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 3437 IWineD3DResource* This); 3438 #endif 3439 3431 3440 END_INTERFACE 3432 3441 } IWineD3DResourceVtbl; … … 3451 3460 #define IWineD3DResource_UnLoad(This) (This)->lpVtbl->UnLoad(This) 3452 3461 #define IWineD3DResource_GetType(This) (This)->lpVtbl->GetType(This) 3462 # ifdef VBOX_WITH_WDDM 3463 # define IWineD3DResource_SetDontDeleteGl(This) (This)->lpVtbl->SetDontDeleteGl(This) 3464 # endif 3453 3465 #endif 3454 3466 … … 4055 4067 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 4056 4068 IWineD3DSurface* This); 4069 4070 #ifdef VBOX_WITH_WDDM 4071 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 4072 IWineD3DResource* This); 4073 #endif 4057 4074 4058 4075 /*** IWineD3DSurface methods ***/ … … 4671 4688 IWineD3DVolume* This); 4672 4689 4690 #ifdef VBOX_WITH_WDDM 4691 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 4692 IWineD3DResource* This); 4693 #endif 4694 4673 4695 /*** IWineD3DVolume methods ***/ 4674 4696 HRESULT (STDMETHODCALLTYPE *GetContainer)( … … 4884 4906 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 4885 4907 IWineD3DBaseTexture* This); 4908 4909 #ifdef VBOX_WITH_WDDM 4910 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 4911 IWineD3DResource* This); 4912 #endif 4886 4913 4887 4914 /*** IWineD3DBaseTexture methods ***/ … … 5130 5157 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 5131 5158 IWineD3DTexture* This); 5159 5160 #ifdef VBOX_WITH_WDDM 5161 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 5162 IWineD3DTexture* This); 5163 #endif 5132 5164 5133 5165 /*** IWineD3DBaseTexture methods ***/ … … 5377 5409 IWineD3DCubeTexture* This); 5378 5410 5411 #ifdef VBOX_WITH_WDDM 5412 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 5413 IWineD3DCubeTexture* This); 5414 #endif 5415 5379 5416 /*** IWineD3DBaseTexture methods ***/ 5380 5417 DWORD (STDMETHODCALLTYPE *SetLOD)( … … 5627 5664 IWineD3DVolumeTexture* This); 5628 5665 5666 #ifdef VBOX_WITH_WDDM 5667 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 5668 IWineD3DResource* This); 5669 #endif 5670 5629 5671 /*** IWineD3DBaseTexture methods ***/ 5630 5672 DWORD (STDMETHODCALLTYPE *SetLOD)( … … 6382 6424 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 6383 6425 IWineD3DBuffer* This); 6426 6427 #ifdef VBOX_WITH_WDDM 6428 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 6429 IWineD3DResource* This); 6430 #endif 6384 6431 6385 6432 /*** IWineD3DBuffer methods ***/ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/VBoxWineEx.h
r38903 r38982 16 16 #define ___VBoxWineEx_h__ 17 17 18 #define VBOXWINEEX_VERSION 1 19 18 20 #ifndef IN_VBOXWINEEX 19 # define VBOXWINEEX_DECL(_type)__declspec(dllimport) _type WINAPI21 # define VBOXWINEEX_DECL(_type) __declspec(dllimport) _type WINAPI 20 22 # else 21 # define VBOXWINEEX_DECL(_type)__declspec(dllexport) _type WINAPI23 # define VBOXWINEEX_DECL(_type) __declspec(dllexport) _type WINAPI 22 24 #endif 23 25 … … 39 41 typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DDEV9_UPDATE(IDirect3DDevice9Ex *iface, D3DPRESENT_PARAMETERS * pParams, IDirect3DDevice9Ex **outIface); 40 42 typedef FNVBOXWINEEXD3DDEV9_UPDATE *PFNVBOXWINEEXD3DDEV9_UPDATE; 43 44 typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DRC9_SETDONTDELETEGL(IDirect3DResource9 *iface); 45 typedef FNVBOXWINEEXD3DRC9_SETDONTDELETEGL *PFNVBOXWINEEXD3DRC9_SETDONTDELETEGL; 41 46 42 47 typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DSWAPCHAIN9_PRESENT(IDirect3DSwapChain9 *iface, IDirect3DSurface9 *surf); … … 64 69 IDirect3DDevice9Ex **outIface); /* update device parameters */ 65 70 71 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DRc9SetDontDeleteGl(IDirect3DResource9 *iface); 72 66 73 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9Present(IDirect3DSwapChain9 *iface, 67 74 IDirect3DSurface9 *surf); /* use the given surface as a frontbuffer content source */ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub/include/wine/debug.h
r38147 r38982 31 31 #define __WINE_WINE_DEBUG_H 32 32 33 #include <stdarg.h> 34 #include <windef.h> 33 #include <windows.h> 35 34 #ifndef GUID_DEFINED 36 35 #include <guiddef.h> … … 322 321 #endif 323 322 323 324 #ifdef DEBUG_misha 325 # define VBOXWINEDBG_SHADERS 326 #endif 327 328 #ifdef VBOXWINEDBG_SHADERS 329 #include <stdio.h> 330 #include <stdarg.h> 331 332 void vboxWDbgPrintF(char * szString, ...); 333 334 # define WDLOG(_m) do {\ 335 vboxWDbgPrintF _m ; \ 336 } while (0) 337 #else 338 339 # define WDLOG(_m) do { } while (0) 340 #endif 341 324 342 #endif /* __WINE_WINE_DEBUG_H */ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub/include/wine/wined3d.h
r38903 r38982 3431 3431 IWineD3DResource* This); 3432 3432 3433 #ifdef VBOX_WITH_WDDM 3434 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 3435 IWineD3DResource* This); 3436 #endif 3437 3433 3438 END_INTERFACE 3434 3439 } IWineD3DResourceVtbl; … … 3453 3458 #define IWineD3DResource_UnLoad(This) (This)->lpVtbl->UnLoad(This) 3454 3459 #define IWineD3DResource_GetType(This) (This)->lpVtbl->GetType(This) 3460 # ifdef VBOX_WITH_WDDM 3461 # define IWineD3DResource_SetDontDeleteGl(This) (This)->lpVtbl->SetDontDeleteGl(This) 3462 # endif 3455 3463 #endif 3456 3464 … … 4057 4065 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 4058 4066 IWineD3DSurface* This); 4067 4068 #ifdef VBOX_WITH_WDDM 4069 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 4070 IWineD3DResource* This); 4071 #endif 4059 4072 4060 4073 /*** IWineD3DSurface methods ***/ … … 4673 4686 IWineD3DVolume* This); 4674 4687 4688 #ifdef VBOX_WITH_WDDM 4689 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 4690 IWineD3DResource* This); 4691 #endif 4692 4675 4693 /*** IWineD3DVolume methods ***/ 4676 4694 HRESULT (STDMETHODCALLTYPE *GetContainer)( … … 4886 4904 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 4887 4905 IWineD3DBaseTexture* This); 4906 4907 #ifdef VBOX_WITH_WDDM 4908 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 4909 IWineD3DResource* This); 4910 #endif 4888 4911 4889 4912 /*** IWineD3DBaseTexture methods ***/ … … 5132 5155 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 5133 5156 IWineD3DTexture* This); 5157 5158 #ifdef VBOX_WITH_WDDM 5159 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 5160 IWineD3DResource* This); 5161 #endif 5134 5162 5135 5163 /*** IWineD3DBaseTexture methods ***/ … … 5379 5407 IWineD3DCubeTexture* This); 5380 5408 5409 #ifdef VBOX_WITH_WDDM 5410 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 5411 IWineD3DResource* This); 5412 #endif 5413 5381 5414 /*** IWineD3DBaseTexture methods ***/ 5382 5415 DWORD (STDMETHODCALLTYPE *SetLOD)( … … 5629 5662 IWineD3DVolumeTexture* This); 5630 5663 5664 #ifdef VBOX_WITH_WDDM 5665 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 5666 IWineD3DResource* This); 5667 #endif 5668 5631 5669 /*** IWineD3DBaseTexture methods ***/ 5632 5670 DWORD (STDMETHODCALLTYPE *SetLOD)( … … 6384 6422 WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)( 6385 6423 IWineD3DBuffer* This); 6424 6425 #ifdef VBOX_WITH_WDDM 6426 HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)( 6427 IWineD3DResource* This); 6428 #endif 6386 6429 6387 6430 /*** IWineD3DBuffer methods ***/ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/basetexture.c
r37873 r38982 114 114 115 115 #ifdef VBOX_WITH_WDDM 116 if ( VBOXSHRC_IS_SHARED_OPENED(This))116 if (!VBOXSHRC_CAN_DELETE(device, This)) 117 117 { 118 118 This->baseTexture.texture_rgb.name = 0; … … 291 291 if (VBOXSHRC_IS_SHARED_OPENED(This)) 292 292 { 293 gl_tex->name = VBOXSHRC_GET_SHAREHANDLE(This);293 gl_tex->name = (GLuint)VBOXSHRC_GET_SHAREHANDLE(This); 294 294 } 295 295 else 296 296 #endif 297 297 { 298 isNewTexture = TRUE; 298 299 glGenTextures(1, &gl_tex->name); 299 300 #ifdef VBOX_WITH_WDDM … … 306 307 checkGLcall("glGenTextures"); 307 308 TRACE("Generated texture %d\n", gl_tex->name); 309 #ifndef VBOX_WITH_WDDM 308 310 if (This->resource.pool == WINED3DPOOL_DEFAULT) { 309 311 /* Tell opengl to try and keep this texture in video ram (well mostly) */ … … 313 315 314 316 } 317 #else 318 /* chromium code on host fails to resolve texture name to texture obj for some reason 319 * @todo: investigate */ 320 #endif 315 321 /* Initialise the state of the texture object 316 322 to the openGL defaults, not the directx defaults */ … … 329 335 gl_tex->states[WINED3DTEXSTA_TSSADDRESSW] = WINED3DTADDRESS_WRAP; 330 336 IWineD3DBaseTexture_SetDirty(iface, TRUE); 331 isNewTexture = TRUE; 332 333 if(This->resource.usage & WINED3DUSAGE_AUTOGENMIPMAP) {337 338 if(isNewTexture 339 && This->resource.usage & WINED3DUSAGE_AUTOGENMIPMAP) { 334 340 /* This means double binding the texture at creation, but keeps the code simpler all 335 341 * in all, and the run-time path free from additional checks -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/buffer.c
r33656 r38982 1449 1449 buffer_UnLoad, 1450 1450 buffer_GetType, 1451 #ifdef VBOX_WITH_WDDM 1452 IWineD3DResourceImpl_SetDontDeleteGl, 1453 #endif 1451 1454 /* IWineD3DBuffer methods */ 1452 1455 buffer_Map, -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/cubetexture.c
r37870 r38982 245 245 } 246 246 247 #ifdef VBOX_WITH_WDDM 248 static HRESULT WINAPI IWineD3DCubeTextureImpl_SetDontDeleteGl(IWineD3DCubeTexture *iface) { 249 IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl*)iface; 250 HRESULT hr = IWineD3DResourceImpl_SetDontDeleteGl((IWineD3DResource*)iface); 251 unsigned int i, j; 252 253 if (FAILED(hr)) 254 { 255 ERR("IWineD3DResource_SetDontDeleteGl failed"); 256 return hr; 257 } 258 259 for (i = 0; i < This->baseTexture.levels; ++i) { 260 for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j) { 261 if (This->surfaces[j][i]) { 262 HRESULT tmpHr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->surfaces[j][i]); 263 Assert(tmpHr == S_OK); 264 } 265 } 266 } 267 268 return WINED3D_OK; 269 } 270 #endif 271 247 272 /* ****************************************************** 248 273 IWineD3DCubeTexture IWineD3DBaseTexture parts follow … … 418 443 IWineD3DCubeTextureImpl_UnLoad, 419 444 IWineD3DCubeTextureImpl_GetType, 445 #ifdef VBOX_WITH_WDDM 446 IWineD3DCubeTextureImpl_SetDontDeleteGl, 447 #endif 420 448 /* IWineD3DBaseTexture */ 421 449 IWineD3DCubeTextureImpl_SetLOD, … … 606 634 for (j = 0; j < 6; ++j) 607 635 { 608 Assert((*shared_handle) == ( (IWineD3DSurfaceImpl*)texture->surfaces[j][i])->texture_name);636 Assert((*shared_handle) == (HANDLE)((IWineD3DSurfaceImpl*)texture->surfaces[j][i])->texture_name); 609 637 } 610 638 } -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/device.c
r38903 r38982 4080 4080 if (stage >= sizeof(This->stateBlock->textures) / sizeof(*This->stateBlock->textures)) 4081 4081 { 4082 #ifdef DEBUG_misha 4083 ERR("Ignoring invalid stage %u.\n", stage); 4084 #else 4082 4085 WARN("Ignoring invalid stage %u.\n", stage); 4086 #endif 4083 4087 return WINED3D_OK; 4084 4088 } … … 6280 6284 Assert(!VBOXSHRC_IS_SHARED(surface)); 6281 6285 # endif 6282 if ( !VBOXSHRC_IS_SHARED_OPENED(surface))6286 if (VBOXSHRC_CAN_DELETE(device, surface)) 6283 6287 #endif 6284 6288 { … … 6996 7000 } 6997 7001 6998 This->swapchains = (IWineD3DSwapChain *)pvNewBuf;7002 This->swapchains = pvNewBuf; 6999 7003 } 7000 7004 else -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/glsl_shader.c
r37550 r38982 241 241 }; 242 242 243 #ifndef VBOXWINEDBG_SHADERS 243 244 if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return; 245 #endif 244 246 245 247 GL_EXTCALL(glGetObjectParameterivARB(obj, … … 270 272 if (is_spam) 271 273 { 272 TRACE("Spam received from GLSL shader #%u:\n", obj);273 while ((line = get_info_log_line(&ptr))) TRACE(" %s\n", line);274 WDLOG(("Spam received from GLSL shader #%u:\n", obj)); 275 while ((line = get_info_log_line(&ptr))) WDLOG((" %s\n", line)); 274 276 } 275 277 else 276 278 { 277 FIXME("Error received from GLSL shader #%u:\n", obj);278 while ((line = get_info_log_line(&ptr))) FIXME(" %s\n", line);279 WDLOG(("Error received from GLSL shader #%u:\n", obj)); 280 while ((line = get_info_log_line(&ptr))) WDLOG((" %s\n", line)); 279 281 } 280 282 HeapFree(GetProcessHeap(), 0, infoLog); … … 319 321 } 320 322 321 FIXME("Object %u:\n", objects[i]);323 WDLOG(("Object %u:\n", objects[i])); 322 324 GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SUBTYPE_ARB, &tmp)); 323 FIXME(" GL_OBJECT_SUBTYPE_ARB: %s.\n", debug_gl_shader_type(tmp));325 WDLOG((" GL_OBJECT_SUBTYPE_ARB: %s.\n", debug_gl_shader_type(tmp))); 324 326 GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_COMPILE_STATUS_ARB, &tmp)); 325 FIXME(" GL_OBJECT_COMPILE_STATUS_ARB: %d.\n", tmp);326 FIXME("\n");327 WDLOG((" GL_OBJECT_COMPILE_STATUS_ARB: %d.\n", tmp)); 328 WDLOG(("\n")); 327 329 328 330 ptr = source; 329 331 GL_EXTCALL(glGetShaderSourceARB(objects[i], source_size, NULL, source)); 330 while ((line = get_info_log_line(&ptr))) FIXME(" %s\n", line);331 FIXME("\n");332 while ((line = get_info_log_line(&ptr))) WDLOG((" %s\n", line)); 333 WDLOG(("\n")); 332 334 } 333 335 … … 337 339 338 340 /* GL locking is done by the caller. */ 339 static void shader_glsl_validate_link(const struct wined3d_gl_info *gl_info, GLhandleARB program) 340 { 341 GLint tmp; 342 341 static void shader_glsl_validate_compile_link(const struct wined3d_gl_info *gl_info, GLhandleARB program, GLboolean fIsProgram) 342 { 343 GLint tmp = -1; 344 345 #ifndef VBOXWINEDBG_SHADERS 343 346 if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return; 347 #endif 344 348 345 349 GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_TYPE_ARB, &tmp)); 346 350 if (tmp == GL_PROGRAM_OBJECT_ARB) 347 351 { 352 if (!fIsProgram) 353 { 354 ERR("this is a program, but shader expected"); 355 } 348 356 GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &tmp)); 349 357 if (!tmp) 350 358 { 351 FIXME("Program %u link status invalid.\n", program);359 ERR("Program %u link status invalid.\n", program); 352 360 shader_glsl_dump_program_source(gl_info, program); 353 361 } 362 } 363 else if (tmp == GL_SHADER_OBJECT_ARB) 364 { 365 if (fIsProgram) 366 { 367 ERR("this is a shader, but program expected"); 368 } 369 370 GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_COMPILE_STATUS_ARB, &tmp)); 371 if (!tmp) 372 { 373 ERR("Shader %u compile status invalid.\n", program); 374 shader_glsl_dump_program_source(gl_info, program); 375 } 376 } 377 else 378 { 379 ERR("unexpected oject type(%d)!", tmp); 354 380 } 355 381 … … 1003 1029 * Writing gl_ClipVertex requires one uniform for each clipplane as well. 1004 1030 */ 1031 #ifdef DEBUG_misha 1032 /* tmp work-around to make Internet Explorer in win8 work with GPU supporting only with 256 shader uniform vars */ 1033 max_constantsF = gl_info->limits.glsl_vs_float_constants - 1; 1034 #else 1005 1035 max_constantsF = gl_info->limits.glsl_vs_float_constants - 3; 1036 #endif 1006 1037 if(ctx_priv->cur_vs_args->clip_enabled) 1007 1038 { … … 4031 4062 GL_EXTCALL(glCompileShaderARB(ret)); 4032 4063 checkGLcall("glCompileShaderARB(ret)"); 4033 4064 shader_glsl_validate_compile_link(gl_info, ret, FALSE); 4034 4065 return ret; 4035 4066 } … … 4153 4184 GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL)); 4154 4185 GL_EXTCALL(glCompileShaderARB(shader_obj)); 4155 print_glsl_info_log(gl_info, shader_obj);4186 shader_glsl_validate_compile_link(gl_info, shader_obj, FALSE); 4156 4187 4157 4188 /* Store the shader object */ … … 4229 4260 GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL)); 4230 4261 GL_EXTCALL(glCompileShaderARB(shader_obj)); 4231 print_glsl_info_log(gl_info, shader_obj);4262 shader_glsl_validate_compile_link(gl_info, shader_obj, FALSE); 4232 4263 4233 4264 return shader_obj; … … 4509 4540 TRACE("Linking GLSL shader program %u\n", programId); 4510 4541 GL_EXTCALL(glLinkProgramARB(programId)); 4511 shader_glsl_validate_ link(gl_info, programId);4542 shader_glsl_validate_compile_link(gl_info, programId, TRUE); 4512 4543 4513 4544 entry->vuniformF_locations = HeapAlloc(GetProcessHeap(), 0, … … 4655 4686 GL_EXTCALL(glShaderSourceARB(vshader_id, 1, blt_vshader, NULL)); 4656 4687 GL_EXTCALL(glCompileShaderARB(vshader_id)); 4688 shader_glsl_validate_compile_link(gl_info, vshader_id, FALSE); 4657 4689 4658 4690 pshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); 4659 4691 GL_EXTCALL(glShaderSourceARB(pshader_id, 1, &blt_pshaders[tex_type], NULL)); 4660 4692 GL_EXTCALL(glCompileShaderARB(pshader_id)); 4693 4694 shader_glsl_validate_compile_link(gl_info, vshader_id, FALSE); 4661 4695 4662 4696 program_id = GL_EXTCALL(glCreateProgramObjectARB()); … … 4664 4698 GL_EXTCALL(glAttachObjectARB(program_id, pshader_id)); 4665 4699 GL_EXTCALL(glLinkProgramARB(program_id)); 4666 4667 shader_glsl_validate_link(gl_info, program_id); 4700 shader_glsl_validate_compile_link(gl_info, program_id, TRUE); 4668 4701 4669 4702 /* Once linked we can mark the shaders for deletion. They will be deleted once the program … … 5209 5242 shader_glsl_color_fixup_supported, 5210 5243 }; 5244 5245 #ifdef VBOXWINEDBG_SHADERS 5246 void vboxWDbgPrintF(char * szString, ...) 5247 { 5248 char szBuffer[4096*2] = {0}; 5249 va_list pArgList; 5250 va_start(pArgList, szString); 5251 _vsnprintf(szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]), szString, pArgList); 5252 va_end(pArgList); 5253 5254 OutputDebugStringA(szBuffer); 5255 } 5256 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/palette.c
r33656 r38982 30 30 31 31 #include "config.h" 32 #include "wined3d_private.h" 33 32 34 #include "winerror.h" 33 35 #include "wine/debug.h" 34 35 36 #include <string.h> 36 37 37 #include "wined3d_private.h"38 38 39 39 WINE_DEFAULT_DEBUG_CHANNEL(d3d); -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/resource.c
r33656 r38982 61 61 62 62 #ifdef VBOX_WITH_WDDM 63 resource->sharerc_handle = 0; 64 resource->sharerc_flags = 0; 65 resource->sharerc_locks = 0; 63 66 if (pool == WINED3DPOOL_SYSTEMMEM && pvClientMem) 64 67 { … … 72 75 if (pool == WINED3DPOOL_DEFAULT && shared_handle) 73 76 { 74 resource->sharerc_handle = *shared_handle;77 resource->sharerc_handle = (DWORD)*shared_handle; 75 78 resource->sharerc_flags = VBOXSHRC_F_SHARED; 76 79 if (*shared_handle) … … 283 286 return WINED3D_OK; 284 287 } 288 289 #ifdef VBOX_WITH_WDDM 290 HRESULT WINAPI IWineD3DResourceImpl_SetDontDeleteGl(IWineD3DResource *iface) { 291 IWineD3DResourceImpl *This = (IWineD3DResourceImpl*)iface; 292 if (!VBOXSHRC_IS_SHARED(This)) 293 { 294 ERR("invalid arg"); 295 return E_INVALIDARG; 296 } 297 298 VBOXSHRC_SET_DONT_DELETE(This); 299 return WINED3D_OK; 300 } 301 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/surface.c
r38903 r38982 100 100 if (This->texture_name 101 101 #ifdef VBOX_WITH_WDDM 102 && !VBOXSHRC_IS_SHARED_OPENED(This)102 && VBOXSHRC_CAN_DELETE(device, This) 103 103 #endif 104 104 ) … … 580 580 if (!*name && new_name) 581 581 { 582 BOOL fPersistent = FALSE; 582 583 /* FIXME: We shouldn't need to remove SFLAG_INTEXTURE if the 583 584 * surface has no texture name yet. See if we can get rid of this. */ 584 585 if (This->Flags & flag) 585 586 ERR("Surface has SFLAG_INTEXTURE set, but no texture name\n"); 586 IWineD3DSurface_ModifyLocation(iface, flag, FALSE); 587 #ifdef VBOX_WITH_WDDM 588 if (VBOXSHRC_IS_SHARED_OPENED(This)) 589 { 590 fPersistent = TRUE; 591 } 592 #endif 593 IWineD3DSurface_ModifyLocation(iface, flag, fPersistent); 587 594 } 588 595 … … 590 597 if (VBOXSHRC_IS_SHARED(This)) 591 598 { 599 Assert(VBOXSHRC_GET_SHAREHANDLE(This) == NULL 600 || (GLuint)VBOXSHRC_GET_SHAREHANDLE(This) == new_name 601 || new_name == 0 /* on cleanup */); 592 602 VBOXSHRC_SET_SHAREHANDLE(This, new_name); 593 603 } … … 1291 1301 GLclampf tmp; 1292 1302 tmp = 0.9f; 1303 #ifndef VBOX_WITH_WDDM 1293 1304 ENTER_GL(); 1294 1305 glPrioritizeTextures(1, &This->texture_name, &tmp); 1295 1306 LEAVE_GL(); 1307 #else 1308 /* chromium code on host fails to resolve texture name to texture obj for some reason 1309 * @todo: investigate */ 1310 #endif 1296 1311 } 1297 1312 … … 1407 1422 ENTER_GL(); 1408 1423 #ifdef VBOX_WITH_WDDM 1409 if ( !VBOXSHRC_IS_SHARED_OPENED(This))1424 if (VBOXSHRC_CAN_DELETE(device, This)) 1410 1425 #endif 1426 { 1411 1427 glDeleteTextures(1, &This->texture_name); 1428 glDeleteTextures(1, &This->texture_name_srgb); 1429 } 1412 1430 This->texture_name = 0; 1413 #ifdef VBOX_WITH_WDDM1414 if (!VBOXSHRC_IS_SHARED_OPENED(This))1415 #endif1416 glDeleteTextures(1, &This->texture_name_srgb);1417 1431 This->texture_name_srgb = 0; 1418 1432 LEAVE_GL(); … … 1767 1781 } 1768 1782 1783 #ifdef VBOX_WITH_WDDM 1784 void surface_setup_location_onopen(IWineD3DSurfaceImpl *This) 1785 { 1786 IWineD3DDeviceImpl *device = This->resource.device; 1787 const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; 1788 struct wined3d_context * context = NULL; 1789 if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD); 1790 1791 surface_prepare_texture(This, gl_info, FALSE); 1792 surface_bind_and_dirtify(This, FALSE); 1793 1794 if (context) context_release(context); 1795 1796 IWineD3DSurface_ModifyLocation((IWineD3DSurface*)This, SFLAG_INTEXTURE, TRUE); 1797 } 1798 #endif 1799 1769 1800 static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This) 1770 1801 { … … 2807 2838 if (VBOXSHRC_IS_SHARED_OPENED(This)) 2808 2839 { 2809 *name = VBOXSHRC_GET_SHAREHANDLE(This);2840 *name = (GLuint)VBOXSHRC_GET_SHAREHANDLE(This); 2810 2841 } 2811 2842 else … … 4791 4822 } 4792 4823 } 4824 else if (This->Flags & SFLAG_CLIENTMEM) 4825 { 4826 if(!(This->Flags & SFLAG_INSYSMEM)) { 4827 IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, NULL); 4828 } else { 4829 This->Flags &= ~SFLAG_LOCATIONS; 4830 This->Flags |= SFLAG_INSYSMEM; 4831 } 4832 4833 } 4793 4834 #endif 4794 4835 … … 5120 5161 // } 5121 5162 } 5163 else if (This->Flags & SFLAG_CLIENTMEM) 5164 { 5165 Assert(!!(This->Flags & SFLAG_INSYSMEM)); 5166 This->Flags &= ~SFLAG_LOCATIONS; 5167 This->Flags |= SFLAG_INSYSMEM; 5168 } 5122 5169 else 5123 5170 #endif … … 5216 5263 IWineD3DSurfaceImpl_UnLoad, 5217 5264 IWineD3DBaseSurfaceImpl_GetType, 5265 #ifdef VBOX_WITH_WDDM 5266 IWineD3DResourceImpl_SetDontDeleteGl, 5267 #endif 5218 5268 /* IWineD3DSurface */ 5219 5269 IWineD3DBaseSurfaceImpl_GetContainer, -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/surface_gdi.c
r38565 r38982 666 666 IWineGDISurfaceImpl_UnLoad, 667 667 IWineD3DBaseSurfaceImpl_GetType, 668 #ifdef VBOX_WITH_WDDM 669 IWineD3DResourceImpl_SetDontDeleteGl, 670 #endif 668 671 /* IWineD3DSurface */ 669 672 IWineD3DBaseSurfaceImpl_GetContainer, -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/texture.c
r37870 r38982 231 231 } 232 232 233 #ifdef VBOX_WITH_WDDM 234 static HRESULT WINAPI IWineD3DTextureImpl_SetDontDeleteGl(IWineD3DTexture *iface) { 235 IWineD3DTextureImpl *This = (IWineD3DTextureImpl*)iface; 236 HRESULT hr = IWineD3DResourceImpl_SetDontDeleteGl((IWineD3DResource*)iface); 237 unsigned int i; 238 239 if (FAILED(hr)) 240 { 241 ERR("IWineD3DResource_SetDontDeleteGl failed"); 242 return hr; 243 } 244 245 for (i = 0; i < This->baseTexture.levels; ++i) 246 { 247 if (This->surfaces[i]) 248 { 249 HRESULT tmpHr = IWineD3DResource_SetDontDeleteGl((IWineD3DResource*)This->surfaces[i]); 250 Assert(tmpHr == S_OK); 251 } 252 } 253 254 return WINED3D_OK; 255 } 256 #endif 257 233 258 /* ****************************************************** 234 259 IWineD3DTexture IWineD3DBaseTexture parts follow … … 289 314 surface_set_texture_name(This->surfaces[i], gl_tex->name, This->baseTexture.is_srgb); 290 315 } 316 291 317 /* Conditinal non power of two textures use a different clamping default. If we're using the GL_WINE_normalized_texrect 292 318 * partial driver emulation, we're dealing with a GL_TEXTURE_2D texture which has the address mode set to repeat - something … … 295 321 */ 296 322 if(IWineD3DBaseTexture_IsCondNP2(iface)) { 297 ENTER_GL(); 298 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 299 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)"); 300 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 301 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)"); 302 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_MIN_FILTER, GL_NEAREST); 303 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST)"); 304 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_MAG_FILTER, GL_NEAREST); 305 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST)"); 306 LEAVE_GL(); 323 #ifdef VBOX_WITH_WDDM 324 if (!VBOXSHRC_IS_SHARED_OPENED(This)) 325 #endif 326 { 327 ENTER_GL(); 328 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 329 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)"); 330 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 331 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)"); 332 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_MIN_FILTER, GL_NEAREST); 333 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST)"); 334 glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_MAG_FILTER, GL_NEAREST); 335 checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST)"); 336 LEAVE_GL(); 337 } 307 338 gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_CLAMP; 308 339 gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_CLAMP; … … 419 450 IWineD3DTextureImpl_UnLoad, 420 451 IWineD3DTextureImpl_GetType, 452 #ifdef VBOX_WITH_WDDM 453 IWineD3DTextureImpl_SetDontDeleteGl, 454 #endif 421 455 /* IWineD3DBaseTexture */ 422 456 IWineD3DTextureImpl_SetLOD, … … 632 666 } 633 667 #endif 634 IWineD3DSurface_LoadLocation(texture->surfaces[0], SFLAG_INTEXTURE, NULL); 635 if (!VBOXSHRC_IS_SHARED_OPENED(texture)) 636 { 637 Assert(!(*shared_handle)); 638 *shared_handle = VBOXSHRC_GET_SHAREHANDLE(texture); 639 } 640 else 641 { 642 Assert(*shared_handle); 643 Assert(*shared_handle == VBOXSHRC_GET_SHAREHANDLE(texture)); 668 for (i = 0; i < texture->baseTexture.levels; ++i) 669 { 670 if (!VBOXSHRC_IS_SHARED_OPENED(texture)) 671 { 672 IWineD3DSurface_LoadLocation(texture->surfaces[i], SFLAG_INTEXTURE, NULL); 673 Assert(!(*shared_handle)); 674 *shared_handle = VBOXSHRC_GET_SHAREHANDLE(texture); 675 } 676 else 677 { 678 surface_setup_location_onopen((IWineD3DSurfaceImpl*)texture->surfaces[i]); 679 Assert(*shared_handle); 680 Assert(*shared_handle == VBOXSHRC_GET_SHAREHANDLE(texture)); 681 } 644 682 } 645 683 #ifdef DEBUG 646 684 for (i = 0; i < texture->baseTexture.levels; ++i) 647 685 { 648 Assert(( *shared_handle) == ((IWineD3DSurfaceImpl*)texture->surfaces[i])->texture_name);686 Assert((GLuint)(*shared_handle) == ((IWineD3DSurfaceImpl*)texture->surfaces[i])->texture_name); 649 687 } 650 688 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/vboxsharedrc.h
r38112 r38982 19 19 #define VBOXSHRC_F_SHARED 0x00000001 /* shared rc */ 20 20 #define VBOXSHRC_F_SHARED_OPENED 0x00000002 /* if set shared rc is opened, otherwise it is created */ 21 #define VBOXSHRC_F_DONT_DELETE 0x00000004 /* don't delete gl resources on d3d resource deletion */ 21 22 22 23 #define VBOXSHRC_GET_SHAREFLAFS(_o) ((_o)->resource.sharerc_flags) … … 24 25 #define VBOXSHRC_SET_SHAREHANDLE(_o, _h) ((_o)->resource.sharerc_handle = (DWORD)(_h)) 25 26 #define VBOXSHRC_COPY_SHAREDATA(_oDst, _oSrc) do { \ 26 VBOXSHRC_GET_SHAREFLAFS(_oDst) = VBOXSHRC_GET_SHAREFLAFS(_oSrc); \27 VBOXSHRC_SET_SHAREHANDLE(_oDst, VBOXSHRC_GET_SHARE FLAFS(_oSrc)); \27 VBOXSHRC_GET_SHAREFLAFS(_oDst) = VBOXSHRC_GET_SHAREFLAFS(_oSrc); \ 28 VBOXSHRC_SET_SHAREHANDLE(_oDst, VBOXSHRC_GET_SHAREHANDLE(_oSrc)); \ 28 29 } while (0) 29 30 #define VBOXSHRC_SET_SHARED(_o) (VBOXSHRC_GET_SHAREFLAFS(_o) |= VBOXSHRC_F_SHARED) 30 31 #define VBOXSHRC_SET_SHARED_OPENED(_o) (VBOXSHRC_GET_SHAREFLAFS(_o) |= VBOXSHRC_F_SHARED_OPENED) 32 #define VBOXSHRC_SET_DONT_DELETE(_o) (VBOXSHRC_GET_SHAREFLAFS(_o) |= VBOXSHRC_F_DONT_DELETE) 33 31 34 #define VBOXSHRC_IS_SHARED(_o) (!!(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_SHARED)) 32 35 #define VBOXSHRC_IS_SHARED_OPENED(_o) (!!(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_SHARED_OPENED)) 33 36 #define VBOXSHRC_IS_SHARED_UNLOCKED(_o) (VBOXSHRC_IS_SHARED(_o) && !VBOXSHRC_IS_LOCKED(_o)) 37 #define VBOXSHRC_CAN_DELETE(_d, _o) ( \ 38 !VBOXSHRC_IS_SHARED(_o) \ 39 || !(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_DONT_DELETE) \ 40 ) 34 41 35 42 #define VBOXSHRC_LOCK(_o) do{ \ -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/volume.c
r33656 r38982 381 381 IWineD3DVolumeImpl_UnLoad, 382 382 IWineD3DVolumeImpl_GetType, 383 #ifdef VBOX_WITH_WDDM 384 IWineD3DResourceImpl_SetDontDeleteGl, 385 #endif 383 386 /* IWineD3DVolume */ 384 387 IWineD3DVolumeImpl_GetContainer, -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/volumetexture.c
r33656 r38982 339 339 IWineD3DVolumeTextureImpl_UnLoad, 340 340 IWineD3DVolumeTextureImpl_GetType, 341 #ifdef VBOX_WITH_WDDM 342 IWineD3DResourceImpl_SetDontDeleteGl, 343 #endif 341 344 /* BaseTexture */ 342 345 IWineD3DVolumeTextureImpl_SetLOD, -
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/wined3d_private.h
r38903 r38982 1887 1887 const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN; 1888 1888 1889 #ifdef VBOX_WITH_WDDM 1890 HRESULT WINAPI IWineD3DResourceImpl_SetDontDeleteGl(IWineD3DResource *iface) ; 1891 #endif 1892 1889 1893 /* Tests show that the start address of resources is 32 byte aligned */ 1890 1894 #define RESOURCE_ALIGNMENT 16 … … 1951 1955 void surface_prepare_texture(IWineD3DSurfaceImpl *surface, 1952 1956 const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN; 1957 #ifdef VBOX_WITH_WDDM 1958 void surface_setup_location_onopen(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; 1959 #endif 1953 1960 1954 1961 typedef struct IWineD3DBaseTextureImpl
Note:
See TracChangeset
for help on using the changeset viewer.