VirtualBox

Changeset 43236 in vbox


Ignore:
Timestamp:
Sep 7, 2012 9:32:42 AM (12 years ago)
Author:
vboxsync
Message:

wddm/3d: bugfixes + cleanup

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h

    r41058 r43236  
    574574            return 8;
    575575        case D3DDDIFMT_INDEX32:
    576 #ifdef DEBUG_misha
    577             Assert(0); /* <- test correctness */
    578 #endif
    579576            return 8;
    580577        default:
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk

    r42501 r43236  
    118118        wddm/VBoxDispKmt.cpp \
    119119        wddm/VBoxDispDbg.cpp \
     120        wddm/VBoxD3DIf.cpp \
    120121        wddm/VBoxDispD3D.rc \
    121122        wddm/VBoxDispD3D.def
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp

    r42971 r43236  
    449449}
    450450
    451 static void vboxResourceInit(PVBOXWDDMDISP_RESOURCE pRc, UINT cAllocs)
     451void vboxWddmResourceInit(PVBOXWDDMDISP_RESOURCE pRc, UINT cAllocs)
    452452{
    453453    memset(pRc, 0, RT_OFFSETOF(VBOXWDDMDISP_RESOURCE, aAllocations[cAllocs]));
     
    466466    if (pRc)
    467467    {
    468         vboxResourceInit(pRc, cAllocs);
     468        vboxWddmResourceInit(pRc, cAllocs);
    469469        return pRc;
    470470    }
    471471    return NULL;
    472 }
    473 
    474 static void vboxWddmLockUnlockMemSynch(PVBOXWDDMDISP_ALLOCATION pAlloc, D3DLOCKED_RECT *pLockInfo, RECT *pRect, bool bToLockInfo)
    475 {
    476     Assert(pAlloc->SurfDesc.pitch);
    477     Assert(pAlloc->pvMem);
    478 
    479     if (!pRect)
    480     {
    481         if (pAlloc->SurfDesc.pitch == pLockInfo->Pitch)
    482         {
    483             Assert(pAlloc->SurfDesc.cbSize);
    484             if (bToLockInfo)
    485                 memcpy(pLockInfo->pBits, pAlloc->pvMem, pAlloc->SurfDesc.cbSize);
    486             else
    487                 memcpy(pAlloc->pvMem, pLockInfo->pBits, pAlloc->SurfDesc.cbSize);
    488         }
    489         else
    490         {
    491             uint8_t *pvSrc, *pvDst;
    492             uint32_t srcPitch, dstPitch;
    493             if (bToLockInfo)
    494             {
    495                 pvSrc = (uint8_t *)pAlloc->pvMem;
    496                 pvDst = (uint8_t *)pLockInfo->pBits;
    497                 srcPitch = pAlloc->SurfDesc.pitch;
    498                 dstPitch = pLockInfo->Pitch;
    499             }
    500             else
    501             {
    502                 pvDst = (uint8_t *)pAlloc->pvMem;
    503                 pvSrc = (uint8_t *)pLockInfo->pBits;
    504                 dstPitch = pAlloc->SurfDesc.pitch;
    505                 srcPitch = (uint32_t)pLockInfo->Pitch;
    506             }
    507 
    508             uint32_t cRows = vboxWddmCalcNumRows(0, pAlloc->SurfDesc.height, pAlloc->SurfDesc.format);
    509             uint32_t pitch = RT_MIN(srcPitch, dstPitch);
    510             Assert(pitch);
    511             for (UINT j = 0; j < cRows; ++j)
    512             {
    513                 memcpy(pvDst, pvSrc, pitch);
    514                 pvSrc += srcPitch;
    515                 pvDst += dstPitch;
    516             }
    517         }
    518     }
    519     else
    520     {
    521         uint8_t *pvSrc, *pvDst;
    522         uint32_t srcPitch, dstPitch;
    523         uint8_t * pvAllocMemStart = (uint8_t *)pAlloc->pvMem;
    524         uint32_t offAllocMemStart = vboxWddmCalcOffXYrd(pRect->left, pRect->top, pAlloc->SurfDesc.pitch, pAlloc->SurfDesc.format);
    525         pvAllocMemStart += offAllocMemStart;
    526 
    527         if (bToLockInfo)
    528         {
    529             pvSrc = (uint8_t *)pvAllocMemStart;
    530             pvDst = (uint8_t *)pLockInfo->pBits;
    531             srcPitch = pAlloc->SurfDesc.pitch;
    532             dstPitch = pLockInfo->Pitch;
    533         }
    534         else
    535         {
    536             pvDst = (uint8_t *)pvAllocMemStart;
    537             pvSrc = (uint8_t *)pLockInfo->pBits;
    538             dstPitch = pAlloc->SurfDesc.pitch;
    539             srcPitch = (uint32_t)pLockInfo->Pitch;
    540         }
    541 
    542         if (pRect->right - pRect->left == pAlloc->SurfDesc.width && srcPitch == dstPitch)
    543         {
    544             uint32_t cbSize = vboxWddmCalcSize(pAlloc->SurfDesc.pitch, pRect->bottom - pRect->top, pAlloc->SurfDesc.format);
    545             memcpy(pvDst, pvSrc, cbSize);
    546         }
    547         else
    548         {
    549             uint32_t pitch = RT_MIN(srcPitch, dstPitch);
    550             uint32_t cbCopyLine = vboxWddmCalcRowSize(pRect->left, pRect->right, pAlloc->SurfDesc.format);
    551             Assert(pitch);
    552             uint32_t cRows = vboxWddmCalcNumRows(pRect->top, pRect->bottom, pAlloc->SurfDesc.format);
    553             for (UINT j = 0; j < cRows; ++j)
    554             {
    555                 memcpy(pvDst, pvSrc, cbCopyLine);
    556                 pvSrc += srcPitch;
    557                 pvDst += dstPitch;
    558             }
    559         }
    560     }
    561 }
    562 
    563 HRESULT vboxWddmLockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc,
    564         D3DLOCKED_RECT * pLockedRect,
    565         CONST RECT *pRect,
    566         DWORD fLockFlags)
    567 {
    568     HRESULT hr = E_FAIL;
    569     Assert(!pRc->aAllocations[iAlloc].LockInfo.cLocks);
    570     Assert(pRc->cAllocations > iAlloc);
    571     switch (pRc->aAllocations[0].enmD3DIfType)
    572     {
    573         case VBOXDISP_D3DIFTYPE_SURFACE:
    574         {
    575             IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;
    576             Assert(pD3DIfSurf);
    577             hr = pD3DIfSurf->LockRect(pLockedRect, pRect, fLockFlags);
    578             Assert(hr == S_OK);
    579             break;
    580         }
    581         case VBOXDISP_D3DIFTYPE_TEXTURE:
    582         {
    583             IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
    584             Assert(pD3DIfTex);
    585             hr = pD3DIfTex->LockRect(iAlloc, pLockedRect, pRect, fLockFlags);
    586             Assert(hr == S_OK);
    587             break;
    588         }
    589         case VBOXDISP_D3DIFTYPE_CUBE_TEXTURE:
    590         {
    591             IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pRc->aAllocations[0].pD3DIf;
    592             Assert(pD3DIfCubeTex);
    593             hr = pD3DIfCubeTex->LockRect(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, iAlloc),
    594                     VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, iAlloc), pLockedRect, pRect, fLockFlags);
    595             Assert(hr == S_OK);
    596             break;
    597         }
    598         case VBOXDISP_D3DIFTYPE_VERTEXBUFFER:
    599         {
    600             IDirect3DVertexBuffer9 *pD3D9VBuf = (IDirect3DVertexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf;
    601             Assert(pD3D9VBuf);
    602             hr = pD3D9VBuf->Lock(pRect ? pRect->left : 0/* offset */,
    603                     pRect ? pRect->right : 0 /* size 2 lock - 0 means all */,
    604                     &pLockedRect->pBits, fLockFlags);
    605             Assert(hr == S_OK);
    606             pLockedRect->Pitch = pRc->aAllocations[iAlloc].SurfDesc.pitch;
    607             break;
    608         }
    609         case VBOXDISP_D3DIFTYPE_INDEXBUFFER:
    610         {
    611             IDirect3DIndexBuffer9 *pD3D9IBuf = (IDirect3DIndexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf;
    612             Assert(pD3D9IBuf);
    613             hr = pD3D9IBuf->Lock(pRect ? pRect->left : 0/* offset */,
    614                     pRect ? pRect->right : 0 /* size 2 lock - 0 means all */,
    615                     &pLockedRect->pBits, fLockFlags);
    616             Assert(hr == S_OK);
    617             pLockedRect->Pitch = pRc->aAllocations[iAlloc].SurfDesc.pitch;
    618             break;
    619         }
    620         default:
    621             Assert(0);
    622             break;
    623     }
    624     return hr;
    625 }
    626 
    627 HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc)
    628 {
    629     HRESULT hr = S_OK;
    630     Assert(pRc->cAllocations > iAlloc);
    631     switch (pRc->aAllocations[0].enmD3DIfType)
    632     {
    633         case VBOXDISP_D3DIFTYPE_SURFACE:
    634         {
    635             IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;
    636             Assert(pD3DIfSurf);
    637             hr = pD3DIfSurf->UnlockRect();
    638             Assert(hr == S_OK);
    639             break;
    640         }
    641         case VBOXDISP_D3DIFTYPE_TEXTURE:
    642         {
    643             IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
    644             Assert(pD3DIfTex);
    645             hr = pD3DIfTex->UnlockRect(iAlloc);
    646             Assert(hr == S_OK);
    647             break;
    648         }
    649         case VBOXDISP_D3DIFTYPE_CUBE_TEXTURE:
    650         {
    651             IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pRc->aAllocations[0].pD3DIf;
    652             Assert(pD3DIfCubeTex);
    653             hr = pD3DIfCubeTex->UnlockRect(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, iAlloc),
    654                     VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, iAlloc));
    655             Assert(hr == S_OK);
    656             break;
    657         }
    658         case VBOXDISP_D3DIFTYPE_VERTEXBUFFER:
    659         {
    660             IDirect3DVertexBuffer9 *pD3D9VBuf = (IDirect3DVertexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf;
    661             Assert(pD3D9VBuf);
    662             hr = pD3D9VBuf->Unlock();
    663             Assert(hr == S_OK);
    664             break;
    665         }
    666         case VBOXDISP_D3DIFTYPE_INDEXBUFFER:
    667         {
    668             IDirect3DIndexBuffer9 *pD3D9IBuf = (IDirect3DIndexBuffer9*)pRc->aAllocations[iAlloc].pD3DIf;
    669             Assert(pD3D9IBuf);
    670             hr = pD3D9IBuf->Unlock();
    671             Assert(hr == S_OK);
    672             break;
    673         }
    674         default:
    675             Assert(0);
    676             hr = E_FAIL;
    677             break;
    678     }
    679     return hr;
    680 }
    681 
    682 static HRESULT vboxWddmSurfSynchMem(PVBOXWDDMDISP_RESOURCE pRc)
    683 {
    684     if (pRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM)
    685     {
    686         return S_OK;
    687     }
    688 
    689     for (UINT i = 0; i < pRc->cAllocations; ++i)
    690     {
    691         D3DLOCKED_RECT Rect;
    692         HRESULT hr = vboxWddmLockRect(pRc, i, &Rect, NULL, D3DLOCK_DISCARD);
    693         if (FAILED(hr))
    694         {
    695             WARN(("vboxWddmLockRect failed, hr(0x%x)", hr));
    696             return hr;
    697         }
    698 
    699         PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i];
    700         Assert(pAlloc->pvMem);
    701 
    702         vboxWddmLockUnlockMemSynch(pAlloc, &Rect, NULL, true /*bool bToLockInfo*/);
    703 
    704         hr = vboxWddmUnlockRect(pRc, i);
    705         Assert(SUCCEEDED(hr));
    706     }
    707     return S_OK;
    708472}
    709473
     
    764528    {
    765529        D3DLOCKED_RECT Rect;
    766         HRESULT hr = vboxWddmLockRect(pRc, i, &Rect, NULL, D3DLOCK_READONLY);
     530        HRESULT hr = VBoxD3DIfLockRect(pRc, i, &Rect, NULL, D3DLOCK_READONLY);
    767531        if (FAILED(hr))
    768532        {
    769             WARN(("vboxWddmLockRect failed, hr(0x%x)", hr));
     533            WARN(("VBoxD3DIfLockRect failed, hr(0x%x)", hr));
    770534            return;
    771535        }
     
    776540        vboxWddmDbgSynchMemCheck(pAlloc, &Rect);
    777541
    778         hr = vboxWddmUnlockRect(pRc, i);
     542        hr = VBoxD3DIfUnlockRect(pRc, i);
    779543        Assert(SUCCEEDED(hr));
    780544    }
     
    782546#endif
    783547
    784 
    785 static D3DFORMAT vboxDDI2D3DFormat(D3DDDIFORMAT format)
    786 {
    787     /* @todo: check they are all equal */
    788     return (D3DFORMAT)format;
    789 }
    790 
    791 D3DMULTISAMPLE_TYPE vboxDDI2D3DMultiSampleType(D3DDDIMULTISAMPLE_TYPE enmType)
    792 {
    793     /* @todo: check they are all equal */
    794     return (D3DMULTISAMPLE_TYPE)enmType;
    795 }
    796 
    797 D3DPOOL vboxDDI2D3DPool(D3DDDI_POOL enmPool)
    798 {
    799     /* @todo: check they are all equal */
    800     switch (enmPool)
    801     {
    802     case D3DDDIPOOL_SYSTEMMEM:
    803         return D3DPOOL_SYSTEMMEM;
    804     case D3DDDIPOOL_VIDEOMEMORY:
    805     case D3DDDIPOOL_LOCALVIDMEM:
    806     case D3DDDIPOOL_NONLOCALVIDMEM:
    807         /* @todo: what would be proper here? */
    808         return D3DPOOL_DEFAULT;
    809     default:
    810         Assert(0);
    811     }
    812     return D3DPOOL_DEFAULT;
    813 }
    814 
    815 D3DRENDERSTATETYPE vboxDDI2D3DRenderStateType(D3DDDIRENDERSTATETYPE enmType)
    816 {
    817     /* @todo: @fixme: not entirely correct, need to check */
    818     return (D3DRENDERSTATETYPE)enmType;
    819 }
    820 
    821 VBOXWDDMDISP_TSS_LOOKUP vboxDDI2D3DTestureStageStateType(D3DDDITEXTURESTAGESTATETYPE enmType)
    822 {
    823     static const VBOXWDDMDISP_TSS_LOOKUP lookup[] =
    824     {
    825         {FALSE, D3DTSS_FORCE_DWORD},             /*  0, D3DDDITSS_TEXTUREMAP */
    826         {FALSE, D3DTSS_COLOROP},                 /*  1, D3DDDITSS_COLOROP */
    827         {FALSE, D3DTSS_COLORARG1},               /*  2, D3DDDITSS_COLORARG1 */
    828         {FALSE, D3DTSS_COLORARG2},               /*  3, D3DDDITSS_COLORARG2 */
    829         {FALSE, D3DTSS_ALPHAOP},                 /*  4, D3DDDITSS_ALPHAOP */
    830         {FALSE, D3DTSS_ALPHAARG1},               /*  5, D3DDDITSS_ALPHAARG1 */
    831         {FALSE, D3DTSS_ALPHAARG2},               /*  6, D3DDDITSS_ALPHAARG2 */
    832         {FALSE, D3DTSS_BUMPENVMAT00},            /*  7, D3DDDITSS_BUMPENVMAT00 */
    833         {FALSE, D3DTSS_BUMPENVMAT01},            /*  8, D3DDDITSS_BUMPENVMAT01 */
    834         {FALSE, D3DTSS_BUMPENVMAT10},            /*  9, D3DDDITSS_BUMPENVMAT10 */
    835         {FALSE, D3DTSS_BUMPENVMAT11},            /* 10, D3DDDITSS_BUMPENVMAT11 */
    836         {FALSE, D3DTSS_TEXCOORDINDEX},           /* 11, D3DDDITSS_TEXCOORDINDEX */
    837         {FALSE, D3DTSS_FORCE_DWORD},             /* 12, unused */
    838         {TRUE, D3DSAMP_ADDRESSU},                /* 13, D3DDDITSS_ADDRESSU */
    839         {TRUE, D3DSAMP_ADDRESSV},                /* 14, D3DDDITSS_ADDRESSV */
    840         {TRUE, D3DSAMP_BORDERCOLOR},             /* 15, D3DDDITSS_BORDERCOLOR */
    841         {TRUE, D3DSAMP_MAGFILTER},               /* 16, D3DDDITSS_MAGFILTER */
    842         {TRUE, D3DSAMP_MINFILTER},               /* 17, D3DDDITSS_MINFILTER */
    843         {TRUE, D3DSAMP_MIPFILTER},               /* 18, D3DDDITSS_MIPFILTER */
    844         {TRUE, D3DSAMP_MIPMAPLODBIAS},           /* 19, D3DDDITSS_MIPMAPLODBIAS */
    845         {TRUE, D3DSAMP_MAXMIPLEVEL},             /* 20, D3DDDITSS_MAXMIPLEVEL */
    846         {TRUE, D3DSAMP_MAXANISOTROPY},           /* 21, D3DDDITSS_MAXANISOTROPY */
    847         {FALSE, D3DTSS_BUMPENVLSCALE},           /* 22, D3DDDITSS_BUMPENVLSCALE */
    848         {FALSE, D3DTSS_BUMPENVLOFFSET},          /* 23, D3DDDITSS_BUMPENVLOFFSET */
    849         {FALSE, D3DTSS_TEXTURETRANSFORMFLAGS},   /* 24, D3DDDITSS_TEXTURETRANSFORMFLAGS */
    850         {TRUE, D3DSAMP_ADDRESSW},                /* 25, D3DDDITSS_ADDRESSW */
    851         {FALSE, D3DTSS_COLORARG0},               /* 26, D3DDDITSS_COLORARG0 */
    852         {FALSE, D3DTSS_ALPHAARG0},               /* 27, D3DDDITSS_ALPHAARG0 */
    853         {FALSE, D3DTSS_RESULTARG},               /* 28, D3DDDITSS_RESULTARG */
    854         {TRUE, D3DSAMP_SRGBTEXTURE},             /* 29, D3DDDITSS_SRGBTEXTURE */
    855         {TRUE, D3DSAMP_ELEMENTINDEX},            /* 30, D3DDDITSS_ELEMENTINDEX */
    856         {TRUE, D3DSAMP_DMAPOFFSET},              /* 31, D3DDDITSS_DMAPOFFSET */
    857         {FALSE, D3DTSS_CONSTANT},                /* 32, D3DDDITSS_CONSTANT */
    858         {FALSE, D3DTSS_FORCE_DWORD},             /* 33, D3DDDITSS_DISABLETEXTURECOLORKEY */
    859         {FALSE, D3DTSS_FORCE_DWORD},             /* 34, D3DDDITSS_TEXTURECOLORKEYVAL */
    860     };
    861 
    862     Assert(enmType > 0);
    863     Assert(enmType < RT_ELEMENTS(lookup));
    864     Assert(lookup[enmType].dType != D3DTSS_FORCE_DWORD);
    865 
    866     return lookup[enmType];
    867 }
    868 
    869 DWORD vboxDDI2D3DUsage(D3DDDI_RESOURCEFLAGS fFlags)
    870 {
    871     DWORD fUsage = 0;
    872     if (fFlags.Dynamic)
    873         fUsage |= D3DUSAGE_DYNAMIC;
    874     if (fFlags.AutogenMipmap)
    875         fUsage |= D3DUSAGE_AUTOGENMIPMAP;
    876     if (fFlags.DMap)
    877         fUsage |= D3DUSAGE_DMAP;
    878     if (fFlags.WriteOnly)
    879         fUsage |= D3DUSAGE_WRITEONLY;
    880     if (fFlags.NPatches)
    881         fUsage |= D3DUSAGE_NPATCHES;
    882     if (fFlags.Points)
    883         fUsage |= D3DUSAGE_POINTS;
    884     if (fFlags.RenderTarget)
    885         fUsage |= D3DUSAGE_RENDERTARGET;
    886     if (fFlags.RtPatches)
    887         fUsage |= D3DUSAGE_RTPATCHES;
    888     if (fFlags.TextApi)
    889         fUsage |= D3DUSAGE_TEXTAPI;
    890     if (fFlags.WriteOnly)
    891         fUsage |= D3DUSAGE_WRITEONLY;
    892     //below are wddm 1.1-specific
    893 //    if (fFlags.RestrictedContent)
    894 //        fUsage |= D3DUSAGE_RESTRICTED_CONTENT;
    895 //    if (fFlags.RestrictSharedAccess)
    896 //        fUsage |= D3DUSAGE_RESTRICT_SHARED_RESOURCE;
    897     return fUsage;
    898 }
    899 
    900 DWORD vboxDDI2D3DLockFlags(D3DDDI_LOCKFLAGS fLockFlags)
    901 {
    902     DWORD fFlags = 0;
    903     if (fLockFlags.Discard)
    904         fFlags |= D3DLOCK_DISCARD;
    905     if (fLockFlags.NoOverwrite)
    906         fFlags |= D3DLOCK_NOOVERWRITE;
    907     if (fLockFlags.ReadOnly)
    908         fFlags |= D3DLOCK_READONLY;
    909     if (fLockFlags.DoNotWait)
    910         fFlags |= D3DLOCK_DONOTWAIT;
    911     return fFlags;
    912 }
    913 
    914 D3DTEXTUREFILTERTYPE vboxDDI2D3DBltFlags(D3DDDI_BLTFLAGS fFlags)
    915 {
    916     if (fFlags.Point)
    917     {
    918         /* no flags other than [Begin|Continue|End]PresentToDwm are set */
    919         Assert((fFlags.Value & (~(0x00000100 | 0x00000200 | 0x00000400))) == 1);
    920         return D3DTEXF_POINT;
    921     }
    922     if (fFlags.Linear)
    923     {
    924         /* no flags other than [Begin|Continue|End]PresentToDwm are set */
    925         Assert((fFlags.Value & (~(0x00000100 | 0x00000200 | 0x00000400))) == 2);
    926         return D3DTEXF_LINEAR;
    927     }
    928     /* no flags other than [Begin|Continue|End]PresentToDwm are set */
    929     Assert((fFlags.Value & (~(0x00000100 | 0x00000200 | 0x00000400))) == 0);
    930     return D3DTEXF_NONE;
    931 }
    932 
    933 static D3DQUERYTYPE vboxDDI2D3DQueryType(D3DDDIQUERYTYPE enmType)
    934 {
    935     return (D3DQUERYTYPE)enmType;
    936 }
    937 
    938 static DWORD vboxDDI2D3DIssueQueryFlags(D3DDDI_ISSUEQUERYFLAGS Flags)
    939 {
    940     DWORD fFlags = 0;
    941     if (Flags.Begin)
    942         fFlags |= D3DISSUE_BEGIN;
    943     if (Flags.End)
    944         fFlags |= D3DISSUE_END;
    945     return fFlags;
    946 }
    947548
    948549/******/
     
    1056657}
    1057658
    1058 static VOID vboxWddmSwapchainDestroy(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
     659VOID vboxWddmSwapchainDestroy(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
    1059660{
    1060661    vboxWddmSwapchainClear(pDevice, pSwapchain);
     
    1202803}
    1203804
    1204 static PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc, BOOL *pbNeedPresent)
     805PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc, BOOL *pbNeedPresent)
    1205806{
    1206807    PVBOXWDDMDISP_SWAPCHAIN pSwapchain = pBbAlloc->pSwapchain;
     
    1243844                                                            * thus the aRTs[0] is a backbuffer */
    1244845            {
    1245                 PVBOXWDDMDISP_RESOURCE pBbRc = pBbAlloc->pRc;
    1246                 PVBOXWDDMDISP_RESOURCE pRtRc = pRt->pAlloc->pRc;
    1247846                if (pBbAlloc->SurfDesc.width == pRt->pAlloc->SurfDesc.width
    1248847                            && pBbAlloc->SurfDesc.height == pRt->pAlloc->SurfDesc.height
    1249                             && pBbAlloc->SurfDesc.format == pRt->pAlloc->SurfDesc.format
     848                            && vboxWddmFmtNoAlphaFormat(pBbAlloc->SurfDesc.format) == vboxWddmFmtNoAlphaFormat(pRt->pAlloc->SurfDesc.format)
    1250849                            && pBbAlloc->SurfDesc.VidPnSourceId == pRt->pAlloc->SurfDesc.VidPnSourceId
    1251850                            )
     
    1329928            if (pAlloc->pD3DIf)
    1330929            {
    1331                 /* since this can be texture, need to do the vboxWddmSurfGet magic */
    1332                 hr = vboxWddmSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9OldSurf);
     930                /* since this can be texture, need to do the VBoxD3DIfSurfGet magic */
     931                hr = VBoxD3DIfSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9OldSurf);
    1333932                if (FAILED(hr))
    1334933                {
    1335                     WARN(("vboxWddmSurfGet failed, hr (0x%x)",hr));
     934                    WARN(("VBoxD3DIfSurfGet failed, hr (0x%x)",hr));
    1336935                    pD3D9Surf->Release();
    1337936                    return hr;
     
    14571056}
    14581057
    1459 static VOID vboxWddmFillPresentParams(D3DPRESENT_PARAMETERS *pParams, PVBOXWDDMDISP_RESOURCE pRc, UINT cRTs)
    1460 {
    1461     Assert(cRTs);
    1462     memset(pParams, 0, sizeof (D3DPRESENT_PARAMETERS));
    1463     pParams->BackBufferWidth = pRc->aAllocations[0].SurfDesc.width;
    1464     pParams->BackBufferHeight = pRc->aAllocations[0].SurfDesc.height;
    1465     pParams->BackBufferFormat = vboxDDI2D3DFormat(pRc->aAllocations[0].SurfDesc.format);
    1466     pParams->BackBufferCount = cRTs - 1;
    1467     pParams->MultiSampleType = vboxDDI2D3DMultiSampleType(pRc->RcDesc.enmMultisampleType);
    1468     pParams->MultiSampleQuality = pRc->RcDesc.MultisampleQuality;
    1469 #if 0 //def VBOXDISP_WITH_WINE_BB_WORKAROUND /* this does not work so far any way :( */
    1470     if (cRTs == 1)
    1471         pParams->SwapEffect = D3DSWAPEFFECT_COPY;
    1472     else
    1473 #endif
    1474     if (pRc->RcDesc.fFlags.DiscardRenderTarget)
    1475         pParams->SwapEffect = D3DSWAPEFFECT_DISCARD;
    1476     pParams->Windowed = TRUE;
    1477 }
    1478 
    14791058static VOID vboxWddmSwapchainFillPresentParams(PVBOXWDDMDISP_SWAPCHAIN pSwapchain, D3DPRESENT_PARAMETERS *pParams)
    14801059{
     
    14861065    PVBOXWDDMDISP_RENDERTGT pRt = vboxWddmSwapchainGetBb(pSwapchain);
    14871066    PVBOXWDDMDISP_RESOURCE pRc = pRt->pAlloc->pRc;
    1488     vboxWddmFillPresentParams(pParams, pRc, pSwapchain->cRTs);
     1067    VBoxD3DIfFillPresentParams(pParams, pRc, pSwapchain->cRTs);
    14891068}
    14901069
     
    15251104        {
    15261105            VOID *pvSwapchain = NULL;
    1527             /* since this can be texture, need to do the vboxWddmSurfGet magic */
    1528             hr = vboxWddmSurfGet(pRT->pAlloc->pRc, pRT->pAlloc->iAlloc, &pD3D9OldSurf);
     1106            /* since this can be texture, need to do the VBoxD3DIfSurfGet magic */
     1107            hr = VBoxD3DIfSurfGet(pRT->pAlloc->pRc, pRT->pAlloc->iAlloc, &pD3D9OldSurf);
    15291108            Assert(hr == S_OK);
    15301109            hr = pD3D9OldSurf->GetContainer(IID_IDirect3DSwapChain9, &pvSwapchain);
     
    16431222}
    16441223
    1645 static HRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
     1224HRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain)
    16461225{
    16471226    if (!pSwapchain->fFlags.bChanged && pSwapchain->pSwapChainIf)
     
    16641243        for (UINT i = 0; i < pSwapchain->cRTs; ++i)
    16651244        {
    1666             if (pSwapchain->aRTs[i].pAlloc->enmD3DIfType != VBOXDISP_D3DIFTYPE_SURFACE)
     1245            if (pSwapchain->aRTs[i].pAlloc->enmD3DIfType != VBOXDISP_D3DIFTYPE_SURFACE
     1246                    && (pSwapchain->aRTs[i].pAlloc->enmD3DIfType != VBOXDISP_D3DIFTYPE_UNDEFINED
     1247                            || pSwapchain->aRTs[i].pAlloc->enmType != VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
     1248                            ))
    16671249            {
    16681250                fNeedRtPresentSwitch = TRUE;
     
    19451527
    19461528    /* if this is not a front-buffer - just return the surface associated with the allocation */
    1947     return vboxWddmSurfGet(pAlloc->pRc, pAlloc->iAlloc, ppSurf);
     1529    return VBoxD3DIfSurfGet(pAlloc->pRc, pAlloc->iAlloc, ppSurf);
    19481530}
    19491531
     
    21321714#endif
    21331715
    2134 static HRESULT vboxWddmD3DDeviceCreateDummy(PVBOXWDDMDISP_DEVICE pDevice)
    2135 {
    2136     VBOXWDDMDISP_RESOURCE Rc;
    2137     vboxResourceInit(&Rc, 1);
    2138 
    2139     Rc.RcDesc.enmFormat = D3DDDIFMT_A8R8G8B8;
    2140     Rc.RcDesc.enmPool = D3DDDIPOOL_LOCALVIDMEM;
    2141     Rc.RcDesc.enmMultisampleType = D3DDDIMULTISAMPLE_NONE;
    2142     Rc.RcDesc.MultisampleQuality = 0;
    2143     PVBOXWDDMDISP_ALLOCATION pAlloc = &Rc.aAllocations[0];
    2144     pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    2145     pAlloc->SurfDesc.width = 0x4;
    2146     pAlloc->SurfDesc.height = 0x4;
    2147     pAlloc->SurfDesc.format = D3DDDIFMT_A8R8G8B8;
    2148     Assert(!pDevice->pDevice9If);
    2149     VBOXWINEEX_D3DPRESENT_PARAMETERS Params;
    2150     vboxWddmFillPresentParams(&Params.Base, &Rc, 2);
    2151     Params.pHgsmi = &pDevice->Uhgsmi.BasePrivate.Base;
    2152     DWORD fFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    2153     PVBOXWDDMDISP_ADAPTER pAdapter = pDevice->pAdapter;
    2154     IDirect3DDevice9 * pDevice9If = NULL;
    2155 
    2156     HRESULT hr = pAdapter->D3D.pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, fFlags, &Params.Base, &pDevice9If);
    2157     if (!SUCCEEDED(hr))
    2158     {
    2159         WARN(("CreateDevice failed hr 0x%x", hr));
    2160         return hr;
    2161     }
    2162 
    2163     pDevice->pDevice9If = pDevice9If;
    2164     return S_OK;
    2165 }
    2166 
    2167 DECLINLINE(IDirect3DDevice9*) vboxWddmD3DDeviceGet(PVBOXWDDMDISP_DEVICE pDevice)
    2168 {
    2169     if (pDevice->pDevice9If)
    2170         return pDevice->pDevice9If;
    2171 
    2172 #ifdef VBOXWDDMDISP_DEBUG
    2173     g_VBoxVDbgInternalDevice = pDevice;
    2174 #endif
    2175 
    2176     HRESULT hr = vboxWddmD3DDeviceCreateDummy(pDevice);
    2177     Assert(hr == S_OK);
    2178     Assert(pDevice->pDevice9If);
    2179     return pDevice->pDevice9If;
    2180 }
    2181 
    21821716/******/
    21831717
     
    21991733    else
    22001734    {
    2201         hr = vboxWddmSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9Surf);
     1735        hr = VBoxD3DIfSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9Surf);
    22021736        if (FAILED(hr))
    22031737        {
    2204             WARN(("vboxWddmSurfGet failed, hr(0x%x)",hr));
     1738            WARN(("VBoxD3DIfSurfGet failed, hr(0x%x)",hr));
    22051739            return hr;
    22061740        }
     
    30212555                r.right = pLock->Range.Offset + pLock->Range.Size;
    30222556
    3023                 vboxWddmLockUnlockMemSynch(pDevice->aStreamSource[stream], &pLock->LockedRect, &r, true /*bool bToLockInfo*/);
     2557                VBoxD3DIfLockUnlockMemSynch(pDevice->aStreamSource[stream], &pLock->LockedRect, &r, true /*bool bToLockInfo*/);
    30242558
    30252559                pD3D9VBuf->Unlock();
     
    31722706        IDirect3DSurface9 *pSrcSurfIf = NULL;
    31732707        IDirect3DSurface9 *pDstSurfIf = NULL;
    3174         hr = vboxWddmSurfGet(pDstRc, 0, &pDstSurfIf);
     2708        hr = VBoxD3DIfSurfGet(pDstRc, 0, &pDstSurfIf);
    31752709        Assert(hr == S_OK);
    31762710        if (hr == S_OK)
    31772711        {
    3178             hr = vboxWddmSurfGet(pSrcRc, 0, &pSrcSurfIf);
     2712            hr = VBoxD3DIfSurfGet(pSrcRc, 0, &pSrcSurfIf);
    31792713            Assert(hr == S_OK);
    31802714            if (hr == S_OK)
     
    37023236                        else
    37033237                            pr = NULL;
    3704                         vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, false /*bool bToLockInfo*/);
     3238                        VBoxD3DIfLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, false /*bool bToLockInfo*/);
    37053239                    }
    37063240                }
     
    37963330                        else
    37973331                            pr = NULL;
    3798                         vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, false /*bool bToLockInfo*/);
     3332                        VBoxD3DIfLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, false /*bool bToLockInfo*/);
    37993333                    }
    38003334                }
     
    39833517                    else
    39843518                        pr = NULL;
    3985                     vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect,
     3519                    VBoxD3DIfLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect,
    39863520                            pr,
    39873521                            true /*bool bToLockInfo*/);
     
    40243558                    else
    40253559                        pr = NULL;
    4026                     vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect,
     3560                    VBoxD3DIfLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect,
    40273561                            pr,
    40283562                            true /*bool bToLockInfo*/);
     
    40773611                        LRect.Pitch = ((pAlloc->SurfDesc.bpp * pAlloc->SurfDesc.width) + 7) >> 3;
    40783612                        Assert(pAlloc->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_VALID);
    4079                         vboxWddmLockUnlockMemSynch(pAlloc, &LRect, &pAlloc->DirtyRegion.Rect, TRUE /* bool bToLockInfo*/);
     3613                        VBoxD3DIfLockUnlockMemSynch(pAlloc, &LRect, &pAlloc->DirtyRegion.Rect, TRUE /* bool bToLockInfo*/);
    40803614                        vboxWddmDirtyRegionClear(&pAlloc->DirtyRegion);
    40813615                        fDoUnlock = TRUE;
     
    42133747    }
    42143748    bool bIssueCreateResource = false;
    4215     bool bCreateSwapchain = false;
    42163749    bool bCreateKMResource = false;
    42173750
     
    42643797    if (VBOXDISPMODE_IS_3D(pAdapter))
    42653798    {
    4266         if (pResource->Flags.SharedResource)
     3799        if (pRc->RcDesc.fFlags.SharedResource)
    42673800        {
    42683801            bIssueCreateResource = true;
     
    42703803        }
    42713804
    4272         if (pResource->Flags.ZBuffer)
    4273         {
    4274             IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    4275             for (UINT i = 0; i < pResource->SurfCount; ++i)
    4276             {
    4277                 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    4278                 IDirect3DSurface9 *pD3D9Surf;
    4279                 hr = pDevice9If->CreateDepthStencilSurface(pAllocation->SurfDesc.width,
    4280                         pAllocation->SurfDesc.height,
    4281                         vboxDDI2D3DFormat(pResource->Format),
    4282                         vboxDDI2D3DMultiSampleType(pResource->MultisampleType),
    4283                         pResource->MultisampleQuality,
    4284                         TRUE /* @todo: BOOL Discard */,
    4285                         &pD3D9Surf,
    4286                         NULL /*HANDLE* pSharedHandle*/);
    4287                 Assert(hr == S_OK);
    4288                 if (hr == S_OK)
    4289                 {
    4290                     Assert(pD3D9Surf);
    4291                     pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    4292                     pAllocation->pD3DIf = pD3D9Surf;
    4293                 }
    4294                 else
    4295                 {
    4296                     for (UINT j = 0; j < i; ++j)
    4297                     {
    4298                         pRc->aAllocations[j].pD3DIf->Release();
    4299                     }
    4300                     break;
    4301                 }
    4302             }
    4303 
    4304             if (SUCCEEDED(hr))
    4305             {
    4306                 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    4307                 {
    4308                     vboxWddmSurfSynchMem(pRc);
    4309                 }
    4310             }
    4311         }
    4312         else if (pResource->Flags.VertexBuffer)
    4313         {
    4314             IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    4315 
    4316             for (UINT i = 0; i < pResource->SurfCount; ++i)
    4317             {
    4318                 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    4319                 IDirect3DVertexBuffer9  *pD3D9VBuf;
    4320                 hr = pDevice9If->CreateVertexBuffer(pAllocation->SurfDesc.width,
    4321                         vboxDDI2D3DUsage(pResource->Flags),
    4322                         pResource->Fvf,
    4323                         vboxDDI2D3DPool(pResource->Pool),
    4324                         &pD3D9VBuf,
    4325                         NULL /*HANDLE* pSharedHandle*/);
    4326                 Assert(hr == S_OK);
    4327                 if (hr == S_OK)
    4328                 {
    4329                     Assert(pD3D9VBuf);
    4330                     pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_VERTEXBUFFER;
    4331                     pAllocation->pD3DIf = pD3D9VBuf;
    4332                 }
    4333                 else
    4334                 {
    4335                     for (UINT j = 0; j < i; ++j)
    4336                     {
    4337                         pRc->aAllocations[j].pD3DIf->Release();
    4338                     }
    4339                     break;
    4340                 }
    4341             }
    4342 
    4343             if (SUCCEEDED(hr))
    4344             {
    4345                 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    4346                 {
    4347                     vboxWddmSurfSynchMem(pRc);
    4348                 }
    4349             }
    4350         }
    4351         else if (pResource->Flags.IndexBuffer)
    4352         {
    4353             IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    4354 
    4355             for (UINT i = 0; i < pResource->SurfCount; ++i)
    4356             {
    4357                 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    4358                 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
    4359                 IDirect3DIndexBuffer9  *pD3D9IBuf;
    4360                 hr = pDevice9If->CreateIndexBuffer(pSurf->Width,
    4361                         vboxDDI2D3DUsage(pResource->Flags),
    4362                         vboxDDI2D3DFormat(pResource->Format),
    4363                         vboxDDI2D3DPool(pResource->Pool),
    4364                         &pD3D9IBuf,
    4365                         NULL /*HANDLE* pSharedHandle*/
    4366                       );
    4367                 Assert(hr == S_OK);
    4368                 if (hr == S_OK)
    4369                 {
    4370                     Assert(pD3D9IBuf);
    4371                     pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_INDEXBUFFER;
    4372                     pAllocation->pD3DIf = pD3D9IBuf;
    4373                 }
    4374                 else
    4375                 {
    4376                     for (UINT j = 0; j < i; ++j)
    4377                     {
    4378                         pRc->aAllocations[j].pD3DIf->Release();
    4379                     }
    4380                     break;
    4381                 }
    4382             }
    4383 
    4384             if (SUCCEEDED(hr))
    4385             {
    4386                 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    4387                 {
    4388                     vboxWddmSurfSynchMem(pRc);
    4389                 }
    4390             }
    4391         }
    4392         else if (VBOXWDDMDISP_IS_TEXTURE(pResource->Flags))
    4393         {
    4394             IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    4395 
    4396             if (pResource->Flags.RenderTarget && !pResource->Flags.Texture)
    4397             {
    4398                 bIssueCreateResource = true;
    4399             }
    4400 
    4401             if (!pResource->Flags.CubeMap)
    4402             {
    4403 #ifdef DEBUG
    4404                 {
    4405                     uint32_t tstW = pResource->pSurfList[0].Width;
    4406                     uint32_t tstH = pResource->pSurfList[0].Height;
    4407                     for (UINT i = 1; i < pResource->SurfCount; ++i)
    4408                     {
    4409                         tstW /= 2;
    4410                         tstH /= 2;
    4411                         CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
    4412                         Assert((pSurf->Width == tstW) || (!tstW && (pSurf->Width==1)));
    4413                         Assert((pSurf->Height == tstH) || (!tstH && (pSurf->Height==1)));
    4414                     }
    4415                 }
    4416 #endif
    4417                 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[0];
    4418                 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[0];
    4419                 IDirect3DTexture9 *pD3DIfTex;
    4420                 HANDLE hSharedHandle = NULL;
    4421                 void **pavClientMem = NULL;
    4422                 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    4423                 {
    4424                     Assert(pSurf->pSysMem);
    4425                     Assert(pSurf->SysMemPitch);
    4426                     UINT minPitch = vboxWddmCalcPitch(pAllocation->SurfDesc.width, pAllocation->SurfDesc.format);
    4427                     Assert(minPitch);
    4428                     if (minPitch)
    4429                     {
    4430                         if (pSurf->SysMemPitch != minPitch)
    4431                             pAllocation->D3DWidth = vboxWddmCalcWidthForPitch(pSurf->SysMemPitch, pAllocation->SurfDesc.format);
    4432                         Assert(pAllocation->D3DWidth >= pSurf->Width);
    4433                     }
    4434                     else
    4435                     {
    4436                         Assert(pAllocation->D3DWidth == pSurf->Width);
    4437                     }
    4438                 }
    4439                 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    4440                 {
    4441                     pavClientMem = (void**)RTMemAlloc(sizeof (pavClientMem[0]) * pResource->SurfCount);
    4442                     Assert(pavClientMem);
    4443                     if (pavClientMem)
    4444                     {
    4445                         for (UINT i = 0; i < pResource->SurfCount; ++i)
    4446                         {
    4447                             pavClientMem[i] = pRc->aAllocations[i].pvMem;
    4448                         }
    4449                     }
    4450                     else
    4451                         hr = E_FAIL;
    4452                 }
    4453                 if (hr == S_OK)
    4454                 {
    4455                     hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice9If,
    4456                                                 pAllocation->D3DWidth,
    4457                                                 pSurf->Height,
    4458                                                 pResource->SurfCount,
    4459                                                 vboxDDI2D3DUsage(pResource->Flags),
    4460                                                 vboxDDI2D3DFormat(pResource->Format),
    4461                                                 vboxDDI2D3DPool(pResource->Pool),
    4462                                                 &pD3DIfTex,
    4463 #ifdef VBOXWDDMDISP_DEBUG_NOSHARED
    4464                                                 NULL,
    4465 #else
    4466                                                     pResource->Flags.SharedResource ? &hSharedHandle : NULL,
    4467 #endif
    4468                                                     pavClientMem);
    4469                     Assert(hr == S_OK);
    4470                     if (hr == S_OK)
    4471                     {
    4472                         Assert(pD3DIfTex);
    4473                         pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_TEXTURE;
    4474                         pAllocation->pD3DIf = pD3DIfTex;
    4475 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    4476                         Assert(!!(pResource->Flags.SharedResource) == !!(hSharedHandle));
    4477 #endif
    4478                         pAllocation->hSharedHandle = hSharedHandle;
    4479 
    4480                         if (!pavClientMem)
    4481                         {
    4482                             /* zero-init texture memory */
    4483 
    4484                         }
    4485                     }
    4486 
    4487                     if (pavClientMem)
    4488                         RTMemFree(pavClientMem);
    4489                 }
    4490             }
    4491             else /*pResource->Flags.CubeMap*/
    4492             {
    4493                 IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    4494                 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[0];
    4495                 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[0];
    4496                 IDirect3DCubeTexture9 *pD3DIfCubeTex;
    4497                 HANDLE hSharedHandle = NULL;
    4498                 void **pavClientMem = NULL;
    4499 
    4500                 if ( (pAllocation->SurfDesc.width!=pAllocation->SurfDesc.height)
    4501                      || (pResource->SurfCount%6!=0))
    4502                 {
    4503                     Assert(0);
    4504                     hr = E_INVALIDARG;
    4505                 }
    4506                 else
    4507                 {
    4508                     if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    4509                     {
    4510                         pavClientMem = (void**)RTMemAlloc(sizeof (pavClientMem[0]) * pResource->SurfCount);
    4511                         Assert(pavClientMem);
    4512                         if (pavClientMem)
    4513                         {
    4514                             for (UINT i = 0; i < pResource->SurfCount; ++i)
    4515                             {
    4516                                 pavClientMem[i] = pRc->aAllocations[i].pvMem;
    4517                             }
    4518                         }
    4519                         else
    4520                             hr = E_FAIL;
    4521                     }
    4522 
    4523                     if (hr == S_OK)
    4524                     {
    4525                         hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If,
    4526                                                 pAllocation->SurfDesc.width,
    4527                                                 VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc),
    4528                                                 vboxDDI2D3DUsage(pResource->Flags),
    4529                                                 vboxDDI2D3DFormat(pResource->Format),
    4530                                                 vboxDDI2D3DPool(pResource->Pool),
    4531                                                 &pD3DIfCubeTex,
    4532 #ifdef VBOXWDDMDISP_DEBUG_NOSHARED
    4533                                                 NULL,
    4534 #else
    4535                                                 pResource->Flags.SharedResource ? &hSharedHandle : NULL,
    4536 #endif
    4537                                                     pavClientMem);
    4538                         Assert(hr == S_OK);
    4539                         if (hr == S_OK)
    4540                         {
    4541                             Assert(pD3DIfCubeTex);
    4542                             pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_CUBE_TEXTURE;
    4543                             pAllocation->pD3DIf = pD3DIfCubeTex;
    4544 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    4545                             Assert(!!(pResource->Flags.SharedResource) == !!(hSharedHandle));
    4546 #endif
    4547                             pAllocation->hSharedHandle = hSharedHandle;
    4548                         }
    4549 
    4550                         if (pavClientMem)
    4551                             RTMemFree(pavClientMem);
    4552                     }
    4553                 }
    4554             }
    4555         }
    4556         else if (pResource->Flags.RenderTarget)
    4557         {
    4558             HWND hWnd = NULL;
     3805        if (pRc->RcDesc.fFlags.RenderTarget)
     3806        {
    45593807            bIssueCreateResource = true;
    4560             Assert(pResource->SurfCount);
    4561 
    4562 #ifdef VBOXWDDMDISP_DEBUG
    4563             if (g_VBoxVDbgCfgForceDummyDevCreate)
    4564             {
    4565                 VBOXDISP_D3DEV(pDevice);
    4566                 Assert(!RTListIsEmpty(&pDevice->SwapchainList));
    4567                 g_VBoxVDbgInternalRc = pRc;
    4568             }
    4569 #endif
    4570 
    4571 #if 0 /* <- always create an offscreen render target here since wined3dwddm makes host
    4572        * to postpone any host window sizing until it becomes visible (which is done to prevent flikering on *nix hosts)
    4573        * and thus back/front-buffer data is invalid until then
    4574        * and in case the 3d app is running under Aero enabled, the window will never become visible and thus never resized
    4575        * to the requested values */
    4576             if (!pResource->Flags.SharedResource /* <- the Shared must NOT be a swapchain (on-screen) render target
    4577                                                   * since it will be non-upside-down,
    4578                                                   * while the app opening the resource would use it as an off-screen,
    4579                                                   * i.e. upside-down */
    4580                     && RTListIsEmpty(&pDevice->SwapchainList))
    4581             {
    4582                 bCreateSwapchain = true;
    4583                 Assert(bIssueCreateResource);
    4584                 for (UINT i = 0; i < pRc->cAllocations; ++i)
    4585                 {
    4586                     PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    4587                     pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    4588                 }
    4589             }
    4590             else
    4591 #endif
    4592             {
    4593                 /* make sure the device is created */
    4594                 IDirect3DDevice9 *pDevice9If = VBOXDISP_D3DEV(pDevice);
    4595                 for (UINT i = 0; i < pResource->SurfCount; ++i)
    4596                 {
    4597                     PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    4598                     HANDLE hSharedHandle = NULL;
    4599 
    4600                     IDirect3DSurface9* pD3D9Surf;
    4601                     hr = pDevice9If->CreateRenderTarget(pAllocation->SurfDesc.width,
    4602                             pAllocation->SurfDesc.height,
    4603                             vboxDDI2D3DFormat(pResource->Format),
    4604                             vboxDDI2D3DMultiSampleType(pResource->MultisampleType),
    4605                             pResource->MultisampleQuality,
    4606                             !pResource->Flags.NotLockable /* BOOL Lockable */,
    4607                             &pD3D9Surf,
    4608 #ifdef VBOXWDDMDISP_DEBUG_NOSHARED
    4609                             NULL
    4610 #else
    4611                             pResource->Flags.SharedResource ? &hSharedHandle : NULL
    4612 #endif
    4613                     );
    4614                     Assert(hr == S_OK);
    4615                     if (hr == S_OK)
    4616                     {
    4617                         Assert(pD3D9Surf);
    4618                         pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    4619                         pAllocation->pD3DIf = pD3D9Surf;
    4620 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    4621                         Assert(!!(pResource->Flags.SharedResource) == !!(hSharedHandle));
    4622 #endif
    4623                         pAllocation->hSharedHandle = hSharedHandle;
    4624                         continue;
    4625 
    4626                         /* fail branch */
    4627                         pD3D9Surf->Release();
    4628                     }
    4629 
    4630                     for (UINT j = 0; j < i; ++j)
    4631                     {
    4632                         pRc->aAllocations[j].pD3DIf->Release();
    4633                     }
    4634                     break;
    4635                 }
    4636 
    4637                 if (SUCCEEDED(hr))
    4638                 {
    4639                     if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    4640                     {
    4641                         Assert(0);
    4642                         vboxWddmSurfSynchMem(pRc);
    4643                     }
    4644                 }
    4645             }
    4646         }
    4647         else
    4648         {
    4649             hr = E_FAIL;
    4650             Assert(0);
     3808        }
     3809
     3810        hr = VBoxD3DIfCreateForRc(pRc);
     3811        if (!SUCCEEDED(hr))
     3812        {
     3813            WARN(("VBoxD3DIfCreateForRc failed, hr 0x%x", hr));
    46513814        }
    46523815    }
     
    46573820    }
    46583821
    4659 
    4660     if (hr == S_OK && bIssueCreateResource)
     3822    if (SUCCEEDED(hr) && bIssueCreateResource)
    46613823    {
    46623824        pRc->fFlags.KmResource = bCreateKMResource;
     
    47283890                    Assert(hr == S_OK);
    47293891                    Assert(!pDdiAllocate->hKMResource);
    4730                     if (hr == S_OK)
     3892                    if (SUCCEEDED(hr))
    47313893                    {
    47323894                        Assert(pDdiAllocate->pAllocationInfo->hAllocation);
     
    47513913            }
    47523914
    4753             if (hr == S_OK)
     3915            if (SUCCEEDED(hr))
    47543916            {
    47553917                pRc->hKMResource = pDdiAllocate->hKMResource;
     
    47803942                }
    47813943
    4782                 if(bCreateSwapchain)
    4783                 {
    4784                     PVBOXWDDMDISP_SWAPCHAIN pSwapchain;
    4785                     hr = vboxWddmSwapchainCreateIfForRc(pDevice, pRc, &pSwapchain);
    4786                     Assert(hr == S_OK);
    4787                 }
    4788                 else
    4789                 {
    4790                     VBOXVDBG_CREATE_CHECK_SWAPCHAIN();
    4791                 }
     3944                VBOXVDBG_CREATE_CHECK_SWAPCHAIN();
    47923945            }
    47933946
     
    48023955    VBOXVDBG_BREAK_SHARED(pRc);
    48033956
    4804     if (hr == S_OK)
     3957    if (SUCCEEDED(hr))
     3958    {
    48053959        pResource->hResource = pRc;
     3960        hr = S_OK;
     3961    }
    48063962    else
    48073963        vboxResourceFree(pRc);
     
    53104466    VBOXVDBG_BREAK_SHARED(pDstRc);
    53114467
    5312     hr = vboxWddmSurfGet(pDstRc, pData->DstSubResourceIndex, &pDstSurfIf);
     4468    hr = VBoxD3DIfSurfGet(pDstRc, pData->DstSubResourceIndex, &pDstSurfIf);
    53134469    Assert(hr == S_OK);
    53144470    if (hr == S_OK)
     
    53244480            else
    53254481            {
    5326                 hr = vboxWddmSurfGet(pSrcRc, pData->SrcSubResourceIndex, &pSrcSurfIf);
     4482                hr = VBoxD3DIfSurfGet(pSrcRc, pData->SrcSubResourceIndex, &pSrcSurfIf);
    53274483                Assert(hr == S_OK);
    53284484            }
     
    53724528    Assert(pRc);
    53734529    IDirect3DSurface9 *pSurfIf = NULL;
    5374     HRESULT hr = vboxWddmSurfGet(pRc, pData->SubResourceIndex, &pSurfIf);
     4530    HRESULT hr = VBoxD3DIfSurfGet(pRc, pData->SubResourceIndex, &pSurfIf);
    53754531    Assert(hr == S_OK);
    53764532    if (hr == S_OK)
     
    60625218}
    60635219
    6064 static HRESULT vboxAllocationInit(PVBOXWDDMDISP_ALLOCATION pAlloc, D3DDDI_OPENALLOCATIONINFO *pInfo)
    6065 {
    6066     HRESULT hr = S_OK;
    6067     pAlloc->hAllocation = pInfo->hAllocation;
    6068     Assert(pInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO));
    6069     Assert(pInfo->pPrivateDriverData);
    6070     if (pInfo->PrivateDriverDataSize >= sizeof (VBOXWDDM_ALLOCINFO))
    6071     {
    6072         PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData;
    6073         pAlloc->enmType = pAllocInfo->enmType;
    6074         Assert(pAllocInfo->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
    6075                 || VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE
    6076                 || VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE);
    6077         pAlloc->pvMem = NULL;
    6078         pAlloc->SurfDesc = pAllocInfo->SurfDesc;
    6079     }
    6080     else
    6081     {
    6082         vboxVDbgPrintR((__FUNCTION__": ERROR: PrivateDriverDataSize(%d) < (%d)\n", pInfo->PrivateDriverDataSize, sizeof (VBOXWDDM_ALLOCINFO)));
    6083         hr = E_INVALIDARG;
    6084     }
    6085     return hr;
    6086 }
    6087 
    60885220static HRESULT APIENTRY vboxWddmDDevOpenResource(HANDLE hDevice, D3DDDIARG_OPENRESOURCE* pData)
    60895221{
     
    61085240        pRc->RcDesc.enmRotation = pData->Rotation;
    61095241        pRc->fFlags.Value = 0;
    6110         pRc->fFlags.Generic = 1;
    61115242        pRc->fFlags.Opened = 1;
    61125243        pRc->fFlags.KmResource = 1;
     5244
     5245        for (UINT i = 0; i < pData->NumAllocations; ++i)
     5246        {
     5247            PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
     5248            D3DDDI_OPENALLOCATIONINFO* pOAI = pData->pOpenAllocationInfo;
     5249            Assert(pOAI->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO));
     5250            if (pOAI->PrivateDriverDataSize != sizeof (VBOXWDDM_ALLOCINFO))
     5251            {
     5252                hr = E_INVALIDARG;
     5253                break;
     5254            }
     5255            Assert(pOAI->pPrivateDriverData);
     5256            PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pOAI->pPrivateDriverData;
     5257            pAllocation->hAllocation = pOAI->hAllocation;
     5258            pAllocation->enmType = pAllocInfo->enmType;
     5259            pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle;
     5260            pAllocation->SurfDesc = pAllocInfo->SurfDesc;
     5261            pAllocation->pvMem = NULL;
     5262#ifndef VBOXWDDMDISP_DEBUG_NOSHARED
     5263            Assert(!pAllocation->hSharedHandle == (pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE));
     5264#endif
     5265#ifdef VBOXWDDMDISP_DEBUG_PRINT_SHARED_CREATE
     5266            vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared OPENNED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), "
     5267                            "Handle(0x%x), (0n%d) \n***********\n\n",
     5268                        GetCurrentProcessId(), GetCurrentProcessId(),
     5269                        pAllocation, pRc->hKMResource, pAllocation->hAllocation,
     5270                        pAllocation->hSharedHandle, pAllocation->hSharedHandle
     5271                        ));
     5272#endif
     5273        }
    61135274        if (!pData->pPrivateDriverData || !pData->PrivateDriverDataSize)
    61145275        {
     
    61225283            pRc->RcDesc.MipLevels = 0;
    61235284            pRc->RcDesc.Fvf;
    6124             pRc->RcDesc.fFlags.Value = 0;
    6125 
    6126             Assert(pData->NumAllocations);
     5285
     5286            if (pData->NumAllocations != 1)
     5287            {
     5288                WARN(("NumAllocations is expected to be 1, but was %d", pData->NumAllocations));
     5289            }
     5290
     5291            for (UINT i = 0; i < pData->NumAllocations; ++i)
     5292            {
     5293                PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i];
     5294                pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
     5295                pAlloc->pD3DIf = NULL;
     5296            }
     5297
    61275298            D3DDDI_OPENALLOCATIONINFO* pDdiAllocInfo = &pData->pOpenAllocationInfo[0];
    61285299            Assert(pDdiAllocInfo->pPrivateDriverData);
     
    61595330                Assert(!pRcInfo->fFlags.Opened);
    61605331                Assert(pRcInfo->cAllocInfos == pData->NumAllocations);
    6161                 pRc->fFlags = pRcInfo->fFlags;
    6162                 pRc->fFlags.Opened = 1;
     5332                pRc->fFlags.Value |= pRcInfo->fFlags.Value;
     5333                pRc->fFlags.Generic = 1;
    61635334                pRc->RcDesc = pRcInfo->RcDesc;
    61645335                pRc->cAllocations = pData->NumAllocations;
    6165 
    6166                 for (UINT i = 0; i < pData->NumAllocations; ++i)
     5336                Assert(pRc->RcDesc.fFlags.SharedResource);
     5337
     5338                hr = VBoxD3DIfCreateForRc(pRc);
     5339                if (!SUCCEEDED(hr))
    61675340                {
    6168                     PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    6169                     D3DDDI_OPENALLOCATIONINFO* pOAI = pData->pOpenAllocationInfo;
    6170                     Assert(pOAI->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO));
    6171                     if (pOAI->PrivateDriverDataSize != sizeof (VBOXWDDM_ALLOCINFO))
    6172                     {
    6173                         hr = E_INVALIDARG;
    6174                         break;
    6175                     }
    6176                     Assert(pOAI->pPrivateDriverData);
    6177                     PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pOAI->pPrivateDriverData;
    6178                     pAllocation->hAllocation = pOAI->hAllocation;
    6179                     pAllocation->enmType = pAllocInfo->enmType;
    6180                     pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle;
    6181                     pAllocation->SurfDesc = pAllocInfo->SurfDesc;
    6182 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    6183                     Assert(pAllocation->hSharedHandle);
    6184 #endif
    6185 #ifdef VBOXWDDMDISP_DEBUG_PRINT_SHARED_CREATE
    6186                     vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared OPENNED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), "
    6187                                     "Handle(0x%x), (0n%d) \n***********\n\n",
    6188                                 GetCurrentProcessId(), GetCurrentProcessId(),
    6189                                 pAllocation, pRc->hKMResource, pAllocation->hAllocation,
    6190                                 pAllocation->hSharedHandle, pAllocation->hSharedHandle
    6191                                 ));
    6192 #endif
    6193                 }
    6194 
    6195                 Assert(pRc->RcDesc.fFlags.SharedResource);
    6196                 if (VBOXWDDMDISP_IS_TEXTURE(pRc->RcDesc.fFlags))
    6197                 {
    6198                     IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    6199                     PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[0];
    6200                     HANDLE hSharedHandle = pAllocation->hSharedHandle;
    6201 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    6202                     Assert(pAllocation->hSharedHandle);
    6203 #endif
    6204 
    6205                     if (!pRc->RcDesc.fFlags.CubeMap)
    6206                     {
    6207                         IDirect3DTexture9 *pD3DIfTex;
    6208                         hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice9If,
    6209                                                     pAllocation->SurfDesc.width,
    6210                                                     pAllocation->SurfDesc.height,
    6211                                                     pRc->cAllocations,
    6212                                                     vboxDDI2D3DUsage(pRc->RcDesc.fFlags),
    6213                                                     vboxDDI2D3DFormat(pRc->RcDesc.enmFormat),
    6214                                                     vboxDDI2D3DPool(pRc->RcDesc.enmPool),
    6215                                                     &pD3DIfTex,
    6216 #ifdef VBOXWDDMDISP_DEBUG_NOSHARED
    6217                                                     NULL,
    6218 #else
    6219                                                     &hSharedHandle,
    6220 #endif
    6221                                                     NULL);
    6222                         Assert(hr == S_OK);
    6223                         if (hr == S_OK)
    6224                         {
    6225                             Assert(pD3DIfTex);
    6226                             pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_TEXTURE;
    6227                             pAllocation->pD3DIf = pD3DIfTex;
    6228                             Assert(pAllocation->hSharedHandle == hSharedHandle);
    6229 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    6230                             Assert(pAllocation->hSharedHandle);
    6231 #endif
    6232                         }
    6233                     }
    6234                     else
    6235                     {
    6236                         IDirect3DCubeTexture9 *pD3DIfCubeTex;
    6237 
    6238                         if ( (pAllocation->SurfDesc.width!=pAllocation->SurfDesc.height)
    6239                              || (pRc->cAllocations%6!=0))
    6240                         {
    6241                             Assert(0);
    6242                             hr = E_INVALIDARG;
    6243                         }
    6244                         hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If,
    6245                                                     pAllocation->SurfDesc.width,
    6246                                                     VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc),
    6247                                                     vboxDDI2D3DUsage(pRc->RcDesc.fFlags),
    6248                                                     vboxDDI2D3DFormat(pRc->RcDesc.enmFormat),
    6249                                                     vboxDDI2D3DPool(pRc->RcDesc.enmPool),
    6250                                                     &pD3DIfCubeTex,
    6251 #ifdef VBOXWDDMDISP_DEBUG_NOSHARED
    6252                                                     NULL,
    6253 #else
    6254                                                     &hSharedHandle,
    6255 #endif
    6256                                                     NULL);
    6257                         Assert(hr == S_OK);
    6258                         if (hr == S_OK)
    6259                         {
    6260                             Assert(pD3DIfCubeTex);
    6261                             pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_CUBE_TEXTURE;
    6262                             pAllocation->pD3DIf = pD3DIfCubeTex;
    6263                             Assert(pAllocation->hSharedHandle == hSharedHandle);
    6264 #ifndef VBOXWDDMDISP_DEBUG_NOSHARED
    6265                             Assert(pAllocation->hSharedHandle);
    6266 #endif
    6267                         }
    6268 
    6269                     }
    6270                 }
    6271                 else
    6272                 {
    6273                     /* impl */
    6274                     Assert(0);
     5341                    WARN(("VBoxD3DIfCreateForRc failed, hr %d", hr));
    62755342                }
    62765343            }
    62775344            else
    62785345                hr = E_INVALIDARG;
    6279         }
    6280 
    6281         if (hr == S_OK)
    6282         {
    6283             for (UINT i = 0; i < pData->NumAllocations; ++i)
    6284             {
    6285                 hr = vboxAllocationInit(&pRc->aAllocations[i], &pData->pOpenAllocationInfo[i]);
    6286                 Assert(hr == S_OK);
    6287                 if (hr != S_OK)
    6288                     break;
    6289             }
    62905346        }
    62915347
     
    66235679}
    66245680
    6625 
    66265681HRESULT APIENTRY OpenAdapter(__inout D3DDDIARG_OPENADAPTER*  pOpenData)
    66275682{
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h

    r42557 r43236  
    337337}
    338338
    339 /* on success increments the surface ref counter,
    340  * i.e. one must call pSurf->Release() once the surface is not needed*/
    341 DECLINLINE(HRESULT) vboxWddmSurfGet(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc, IDirect3DSurface9 **ppSurf)
    342 {
    343     HRESULT hr = S_OK;
    344     Assert(pRc->cAllocations > iAlloc);
    345     switch (pRc->aAllocations[0].enmD3DIfType)
    346     {
    347         case VBOXDISP_D3DIFTYPE_SURFACE:
    348         {
    349             IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;
    350             Assert(pD3DIfSurf);
    351             pD3DIfSurf->AddRef();
    352             *ppSurf = pD3DIfSurf;
    353             break;
    354         }
    355         case VBOXDISP_D3DIFTYPE_TEXTURE:
    356         {
    357             Assert(pRc->cAllocations == 1); /* <- vboxWddmSurfGet is typically used in Blt & ColorFill functions
    358                                              * in this case, if texture is used as a destination,
    359                                              * we should update sub-layers as well which is not done currently
    360                                              * so for now check vboxWddmSurfGet is used for one-level textures */
    361             IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
    362             IDirect3DSurface9 *pSurfaceLevel;
    363             Assert(pD3DIfTex);
    364             hr = pD3DIfTex->GetSurfaceLevel(iAlloc, &pSurfaceLevel);
    365             Assert(hr == S_OK);
    366             if (hr == S_OK)
    367             {
    368                 *ppSurf = pSurfaceLevel;
    369             }
    370             break;
    371         }
    372         case VBOXDISP_D3DIFTYPE_CUBE_TEXTURE:
    373         {
    374             Assert(0);
    375             IDirect3DCubeTexture9 *pD3DIfCubeTex = (IDirect3DCubeTexture9*)pRc->aAllocations[0].pD3DIf;
    376             IDirect3DSurface9 *pSurfaceLevel;
    377             Assert(pD3DIfCubeTex);
    378             hr = pD3DIfCubeTex->GetCubeMapSurface(VBOXDISP_CUBEMAP_INDEX_TO_FACE(pRc, iAlloc),
    379                                                   VBOXDISP_CUBEMAP_INDEX_TO_LEVEL(pRc, iAlloc), &pSurfaceLevel);
    380             Assert(hr == S_OK);
    381             if (hr == S_OK)
    382             {
    383                 *ppSurf = pSurfaceLevel;
    384             }
    385             break;
    386         }
    387         default:
    388             Assert(0);
    389             hr = E_FAIL;
    390             break;
    391     }
    392     return hr;
    393 }
    394 
    395 HRESULT vboxWddmLockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc,
    396         D3DLOCKED_RECT * pLockedRect,
    397         CONST RECT *pRect,
    398         DWORD fLockFlags);
    399 HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc);
    400 
    401 #define VBOXDISPMODE_IS_3D(_p) (!!((_p)->D3D.pD3D9If))
    402 #ifdef VBOXDISP_EARLYCREATEDEVICE
    403 #define VBOXDISP_D3DEV(_p) (_p)->pDevice9If
    404 #else
    405 #define VBOXDISP_D3DEV(_p) vboxWddmD3DDeviceGet(_p)
     339void vboxWddmResourceInit(PVBOXWDDMDISP_RESOURCE pRc, UINT cAllocs);
     340
     341#ifndef IN_VBOXCRHGSMI
     342PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc, BOOL *pbNeedPresent);
     343HRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain);
     344VOID vboxWddmSwapchainDestroy(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain);
     345
    406346#endif
    407347
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DCmn.h

    r42154 r43236  
    6464#endif
    6565#include "VBoxDispD3D.h"
    66 
     66#ifndef IN_VBOXCRHGSMI
     67#include "VBoxD3DIf.h"
     68#endif
    6769
    6870# ifdef VBOXWDDMDISP
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp

    r42683 r43236  
    8888
    8989#ifdef VBOXWDDMDISP_DEBUG
     90
     91DWORD g_VBoxVDbgFLogRel = 1;
     92DWORD g_VBoxVDbgFLog = 1;
     93DWORD g_VBoxVDbgFLogFlow = 0;
     94
     95# ifndef IN_VBOXCRHGSMI
    9096#define VBOXWDDMDISP_DEBUG_DUMP_DEFAULT 0
    9197DWORD g_VBoxVDbgFDumpSetTexture = VBOXWDDMDISP_DEBUG_DUMP_DEFAULT;
     
    112118DWORD g_VBoxVDbgFSkipCheckTexBltDwmWndUpdate = 1;
    113119
    114 DWORD g_VBoxVDbgFLogRel = 1;
    115 DWORD g_VBoxVDbgFLog = 1;
    116 DWORD g_VBoxVDbgFLogFlow = 0;
    117 
    118120DWORD g_VBoxVDbgCfgMaxDirectRts = 3;
    119121DWORD g_VBoxVDbgCfgForceDummyDevCreate = 0;
     
    277279    const RECT *pRect = pInfo->pRect;
    278280    IDirect3DSurface9 *pSurf;
    279     HRESULT hr = vboxWddmSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pSurf);
     281    HRESULT hr = VBoxD3DIfSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pSurf);
    280282    if (hr != S_OK)
    281283    {
    282         WARN(("vboxWddmSurfGet failed, hr 0x%x", hr));
     284        WARN(("VBoxD3DIfSurfGet failed, hr 0x%x", hr));
    283285        return;
    284286    }
     
    527529}
    528530
    529 #ifndef IN_VBOXCRHGSMI
    530531BOOL vboxVDbgDoCheckRectsMatch(const PVBOXWDDMDISP_RESOURCE pDstRc, uint32_t iDstAlloc,
    531532                            const PVBOXWDDMDISP_RESOURCE pSrcRc, uint32_t iSrcAlloc,
     
    592593
    593594    D3DLOCKED_RECT SrcLRect, DstLRect;
    594     HRESULT hr = vboxWddmLockRect(pDstRc, iDstAlloc, &DstLRect, pDstRect, D3DLOCK_READONLY);
     595    HRESULT hr = VBoxD3DIfLockRect(pDstRc, iDstAlloc, &DstLRect, pDstRect, D3DLOCK_READONLY);
    595596    if (FAILED(hr))
    596597    {
    597         WARN(("vboxWddmLockRect failed, hr(0x%x)", hr));
    598         return FALSE;
    599     }
    600 
    601     hr = vboxWddmLockRect(pSrcRc, iSrcAlloc, &SrcLRect, pSrcRect, D3DLOCK_READONLY);
     598        WARN(("VBoxD3DIfLockRect failed, hr(0x%x)", hr));
     599        return FALSE;
     600    }
     601
     602    hr = VBoxD3DIfLockRect(pSrcRc, iSrcAlloc, &SrcLRect, pSrcRect, D3DLOCK_READONLY);
    602603    if (FAILED(hr))
    603604    {
    604         WARN(("vboxWddmLockRect failed, hr(0x%x)", hr));
    605         hr = vboxWddmUnlockRect(pDstRc, iDstAlloc);
     605        WARN(("VBoxD3DIfLockRect failed, hr(0x%x)", hr));
     606        hr = VBoxD3DIfUnlockRect(pDstRc, iDstAlloc);
    606607        return FALSE;
    607608    }
     
    609610    fMatch = vboxVDbgDoCheckLRects(&DstLRect, pDstRect, &SrcLRect, pSrcRect, bpp, fBreakOnMismatch);
    610611
    611     hr = vboxWddmUnlockRect(pDstRc, iDstAlloc);
     612    hr = VBoxD3DIfUnlockRect(pDstRc, iDstAlloc);
    612613    Assert(hr == S_OK);
    613614
    614     hr = vboxWddmUnlockRect(pSrcRc, iSrcAlloc);
     615    hr = VBoxD3DIfUnlockRect(pSrcRc, iSrcAlloc);
    615616    Assert(hr == S_OK);
    616617
    617618    return fMatch;
    618619}
    619 #endif
    620620
    621621void vboxVDbgDoPrintAlloc(const char * pPrefix, const PVBOXWDDMDISP_RESOURCE pRc, uint32_t iAlloc, const char * pSuffix)
     
    643643    vboxVDbgPrint(("%s left(%d), top(%d), right(%d), bottom(%d) %s", pPrefix, pRect->left, pRect->top, pRect->right, pRect->bottom, pSuffix));
    644644}
     645
     646# endif
    645647
    646648static VOID CALLBACK vboxVDbgTimerCb(__in PVOID lpParameter, __in BOOLEAN TimerOrWaitFired)
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h

    r42027 r43236  
    5050# endif
    5151
     52/* log enable flags */
     53extern DWORD g_VBoxVDbgFLogRel;
     54extern DWORD g_VBoxVDbgFLog;
     55extern DWORD g_VBoxVDbgFLogFlow;
     56
     57# ifndef IN_VBOXCRHGSMI
    5258/* debug config vars */
    5359extern DWORD g_VBoxVDbgFDumpSetTexture;
     
    7480extern DWORD g_VBoxVDbgFSkipCheckTexBltDwmWndUpdate;
    7581
    76 /* log enable flags */
    77 extern DWORD g_VBoxVDbgFLogRel;
    78 extern DWORD g_VBoxVDbgFLog;
    79 extern DWORD g_VBoxVDbgFLogFlow;
    80 
    8182extern DWORD g_VBoxVDbgCfgMaxDirectRts;
    8283extern DWORD g_VBoxVDbgCfgForceDummyDevCreate;
     
    8788extern DWORD g_VBoxVDbgCfgCreateSwapchainOnDdiOnce;
    8889
    89 #endif
    90 
    91 #if 0
    92 # ifdef Assert
    93 #  undef Assert
    94 #  define Assert(_a) do{}while(0)
    95 # endif
    96 # ifdef AssertBreakpoint
    97 #  undef AssertBreakpoint
    98 #  define AssertBreakpoint() do{}while(0)
    99 # endif
    100 # ifdef AssertFailed
    101 #  undef AssertFailed
    102 #  define AssertFailed() do{}while(0)
    103 # endif
     90# endif /* #ifndef IN_VBOXCRHGSMI */
    10491#endif
    10592
     
    212199void vboxDispLogDbgPrintF(char * szString, ...);
    213200
     201# ifndef IN_VBOXCRHGSMI
    214202typedef struct VBOXWDDMDISP_ALLOCATION *PVBOXWDDMDISP_ALLOCATION;
    215203typedef struct VBOXWDDMDISP_RESOURCE *PVBOXWDDMDISP_RESOURCE;
     
    640628        } while (0)
    641629
     630# endif /* # ifndef IN_VBOXCRHGSMI */
    642631#else
    643632#define VBOXVDBG_DUMP_DRAWPRIM_ENTER(_pDevice) do { } while (0)
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