VirtualBox

Ignore:
Timestamp:
Oct 12, 2011 8:20:21 PM (13 years ago)
Author:
vboxsync
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
Files:
36 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
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d8/device.c

    r33656 r38982  
    3030
    3131#include "config.h"
     32#include "d3d8_private.h"
    3233
    3334#include <math.h>
     
    4142#include "wingdi.h"
    4243#include "wine/debug.h"
    43 
    44 #include "d3d8_private.h"
    4544
    4645WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d8/directx.c

    r33656 r38982  
    3131
    3232#include "config.h"
     33#include "d3d8_private.h"
    3334
    3435#include <stdarg.h>
     
    4243#include "wine/debug.h"
    4344#include "wine/unicode.h"
    44 
    45 #include "d3d8_private.h"
    4645
    4746WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/d3d9wddm.def

    r38903 r38982  
    1717  VBoxWineExD3DDev9Update
    1818  VBoxWineExD3DSwapchain9Present
     19  VBoxWineExD3DRc9SetDontDeleteGl
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/device.c

    r38363 r38982  
    506506    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
    507507    IDirect3DSwapChain9Impl *newSwapchain;
    508     HRESULT hr = IDirect3DDevice9Impl_DoCreateAdditionalSwapChain(iface, present_parameters, &newSwapchain);
     508    HRESULT hr = IDirect3DDevice9Impl_DoCreateAdditionalSwapChain(iface, present_parameters, (IDirect3DSwapChain9**)&newSwapchain);
    509509    if (FAILED(hr))
    510510    {
     
    520520    {
    521521        ERR("Failed to add additional swapchain, hr %#x.\n", hr);
    522         IUnknown_Release(newSwapchain);
     522        IUnknown_Release((IDirect3DSwapChain9*)newSwapchain);
    523523        return hr;
    524524    }
     
    31523152    return D3D_OK;
    31533153}
     3154
     3155#ifdef VBOX_WITH_WDDM
     3156VBOXWINEEX_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  
    3131#define __WINE_WINE_DEBUG_H
    3232
     33#if defined(VBOX_WITH_WDDM) || defined(VBOX_WINE_WITHOUT_LIBWINE)
     34# error "unexpected include!!"
     35#endif
     36
    3337#include <stdarg.h>
    3438#include <windef.h>
     
    317321#endif
    318322
     323
     324#ifdef DEBUG_misha
     325//# define VBOXWINEDBG_SHADERS
     326#endif
     327
     328#ifdef VBOXWINEDBG_SHADERS
     329
     330void 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
    319340#endif  /* __WINE_WINE_DEBUG_H */
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/include/wine/wined3d.h

    r38903 r38982  
    66#ifndef __WIDL_WINED3D_H
    77#define __WIDL_WINED3D_H
     8
     9#if defined(VBOX_WITH_WDDM) || defined(VBOX_WINE_WITHOUT_LIBWINE)
     10# error "unexpected include!!"
     11#endif
    812
    913#ifdef __cplusplus
     
    34293433        IWineD3DResource* This);
    34303434
     3435#ifdef VBOX_WITH_WDDM
     3436    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     3437        IWineD3DResource* This);
     3438#endif
     3439
    34313440    END_INTERFACE
    34323441} IWineD3DResourceVtbl;
     
    34513460#define IWineD3DResource_UnLoad(This) (This)->lpVtbl->UnLoad(This)
    34523461#define IWineD3DResource_GetType(This) (This)->lpVtbl->GetType(This)
     3462# ifdef VBOX_WITH_WDDM
     3463#  define IWineD3DResource_SetDontDeleteGl(This) (This)->lpVtbl->SetDontDeleteGl(This)
     3464# endif
    34533465#endif
    34543466
     
    40554067    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    40564068        IWineD3DSurface* This);
     4069
     4070#ifdef VBOX_WITH_WDDM
     4071    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     4072        IWineD3DResource* This);
     4073#endif
    40574074
    40584075    /*** IWineD3DSurface methods ***/
     
    46714688        IWineD3DVolume* This);
    46724689
     4690#ifdef VBOX_WITH_WDDM
     4691    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     4692        IWineD3DResource* This);
     4693#endif
     4694
    46734695    /*** IWineD3DVolume methods ***/
    46744696    HRESULT (STDMETHODCALLTYPE *GetContainer)(
     
    48844906    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    48854907        IWineD3DBaseTexture* This);
     4908
     4909#ifdef VBOX_WITH_WDDM
     4910    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     4911        IWineD3DResource* This);
     4912#endif
    48864913
    48874914    /*** IWineD3DBaseTexture methods ***/
     
    51305157    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    51315158        IWineD3DTexture* This);
     5159
     5160#ifdef VBOX_WITH_WDDM
     5161    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     5162        IWineD3DTexture* This);
     5163#endif
    51325164
    51335165    /*** IWineD3DBaseTexture methods ***/
     
    53775409        IWineD3DCubeTexture* This);
    53785410
     5411#ifdef VBOX_WITH_WDDM
     5412    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     5413        IWineD3DCubeTexture* This);
     5414#endif
     5415
    53795416    /*** IWineD3DBaseTexture methods ***/
    53805417    DWORD (STDMETHODCALLTYPE *SetLOD)(
     
    56275664        IWineD3DVolumeTexture* This);
    56285665
     5666#ifdef VBOX_WITH_WDDM
     5667    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     5668        IWineD3DResource* This);
     5669#endif
     5670
    56295671    /*** IWineD3DBaseTexture methods ***/
    56305672    DWORD (STDMETHODCALLTYPE *SetLOD)(
     
    63826424    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    63836425        IWineD3DBuffer* This);
     6426
     6427#ifdef VBOX_WITH_WDDM
     6428    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     6429        IWineD3DResource* This);
     6430#endif
    63846431
    63856432    /*** IWineD3DBuffer methods ***/
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/VBoxWineEx.h

    r38903 r38982  
    1616#define ___VBoxWineEx_h__
    1717
     18#define VBOXWINEEX_VERSION 1
     19
    1820#ifndef IN_VBOXWINEEX
    19 #  define VBOXWINEEX_DECL(_type) __declspec(dllimport) _type WINAPI
     21# define VBOXWINEEX_DECL(_type)  __declspec(dllimport) _type WINAPI
    2022# else
    21 #  define VBOXWINEEX_DECL(_type) __declspec(dllexport) _type WINAPI
     23# define VBOXWINEEX_DECL(_type) __declspec(dllexport) _type WINAPI
    2224#endif
    2325
     
    3941typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DDEV9_UPDATE(IDirect3DDevice9Ex *iface, D3DPRESENT_PARAMETERS * pParams, IDirect3DDevice9Ex **outIface);
    4042typedef FNVBOXWINEEXD3DDEV9_UPDATE *PFNVBOXWINEEXD3DDEV9_UPDATE;
     43
     44typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DRC9_SETDONTDELETEGL(IDirect3DResource9 *iface);
     45typedef FNVBOXWINEEXD3DRC9_SETDONTDELETEGL *PFNVBOXWINEEXD3DRC9_SETDONTDELETEGL;
    4146
    4247typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DSWAPCHAIN9_PRESENT(IDirect3DSwapChain9 *iface, IDirect3DSurface9 *surf);
     
    6469                                                    IDirect3DDevice9Ex **outIface); /* update device parameters */
    6570
     71VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DRc9SetDontDeleteGl(IDirect3DResource9 *iface);
     72
    6673VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9Present(IDirect3DSwapChain9 *iface,
    6774                                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  
    3131#define __WINE_WINE_DEBUG_H
    3232
    33 #include <stdarg.h>
    34 #include <windef.h>
     33#include <windows.h>
    3534#ifndef GUID_DEFINED
    3635#include <guiddef.h>
     
    322321#endif
    323322
     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
     332void 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
    324342#endif  /* __WINE_WINE_DEBUG_H */
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub/include/wine/wined3d.h

    r38903 r38982  
    34313431        IWineD3DResource* This);
    34323432
     3433#ifdef VBOX_WITH_WDDM
     3434    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     3435        IWineD3DResource* This);
     3436#endif
     3437
    34333438    END_INTERFACE
    34343439} IWineD3DResourceVtbl;
     
    34533458#define IWineD3DResource_UnLoad(This) (This)->lpVtbl->UnLoad(This)
    34543459#define IWineD3DResource_GetType(This) (This)->lpVtbl->GetType(This)
     3460# ifdef VBOX_WITH_WDDM
     3461#  define IWineD3DResource_SetDontDeleteGl(This) (This)->lpVtbl->SetDontDeleteGl(This)
     3462# endif
    34553463#endif
    34563464
     
    40574065    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    40584066        IWineD3DSurface* This);
     4067
     4068#ifdef VBOX_WITH_WDDM
     4069    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     4070        IWineD3DResource* This);
     4071#endif
    40594072
    40604073    /*** IWineD3DSurface methods ***/
     
    46734686        IWineD3DVolume* This);
    46744687
     4688#ifdef VBOX_WITH_WDDM
     4689    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     4690        IWineD3DResource* This);
     4691#endif
     4692
    46754693    /*** IWineD3DVolume methods ***/
    46764694    HRESULT (STDMETHODCALLTYPE *GetContainer)(
     
    48864904    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    48874905        IWineD3DBaseTexture* This);
     4906
     4907#ifdef VBOX_WITH_WDDM
     4908    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     4909        IWineD3DResource* This);
     4910#endif
    48884911
    48894912    /*** IWineD3DBaseTexture methods ***/
     
    51325155    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    51335156        IWineD3DTexture* This);
     5157
     5158#ifdef VBOX_WITH_WDDM
     5159    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     5160        IWineD3DResource* This);
     5161#endif
    51345162
    51355163    /*** IWineD3DBaseTexture methods ***/
     
    53795407        IWineD3DCubeTexture* This);
    53805408
     5409#ifdef VBOX_WITH_WDDM
     5410    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     5411        IWineD3DResource* This);
     5412#endif
     5413
    53815414    /*** IWineD3DBaseTexture methods ***/
    53825415    DWORD (STDMETHODCALLTYPE *SetLOD)(
     
    56295662        IWineD3DVolumeTexture* This);
    56305663
     5664#ifdef VBOX_WITH_WDDM
     5665    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     5666        IWineD3DResource* This);
     5667#endif
     5668
    56315669    /*** IWineD3DBaseTexture methods ***/
    56325670    DWORD (STDMETHODCALLTYPE *SetLOD)(
     
    63846422    WINED3DRESOURCETYPE (STDMETHODCALLTYPE *GetType)(
    63856423        IWineD3DBuffer* This);
     6424
     6425#ifdef VBOX_WITH_WDDM
     6426    HRESULT (STDMETHODCALLTYPE *SetDontDeleteGl)(
     6427        IWineD3DResource* This);
     6428#endif
    63866429
    63876430    /*** IWineD3DBuffer methods ***/
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/basetexture.c

    r37873 r38982  
    114114
    115115#ifdef VBOX_WITH_WDDM
    116     if (VBOXSHRC_IS_SHARED_OPENED(This))
     116    if (!VBOXSHRC_CAN_DELETE(device, This))
    117117    {
    118118        This->baseTexture.texture_rgb.name = 0;
     
    291291        if (VBOXSHRC_IS_SHARED_OPENED(This))
    292292        {
    293             gl_tex->name = VBOXSHRC_GET_SHAREHANDLE(This);
     293            gl_tex->name = (GLuint)VBOXSHRC_GET_SHAREHANDLE(This);
    294294        }
    295295        else
    296296#endif
    297297        {
     298            isNewTexture = TRUE;
    298299            glGenTextures(1, &gl_tex->name);
    299300#ifdef VBOX_WITH_WDDM
     
    306307        checkGLcall("glGenTextures");
    307308        TRACE("Generated texture %d\n", gl_tex->name);
     309#ifndef VBOX_WITH_WDDM
    308310        if (This->resource.pool == WINED3DPOOL_DEFAULT) {
    309311            /* Tell opengl to try and keep this texture in video ram (well mostly) */
     
    313315
    314316        }
     317#else
     318        /* chromium code on host fails to resolve texture name to texture obj for some reason
     319         * @todo: investigate */
     320#endif
    315321        /* Initialise the state of the texture object
    316322        to the openGL defaults, not the directx defaults */
     
    329335        gl_tex->states[WINED3DTEXSTA_TSSADDRESSW]   = WINED3DTADDRESS_WRAP;
    330336        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) {
    334340            /* This means double binding the texture at creation, but keeps the code simpler all
    335341             * in all, and the run-time path free from additional checks
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/buffer.c

    r33656 r38982  
    14491449    buffer_UnLoad,
    14501450    buffer_GetType,
     1451#ifdef VBOX_WITH_WDDM
     1452    IWineD3DResourceImpl_SetDontDeleteGl,
     1453#endif
    14511454    /* IWineD3DBuffer methods */
    14521455    buffer_Map,
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/cubetexture.c

    r37870 r38982  
    245245}
    246246
     247#ifdef VBOX_WITH_WDDM
     248static 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
    247272/* ******************************************************
    248273   IWineD3DCubeTexture IWineD3DBaseTexture parts follow
     
    418443    IWineD3DCubeTextureImpl_UnLoad,
    419444    IWineD3DCubeTextureImpl_GetType,
     445#ifdef VBOX_WITH_WDDM
     446    IWineD3DCubeTextureImpl_SetDontDeleteGl,
     447#endif
    420448    /* IWineD3DBaseTexture */
    421449    IWineD3DCubeTextureImpl_SetLOD,
     
    606634            for (j = 0; j < 6; ++j)
    607635            {
    608                 Assert((*shared_handle) == ((IWineD3DSurfaceImpl*)texture->surfaces[j][i])->texture_name);
     636                Assert((*shared_handle) == (HANDLE)((IWineD3DSurfaceImpl*)texture->surfaces[j][i])->texture_name);
    609637            }
    610638        }
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/device.c

    r38903 r38982  
    40804080    if (stage >= sizeof(This->stateBlock->textures) / sizeof(*This->stateBlock->textures))
    40814081    {
     4082#ifdef DEBUG_misha
     4083        ERR("Ignoring invalid stage %u.\n", stage);
     4084#else
    40824085        WARN("Ignoring invalid stage %u.\n", stage);
     4086#endif
    40834087        return WINED3D_OK;
    40844088    }
     
    62806284        Assert(!VBOXSHRC_IS_SHARED(surface));
    62816285# endif
    6282         if (!VBOXSHRC_IS_SHARED_OPENED(surface))
     6286        if (VBOXSHRC_CAN_DELETE(device, surface))
    62836287#endif
    62846288        {
     
    69967000        }
    69977001
    6998         This->swapchains = (IWineD3DSwapChain *)pvNewBuf;
     7002        This->swapchains = pvNewBuf;
    69997003    }
    70007004    else
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/glsl_shader.c

    r37550 r38982  
    241241    };
    242242
     243#ifndef VBOXWINEDBG_SHADERS
    243244    if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return;
     245#endif
    244246
    245247    GL_EXTCALL(glGetObjectParameterivARB(obj,
     
    270272        if (is_spam)
    271273        {
    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));
    274276        }
    275277        else
    276278        {
    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));
    279281        }
    280282        HeapFree(GetProcessHeap(), 0, infoLog);
     
    319321        }
    320322
    321         FIXME("Object %u:\n", objects[i]);
     323        WDLOG(("Object %u:\n", objects[i]));
    322324        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)));
    324326        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"));
    327329
    328330        ptr = source;
    329331        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"));
    332334    }
    333335
     
    337339
    338340/* 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 
     341static 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
    343346    if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return;
     347#endif
    344348
    345349    GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_TYPE_ARB, &tmp));
    346350    if (tmp == GL_PROGRAM_OBJECT_ARB)
    347351    {
     352        if (!fIsProgram)
     353        {
     354            ERR("this is a program, but shader expected");
     355        }
    348356        GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &tmp));
    349357        if (!tmp)
    350358        {
    351             FIXME("Program %u link status invalid.\n", program);
     359            ERR("Program %u link status invalid.\n", program);
    352360            shader_glsl_dump_program_source(gl_info, program);
    353361        }
     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);
    354380    }
    355381
     
    10031029                 * Writing gl_ClipVertex requires one uniform for each clipplane as well.
    10041030                 */
     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
    10051035                max_constantsF = gl_info->limits.glsl_vs_float_constants - 3;
     1036#endif
    10061037                if(ctx_priv->cur_vs_args->clip_enabled)
    10071038                {
     
    40314062    GL_EXTCALL(glCompileShaderARB(ret));
    40324063    checkGLcall("glCompileShaderARB(ret)");
    4033 
     4064    shader_glsl_validate_compile_link(gl_info, ret, FALSE);
    40344065    return ret;
    40354066}
     
    41534184    GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL));
    41544185    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);
    41564187
    41574188    /* Store the shader object */
     
    42294260    GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL));
    42304261    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);
    42324263
    42334264    return shader_obj;
     
    45094540    TRACE("Linking GLSL shader program %u\n", programId);
    45104541    GL_EXTCALL(glLinkProgramARB(programId));
    4511     shader_glsl_validate_link(gl_info, programId);
     4542    shader_glsl_validate_compile_link(gl_info, programId, TRUE);
    45124543
    45134544    entry->vuniformF_locations = HeapAlloc(GetProcessHeap(), 0,
     
    46554686    GL_EXTCALL(glShaderSourceARB(vshader_id, 1, blt_vshader, NULL));
    46564687    GL_EXTCALL(glCompileShaderARB(vshader_id));
     4688    shader_glsl_validate_compile_link(gl_info, vshader_id, FALSE);
    46574689
    46584690    pshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));
    46594691    GL_EXTCALL(glShaderSourceARB(pshader_id, 1, &blt_pshaders[tex_type], NULL));
    46604692    GL_EXTCALL(glCompileShaderARB(pshader_id));
     4693
     4694    shader_glsl_validate_compile_link(gl_info, vshader_id, FALSE);
    46614695
    46624696    program_id = GL_EXTCALL(glCreateProgramObjectARB());
     
    46644698    GL_EXTCALL(glAttachObjectARB(program_id, pshader_id));
    46654699    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);
    46684701
    46694702    /* Once linked we can mark the shaders for deletion. They will be deleted once the program
     
    52095242    shader_glsl_color_fixup_supported,
    52105243};
     5244
     5245#ifdef VBOXWINEDBG_SHADERS
     5246void 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  
    3030
    3131#include "config.h"
     32#include "wined3d_private.h"
     33
    3234#include "winerror.h"
    3335#include "wine/debug.h"
    34 
    3536#include <string.h>
    3637
    37 #include "wined3d_private.h"
    3838
    3939WINE_DEFAULT_DEBUG_CHANNEL(d3d);
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/resource.c

    r33656 r38982  
    6161
    6262#ifdef VBOX_WITH_WDDM
     63    resource->sharerc_handle = 0;
     64    resource->sharerc_flags = 0;
     65    resource->sharerc_locks = 0;
    6366    if (pool == WINED3DPOOL_SYSTEMMEM && pvClientMem)
    6467    {
     
    7275        if (pool == WINED3DPOOL_DEFAULT && shared_handle)
    7376        {
    74             resource->sharerc_handle = *shared_handle;
     77            resource->sharerc_handle = (DWORD)*shared_handle;
    7578            resource->sharerc_flags = VBOXSHRC_F_SHARED;
    7679            if (*shared_handle)
     
    283286    return WINED3D_OK;
    284287}
     288
     289#ifdef VBOX_WITH_WDDM
     290HRESULT 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  
    100100    if (This->texture_name
    101101#ifdef VBOX_WITH_WDDM
    102             && !VBOXSHRC_IS_SHARED_OPENED(This)
     102            && VBOXSHRC_CAN_DELETE(device, This)
    103103#endif
    104104            )
     
    580580    if (!*name && new_name)
    581581    {
     582        BOOL fPersistent = FALSE;
    582583        /* FIXME: We shouldn't need to remove SFLAG_INTEXTURE if the
    583584         * surface has no texture name yet. See if we can get rid of this. */
    584585        if (This->Flags & flag)
    585586            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);
    587594    }
    588595
     
    590597    if (VBOXSHRC_IS_SHARED(This))
    591598    {
     599        Assert(VBOXSHRC_GET_SHAREHANDLE(This) == NULL
     600                || (GLuint)VBOXSHRC_GET_SHAREHANDLE(This) == new_name
     601                || new_name == 0 /* on cleanup */);
    592602        VBOXSHRC_SET_SHAREHANDLE(This, new_name);
    593603    }
     
    12911301            GLclampf tmp;
    12921302            tmp = 0.9f;
     1303#ifndef VBOX_WITH_WDDM
    12931304            ENTER_GL();
    12941305            glPrioritizeTextures(1, &This->texture_name, &tmp);
    12951306            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
    12961311        }
    12971312
     
    14071422        ENTER_GL();
    14081423#ifdef VBOX_WITH_WDDM
    1409         if (!VBOXSHRC_IS_SHARED_OPENED(This))
     1424        if (VBOXSHRC_CAN_DELETE(device, This))
    14101425#endif
     1426        {
    14111427            glDeleteTextures(1, &This->texture_name);
     1428            glDeleteTextures(1, &This->texture_name_srgb);
     1429        }
    14121430        This->texture_name = 0;
    1413 #ifdef VBOX_WITH_WDDM
    1414         if (!VBOXSHRC_IS_SHARED_OPENED(This))
    1415 #endif
    1416             glDeleteTextures(1, &This->texture_name_srgb);
    14171431        This->texture_name_srgb = 0;
    14181432        LEAVE_GL();
     
    17671781}
    17681782
     1783#ifdef VBOX_WITH_WDDM
     1784void 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
    17691800static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
    17701801{
     
    28072838                if (VBOXSHRC_IS_SHARED_OPENED(This))
    28082839                {
    2809                     *name = VBOXSHRC_GET_SHAREHANDLE(This);
     2840                    *name = (GLuint)VBOXSHRC_GET_SHAREHANDLE(This);
    28102841                }
    28112842                else
     
    47914822        }
    47924823    }
     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    }
    47934834#endif
    47944835
     
    51205161//        }
    51215162    }
     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    }
    51225169    else
    51235170#endif
     
    52165263    IWineD3DSurfaceImpl_UnLoad,
    52175264    IWineD3DBaseSurfaceImpl_GetType,
     5265#ifdef VBOX_WITH_WDDM
     5266    IWineD3DResourceImpl_SetDontDeleteGl,
     5267#endif
    52185268    /* IWineD3DSurface */
    52195269    IWineD3DBaseSurfaceImpl_GetContainer,
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/surface_gdi.c

    r38565 r38982  
    666666    IWineGDISurfaceImpl_UnLoad,
    667667    IWineD3DBaseSurfaceImpl_GetType,
     668#ifdef VBOX_WITH_WDDM
     669    IWineD3DResourceImpl_SetDontDeleteGl,
     670#endif
    668671    /* IWineD3DSurface */
    669672    IWineD3DBaseSurfaceImpl_GetContainer,
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/texture.c

    r37870 r38982  
    231231}
    232232
     233#ifdef VBOX_WITH_WDDM
     234static 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
    233258/* ******************************************************
    234259   IWineD3DTexture IWineD3DBaseTexture parts follow
     
    289314            surface_set_texture_name(This->surfaces[i], gl_tex->name, This->baseTexture.is_srgb);
    290315        }
     316
    291317        /* Conditinal non power of two textures use a different clamping default. If we're using the GL_WINE_normalized_texrect
    292318         * partial driver emulation, we're dealing with a GL_TEXTURE_2D texture which has the address mode set to repeat - something
     
    295321         */
    296322        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            }
    307338            gl_tex->states[WINED3DTEXSTA_ADDRESSU]      = WINED3DTADDRESS_CLAMP;
    308339            gl_tex->states[WINED3DTEXSTA_ADDRESSV]      = WINED3DTADDRESS_CLAMP;
     
    419450    IWineD3DTextureImpl_UnLoad,
    420451    IWineD3DTextureImpl_GetType,
     452#ifdef VBOX_WITH_WDDM
     453    IWineD3DTextureImpl_SetDontDeleteGl,
     454#endif
    421455    /* IWineD3DBaseTexture */
    422456    IWineD3DTextureImpl_SetLOD,
     
    632666        }
    633667#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            }
    644682        }
    645683#ifdef DEBUG
    646684        for (i = 0; i < texture->baseTexture.levels; ++i)
    647685        {
    648             Assert((*shared_handle) == ((IWineD3DSurfaceImpl*)texture->surfaces[i])->texture_name);
     686            Assert((GLuint)(*shared_handle) == ((IWineD3DSurfaceImpl*)texture->surfaces[i])->texture_name);
    649687        }
    650688#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/vboxsharedrc.h

    r38112 r38982  
    1919#define VBOXSHRC_F_SHARED              0x00000001 /* shared rc */
    2020#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 */
    2122
    2223#define VBOXSHRC_GET_SHAREFLAFS(_o) ((_o)->resource.sharerc_flags)
     
    2425#define VBOXSHRC_SET_SHAREHANDLE(_o, _h) ((_o)->resource.sharerc_handle = (DWORD)(_h))
    2526#define VBOXSHRC_COPY_SHAREDATA(_oDst, _oSrc) do { \
    26         VBOXSHRC_GET_SHAREFLAFS(_oDst) = VBOXSHRC_GET_SHAREFLAFS(_oSrc); \
    27         VBOXSHRC_SET_SHAREHANDLE(_oDst, VBOXSHRC_GET_SHAREFLAFS(_oSrc)); \
     27        VBOXSHRC_GET_SHAREFLAFS(_oDst) = VBOXSHRC_GET_SHAREFLAFS(_oSrc);   \
     28        VBOXSHRC_SET_SHAREHANDLE(_oDst, VBOXSHRC_GET_SHAREHANDLE(_oSrc)); \
    2829    } while (0)
    2930#define VBOXSHRC_SET_SHARED(_o) (VBOXSHRC_GET_SHAREFLAFS(_o) |= VBOXSHRC_F_SHARED)
    3031#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
    3134#define VBOXSHRC_IS_SHARED(_o) (!!(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_SHARED))
    3235#define VBOXSHRC_IS_SHARED_OPENED(_o) (!!(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_SHARED_OPENED))
    3336#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    )
    3441
    3542#define VBOXSHRC_LOCK(_o) do{ \
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/volume.c

    r33656 r38982  
    381381    IWineD3DVolumeImpl_UnLoad,
    382382    IWineD3DVolumeImpl_GetType,
     383#ifdef VBOX_WITH_WDDM
     384    IWineD3DResourceImpl_SetDontDeleteGl,
     385#endif
    383386    /* IWineD3DVolume */
    384387    IWineD3DVolumeImpl_GetContainer,
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/volumetexture.c

    r33656 r38982  
    339339    IWineD3DVolumeTextureImpl_UnLoad,
    340340    IWineD3DVolumeTextureImpl_GetType,
     341#ifdef VBOX_WITH_WDDM
     342    IWineD3DResourceImpl_SetDontDeleteGl,
     343#endif
    341344    /* BaseTexture */
    342345    IWineD3DVolumeTextureImpl_SetLOD,
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/wined3d_private.h

    r38903 r38982  
    18871887        const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN;
    18881888
     1889#ifdef VBOX_WITH_WDDM
     1890HRESULT WINAPI IWineD3DResourceImpl_SetDontDeleteGl(IWineD3DResource *iface) ;
     1891#endif
     1892
    18891893/* Tests show that the start address of resources is 32 byte aligned */
    18901894#define RESOURCE_ALIGNMENT 16
     
    19511955void surface_prepare_texture(IWineD3DSurfaceImpl *surface,
    19521956        const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN;
     1957#ifdef VBOX_WITH_WDDM
     1958void surface_setup_location_onopen(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN;
     1959#endif
    19531960
    19541961typedef struct IWineD3DBaseTextureImpl
Note: See TracChangeset for help on using the changeset viewer.

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