VirtualBox

Ignore:
Timestamp:
Oct 12, 2011 8:20:21 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
74369
Message:

wddm: proper ie rendering under win8 (shared resource open & destroy fixes, zero-init resources on creaate, etc.)

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  
    3333
    3434/* One would increase this whenever definitions in this file are changed */
    35 #define VBOXVIDEOIF_VERSION 10
     35#define VBOXVIDEOIF_VERSION 11
    3636
    3737#define VBOXWDDM_NODE_ID_SYSTEM           0
     
    116116} VBOXWDDM_ALLOCINFO, *PVBOXWDDM_ALLOCINFO;
    117117
    118 /* this resource is OpenResource'd rather than CreateResource'd */
    119 #define VBOXWDDM_RESOURCE_F_OPENNED      0x00000001
    120 /* identifies this is a resource created with CreateResource, the VBOXWDDMDISP_RESOURCE::fRcFlags is valid */
    121 #define VBOXWDDM_RESOURCE_F_TYPE_GENERIC 0x00000002
    122 
    123118typedef struct VBOXWDDM_RC_DESC
    124119{
     
    135130} VBOXWDDM_RC_DESC, *PVBOXWDDM_RC_DESC;
    136131
     132typedef 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
    137147typedef struct VBOXWDDM_RCINFO
    138148{
    139     uint32_t fFlags;
     149    VBOXWDDMDISP_RESOURCE_FLAGS fFlags;
    140150    VBOXWDDM_RC_DESC RcDesc;
    141151    uint32_t cAllocInfos;
     
    426436    VBOXWDDM_UHGSMI_BUFFER_UI_INFO_ESCAPE aBuffers[1];
    427437} VBOXDISPIFESCAPE_UHGSMI_SUBMIT, *PVBOXDISPIFESCAPE_UHGSMI_SUBMIT;
     438
     439typedef struct VBOXDISPIFESCAPE_SHRC_REF
     440{
     441    VBOXDISPIFESCAPE EscapeHdr;
     442    uint64_t hAlloc;
     443} VBOXDISPIFESCAPE_SHRC_REF, *PVBOXDISPIFESCAPE_SHRC_REF;
    428444
    429445/* query info func */
     
    504520        case D3DDDIFMT_DXT4:
    505521        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
    506529            return 8;
    507530        default:
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp

    r38930 r38982  
    10291029}
    10301030
    1031 #define VBOX_WDDM_SHRC_WO_NOTIFY
     1031//#define VBOX_WDDM_SHRC_WO_NOTIFY
    10321032static BOOLEAN vboxWddmDalCheckAdd(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc, BOOLEAN fWrite)
    10331033{
     
    15121512}
    15131513
    1514 static HRESULT vboxWddmSurfSynchMem(PVBOXWDDMDISP_RESOURCE pRc, PVBOXWDDMDISP_ALLOCATION pAllocation)
     1514static 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
     1578static HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc)
    15151579{
    15161580    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
     1633static 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
     1669static 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
     1698static 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);
    15311708    }
    15321709    else
    15331710    {
    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
     1741static 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
    15381769
    15391770static D3DFORMAT vboxDDI2D3DFormat(D3DDDIFORMAT format)
     
    20772308                            && pBbAlloc->SurfDesc.format == pRt->pAlloc->SurfDesc.format
    20782309                            && pBbAlloc->SurfDesc.VidPnSourceId == pRt->pAlloc->SurfDesc.VidPnSourceId
     2310#if 0
    20792311                            && (pBbRc == pRtRc
    20802312                                    || (pBbRc->fFlags == pRtRc->fFlags
     
    20822314//                                            && pBbRc->RcDesc.fFlags.Value == pRtRc->RcDesc.fFlags.Value
    20832315                                        )
    2084                                 ))
     2316
     2317                                )
     2318#endif
     2319                            )
    20852320                {
    20862321                    vboxWddmSwapchainBbAddTail(pCur, pBbAlloc, TRUE);
     
    24622697    return hr;
    24632698}
     2699
     2700static 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
     2725static 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
    24642766
    24652767static HRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
     
    34943796    if (pRc)
    34953797    {
     3798        VBOXVDBG_CHECK_SMSYNC(pRc);
    34963799        if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE)
    34973800        {
     
    35913894    if (pRc)
    35923895    {
     3896        VBOXVDBG_CHECK_SMSYNC(pRc);
    35933897        Assert(pRc->cAllocations == 1);
    35943898        pAlloc = &pRc->aAllocations[0];
     
    39254229    Assert(pDstRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM);
    39264230    HRESULT hr = S_OK;
     4231    VBOXVDBG_CHECK_SMSYNC(pDstRc);
     4232    VBOXVDBG_CHECK_SMSYNC(pSrcRc);
    39274233
    39284234    VBOXVDBG_DUMP_TEXBLT_ENTER(pSrcRc, &pData->SrcRect, pDstRc, &pData->DstPoint);
     
    42694575            if (!pLockAlloc->LockInfo.cLocks)
    42704576            {
     4577                VBOXVDBG_CHECK_SMSYNC(pRc);
    42714578                switch (pTexAlloc->enmD3DIfType)
    42724579                {
     
    44174724            if (!pAlloc->LockInfo.cLocks)
    44184725            {
     4726                VBOXVDBG_CHECK_SMSYNC(pRc);
    44194727                if (!pData->Flags.MightDrawFromLocked || (!pData->Flags.Discard && !pData->Flags.NoOverwrite))
    44204728                {
     
    45094817            if (!pAlloc->LockInfo.cLocks)
    45104818            {
     4819                VBOXVDBG_CHECK_SMSYNC(pRc);
    45114820                if (!pData->Flags.MightDrawFromLocked || (!pData->Flags.Discard && !pData->Flags.NoOverwrite))
    45124821                {
     
    45894898    else
    45904899    {
     4900#ifdef DEBUG_misha
     4901        Assert(0);
     4902#endif
    45914903        PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];
    45924904        D3DDDICB_LOCK LockData;
     
    47155027                }
    47165028                Assert(hr == S_OK);
     5029                VBOXVDBG_CHECK_SMSYNC(pRc);
    47175030            }
    47185031            else
     
    47555068                hr = pD3D9VBuf->Unlock();
    47565069                Assert(hr == S_OK);
     5070                VBOXVDBG_CHECK_SMSYNC(pRc);
    47575071            }
    47585072            else
     
    47955109                hr = pD3D9IBuf->Unlock();
    47965110                Assert(hr == S_OK);
     5111                VBOXVDBG_CHECK_SMSYNC(pRc);
    47975112            }
    47985113            else
     
    49315246        pRc->hKMResource = NULL;
    49325247        pRc->pDevice = pDevice;
    4933         pRc->fFlags = VBOXWDDM_RESOURCE_F_TYPE_GENERIC;
     5248        pRc->fFlags.Value = 0;
     5249        pRc->fFlags.Generic = 1;
    49345250        pRc->RcDesc.fFlags = pResource->Flags;
    49355251        pRc->RcDesc.enmFormat = pResource->Format;
     
    49695285            pAllocation->D3DWidth = pSurf->Width;
    49705286            pAllocation->pvMem = (void*)pSurf->pSysMem;
    4971             pAllocation->SurfDesc.pitch = pSurf->SysMemPitch;
    49725287            pAllocation->SurfDesc.slicePitch = pSurf->SysMemSlicePitch;
    49735288            pAllocation->SurfDesc.depth = pSurf->Depth;
     
    49755290            pAllocation->SurfDesc.height = pSurf->Height;
    49765291            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);
    49775303        }
    49785304
     
    50065332                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    50075333                        pAllocation->pD3DIf = pD3D9Surf;
    5008                         hr = vboxWddmSurfSynchMem(pRc, pAllocation);
    5009                         Assert(hr == S_OK);
    50105334                    }
    50115335                    else
     
    50165340                        }
    50175341                        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);
    50185354                    }
    50195355                }
     
    50395375                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_VERTEXBUFFER;
    50405376                        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                         else
    5056                         {
    5057                             Assert(!pAllocation->pvMem);
    5058                         }
    50595377                    }
    50605378                    else
     
    50655383                        }
    50665384                        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);
    50675397                    }
    50685398                }
     
    50905420                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_INDEXBUFFER;
    50915421                        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                         else
    5107                         {
    5108                             Assert(!pAllocation->pvMem);
    5109                         }
    51105422                    }
    51115423                    else
     
    51165428                        }
    51175429                        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);
    51185442                    }
    51195443                }
     
    52065530#endif
    52075531                            pAllocation->hSharedHandle = hSharedHandle;
    5208 #ifdef DEBUG_misha
    5209                             if (pResource->Flags.SharedResource)
     5532
     5533                            if (!pavClientMem)
    52105534                            {
    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
    52135537                            }
    5214 #endif
    52155538                        }
    52165539
     
    52835606                    }
    52845607                }
     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                }
    52855620            }
    52865621            else if (pResource->Flags.RenderTarget)
     
    53305665#endif
    53315666                            pAllocation->hSharedHandle = hSharedHandle;
    5332                             hr = vboxWddmSurfSynchMem(pRc, pAllocation);
    5333                             Assert(hr == S_OK);
    5334                             if (hr == S_OK)
    5335                             {
    5336                                 continue;
    5337                             }
     5667                            continue;
    53385668
    53395669                            /* fail branch */
     
    53475677                        break;
    53485678                    }
     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                    }
    53495692                }
    53505693            }
     
    53645707        if (hr == S_OK && bIssueCreateResource)
    53655708        {
     5709            pRc->fFlags.KmResource = bCreateKMResource;
    53665710            D3DDDICB_ALLOCATE *pDdiAllocate = vboxWddmRequestAllocAlloc(pResource);
    53675711            Assert(pDdiAllocate);
     
    53715715                Assert(pDdiAllocate->PrivateDriverDataSize == sizeof (VBOXWDDM_RCINFO));
    53725716                PVBOXWDDM_RCINFO pRcInfo = (PVBOXWDDM_RCINFO)pDdiAllocate->pPrivateDriverData;
    5373                 pRcInfo->fFlags = VBOXWDDM_RESOURCE_F_TYPE_GENERIC;
     5717                pRcInfo->fFlags = pRc->fFlags;
    53745718                pRcInfo->RcDesc = pRc->RcDesc;
    53755719                pRcInfo->cAllocInfos = pResource->SurfCount;
     
    54235767                }
    54245768
     5769                Assert(!pRc->fFlags.Opened);
     5770//                Assert(!pRc->fFlags.KmResource);
     5771                Assert(pRc->fFlags.Generic);
     5772
    54255773                if (bCreateKMResource)
    54265774                {
     5775                    Assert(pRc->fFlags.KmResource);
     5776
    54275777                    hr = pDevice->RtCallbacks.pfnAllocateCb(pDevice->hDevice, pDdiAllocate);
    54285778                    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                            );
    54305783                }
    54315784                else
    54325785                {
     5786                    Assert(!pRc->fFlags.KmResource);
     5787
    54335788                    pDdiAllocate->hResource = NULL;
    54345789                    pDdiAllocate->NumAllocations = 1;
     
    54805835                        pAllocation->pvMem = (void*)pSurf->pSysMem;
    54815836                        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                        }
    54825854                    }
    54835855
     
    55325904        for (UINT i = 0; i < pRc->cAllocations; ++i)
    55335905        {
     5906            BOOL fSetDontDelete = FALSE;
    55345907            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                }
    55355916#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
    55425932            if (pAlloc->pD3DIf)
    55435933                pAlloc->pD3DIf->Release();
    5544             if (pAlloc->pSecondaryOpenedD3DIf)
    5545                 pAlloc->pSecondaryOpenedD3DIf->Release();
    55465934
    55475935            PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainForAlloc(pAlloc);
     
    55605948
    55615949    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);
    55775960    }
    55785961    else
    55795962    {
    5580         Assert(!(pRc->fFlags & VBOXWDDM_RESOURCE_F_OPENNED));
     5963        Assert(!(pRc->fFlags.Opened));
    55815964        for (UINT j = 0; j < pRc->cAllocations; ++j)
    55825965        {
     
    56226005//    Assert(pScreen->iRenderTargetFrontBuf == pData->SubResourceIndex);
    56236006
    5624 #if 0
    5625     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 #endif
    56316007    {
    56326008        hr = pDevice->RtCallbacks.pfnSetDisplayModeCb(pDevice->hDevice, &DdiDm);
     
    59466322    if (pRc)
    59476323    {
     6324        VBOXVDBG_CHECK_SMSYNC(pRc);
    59486325        Assert(pRc->cAllocations == 1);
    59496326        pAlloc = &pRc->aAllocations[0];
     
    60106387    return E_FAIL;
    60116388}
    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 }
    60926389
    60936390static HRESULT APIENTRY vboxWddmDDevBlt(HANDLE hDevice, CONST D3DDDIARG_BLT* pData)
     
    61026399    PVBOXWDDMDISP_RESOURCE pDstRc = (PVBOXWDDMDISP_RESOURCE)pData->hDstResource;
    61036400    PVBOXWDDMDISP_RESOURCE pSrcRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
     6401    VBOXVDBG_CHECK_SMSYNC(pDstRc);
     6402    VBOXVDBG_CHECK_SMSYNC(pSrcRc);
    61046403    Assert(pDstRc->cAllocations > pData->DstSubResourceIndex);
    61056404    Assert(pSrcRc->cAllocations > pData->SrcSubResourceIndex);
     
    61866485    if (hr == S_OK)
    61876486    {
     6487        VBOXVDBG_CHECK_SMSYNC(pRc);
    61886488        Assert(pSurfIf);
    61896489        hr = pDevice9If->ColorFill(pSurfIf, &pData->DstRect, pData->Color);
     
    63086608    IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    63096609    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hRenderTarget;
     6610    VBOXVDBG_CHECK_SMSYNC(pRc);
    63106611    Assert(pRc);
    63116612    Assert(pData->SubResourceIndex < pRc->cAllocations);
     
    63296630    if (pRc)
    63306631    {
     6632        VBOXVDBG_CHECK_SMSYNC(pRc);
    63316633        Assert(pRc->cAllocations == 1);
    63326634        Assert(pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
     
    68937195    HRESULT hr = S_OK;
    68947196
     7197    Assert(pData->hKMResource);
     7198
    68957199    Assert(pData->NumAllocations);
    68967200    PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(pData->NumAllocations);
     
    69027206        pRc->pDevice = pDevice;
    69037207        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;
    69057212        if (!pData->pPrivateDriverData || !pData->PrivateDriverDataSize)
    69067213        {
     
    69487255            {
    69497256                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);
    69517259                Assert(pRcInfo->cAllocInfos == pData->NumAllocations);
    6952                 pRc->fFlags = pRcInfo->fFlags | VBOXWDDM_RESOURCE_F_OPENNED;
     7260                pRc->fFlags = pRcInfo->fFlags;
     7261                pRc->fFlags.Opened = 1;
    69537262                pRc->RcDesc = pRcInfo->RcDesc;
    69547263                pRc->cAllocations = pData->NumAllocations;
     
    69737282                    Assert(pAllocation->hSharedHandle);
    69747283#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                                ));
    69757293                }
    69767294
     
    69837301#ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    69847302                    Assert(pAllocation->hSharedHandle);
    6985 #endif
    6986 
    6987 #ifdef DEBUG_misha
    6988                     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 
    69917303#endif
    69927304
     
    70307342                            hr = E_INVALIDARG;
    70317343                        }
    7032 
    70337344                        hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If,
    70347345                                                    pAllocation->SurfDesc.width,
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h

    r38903 r38982  
    3333/* maximum number of direct render targets to be used before
    3434 * switching to offscreen rendering */
    35 #define VBOXWDDMDISP_MAX_DIRECT_RTS      3
     35#define VBOXWDDMDISP_MAX_DIRECT_RTS      0
    3636
    3737#define VBOXWDDMDISP_IS_TEXTURE(_f) ((_f).Texture || (_f).Value == 0)
     
    240240    /* object type is defined by enmD3DIfType enum */
    241241    IUnknown *pD3DIf;
    242     IUnknown *pSecondaryOpenedD3DIf;
    243242    VBOXDISP_D3DIFTYPE enmD3DIfType;
    244243    /* list entry used to add allocation to the dirty alloc list */
     
    257256    D3DKMT_HANDLE hKMResource;
    258257    PVBOXWDDMDISP_DEVICE pDevice;
    259     uint32_t fFlags;
     258    VBOXWDDMDISP_RESOURCE_FLAGS fFlags;
    260259    VBOXWDDM_RC_DESC RcDesc;
    261260    UINT cAllocations;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp

    r38903 r38982  
    3737#endif
    3838    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
    4047    {
    4148        pD3D->pfnDirect3DCreate9Ex = (PFNVBOXDISPD3DCREATE9EX)GetProcAddress(pD3D->hD3DLib, "Direct3DCreate9Ex");
    42         Assert(pD3D->pfnDirect3DCreate9Ex);
    43         if (pD3D->pfnDirect3DCreate9Ex)
     49        if (!pD3D->pfnDirect3DCreate9Ex)
    4450        {
    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;
    7653        }
    7754
    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);
    85102
    86103    return E_FAIL;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h

    r38903 r38982  
    4545    PFNVBOXWINEEXD3DDEV9_UPDATE pfnVBoxWineExD3DDev9Update;
    4646
     47    PFNVBOXWINEEXD3DRC9_SETDONTDELETEGL pfnVBoxWineExD3DRc9SetDontDeleteGl;
     48
    4749    PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT pfnVBoxWineExD3DSwapchain9Present;
    4850
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp

    r38930 r38982  
    6464DWORD g_VBoxVDbgFBreakDdi = 0;
    6565
    66 DWORD g_VBoxVDbgFLogRel = 0;
    67 DWORD g_VBoxVDbgFLog = 0;
     66DWORD g_VBoxVDbgFCheckSysMemSync = 0;
     67
     68DWORD g_VBoxVDbgFLogRel = 1;
     69DWORD g_VBoxVDbgFLog = 1;
    6870DWORD g_VBoxVDbgFLogFlow = 0;
    6971
     
    561563    switch (pExceptionRecord->ExceptionCode)
    562564    {
    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:
    565573            AssertRelease(0);
    566574            break;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h

    r38930 r38982  
    5252extern DWORD g_VBoxVDbgFBreakDdi;
    5353
     54extern DWORD g_VBoxVDbgFCheckSysMemSync;
    5455
    5556/* log enable flags */
     
    146147    } while (0)
    147148
     149#define LOG vboxVDbgPrint
     150#define LOGREL vboxVDbgPrintR
     151#define LOGFLOW vboxVDbgPrintF
     152
    148153#ifdef VBOXWDDMDISP_DEBUG
    149154
     
    191196        )
    192197
     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
    193205#define VBOXVDBG_IS_DUMP_SHARED_ALLOWED(_pRc) (\
    194206        (_pRc)->RcDesc.fFlags.SharedResource \
     
    214226    } while (0)
    215227
     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
    216250#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)) \
    218255        { \
    219256            vboxVDbgDoDumpRt("==>"__FUNCTION__": RenderTarget Dump\n", (_pDevice), "\n"); \
     
    222259
    223260#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)) \
    225265        { \
    226266            vboxVDbgDoDumpRt("<=="__FUNCTION__": RenderTarget Dump\n", (_pDevice), "\n"); \
     
    330370#define VBOXVDBG_BREAK_SHARED(_pRc) do { } while (0)
    331371#define VBOXVDBG_BREAK_DDI() do { } while (0)
     372#define VBOXVDBG_CHECK_SMSYNC(_pRc) do { } while (0)
    332373#endif
    333374
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h

    r37626 r38982  
    106106   BOOL bNotifyDxDpc;
    107107
     108#if 0
     109   FAST_MUTEX ShRcTreeMutex;
     110   AVLPVTREE ShRcTree;
     111#endif
     112
    108113   VBOXWDDM_SOURCE aSources[VBOX_VIDEO_MAX_SCREENS];
    109114   VBOXWDDM_TARGET aTargets[VBOX_VIDEO_MAX_SCREENS];
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp

    r38930 r38982  
    14731473    }
    14741474}
     1475
     1476#if 0
     1477VOID vboxShRcTreeInit(PVBOXMP_DEVEXT pDevExt)
     1478{
     1479    ExInitializeFastMutex(&pDevExt->ShRcTreeMutex);
     1480    pDevExt->ShRcTree = NULL;
     1481}
     1482
     1483VOID vboxShRcTreeTerm(PVBOXMP_DEVEXT pDevExt)
     1484{
     1485    Assert(!pDevExt->ShRcTree);
     1486    pDevExt->ShRcTree = NULL;
     1487}
     1488
     1489BOOLEAN 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)))
     1506PVBOXWDDM_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
     1517BOOLEAN 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  
    151151VOID vboxWddmCounterU32Wait(uint32_t volatile * pu32, uint32_t u32Val);
    152152
     153#if 0
     154/* wine shrc handle -> allocation map */
     155VOID vboxShRcTreeInit(PVBOXMP_DEVEXT pDevExt);
     156VOID vboxShRcTreeTerm(PVBOXMP_DEVEXT pDevExt);
     157BOOLEAN vboxShRcTreePut(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc);
     158PVBOXWDDM_ALLOCATION vboxShRcTreeGet(PVBOXMP_DEVEXT pDevExt, HANDLE hSharedRc);
     159BOOLEAN vboxShRcTreeRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pAlloc);
     160#endif
     161
    153162#endif /* #ifndef ___VBoxMPMisc_h__ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r37889 r38982  
    3232#include "VBoxMPVbva.h"
    3333
     34#if 0
     35#include <iprt/avl.h>
     36#endif
     37
    3438/* one page size */
    3539#define VBOXWDDM_C_DMA_BUFFER_SIZE         0x1000
     
    118122    VBOXWDDM_ALLOC_TYPE enmType;
    119123    volatile uint32_t cRefs;
    120 //    VBOXWDDM_ALLOCUSAGE_TYPE enmCurrentUsage;
    121124    D3DDDI_RESOURCEFLAGS fRcFlags;
    122125    UINT SegmentId;
     
    128131    BOOLEAN bVisible;
    129132    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
    130137    VBOXWDDM_SURFACE_DESC SurfDesc;
    131138    struct VBOXWDDM_RESOURCE *pResource;
     
    133140    DXGK_ALLOCATIONUSAGEHINT UsageHint;
    134141    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
    135150    VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
    136151    union
     
    143158typedef struct VBOXWDDM_RESOURCE
    144159{
    145     uint32_t fFlags;
     160    VBOXWDDMDISP_RESOURCE_FLAGS fFlags;
    146161    volatile uint32_t cRefs;
    147162    VBOXWDDM_RC_DESC RcDesc;
     
    251266} VBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD, *PVBOXWDDM_DMA_PRIVATEDATA_CHROMIUM_CMD;
    252267
     268typedef 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
    253274typedef struct VBOXWDDM_OPENALLOCATION
    254275{
     276    LIST_ENTRY ListEntry;
    255277    D3DKMT_HANDLE  hAllocation;
     278    PVBOXWDDM_ALLOCATION pAllocation;
     279    PVBOXWDDM_DEVICE pDevice;
     280    uint32_t cShRcRefs;
    256281} VBOXWDDM_OPENALLOCATION, *PVBOXWDDM_OPENALLOCATION;
    257282
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h

    r38112 r38982  
    178178    PVBOXWDDM_ALLOCATION pAlloc;
    179179    VBOXVIDEOOFFSET offAlloc;
    180     UINT segmentIdAlloc;
     180    UINT segmentIdAlloc : 31;
     181    UINT fWriteOp : 1;
    181182    D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId;
    182183} VBOXWDDM_DMA_ALLOCINFO, *PVBOXWDDM_DMA_ALLOCINFO;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r38660 r38982  
    5151}
    5252
    53 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromOpenData(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_OPENALLOCATION pOa)
     53DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromHandle(PVBOXMP_DEVEXT pDevExt, D3DKMT_HANDLE hAllocation)
    5454{
    5555    DXGKARGCB_GETHANDLEDATA GhData;
    56     GhData.hObject = pOa->hAllocation;
     56    GhData.hObject = hAllocation;
    5757    GhData.Type = DXGK_HANDLE_ALLOCATION;
    5858    GhData.Flags.Value = 0;
     
    6262DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromAllocList(PVBOXMP_DEVEXT pDevExt, DXGK_ALLOCATIONLIST *pAllocList)
    6363{
    64     return vboxWddmGetAllocationFromOpenData(pDevExt, (PVBOXWDDM_OPENALLOCATION)pAllocList->hDeviceSpecificAllocation);
     64    PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)pAllocList->hDeviceSpecificAllocation;
     65    return pOa->pAllocation;
    6566}
    6667
     
    955956                    VBoxMPCmnInitCustomVideoModes(pContext);
    956957                    VBoxWddmInvalidateVideoModesInfo(pContext);
     958#if 0
     959                    vboxShRcTreeInit(pContext);
     960#endif
    957961
    958962#ifdef VBOX_WITH_VIDEOHWACCEL
     
    10101014#ifdef VBOX_WITH_VIDEOHWACCEL
    10111015    vboxVhwaFree(pDevExt);
     1016#endif
     1017#if 0
     1018    vboxShRcTreeTerm(pDevExt);
    10121019#endif
    10131020
     
    17941801                vboxWddmAssignPrimary(pDevExt, &pDevExt->aSources[pAllocation->SurfDesc.VidPnSourceId], NULL, pAllocation->SurfDesc.VidPnSourceId);
    17951802            }
     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
    17961813            break;
    17971814        }
     
    19031920            pAllocation->bVisible = FALSE;
    19041921            pAllocation->bAssigned = FALSE;
     1922            InitializeListHead(&pAllocation->OpenList);
    19051923
    19061924            switch (pAllocInfo->enmType)
     
    19571975                                {
    19581976                                    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
    19591987                                }
    19601988                            }
     
    32123240        case DXGK_OPERATION_FILL:
    32133241        {
     3242            Assert(pBuildPagingBuffer->Fill.FillPattern == 0);
     3243            PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->Fill.hAllocation;
    32143244//            pBuildPagingBuffer->pDmaBuffer = (uint8_t*)pBuildPagingBuffer->pDmaBuffer + VBOXVDMACMD_SIZE(VBOXVDMACMD_DMA_BPB_FILL);
    32153245            break;
     
    35563586            case VBOXESC_UHGSMI_SUBMIT:
    35573587            {
     3588                /* submit UHGSMI command */
    35583589                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    35593590                PVBOXDISPIFESCAPE_UHGSMI_SUBMIT pSubmit = (PVBOXDISPIFESCAPE_UHGSMI_SUBMIT)pEscapeHdr;
     
    35743605            case VBOXESC_UHGSMI_ALLOCATE:
    35753606            {
     3607                /* allocate UHGSMI buffer */
    35763608                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    35773609                PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE pAlocate = (PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE)pEscapeHdr;
     
    35893621            case VBOXESC_UHGSMI_DEALLOCATE:
    35903622            {
     3623                /* deallocate UHGSMI buffer */
    35913624                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    35923625                PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE pDealocate = (PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE)pEscapeHdr;
     
    36043637            case VBOXESC_GETVBOXVIDEOCMCMD:
    36053638            {
     3639                /* get the list of r0->r3 commands (d3d window visible regions reporting )*/
    36063640                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    36073641                PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pRegions = (PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD)pEscapeHdr;
     
    36193653            case VBOXESC_SETVISIBLEREGION:
    36203654            {
     3655                /* visible regions for seamless */
    36213656                LPRGNDATA lpRgnData = VBOXDISPIFESCAPE_DATA(pEscapeHdr, RGNDATA);
    36223657                uint32_t cbData = VBOXDISPIFESCAPE_DATA_SIZE(pEscape->PrivateDriverDataSize);
     
    36823717            case VBOXESC_SCREENLAYOUT:
    36833718            {
     3719                /* set screen layout (unused currently) */
    36843720                Assert(pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT));
    36853721                if (pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT))
     
    37113747            case VBOXESC_SWAPCHAININFO:
    37123748            {
     3749                /* set swapchain information */
    37133750                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    37143751                Status = vboxWddmSwapchainCtxEscape(pDevExt, pContext, (PVBOXDISPIFESCAPE_SWAPCHAININFO)pEscapeHdr, pEscape->PrivateDriverDataSize);
     
    37173754            }
    37183755            case VBOXESC_REINITVIDEOMODES:
     3756            {
     3757                /* clear driver's internal videomodes cache */
    37193758                VBoxWddmInvalidateVideoModesInfo(pDevExt);
    37203759                Status = STATUS_SUCCESS;
    37213760                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            }
    37223831            case VBOXESC_DBGPRINT:
    37233832            {
     
    45804689    if (Status == STATUS_SUCCESS)
    45814690    {
    4582         for (UINT i = 0; i < pOpenAllocation->NumAllocations; ++i)
     4691        UINT i = 0;
     4692        for (; i < pOpenAllocation->NumAllocations; ++i)
    45834693        {
    45844694            DXGK_OPENALLOCATIONINFO* pInfo = &pOpenAllocation->pOpenAllocation[i];
    45854695            Assert(pInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO));
    45864696            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
    45874705            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);
    45884727            pOa->hAllocation = pInfo->hAllocation;
     4728            pOa->pAllocation = pAllocation;
     4729            pOa->pDevice = pDevice;
    45894730            pInfo->hDeviceSpecificAllocation = pOa;
    45904731
     4732
    45914733            if (pRcInfo)
    45924734            {
     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
    45934747#ifdef VBOX_WITH_VIDEOHWACCEL
    45944748                if (pRcInfo->RcDesc.fFlags.Overlay)
    45954749                {
    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 */
    46244754                }
    46254755#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);
    46264772            }
    46274773        }
     
    46454791    vboxVDbgBreakFv();
    46464792
     4793    PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)hDevice;
     4794    PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter;
     4795
    46474796    for (UINT i = 0; i < pCloseAllocation->NumAllocations; ++i)
    46484797    {
    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);
    46504806    }
    46514807
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette