VirtualBox

Changeset 31797 in vbox for trunk


Ignore:
Timestamp:
Aug 19, 2010 5:03:40 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: multimonitor for fullscreen apps (Aero), shared rc support needed

Location:
trunk/src/VBox/Additions/WINNT/Graphics
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r31740 r31797  
    10691069static HRESULT vboxWddmRenderTargetUpdateSurface(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc, uint32_t iBBuf)
    10701070{
     1071    if (pAlloc->SurfDesc.VidPnSourceId != pDevice->iPrimaryScreen)
     1072        return S_OK;
     1073
    10711074    IDirect3DSurface9 *pD3D9Surf;
    1072     HRESULT hr = pDevice->pDevice9If->GetBackBuffer(0 /*UINT iSwapChain*/,
     1075    IDirect3DDevice9 *pDevice9If = pDevice->aScreens[pDevice->iPrimaryScreen].pDevice9If;
     1076    HRESULT hr = pDevice9If->GetBackBuffer(0 /*UINT iSwapChain*/,
    10731077            iBBuf, D3DBACKBUFFER_TYPE_MONO, &pD3D9Surf);
    10741078    Assert(hr == S_OK);
     
    10851089static HRESULT vboxWddmRenderTargetUpdate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_RESOURCE pRc, uint32_t iNewRTFB)
    10861090{
     1091    if (pRc->RcDesc.VidPnSourceId != pDevice->iPrimaryScreen)
     1092        return S_OK;
     1093
    10871094    PVBOXWDDMDISP_ALLOCATION pAlloc;
    10881095    UINT iBBuf = 0;
     
    11341141    IDirect3DSurface9 *pD3D9Surf;
    11351142    Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
    1136     HRESULT hr = pDevice->pDevice9If->GetBackBuffer(0 /*UINT iSwapChain*/,
     1143    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1144    Assert(pScreen->hWnd);
     1145    Assert(pScreen->pDevice9If);
     1146    HRESULT hr = pScreen->pDevice9If->GetBackBuffer(0 /*UINT iSwapChain*/,
    11371147            iBBuf, D3DBACKBUFFER_TYPE_MONO, &pD3D9Surf);
    11381148    Assert(hr == S_OK);
     
    11821192}
    11831193
    1184 # define VBOXVDBG_RTGT_STATECHECK(_pDev) (vboxWddmDbgRenderTargetCheck((_pDev), (_pDev)->pRenderTargetRc, (_pDev)->iRenderTargetFrontBuf))
     1194# define VBOXVDBG_RTGT_STATECHECK(_pDev) (vboxWddmDbgRenderTargetCheck((_pDev), (_pDev)->aScreens[(_pDev)->iPrimaryScreen].pRenderTargetRc, (_pDev)->aScreens[(_pDev)->iPrimaryScreen].iRenderTargetFrontBuf))
    11851195#else
    11861196# define VBOXVDBG_RTGT_STATECHECK(_pDev) do{}while(0)
     
    17661776    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    17671777    Assert(pDevice);
    1768     Assert(pDevice->pDevice9If);
    1769     HRESULT hr = pDevice->pDevice9If->SetRenderState(vboxDDI2D3DRenderStateType(pData->State), pData->Value);
     1778    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1779    Assert(pScreen->hWnd);
     1780    Assert(pScreen->pDevice9If);
     1781    HRESULT hr = pScreen->pDevice9If->SetRenderState(vboxDDI2D3DRenderStateType(pData->State), pData->Value);
    17701782    Assert(hr == S_OK);
    17711783    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    17931805    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    17941806    Assert(pDevice);
    1795     Assert(pDevice->pDevice9If);
     1807    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1808    Assert(pScreen->hWnd);
     1809    Assert(pScreen->pDevice9If);
    17961810
    17971811    VBOXWDDMDISP_TSS_LOOKUP lookup = vboxDDI2D3DTestureStageStateType(pData->State);
     
    18001814    if (!lookup.bSamplerState)
    18011815    {
    1802         hr = pDevice->pDevice9If->SetTextureStageState(pData->Stage, D3DTEXTURESTAGESTATETYPE(lookup.dType), pData->Value);
     1816        hr = pScreen->pDevice9If->SetTextureStageState(pData->Stage, D3DTEXTURESTAGESTATETYPE(lookup.dType), pData->Value);
    18031817    }
    18041818    else
    18051819    {
    1806         hr = pDevice->pDevice9If->SetSamplerState(pData->Stage, D3DSAMPLERSTATETYPE(lookup.dType), pData->Value);
     1820        hr = pScreen->pDevice9If->SetSamplerState(pData->Stage, D3DSAMPLERSTATETYPE(lookup.dType), pData->Value);
    18071821    }
    18081822
     
    18171831    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    18181832    Assert(pDevice);
    1819     Assert(pDevice->pDevice9If);
     1833    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1834    Assert(pScreen->hWnd);
     1835    Assert(pScreen->pDevice9If);
    18201836    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)hTexture;
    18211837//    Assert(pRc);
     
    18301846
    18311847//    Assert(pD3DIfTex);
    1832     HRESULT hr = pDevice->pDevice9If->SetTexture(Stage, pD3DIfTex);
     1848    HRESULT hr = pScreen->pDevice9If->SetTexture(Stage, pD3DIfTex);
    18331849    Assert(hr == S_OK);
    18341850    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    18411857    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    18421858    Assert(pDevice);
    1843     Assert(pDevice->pDevice9If);
     1859    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1860    Assert(pScreen->hWnd);
     1861    Assert(pScreen->pDevice9If);
    18441862    IDirect3DPixelShader9 *pShader = (IDirect3DPixelShader9*)hShaderHandle;
    18451863    Assert(pShader);
    1846     HRESULT hr = pDevice->pDevice9If->SetPixelShader(pShader);
     1864    HRESULT hr = pScreen->pDevice9If->SetPixelShader(pShader);
    18471865    Assert(hr == S_OK);
    18481866    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    18551873    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    18561874    Assert(pDevice);
    1857     Assert(pDevice->pDevice9If);
    1858     HRESULT hr = pDevice->pDevice9If->SetPixelShaderConstantF(pData->Register, pRegisters, pData->Count);
     1875    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1876    Assert(pScreen->hWnd);
     1877    Assert(pScreen->pDevice9If);
     1878    HRESULT hr = pScreen->pDevice9If->SetPixelShaderConstantF(pData->Register, pRegisters, pData->Count);
    18591879    Assert(hr == S_OK);
    18601880    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    18671887    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    18681888    Assert(pDevice);
    1869     Assert(pDevice->pDevice9If);
     1889    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1890    Assert(pScreen->hWnd);
     1891    Assert(pScreen->pDevice9If);
    18701892    HRESULT hr = S_OK;
    18711893//    IDirect3DVertexBuffer9 *pStreamData;
     
    18981920    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    18991921    Assert(pDevice);
    1900     Assert(pDevice->pDevice9If);
     1922    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1923    Assert(pScreen->hWnd);
     1924    Assert(pScreen->pDevice9If);
    19011925    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hIndexBuffer;
    19021926    PVBOXWDDMDISP_ALLOCATION pAlloc = NULL;
     
    19091933        pIndexBuffer = (IDirect3DIndexBuffer9*)pAlloc->pD3DIf;
    19101934    }
    1911     HRESULT hr = pDevice->pDevice9If->SetIndices(pIndexBuffer);
     1935    HRESULT hr = pScreen->pDevice9If->SetIndices(pIndexBuffer);
    19121936    Assert(hr == S_OK);
    19131937    if (hr == S_OK)
     
    19251949    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    19261950    Assert(pDevice);
    1927     Assert(pDevice->pDevice9If);
     1951    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1952    Assert(pScreen->hWnd);
     1953    Assert(pScreen->pDevice9If);
    19281954    HRESULT hr = S_OK;
    19291955    pDevice->IndiciesUm.pvBuffer = pUMBuffer;
     
    19381964    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    19391965    Assert(pDevice);
    1940     Assert(pDevice->pDevice9If);
     1966    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     1967    Assert(pScreen->hWnd);
     1968    Assert(pScreen->pDevice9If);
    19411969    Assert(!pFlagBuffer);
    19421970    HRESULT hr = S_OK;
     
    19581986            }
    19591987#endif
    1960             hr = pDevice->pDevice9If->DrawPrimitiveUP(pData->PrimitiveType,
     1988            hr = pScreen->pDevice9If->DrawPrimitiveUP(pData->PrimitiveType,
    19611989                                      pData->PrimitiveCount,
    19621990                                      ((uint8_t*)pDevice->aStreamSourceUm[0].pvBuffer) + pData->VStart * pDevice->aStreamSourceUm[0].cbStride,
     
    19942022            Assert(cStreams == pDevice->cStreamSources);
    19952023#endif
    1996         hr = pDevice->pDevice9If->DrawPrimitive(pData->PrimitiveType,
     2024        hr = pScreen->pDevice9If->DrawPrimitive(pData->PrimitiveType,
    19972025                                                pData->VStart,
    19982026                                                pData->PrimitiveCount);
     
    20022030#if 0
    20032031        IDirect3DVertexDeclaration9* pDecl;
    2004         hr = pDevice->pDevice9If->GetVertexDeclaration(&pDecl);
     2032        hr = pScreen->pDevice9If->GetVertexDeclaration(&pDecl);
    20052033        Assert(hr == S_OK);
    20062034        if (hr == S_OK)
     
    21272155                            UINT cbOffset;
    21282156                            UINT cbStride;
    2129                             hr = pDevice->pDevice9If->GetStreamSource(iStream, &pCurVb, &cbOffset, &cbStride);
     2157                            hr = pScreen->pDevice9If->GetStreamSource(iStream, &pCurVb, &cbOffset, &cbStride);
    21302158                            Assert(hr == S_OK);
    21312159                            if (hr == S_OK)
     
    21542182                            if (!pVb)
    21552183                            {
    2156                                 hr = pDevice->pDevice9If->CreateVertexBuffer(cbVertexes,
     2184                                hr = pScreen->pDevice9If->CreateVertexBuffer(cbVertexes,
    21572185                                        0, /* DWORD Usage */
    21582186                                        0, /* DWORD FVF */
     
    21632191                                if (hr == S_OK)
    21642192                                {
    2165                                     hr = pDevice->pDevice9If->SetStreamSource(iStream, pVb, 0, pStrSrc->cbStride);
     2193                                    hr = pScreen->pDevice9If->SetStreamSource(iStream, pVb, 0, pStrSrc->cbStride);
    21662194                                    Assert(hr == S_OK);
    21672195                                    if (hr == S_OK)
     
    22002228            if (hr == S_OK)
    22012229            {
    2202                 hr = pDevice->pDevice9If->DrawPrimitive(pData->PrimitiveType,
     2230                hr = pScreen->pDevice9If->DrawPrimitive(pData->PrimitiveType,
    22032231                        0 /* <- since we use our owne StreamSource buffer which has data at the very beginning*/,
    22042232                        pData->PrimitiveCount);
     
    22242252    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    22252253    Assert(pDevice);
    2226     Assert(pDevice->pDevice9If);
     2254    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2255    Assert(pScreen->hWnd);
     2256    Assert(pScreen->pDevice9If);
    22272257//#ifdef DEBUG_misha
    22282258//    uint32_t iBackBuf = (pDevice->iRenderTargetFrontBuf + 1) % pDevice->pRenderTargetRc->cAllocations;
     
    22542284#endif
    22552285
    2256     HRESULT hr = pDevice->pDevice9If->DrawIndexedPrimitive(
     2286    HRESULT hr = pScreen->pDevice9If->DrawIndexedPrimitive(
    22572287            pData->PrimitiveType,
    22582288            pData->BaseVertexIndex,
     
    22952325    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    22962326    Assert(pDevice);
    2297     Assert(pDevice->pDevice9If);
     2327    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2328    Assert(pScreen->hWnd);
     2329    Assert(pScreen->pDevice9If);
    22982330    HRESULT hr;
    22992331
     
    23252357    }
    23262358
    2327     hr = pDevice->pDevice9If->DrawPrimitive(pData->PrimitiveType, pData->FirstVertexOffset, pData->PrimitiveCount);
     2359    hr = pScreen->pDevice9If->DrawPrimitive(pData->PrimitiveType, pData->FirstVertexOffset, pData->PrimitiveCount);
    23282360#else
    23292361//#ifdef DEBUG_misha
     
    23542386
    23552387                Assert(pLock->fFlags.MightDrawFromLocked && (pLock->fFlags.Discard || pLock->fFlags.NoOverwrite));
    2356                 hr = pDevice->pDevice9If->DrawPrimitiveUP(pData->PrimitiveType, pData->PrimitiveCount,
     2388                hr = pScreen->pDevice9If->DrawPrimitiveUP(pData->PrimitiveType, pData->PrimitiveCount,
    23572389                        (void*)((uintptr_t)pDevice->aStreamSource[stream]->pvMem+pDevice->StreamSourceInfo[stream].uiOffset+pData->FirstVertexOffset),
    23582390                         pDevice->StreamSourceInfo[stream].uiStride);
    23592391                Assert(hr == S_OK);
    2360                 hr = pDevice->pDevice9If->SetStreamSource(stream, (IDirect3DVertexBuffer9*)pDevice->aStreamSource[stream]->pD3DIf, pDevice->StreamSourceInfo[stream].uiOffset, pDevice->StreamSourceInfo[stream].uiStride);
     2392                hr = pScreen->pDevice9If->SetStreamSource(stream, (IDirect3DVertexBuffer9*)pDevice->aStreamSource[stream]->pD3DIf, pDevice->StreamSourceInfo[stream].uiOffset, pDevice->StreamSourceInfo[stream].uiStride);
    23612393                Assert(hr == S_OK);
    23622394            }
     
    23652397//                vboxVDbgMpPrint((pDevice, __FUNCTION__": DrawPrimitive\n"));
    23662398
    2367                 hr = pDevice->pDevice9If->DrawPrimitive(pData->PrimitiveType, pData->FirstVertexOffset/pDevice->StreamSourceInfo[stream].uiStride, pData->PrimitiveCount);
     2399                hr = pScreen->pDevice9If->DrawPrimitive(pData->PrimitiveType, pData->FirstVertexOffset/pDevice->StreamSourceInfo[stream].uiStride, pData->PrimitiveCount);
    23682400                Assert(hr == S_OK);
    23692401            }
     
    24172449    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    24182450    Assert(pDevice);
    2419     Assert(pDevice->pDevice9If);
     2451    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2452    Assert(pScreen->hWnd);
     2453    Assert(pScreen->pDevice9If);
    24202454    PVBOXWDDMDISP_RESOURCE pDstRc = (PVBOXWDDMDISP_RESOURCE)pData->hDstResource;
    24212455    PVBOXWDDMDISP_RESOURCE pSrcRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
     
    24392473                && pData->SrcRect.bottom - pData->SrcRect.top == pSrcRc->aAllocations[0].SurfDesc.height)
    24402474        {
    2441             hr = pDevice->pDevice9If->UpdateTexture(pD3DIfSrcTex, pD3DIfDstTex);
     2475            hr = pScreen->pDevice9If->UpdateTexture(pD3DIfSrcTex, pD3DIfDstTex);
    24422476            Assert(hr == S_OK);
    24432477        }
     
    24872521    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    24882522    Assert(pDevice);
    2489     Assert(pDevice->pDevice9If);
    2490     HRESULT hr = pDevice->pDevice9If->Clear(NumRect, (D3DRECT*)pRect /* see AssertCompile above */,
     2523    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2524    Assert(pScreen->hWnd);
     2525    Assert(pScreen->pDevice9If);
     2526    HRESULT hr = pScreen->pDevice9If->Clear(NumRect, (D3DRECT*)pRect /* see AssertCompile above */,
    24912527            pData->Flags,
    24922528            pData->FillColor,
     
    25182554    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    25192555    Assert(pDevice);
    2520     Assert(pDevice->pDevice9If);
    2521     HRESULT hr = pDevice->pDevice9If->SetVertexShaderConstantF(
     2556    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2557    Assert(pScreen->hWnd);
     2558    Assert(pScreen->pDevice9If);
     2559    HRESULT hr = pScreen->pDevice9If->SetVertexShaderConstantF(
    25222560            pData->Register,
    25232561            (CONST float*)pRegisters,
     
    25462584    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    25472585    Assert(pDevice);
    2548     Assert(pDevice->pDevice9If);
     2586    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2587    Assert(pScreen->hWnd);
     2588    Assert(pScreen->pDevice9If);
    25492589    pDevice->ViewPort.X = pData->X;
    25502590    pDevice->ViewPort.Y = pData->Y;
    25512591    pDevice->ViewPort.Width = pData->Width;
    25522592    pDevice->ViewPort.Height = pData->Height;
    2553     HRESULT hr = pDevice->pDevice9If->SetViewport(&pDevice->ViewPort);
     2593    HRESULT hr = pScreen->pDevice9If->SetViewport(&pDevice->ViewPort);
    25542594    Assert(hr == S_OK);
    25552595    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    25612601    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    25622602    Assert(pDevice);
    2563     Assert(pDevice->pDevice9If);
     2603    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2604    Assert(pScreen->hWnd);
     2605    Assert(pScreen->pDevice9If);
    25642606    pDevice->ViewPort.MinZ = pData->MinZ;
    25652607    pDevice->ViewPort.MaxZ = pData->MaxZ;
    2566     HRESULT hr = pDevice->pDevice9If->SetViewport(&pDevice->ViewPort);
     2608    HRESULT hr = pScreen->pDevice9If->SetViewport(&pDevice->ViewPort);
    25672609    Assert(hr == S_OK);
    25682610    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    26022644    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    26032645    Assert(pDevice);
    2604     Assert(pDevice->pDevice9If);
    2605     HRESULT hr = pDevice->pDevice9If->SetClipPlane(pData->Index, pData->Plane);
     2646    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2647    Assert(pScreen->hWnd);
     2648    Assert(pScreen->pDevice9If);
     2649    HRESULT hr = pScreen->pDevice9If->SetClipPlane(pData->Index, pData->Plane);
    26062650    Assert(hr == S_OK);
    26072651    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    26512695    if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
    26522696    {
    2653         Assert(pRc != pDevice->pRenderTargetRc || pDevice->iRenderTargetFrontBuf != pData->SubResourceIndex);
     2697        PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     2698
     2699        Assert(pRc != pScreen->pRenderTargetRc || pScreen->iRenderTargetFrontBuf != pData->SubResourceIndex);
    26542700
    26552701        if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE)
     
    33303376            if (pResource->Flags.ZBuffer)
    33313377            {
    3332                 Assert(pDevice->pDevice9If);
     3378                PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     3379                Assert(pScreen->hWnd);
     3380                Assert(pScreen->pDevice9If);
    33333381                for (UINT i = 0; i < pResource->SurfCount; ++i)
    33343382                {
    33353383                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    33363384                    IDirect3DSurface9 *pD3D9Surf;
    3337                     hr = pDevice->pDevice9If->CreateDepthStencilSurface(pAllocation->SurfDesc.width,
     3385                    hr = pScreen->pDevice9If->CreateDepthStencilSurface(pAllocation->SurfDesc.width,
    33383386                            pAllocation->SurfDesc.height,
    33393387                            vboxDDI2D3DFormat(pResource->Format),
     
    33643412            else if (pResource->Flags.VertexBuffer)
    33653413            {
    3366                 Assert(pDevice->pDevice9If);
     3414                PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     3415                Assert(pScreen->hWnd);
     3416                Assert(pScreen->pDevice9If);
    33673417                for (UINT i = 0; i < pResource->SurfCount; ++i)
    33683418                {
    33693419                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    33703420                    IDirect3DVertexBuffer9  *pD3D9VBuf;
    3371                     hr = pDevice->pDevice9If->CreateVertexBuffer(pAllocation->SurfDesc.width,
     3421                    hr = pScreen->pDevice9If->CreateVertexBuffer(pAllocation->SurfDesc.width,
    33723422                            vboxDDI2D3DUsage(pResource->Flags),
    33733423                            pResource->Fvf,
     
    34123462            else if (pResource->Flags.IndexBuffer)
    34133463            {
    3414                 Assert(pDevice->pDevice9If);
     3464                PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     3465                Assert(pScreen->hWnd);
     3466                Assert(pScreen->pDevice9If);
    34153467                for (UINT i = 0; i < pResource->SurfCount; ++i)
    34163468                {
     
    34183470                    CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
    34193471                    IDirect3DIndexBuffer9  *pD3D9IBuf;
    3420                     hr = pDevice->pDevice9If->CreateIndexBuffer(pSurf->Width,
     3472                    hr = pScreen->pDevice9If->CreateIndexBuffer(pSurf->Width,
    34213473                            vboxDDI2D3DUsage(pResource->Flags),
    34223474                            vboxDDI2D3DFormat(pResource->Format),
     
    34623514            else if (pResource->Flags.Texture || pResource->Flags.Value == 0)
    34633515            {
    3464                 Assert(pDevice->pDevice9If);
     3516                PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     3517                Assert(pScreen->hWnd);
     3518                Assert(pScreen->pDevice9If);
    34653519#ifdef DEBUG
    34663520                {
     
    34863540                HANDLE hSharedHandle = NULL;
    34873541#if 0
    3488                 hr = pDevice->pDevice9If->CreateTexture(pSurf->Width,
     3542                hr = pScreen->pDevice9If->CreateTexture(pSurf->Width,
    34893543                                            pSurf->Height,
    34903544                                            pResource->SurfCount,
     
    34963550                                            );
    34973551#else
    3498                 hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice->pDevice9If,
     3552                hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pScreen->pDevice9If,
    34993553                                            pSurf->Width,
    35003554                                            pSurf->Height,
     
    35563610                bIssueCreateResource = true;
    35573611                Assert(pResource->SurfCount);
    3558                 if (!pDevice->pDevice9If)
    3559                 {
    3560                     Assert(!pDevice->hWnd);
     3612                IDirect3DDevice9 *pPrimaryDevice = pDevice->aScreens[pDevice->iPrimaryScreen].pDevice9If;
     3613                if (!pPrimaryDevice || pResource->Flags.Primary)
     3614                {
     3615                    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pResource->VidPnSourceId];
     3616                    Assert(!pScreen->pDevice9If);
     3617                    Assert(!pScreen->hWnd);
    35613618                    hr = VBoxDispWndCreate(pAdapter, pResource->pSurfList[0].Width, pResource->pSurfList[0].Height, &hWnd);
    35623619                    Assert(hr == S_OK);
    35633620                    if (hr == S_OK)
    35643621                    {
     3622                        pScreen->hWnd = hWnd;
     3623
    35653624                        DWORD fFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    35663625                        if (pDevice->fFlags.AllowMultithreading)
     
    35743633                        params.BackBufferFormat = vboxDDI2D3DFormat(pResource->Format);
    35753634                        Assert(pResource->SurfCount);
    3576                         params.BackBufferCount = pResource->SurfCount - 1;
     3635                        params.BackBufferCount = !pPrimaryDevice ? pResource->SurfCount - 1 : 0;
    35773636                        params.MultiSampleType = vboxDDI2D3DMultiSampleType(pResource->MultisampleType);
    35783637                        if (pResource->Flags.DiscardRenderTarget)
     
    35913650                        if (hr == S_OK)
    35923651                        {
    3593                             pDevice->pDevice9If = pDevice9If;
    3594                             pDevice->hWnd = hWnd;
    3595                             pDevice->pRenderTargetRc = pRc;
     3652                            pScreen->pDevice9If = pDevice9If;
     3653                            pScreen->pRenderTargetRc = pRc;
     3654                            ++pDevice->cScreens;
    35963655
    35973656                            for (UINT i = 0; i < pResource->SurfCount; ++i)
     
    36013660                            }
    36023661
    3603                             hr = vboxWddmRenderTargetUpdate(pDevice, pRc, 0);
    3604                             Assert(hr == S_OK);
    3605                             if (hr == S_OK)
     3662                            if (pPrimaryDevice)
    36063663                            {
    36073664                                for (UINT i = 0; i < pResource->SurfCount; ++i)
    36083665                                {
    36093666                                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    3610                                     pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    3611                                     hr = vboxWddmSurfSynchMem(pRc, pAllocation);
    3612                                     Assert(hr == S_OK);
    3613                                     if (hr != S_OK)
    3614                                     {
    3615                                         break;
    3616                                     }
    3617                                 }
    3618 
    3619 #ifndef VBOXWDDM_WITH_VISIBLE_FB
    3620                                 if (hr == S_OK)
    3621                                 {
    3622                                     IDirect3DSurface9* pD3D9Surf;
    3623                                     hr = pDevice->pDevice9If->CreateRenderTarget(pRc->aAllocations[0].SurfDesc.width,
    3624                                             pRc->aAllocations[0].SurfDesc.height,
     3667                                    IDirect3DSurface9 *pRt;
     3668                                    IDirect3DSurface9 *pSecondaryOpenedRt;
     3669                                    HANDLE hSharedHandle = NULL;
     3670                                    hr = pPrimaryDevice->CreateRenderTarget(
     3671                                            pResource->pSurfList[i].Width,
     3672                                            pResource->pSurfList[i].Height,
    36253673                                            vboxDDI2D3DFormat(pResource->Format),
    36263674                                            vboxDDI2D3DMultiSampleType(pResource->MultisampleType),
    3627                                             pResource->MultisampleQuality,
    3628                                             !pResource->Flags.NotLockable /* BOOL Lockable */,
    3629                                             &pD3D9Surf,
    3630                                             NULL /* HANDLE* pSharedHandle */
    3631                                             );
     3675                                            0, /*DWORD MultisampleQuality*/
     3676                                            TRUE, /*BOOL Lockable*/
     3677                                            &pRt,
     3678                                            &hSharedHandle);
    36323679                                    Assert(hr == S_OK);
    36333680                                    if (hr == S_OK)
    36343681                                    {
    3635                                         pDevice->pRenderTargetFbCopy = pD3D9Surf;
     3682                                        Assert(hSharedHandle != NULL);
     3683                                        /* open render target for primary device */
     3684                                        hr = pDevice9If->CreateRenderTarget(
     3685                                                    pResource->pSurfList[i].Width,
     3686                                                    pResource->pSurfList[i].Height,
     3687                                                    vboxDDI2D3DFormat(pResource->Format),
     3688                                                    vboxDDI2D3DMultiSampleType(pResource->MultisampleType),
     3689                                                    0, /*DWORD MultisampleQuality*/
     3690                                                    TRUE, /*BOOL Lockable*/
     3691                                                    &pSecondaryOpenedRt,
     3692                                                    &hSharedHandle);
     3693                                        Assert(hr == S_OK);
     3694                                        if (hr == S_OK)
     3695                                        {
     3696                                            pAllocation->pD3DIf = pRt;
     3697                                            pAllocation->pSecondaryOpenedD3DIf = pSecondaryOpenedRt;
     3698                                            pAllocation->hSharedHandle = hSharedHandle;
     3699                                            continue;
     3700                                        }
     3701                                        pRt->Release();
    36363702                                    }
     3703
     3704                                    for (UINT j = 0; j < i; ++j)
     3705                                    {
     3706                                        PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[j];
     3707                                        pAlloc->pD3DIf->Release();
     3708                                        pAlloc->pSecondaryOpenedD3DIf->Release();
     3709                                    }
     3710
     3711                                    break;
    36373712                                }
    3638 #endif
    3639 
    3640                                 if (hr != S_OK)
     3713                            }
     3714                            else
     3715                            {
     3716                                pDevice->iPrimaryScreen = pResource->VidPnSourceId;
     3717                            }
     3718
     3719                            if (hr == S_OK)
     3720                            {
     3721                                hr = vboxWddmRenderTargetUpdate(pDevice, pRc, 0);
     3722                                Assert(hr == S_OK);
     3723                                if (hr == S_OK)
    36413724                                {
    36423725                                    for (UINT i = 0; i < pResource->SurfCount; ++i)
    36433726                                    {
    36443727                                        PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    3645                                         pAllocation->pD3DIf->Release();
     3728                                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
     3729                                        hr = vboxWddmSurfSynchMem(pRc, pAllocation);
     3730                                        Assert(hr == S_OK);
     3731                                        if (hr != S_OK)
     3732                                        {
     3733                                            break;
     3734                                        }
     3735                                    }
     3736
     3737#ifndef VBOXWDDM_WITH_VISIBLE_FB
     3738                                    if (!pPrimaryDevice)
     3739                                    {
     3740                                        if (hr == S_OK)
     3741                                        {
     3742                                            IDirect3DSurface9* pD3D9Surf;
     3743                                            hr = pDevice9If->CreateRenderTarget(pRc->aAllocations[0].SurfDesc.width,
     3744                                                    pRc->aAllocations[0].SurfDesc.height,
     3745                                                    vboxDDI2D3DFormat(pResource->Format),
     3746                                                    vboxDDI2D3DMultiSampleType(pResource->MultisampleType),
     3747                                                    pResource->MultisampleQuality,
     3748                                                    !pResource->Flags.NotLockable /* BOOL Lockable */,
     3749                                                    &pD3D9Surf,
     3750                                                    NULL /* HANDLE* pSharedHandle */
     3751                                                    );
     3752                                            Assert(hr == S_OK);
     3753                                            if (hr == S_OK)
     3754                                            {
     3755                                                pDevice->pRenderTargetFbCopy = pD3D9Surf;
     3756                                            }
     3757                                        }
     3758                                    }
     3759#endif
     3760
     3761                                    if (hr != S_OK)
     3762                                    {
     3763                                        for (UINT i = 0; i < pResource->SurfCount; ++i)
     3764                                        {
     3765                                            PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
     3766                                            pAllocation->pD3DIf->Release();
     3767                                        }
    36463768                                    }
    36473769                                }
     
    36493771
    36503772                            if (hr != S_OK)
     3773                            {
    36513774                                pDevice9If->Release();
     3775                                --pDevice->cScreens;
     3776                                Assert(pDevice->cScreens < UINT32_MAX/2);
     3777                            }
    36523778                        }
    36533779
    36543780                        if (hr != S_OK)
    36553781                        {
    3656                             HRESULT tmpHr = VBoxDispWndDestroy(pAdapter, pDevice->hWnd);
     3782                            HRESULT tmpHr = VBoxDispWndDestroy(pAdapter, pScreen->hWnd);
    36573783                            Assert(tmpHr == S_OK);
    36583784                        }
    36593785                    }
     3786
     3787
    36603788                }
    36613789                else
    36623790                {
    3663                     Assert(pDevice->hWnd);
    3664                     Assert(pDevice->pDevice9If);
     3791                    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     3792                    Assert(pScreen->hWnd);
     3793                    Assert(pScreen->pDevice9If);
    36653794                    for (UINT i = 0; i < pResource->SurfCount; ++i)
    36663795                    {
     
    36683797
    36693798                        IDirect3DSurface9* pD3D9Surf;
    3670                         hr = pDevice->pDevice9If->CreateRenderTarget(pAllocation->SurfDesc.width,
     3799                        hr = pScreen->pDevice9If->CreateRenderTarget(pAllocation->SurfDesc.width,
    36713800                                pAllocation->SurfDesc.height,
    36723801                                vboxDDI2D3DFormat(pResource->Format),
     
    37023831            else
    37033832            {
    3704                 Assert(pDevice->pDevice9If);
     3833                PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     3834                Assert(pScreen->hWnd);
     3835                Assert(pScreen->pDevice9If);
    37053836                Assert(0);
    37063837            }
    37073838        }
    37083839        else
     3840        {
    37093841            bIssueCreateResource = true;
     3842        }
    37103843
    37113844
     
    38283961    if (VBOXDISPMODE_IS_3D(pAdapter))
    38293962    {
    3830         if (pRc->RcDesc.fFlags.RenderTarget)
    3831         {
    3832             Assert(pDevice->hWnd);
    3833             Assert(pDevice->pDevice9If);
    3834         }
     3963//        if (pRc->RcDesc.fFlags.RenderTarget)
     3964//        {
     3965//            Assert(pDevice->hWnd);
     3966//            Assert(pDevice->pDevice9If);
     3967//        }
    38353968
    38363969        for (UINT i = 0; i < pRc->cAllocations; ++i)
     
    38393972            if (pAlloc->pD3DIf)
    38403973                pAlloc->pD3DIf->Release();
     3974            if (pAlloc->pSecondaryOpenedD3DIf)
     3975                pAlloc->pSecondaryOpenedD3DIf->Release();
    38413976        }
    38423977    }
     
    38834018    PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];
    38844019    Assert(pRc->RcDesc.fFlags.RenderTarget);
     4020    Assert(pRc->RcDesc.fFlags.Primary);
    38854021    Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
    38864022    Assert(pAlloc->hAllocation);
     4023    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pRc->RcDesc.VidPnSourceId];
     4024    Assert(pScreen->hWnd);
     4025    Assert(pScreen->pDevice9If);
    38874026    D3DDDICB_SETDISPLAYMODE DdiDm = {0};
    38884027    DdiDm.hPrimaryAllocation = pAlloc->hAllocation;
    38894028//    DdiDm.PrivateDriverFormatAttribute = 0;
    3890     Assert(pDevice->pRenderTargetRc == pRc);
    3891     Assert(pDevice->iRenderTargetFrontBuf == pData->SubResourceIndex);
     4029    Assert(pScreen->pRenderTargetRc == pRc);
     4030    Assert(pScreen->iRenderTargetFrontBuf == pData->SubResourceIndex);
    38924031
    38934032#if 0
    3894     IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pAlloc->pD3DIf;
    3895     hr = pDevice->pDevice9If->SetRenderTarget(0, pD3DIfSurf);
     4033    IDirect3DSurface9 *pSoD3DIfSurf = (IDirect3DSurface9*)pAlloc->pSecondaryOpenedD3DIf;
     4034    hr = pScreen->pDevice9If->SetRenderTarget(0, pSoD3DIfSurf);
    38964035    Assert(hr == S_OK);
    38974036    if (hr == S_OK)
     
    39134052    if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
    39144053    {
    3915         Assert(pDevice->pDevice9If);
     4054        PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
     4055        Assert(pRc);
     4056        PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pRc->RcDesc.VidPnSourceId];
     4057        Assert(pScreen->hWnd);
     4058        Assert(pScreen->pDevice9If);
     4059        Assert(pRc == pScreen->pRenderTargetRc);
    39164060#if 1
    39174061        VBOXVDBG_RTGT_STATECHECK(pDevice);
    39184062
    3919         hr = pDevice->pDevice9If->Present(NULL, /* CONST RECT * pSourceRect */
     4063        if (pRc->RcDesc.VidPnSourceId != pDevice->iPrimaryScreen)
     4064        {
     4065            PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SrcSubResourceIndex];
     4066            IDirect3DSurface9 *pSecondaryRt;
     4067            IDirect3DSurface9 *pDataRt = (IDirect3DSurface9*)pAlloc->pSecondaryOpenedD3DIf;
     4068            Assert(pDataRt);
     4069            Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
     4070            hr = pScreen->pDevice9If->GetRenderTarget(0, &pSecondaryRt);
     4071            Assert(hr == S_OK);
     4072            if (hr == S_OK)
     4073            {
     4074                hr = pScreen->pDevice9If->StretchRect(pDataRt,
     4075                                    NULL,
     4076                                    pSecondaryRt,
     4077                                    NULL,
     4078                                    D3DTEXF_NONE);
     4079                pSecondaryRt->Release();
     4080            }
     4081        }
     4082
     4083        hr = pScreen->pDevice9If->Present(NULL, /* CONST RECT * pSourceRect */
    39204084                NULL, /* CONST RECT * pDestRect */
    39214085                NULL, /* HWND hDestWindowOverride */
     
    39334097            Assert(pData->hSrcResource);
    39344098            PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
    3935             Assert(pDevice->pRenderTargetRc == pRc);
     4099            PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pRc->RcDesc.VidPnSourceId];
     4100            Assert(pScreen->hWnd);
     4101            Assert(pScreen->pDevice9If);
     4102            Assert(pScreen->pRenderTargetRc == pRc);
    39364103            Assert(pRc->cAllocations >= 2);
    39374104            Assert(pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
    39384105            Assert(pRc->RcDesc.fFlags.RenderTarget);
    3939             uint32_t iNewRTFB = (pDevice->iRenderTargetFrontBuf + 1) % pRc->cAllocations;
    3940 
    3941             Assert(pDevice->iRenderTargetFrontBuf != iNewRTFB);
     4106            uint32_t iNewRTFB = (pScreen->iRenderTargetFrontBuf + 1) % pRc->cAllocations;
     4107
     4108            Assert(pScreen->iRenderTargetFrontBuf != iNewRTFB);
    39424109            Assert(pData->SrcSubResourceIndex == iNewRTFB);
    39434110
     
    39454112
    39464113            /* assign a new frontbuffer index */
    3947             pDevice->iRenderTargetFrontBuf = iNewRTFB;
     4114            pScreen->iRenderTargetFrontBuf = iNewRTFB;
    39484115
    39494116            VBOXVDBG_RTGT_STATECHECK(pDevice);
     
    39864153    if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
    39874154    {
    3988         Assert(pDevice->pDevice9If);
    3989 #if 0
    3990         hr = pDevice->pDevice9If->Present(NULL, /* CONST RECT * pSourceRect */
    3991                 NULL, /* CONST RECT * pDestRect */
    3992                 NULL, /* HWND hDestWindowOverride */
    3993                 NULL /*CONST RGNDATA * pDirtyRegion */
    3994                 );
    3995         Assert(hr == S_OK);
    3996 #endif
     4155        Assert(pDevice->cScreens);
     4156        for (UINT i = 0; i < RT_ELEMENTS(pDevice->aScreens); ++i)
     4157        {
     4158            PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[i];
     4159            if (pScreen->pDevice9If)
     4160            {
     4161                /* @todo: make a flush */
     4162            }
     4163        }
    39974164    }
    39984165    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    40204187    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    40214188    Assert(pDevice);
    4022     Assert(pDevice->pDevice9If);
     4189    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4190    Assert(pScreen->hWnd);
     4191    Assert(pScreen->pDevice9If);
    40234192    IDirect3DVertexDeclaration9 *pDecl;
    40244193    static D3DVERTEXELEMENT9 DeclEnd = D3DDECL_END();
     
    40434212    if (hr == S_OK)
    40444213    {
    4045         hr = pDevice->pDevice9If->CreateVertexDeclaration(
     4214        hr = pScreen->pDevice9If->CreateVertexDeclaration(
    40464215                pVe,
    40474216                &pDecl
     
    40664235    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    40674236    Assert(pDevice);
    4068     Assert(pDevice->pDevice9If);
     4237    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4238    Assert(pScreen->hWnd);
     4239    Assert(pScreen->pDevice9If);
    40694240    IDirect3DVertexDeclaration9 *pDecl = (IDirect3DVertexDeclaration9*)hShaderHandle;
    40704241    Assert(pDecl);
    4071     HRESULT hr = pDevice->pDevice9If->SetVertexDeclaration(pDecl);
     4242    HRESULT hr = pScreen->pDevice9If->SetVertexDeclaration(pDecl);
    40724243    Assert(hr == S_OK);
    40734244    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    40794250    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    40804251    Assert(pDevice);
    4081     Assert(pDevice->pDevice9If);
     4252    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4253    Assert(pScreen->hWnd);
     4254    Assert(pScreen->pDevice9If);
    40824255    IDirect3DVertexDeclaration9 *pDecl = (IDirect3DVertexDeclaration9*)hShaderHandle;
    40834256    HRESULT hr = S_OK;
     
    40914264    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    40924265    Assert(pDevice);
    4093     Assert(pDevice->pDevice9If);
     4266    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4267    Assert(pScreen->hWnd);
     4268    Assert(pScreen->pDevice9If);
    40944269    IDirect3DVertexShader9 *pShader;
    40954270    Assert(*((UINT*)((uint8_t*)pCode + pData->Size-4)) == 0x0000FFFF /* end token */);
    4096     HRESULT hr = pDevice->pDevice9If->CreateVertexShader((const DWORD *)pCode, &pShader);
     4271    HRESULT hr = pScreen->pDevice9If->CreateVertexShader((const DWORD *)pCode, &pShader);
    40974272    Assert(hr == S_OK);
    40984273    if (hr == S_OK)
     
    41094284    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    41104285    Assert(pDevice);
    4111     Assert(pDevice->pDevice9If);
     4286    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4287    Assert(pScreen->hWnd);
     4288    Assert(pScreen->pDevice9If);
    41124289    IDirect3DVertexShader9 *pShader = (IDirect3DVertexShader9*)hShaderHandle;
    41134290    Assert(pShader);
    4114     HRESULT hr = pDevice->pDevice9If->SetVertexShader(pShader);
     4291    HRESULT hr = pScreen->pDevice9If->SetVertexShader(pShader);
    41154292    Assert(hr == S_OK);
    41164293    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    41224299    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    41234300    Assert(pDevice);
    4124     Assert(pDevice->pDevice9If);
     4301    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4302    Assert(pScreen->hWnd);
     4303    Assert(pScreen->pDevice9If);
    41254304    IDirect3DVertexShader9 *pShader = (IDirect3DVertexShader9*)hShaderHandle;
    41264305    HRESULT hr = S_OK;
     
    41344313    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    41354314    Assert(pDevice);
    4136     Assert(pDevice->pDevice9If);
    4137     HRESULT hr = pDevice->pDevice9If->SetVertexShaderConstantI(pData->Register, pRegisters, pData->Count);
     4315    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4316    Assert(pScreen->hWnd);
     4317    Assert(pScreen->pDevice9If);
     4318    HRESULT hr = pScreen->pDevice9If->SetVertexShaderConstantI(pData->Register, pRegisters, pData->Count);
    41384319    Assert(hr == S_OK);
    41394320    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    41454326    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    41464327    Assert(pDevice);
    4147     Assert(pDevice->pDevice9If);
    4148     HRESULT hr = pDevice->pDevice9If->SetVertexShaderConstantB(pData->Register, pRegisters, pData->Count);
     4328    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4329    Assert(pScreen->hWnd);
     4330    Assert(pScreen->pDevice9If);
     4331    HRESULT hr = pScreen->pDevice9If->SetVertexShaderConstantB(pData->Register, pRegisters, pData->Count);
    41494332    Assert(hr == S_OK);
    41504333    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    41564339    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    41574340    Assert(pDevice);
    4158     Assert(pDevice->pDevice9If);
    4159     HRESULT hr = pDevice->pDevice9If->SetScissorRect(pRect);
     4341    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4342    Assert(pScreen->hWnd);
     4343    Assert(pScreen->pDevice9If);
     4344    HRESULT hr = pScreen->pDevice9If->SetScissorRect(pRect);
    41604345    Assert(hr == S_OK);
    41614346    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    41674352    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    41684353    Assert(pDevice);
    4169     Assert(pDevice->pDevice9If);
     4354    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4355    Assert(pScreen->hWnd);
     4356    Assert(pScreen->pDevice9If);
    41704357    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hVertexBuffer;
    41714358    PVBOXWDDMDISP_ALLOCATION pAlloc = NULL;
     
    41784365        pStreamData = (IDirect3DVertexBuffer9*)pAlloc->pD3DIf;
    41794366    }
    4180     HRESULT hr = pDevice->pDevice9If->SetStreamSource(pData->Stream, pStreamData, pData->Offset, pData->Stride);
     4367    HRESULT hr = pScreen->pDevice9If->SetStreamSource(pData->Stream, pStreamData, pData->Offset, pData->Stride);
    41814368    Assert(hr == S_OK);
    41824369    Assert(pData->Stream<VBOXWDDMDISP_MAX_VERTEX_STREAMS);
     
    43294516    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    43304517    Assert(pDevice);
    4331     Assert(pDevice->pDevice9If);
     4518    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4519    Assert(pScreen->hWnd);
     4520    Assert(pScreen->pDevice9If);
    43324521    PVBOXWDDMDISP_RESOURCE pDstRc = (PVBOXWDDMDISP_RESOURCE)pData->hDstResource;
    43334522    PVBOXWDDMDISP_RESOURCE pSrcRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
    43344523    Assert(pDstRc->cAllocations > pData->DstSubResourceIndex);
    43354524    Assert(pSrcRc->cAllocations > pData->SrcSubResourceIndex);
    4336     Assert(pDstRc != pDevice->pRenderTargetRc || pDevice->iRenderTargetFrontBuf != pData->DstSubResourceIndex);
     4525    Assert(pDstRc != pScreen->pRenderTargetRc || pScreen->iRenderTargetFrontBuf != pData->DstSubResourceIndex);
    43374526    HRESULT hr = S_OK;
    43384527    /* try StretchRect */
     
    43474536        {
    43484537#ifndef VBOXWDDM_WITH_VISIBLE_FB
    4349             if (pSrcRc == pDevice->pRenderTargetRc && pDevice->iRenderTargetFrontBuf == pData->SrcSubResourceIndex)
     4538            if (pSrcRc == pScreen->pRenderTargetRc && pScreen->iRenderTargetFrontBuf == pData->SrcSubResourceIndex)
    43504539            {
    43514540                PVBOXWDDMDISP_ALLOCATION pSrcAlloc = &pSrcRc->aAllocations[pData->SrcSubResourceIndex];
     
    43784567                        && pSrcAlloc->SurfDesc.format == pDstAlloc->SurfDesc.format)
    43794568                {
    4380                     hr = pDevice->pDevice9If->GetFrontBufferData(0, pDstSurfIf);
     4569                    hr = pScreen->pDevice9If->GetFrontBufferData(0, pDstSurfIf);
    43814570                    Assert(hr == S_OK);
    43824571                    break;
     
    43874576                    pSrcSurfIf = pDevice->pRenderTargetFbCopy;
    43884577                    Assert(pSrcSurfIf);
    4389                     hr = pDevice->pDevice9If->GetFrontBufferData(0, pDevice->pRenderTargetFbCopy);
     4578                    hr = pScreen->pDevice9If->GetFrontBufferData(0, pDevice->pRenderTargetFbCopy);
    43904579                    Assert(hr == S_OK);
    43914580                    if (hr == S_OK)
     
    44454634                /* we support only Point & Linear, we ignore [Begin|Continue|End]PresentToDwm */
    44464635                Assert((pData->Flags.Value & (~(0x00000100 | 0x00000200 | 0x00000400 | 0x00000001  | 0x00000002))) == 0);
    4447                 hr = pDevice->pDevice9If->StretchRect(pSrcSurfIf,
     4636                hr = pScreen->pDevice9If->StretchRect(pSrcSurfIf,
    44484637                                    &pData->SrcRect,
    44494638                                    pDstSurfIf,
     
    44944683                    )
    44954684            {
    4496                 hr = pDevice->pDevice9If->UpdateTexture(pD3DIfSrcTex, pD3DIfDstTex);
     4685                hr = pScreen->pDevice9If->UpdateTexture(pD3DIfSrcTex, pD3DIfDstTex);
    44974686                Assert(hr == S_OK);
    44984687            }
     
    45854774    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    45864775    Assert(pDevice);
    4587     Assert(pDevice->pDevice9If);
     4776    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4777    Assert(pScreen->hWnd);
     4778    Assert(pScreen->pDevice9If);
    45884779    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hResource;
    45894780    Assert(pRc);
     
    45944785    {
    45954786        Assert(pSurfIf);
    4596         hr = pDevice->pDevice9If->ColorFill(pSurfIf, &pData->DstRect, pData->Color);
     4787        hr = pScreen->pDevice9If->ColorFill(pSurfIf, &pData->DstRect, pData->Color);
    45974788        Assert(hr == S_OK);
    45984789        /* @todo: check what need to do when PresentToDwm flag is set */
     
    46444835    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    46454836    Assert(pDevice);
    4646     Assert(pDevice->pDevice9If);
     4837    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4838    Assert(pScreen->hWnd);
     4839    Assert(pScreen->pDevice9If);
    46474840    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hRenderTarget;
    46484841    Assert(pRc);
    46494842    Assert(pData->SubResourceIndex < pRc->cAllocations);
    4650     if (pRc == pDevice->pRenderTargetRc)
     4843    PVBOXWDDMDISP_SCREEN pVisibleScreen = pRc->RcDesc.fFlags.Primary ? &pDevice->aScreens[pRc->RcDesc.VidPnSourceId] : pScreen;
     4844    if (pRc == pVisibleScreen->pRenderTargetRc)
    46514845    {
    46524846        /* backbuffer */
    4653         Assert(pData->SubResourceIndex == ((pDevice->iRenderTargetFrontBuf + 1) % pDevice->pRenderTargetRc->cAllocations));
     4847        Assert(pData->SubResourceIndex == ((pVisibleScreen->iRenderTargetFrontBuf + 1) % pVisibleScreen->pRenderTargetRc->cAllocations));
    46544848    }
    46554849
    46564850    HRESULT hr = S_OK;
    46574851    IDirect3DSurface9 *pD3D9Surf;
    4658     if (pRc == pDevice->pRenderTargetRc && pRc->cAllocations == 1 && pData->RenderTargetIndex == 0)
     4852    if (pRc == pScreen->pRenderTargetRc && pRc->cAllocations == 1 && pData->RenderTargetIndex == 0)
    46594853    {
    46604854        /* work-around wine double-buffering for the case we have no backbuffers */
    4661         hr = pDevice->pDevice9If->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pD3D9Surf);
     4855        hr = pScreen->pDevice9If->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pD3D9Surf);
    46624856        Assert(hr == S_OK);
    46634857        Assert(pD3D9Surf);
     
    46724866    {
    46734867        Assert(pD3D9Surf);
    4674         hr = pDevice->pDevice9If->SetRenderTarget(pData->RenderTargetIndex, pD3D9Surf);
     4868        hr = pScreen->pDevice9If->SetRenderTarget(pData->RenderTargetIndex, pD3D9Surf);
    46754869        Assert(hr == S_OK);
    46764870        pD3D9Surf->Release();
     
    46844878    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    46854879    Assert(pDevice);
    4686     Assert(pDevice->pDevice9If);
     4880    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4881    Assert(pScreen->hWnd);
     4882    Assert(pScreen->pDevice9If);
    46874883    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hZBuffer;
    46884884    IDirect3DSurface9 *pD3D9Surf = NULL;
     
    46934889        Assert(pD3D9Surf);
    46944890    }
    4695     HRESULT hr = pDevice->pDevice9If->SetDepthStencilSurface(pD3D9Surf);
     4891    HRESULT hr = pScreen->pDevice9If->SetDepthStencilSurface(pD3D9Surf);
    46964892    Assert(hr == S_OK);
    46974893    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    47104906    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    47114907    Assert(pDevice);
    4712     Assert(pDevice->pDevice9If);
    4713     HRESULT hr = pDevice->pDevice9If->SetPixelShaderConstantI(pData->Register, pRegisters, pData->Count);
     4908    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4909    Assert(pScreen->hWnd);
     4910    Assert(pScreen->pDevice9If);
     4911    HRESULT hr = pScreen->pDevice9If->SetPixelShaderConstantI(pData->Register, pRegisters, pData->Count);
    47144912    Assert(hr == S_OK);
    47154913    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    47214919    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    47224920    Assert(pDevice);
    4723     Assert(pDevice->pDevice9If);
    4724     HRESULT hr = pDevice->pDevice9If->SetPixelShaderConstantB(pData->Register, pRegisters, pData->Count);
     4921    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4922    Assert(pScreen->hWnd);
     4923    Assert(pScreen->pDevice9If);
     4924    HRESULT hr = pScreen->pDevice9If->SetPixelShaderConstantB(pData->Register, pRegisters, pData->Count);
    47254925    Assert(hr == S_OK);
    47264926    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    47324932    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    47334933    Assert(pDevice);
    4734     Assert(pDevice->pDevice9If);
     4934    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4935    Assert(pScreen->hWnd);
     4936    Assert(pScreen->pDevice9If);
    47354937    IDirect3DPixelShader9 *pShader;
    47364938    Assert(*((UINT*)((uint8_t*)pCode + pData->CodeSize-4)) == 0x0000FFFF /* end token */);
    4737     HRESULT hr = pDevice->pDevice9If->CreatePixelShader((const DWORD *)pCode, &pShader);
     4939    HRESULT hr = pScreen->pDevice9If->CreatePixelShader((const DWORD *)pCode, &pShader);
    47384940    Assert(hr == S_OK);
    47394941    if (hr == S_OK)
     
    47504952    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    47514953    Assert(pDevice);
    4752     Assert(pDevice->pDevice9If);
     4954    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     4955    Assert(pScreen->hWnd);
     4956    Assert(pScreen->pDevice9If);
    47534957    IDirect3DPixelShader9 *pShader = (IDirect3DPixelShader9*)hShaderHandle;
    47544958    HRESULT hr = S_OK;
     
    48755079    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    48765080    PVBOXWDDMDISP_ADAPTER pAdapter = pDevice->pAdapter;
    4877     if (pDevice->pDevice9If)
    4878     {
     5081//    Assert(!pDevice->cScreens);
    48795082#ifndef VBOXWDDM_WITH_VISIBLE_FB
     5083    if(pDevice->pRenderTargetFbCopy)
    48805084        pDevice->pRenderTargetFbCopy->Release();
    48815085#endif
    4882         pDevice->pDevice9If->Release();
    4883         Assert(pDevice->hWnd);
    4884         HRESULT tmpHr = VBoxDispWndDestroy(pAdapter, pDevice->hWnd);
    4885         Assert(tmpHr == S_OK);
    4886     }
     5086    for (UINT i = 0; i < RT_ELEMENTS(pDevice->aScreens); ++i)
     5087    {
     5088        PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[i];
     5089        if (pScreen->pDevice9If)
     5090        {
     5091            pScreen->pDevice9If->Release();
     5092            Assert(pScreen->hWnd);
     5093            HRESULT tmpHr = VBoxDispWndDestroy(pAdapter, pScreen->hWnd);
     5094            Assert(tmpHr == S_OK);
     5095        }
     5096    }
     5097
    48875098    HRESULT hr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
    48885099    Assert(hr == S_OK);
     
    52155426                if (pRc->RcDesc.fFlags.Texture)
    52165427                {
    5217                     Assert(pDevice->pDevice9If);
    5218 
     5428                    PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pDevice->iPrimaryScreen];
     5429                    Assert(pScreen->hWnd);
     5430                    Assert(pScreen->pDevice9If);
    52195431                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[0];
    52205432                    IDirect3DTexture9 *pD3DIfTex;
     
    52225434                    Assert(pAllocation->hSharedHandle);
    52235435
    5224                     hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice->pDevice9If,
     5436                    hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pScreen->pDevice9If,
    52255437                                                pAllocation->SurfDesc.width,
    52265438                                                pAllocation->SurfDesc.height,
     
    56735885    Assert(pRc->cAllocations > iAlloc);
    56745886    PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[iAlloc];
     5887    BOOL bPrimary = pRc->RcDesc.fFlags.Primary;
     5888    BOOL bFrontBuf = FALSE;
     5889    if (bPrimary)
     5890    {
     5891        PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[pRc->RcDesc.VidPnSourceId];
     5892        Assert(pRc == pScreen->pRenderTargetRc);
     5893        bFrontBuf = (iAlloc == pScreen->iRenderTargetFrontBuf);
     5894    }
    56755895    vboxVDbgDoMpPrintF(pDevice, "%s width(%d), height(%d), format(%d), usage(%s), %s", pPrefix,
    56765896            pAlloc->SurfDesc.width, pAlloc->SurfDesc.height, pAlloc->SurfDesc.format,
    5677             pRc == pDevice->pRenderTargetRc ?
    5678                     (iAlloc == pDevice->iRenderTargetFrontBuf ? "Front Buffer" : "Back Buffer")
     5897            bPrimary ?
     5898                    (bFrontBuf ? "Front Buffer" : "Back Buffer")
    56795899                    : "?Everage? Alloc",
    56805900            pSuffix);
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h

    r31713 r31797  
    9191} VBOXWDDMDISP_INDICES_INFO;
    9292
     93typedef struct VBOXWDDMDISP_SCREEN
     94{
     95    IDirect3DDevice9 *pDevice9If;
     96    struct VBOXWDDMDISP_RESOURCE *pRenderTargetRc;
     97    uint32_t iRenderTargetFrontBuf;
     98    HWND hWnd;
     99} VBOXWDDMDISP_SCREEN, *PVBOXWDDMDISP_SCREEN;
     100
    93101typedef struct VBOXWDDMDISP_DEVICE
    94102{
     
    101109    UINT cbCmdBuffer;
    102110    D3DDDI_CREATEDEVICEFLAGS fFlags;
    103     HWND hWnd;
    104111#ifndef VBOXWDDM_WITH_VISIBLE_FB
    105112    IDirect3DSurface9 *pRenderTargetFbCopy;
    106113#endif
    107     struct VBOXWDDMDISP_RESOURCE *pRenderTargetRc;
    108     uint32_t iRenderTargetFrontBuf;
    109114    /* number of StreamSources set */
    110115    UINT cStreamSources;
     
    115120    VBOXWDDMDISP_ALLOCATION *pIndicesAlloc;
    116121    VBOXWDDMDISP_INDICES_INFO IndiciesInfo;
    117     IDirect3DDevice9 *pDevice9If;
    118122    /* need to cache the ViewPort data because IDirect3DDevice9::SetViewport
    119123     * is split into two calls : SetViewport & SetZRange */
    120124    D3DVIEWPORT9 ViewPort;
    121125    VBOXWDDMDISP_CONTEXT DefaultContext;
     126
     127    UINT iPrimaryScreen;
     128    UINT cScreens;
     129    VBOXWDDMDISP_SCREEN aScreens[VBOX_VIDEO_MAX_SCREENS];
    122130} VBOXWDDMDISP_DEVICE, *PVBOXWDDMDISP_DEVICE;
    123131
     
    150158    /* object type is defined by enmD3DIfType enum */
    151159    IUnknown *pD3DIf;
     160    IUnknown *pSecondaryOpenedD3DIf;
    152161    VBOXDISP_D3DIFTYPE enmD3DIfType;
    153162    HANDLE hSharedHandle;
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMp.cpp

    r30532 r31797  
    138138        Assert(pHdr);
    139139        VBOXWDDMDISP_CONTEXT *pContext = (VBOXWDDMDISP_CONTEXT*)pHdr->u64UmData;
    140         Assert(pContext->pDevice->hWnd);
    141         pRegions->hWnd = pContext->pDevice->hWnd;
    142         pRegions->pRegions = (PVBOXVIDEOCM_CMD_RECTS)(((uint8_t*)pHdr) + sizeof (VBOXVIDEOCM_CMD_HDR));
     140        PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)(((uint8_t*)pHdr) + sizeof (VBOXVIDEOCM_CMD_HDR));
     141        UINT iScreen = pContext->pDevice->cScreens == 1 ? pContext->pDevice->iPrimaryScreen : pCmdInternal->VidPnSourceId;
     142        PVBOXWDDMDISP_SCREEN pScreen = &pContext->pDevice->aScreens[iScreen];
     143        Assert(pScreen->hWnd);
     144        Assert(pScreen->pDevice9If);
     145        pRegions->hWnd = pScreen->hWnd;
     146        pRegions->pRegions = &pCmdInternal->Cmd;
    143147    }
    144148    return hr;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h

    r31713 r31797  
    2828
    2929
    30 /* @todo: implement a check to ensure display & miniport versions match.
    31  * One would increase this whenever definitions in this file are changed */
    32 #define VBOXVIDEOIF_VERSION 4
     30/* One would increase this whenever definitions in this file are changed */
     31#define VBOXVIDEOIF_VERSION 5
    3332
    3433/* create allocation func */
     
    213212} VBOXVIDEOCM_CMD_RECTS, *PVBOXVIDEOCM_CMD_RECTS;
    214213
    215 #define VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(_cRects) (RT_OFFSETOF(VBOXVIDEOCM_CMD_RECTS, RectsInfo.aRects[(_cRects)]))
    216 #define VBOXVIDEOCM_CMD_RECTS_SIZE(_pCmd) (VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS((_pCmd)->cRects))
     214typedef struct VBOXVIDEOCM_CMD_RECTS_INTERNAL
     215{
     216    D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
     217    UINT u32Reserved;
     218    VBOXVIDEOCM_CMD_RECTS Cmd;
     219} VBOXVIDEOCM_CMD_RECTS_INTERNAL, *PVBOXVIDEOCM_CMD_RECTS_INTERNAL;
     220
     221#define VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(_cRects) (RT_OFFSETOF(VBOXVIDEOCM_CMD_RECTS_INTERNAL, Cmd.RectsInfo.aRects[(_cRects)]))
     222#define VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE(_pCmd) (VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS((_pCmd)->cRects))
    217223
    218224typedef struct VBOXWDDM_GETVBOXVIDEOCMCMD_HDR
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp

    r31763 r31797  
    310310    PVBOXWDDM_RECTS_INFO pRects = &pRectsInfo->ContextsRects.UpdateRects;
    311311    NTSTATUS Status = STATUS_SUCCESS;
    312     PVBOXVIDEOCM_CMD_RECTS pCmd = NULL;
    313     uint32_t cbCmd = VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(pRects->cRects);
     312    PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = NULL;
     313    uint32_t cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects);
    314314    Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
    315315    ExAcquireFastMutex(&pDevExt->ContextMutex);
     
    319319        {
    320320            PVBOXWDDM_CONTEXT pCurContext = VBOXWDDMENTRY_2_CONTEXT(pCur);
    321             if (!pCmd)
    322             {
    323                 pCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdCreate(&pCurContext->CmContext, cbCmd);
    324                 Assert(pCmd);
    325                 if (!pCmd)
     321            if (!pCmdInternal)
     322            {
     323                pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pCurContext->CmContext, cbCmdInternal);
     324                Assert(pCmdInternal);
     325                if (!pCmdInternal)
    326326                {
    327327                    Status = STATUS_NO_MEMORY;
     
    331331            else
    332332            {
    333                 pCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdReinitForContext(pCmd, &pCurContext->CmContext);
     333                pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pCurContext->CmContext);
    334334            }
    335335
    336             vboxVdmaDirtyRectsCalcIntersection(&pCurContext->ViewRect, pRects, &pCmd->RectsInfo);
    337             if (pCmd->RectsInfo.cRects)
     336            vboxVdmaDirtyRectsCalcIntersection(&pCurContext->ViewRect, pRects, &pCmdInternal->Cmd.RectsInfo);
     337            if (pCmdInternal->Cmd.RectsInfo.cRects)
    338338            {
    339339                bool bSend = false;
    340                 pCmd->fFlags.Value = 0;
    341                 pCmd->fFlags.bAddHiddenRects = 1;
     340                pCmdInternal->Cmd.fFlags.Value = 0;
     341                pCmdInternal->Cmd.fFlags.bAddHiddenRects = 1;
    342342                if (pCurContext->pLastReportedRects)
    343343                {
    344                     if (pCurContext->pLastReportedRects->fFlags.bSetVisibleRects)
     344                    if (pCurContext->pLastReportedRects->Cmd.fFlags.bSetVisibleRects)
    345345                    {
    346346                        RECT *paPrevRects;
    347347                        uint32_t cPrevRects;
    348                         if (pCurContext->pLastReportedRects->fFlags.bSetViewRect)
     348                        if (pCurContext->pLastReportedRects->Cmd.fFlags.bSetViewRect)
    349349                        {
    350                             paPrevRects = &pCurContext->pLastReportedRects->RectsInfo.aRects[1];
    351                             cPrevRects = pCurContext->pLastReportedRects->RectsInfo.cRects - 1;
     350                            paPrevRects = &pCurContext->pLastReportedRects->Cmd.RectsInfo.aRects[1];
     351                            cPrevRects = pCurContext->pLastReportedRects->Cmd.RectsInfo.cRects - 1;
    352352                        }
    353353                        else
    354354                        {
    355                             paPrevRects = &pCurContext->pLastReportedRects->RectsInfo.aRects[0];
    356                             cPrevRects = pCurContext->pLastReportedRects->RectsInfo.cRects;
     355                            paPrevRects = &pCurContext->pLastReportedRects->Cmd.RectsInfo.aRects[0];
     356                            cPrevRects = pCurContext->pLastReportedRects->Cmd.RectsInfo.cRects;
    357357                        }
    358358
    359                         if (vboxVdmaDirtyRectsHasIntersections(paPrevRects, cPrevRects, pCmd->RectsInfo.aRects, pCmd->RectsInfo.cRects))
     359                        if (vboxVdmaDirtyRectsHasIntersections(paPrevRects, cPrevRects,
     360                                pCmdInternal->Cmd.RectsInfo.aRects, pCmdInternal->Cmd.RectsInfo.cRects))
    360361                        {
    361362                            bSend = true;
     
    364365                    else
    365366                    {
    366                         Assert(pCurContext->pLastReportedRects->fFlags.bAddHiddenRects);
    367                         if (!vboxVdmaDirtyRectsIsCover(pCurContext->pLastReportedRects->RectsInfo.aRects,
    368                                 pCurContext->pLastReportedRects->RectsInfo.cRects,
    369                                 pCmd->RectsInfo.aRects, pCmd->RectsInfo.cRects))
     367                        Assert(pCurContext->pLastReportedRects->Cmd.fFlags.bAddHiddenRects);
     368                        if (!vboxVdmaDirtyRectsIsCover(pCurContext->pLastReportedRects->Cmd.RectsInfo.aRects,
     369                                pCurContext->pLastReportedRects->Cmd.RectsInfo.cRects,
     370                                pCmdInternal->Cmd.RectsInfo.aRects, pCmdInternal->Cmd.RectsInfo.cRects))
    370371                        {
    371372                            bSend = true;
     
    380381                    if (pCurContext->pLastReportedRects)
    381382                        vboxVideoCmCmdRelease(pCurContext->pLastReportedRects);
    382                     vboxVideoCmCmdRetain(pCmd);
    383                     pCurContext->pLastReportedRects = pCmd;
    384                     vboxVideoCmCmdSubmit(pCmd, VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(pCmd->RectsInfo.cRects));
    385                     pCmd = NULL;
     383
     384                    pCmdInternal->VidPnSourceId = pRectsInfo->VidPnSourceId;
     385
     386                    vboxVideoCmCmdRetain(pCmdInternal);
     387                    pCurContext->pLastReportedRects = pCmdInternal;
     388                    vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pCmdInternal->Cmd.RectsInfo.cRects));
     389                    pCmdInternal = NULL;
    386390                }
    387391            }
     
    394398                    || pContext->ViewRect.right != pContextRect->right
    395399                    || pContext->ViewRect.bottom != pContextRect->bottom);
    396             PVBOXVIDEOCM_CMD_RECTS pDrCmd;
     400            PVBOXVIDEOCM_CMD_RECTS_INTERNAL pDrCmdInternal;
    397401
    398402            bool bSend = false;
     
    400404            if (bRectShanged)
    401405            {
    402                 uint32_t cbDrCmd = VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(pRects->cRects + 1);
    403                 pDrCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdCreate(&pContext->CmContext, cbDrCmd);
    404                 Assert(pDrCmd);
    405                 if (!pDrCmd)
     406                uint32_t cbDrCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects + 1);
     407                pDrCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pContext->CmContext, cbDrCmdInternal);
     408                Assert(pDrCmdInternal);
     409                if (!pDrCmdInternal)
    406410                {
    407411                    Status = STATUS_NO_MEMORY;
    408412                    break;
    409413                }
    410                 pDrCmd->fFlags.Value = 0;
    411                 pDrCmd->RectsInfo.cRects = pRects->cRects + 1;
    412                 pDrCmd->fFlags.bSetViewRect = 1;
    413                 pDrCmd->RectsInfo.aRects[0] = *pContextRect;
     414                pDrCmdInternal->Cmd.fFlags.Value = 0;
     415                pDrCmdInternal->Cmd.RectsInfo.cRects = pRects->cRects + 1;
     416                pDrCmdInternal->Cmd.fFlags.bSetViewRect = 1;
     417                pDrCmdInternal->Cmd.RectsInfo.aRects[0] = *pContextRect;
    414418                pContext->ViewRect = *pContextRect;
    415                 memcpy(&pDrCmd->RectsInfo.aRects[1], pRects->aRects, sizeof (RECT) * pRects->cRects);
     419                memcpy(&pDrCmdInternal->Cmd.RectsInfo.aRects[1], pRects->aRects, sizeof (RECT) * pRects->cRects);
    416420                bSend = true;
    417421            }
    418422            else
    419423            {
    420                 if (pCmd)
    421                 {
    422                     pDrCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdReinitForContext(pCmd, &pContext->CmContext);
    423                     pCmd = NULL;
     424                if (pCmdInternal)
     425                {
     426                    pDrCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pContext->CmContext);
     427                    pCmdInternal = NULL;
    424428                }
    425429                else
    426430                {
    427                     pDrCmd = (PVBOXVIDEOCM_CMD_RECTS)vboxVideoCmCmdCreate(&pContext->CmContext, cbCmd);
    428                     Assert(pDrCmd);
    429                     if (!pDrCmd)
     431                    pDrCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pContext->CmContext, cbCmdInternal);
     432                    Assert(pDrCmdInternal);
     433                    if (!pDrCmdInternal)
    430434                    {
    431435                        Status = STATUS_NO_MEMORY;
     
    433437                    }
    434438                }
    435                 pDrCmd->fFlags.Value = 0;
    436                 pDrCmd->RectsInfo.cRects = pRects->cRects;
    437                 memcpy(&pDrCmd->RectsInfo.aRects[0], pRects->aRects, sizeof (RECT) * pRects->cRects);
     439                pDrCmdInternal->Cmd.fFlags.Value = 0;
     440                pDrCmdInternal->Cmd.RectsInfo.cRects = pRects->cRects;
     441                memcpy(&pDrCmdInternal->Cmd.RectsInfo.aRects[0], pRects->aRects, sizeof (RECT) * pRects->cRects);
    438442
    439443                if (pContext->pLastReportedRects)
    440444                {
    441                     if (pContext->pLastReportedRects->fFlags.bSetVisibleRects)
     445                    if (pContext->pLastReportedRects->Cmd.fFlags.bSetVisibleRects)
    442446                    {
    443447                        RECT *paRects;
    444448                        uint32_t cRects;
    445                         if (pContext->pLastReportedRects->fFlags.bSetViewRect)
     449                        if (pContext->pLastReportedRects->Cmd.fFlags.bSetViewRect)
    446450                        {
    447                             paRects = &pContext->pLastReportedRects->RectsInfo.aRects[1];
    448                             cRects = pContext->pLastReportedRects->RectsInfo.cRects - 1;
     451                            paRects = &pContext->pLastReportedRects->Cmd.RectsInfo.aRects[1];
     452                            cRects = pContext->pLastReportedRects->Cmd.RectsInfo.cRects - 1;
    449453                        }
    450454                        else
    451455                        {
    452                             paRects = &pContext->pLastReportedRects->RectsInfo.aRects[0];
    453                             cRects = pContext->pLastReportedRects->RectsInfo.cRects;
     456                            paRects = &pContext->pLastReportedRects->Cmd.RectsInfo.aRects[0];
     457                            cRects = pContext->pLastReportedRects->Cmd.RectsInfo.cRects;
    454458                        }
    455                         bSend = (pDrCmd->RectsInfo.cRects != cRects)
    456                                 || memcmp(paRects, pDrCmd->RectsInfo.aRects, cRects * sizeof (RECT));
     459                        bSend = (pDrCmdInternal->Cmd.RectsInfo.cRects != cRects)
     460                                || memcmp(paRects, pDrCmdInternal->Cmd.RectsInfo.aRects, cRects * sizeof (RECT));
    457461                    }
    458462                    else
    459463                    {
    460                         Assert(pContext->pLastReportedRects->fFlags.bAddHiddenRects);
     464                        Assert(pContext->pLastReportedRects->Cmd.fFlags.bAddHiddenRects);
    461465                        bSend = true;
    462466                    }
     
    473477                    vboxVideoCmCmdRelease(pContext->pLastReportedRects);
    474478
    475                 pDrCmd->fFlags.bSetVisibleRects = 1;
    476 
    477                 vboxVideoCmCmdRetain(pDrCmd);
    478                 pContext->pLastReportedRects = pDrCmd;
    479                 vboxVideoCmCmdSubmit(pDrCmd, VBOXVIDEOCM_SUBMITSIZE_DEFAULT);
     479                pDrCmdInternal->Cmd.fFlags.bSetVisibleRects = 1;
     480                pDrCmdInternal->VidPnSourceId = pRectsInfo->VidPnSourceId;
     481
     482                vboxVideoCmCmdRetain(pDrCmdInternal);
     483                pContext->pLastReportedRects = pDrCmdInternal;
     484                vboxVideoCmCmdSubmit(pDrCmdInternal, VBOXVIDEOCM_SUBMITSIZE_DEFAULT);
    480485            }
    481486            else
    482487            {
    483                 if (!pCmd)
    484                     pCmd = pDrCmd;
     488                if (!pCmdInternal)
     489                    pCmdInternal = pDrCmdInternal;
    485490                else
    486                     vboxVideoCmCmdRelease(pDrCmd);
     491                    vboxVideoCmCmdRelease(pDrCmdInternal);
    487492            }
    488493        }
     
    491496
    492497
    493     if (pCmd)
    494         vboxVideoCmCmdRelease(pCmd);
     498    if (pCmdInternal)
     499        vboxVideoCmCmdRelease(pCmdInternal);
    495500
    496501    return Status;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h

    r30953 r31797  
    7979    VBOXVDMAPIPE_CMD_DR Hdr;
    8080    struct VBOXWDDM_CONTEXT *pContext;
     81    D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
    8182    VBOXVDMAPIPE_RECTS ContextsRects;
    8283} VBOXVDMAPIPE_CMD_RECTSINFO, *PVBOXVDMAPIPE_CMD_RECTSINFO;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r31763 r31797  
    20662066}
    20672067
    2068 static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
     2068static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
    20692069{
    20702070    PVBOXVDMAPIPE_CMD_RECTSINFO pRectsCmd = (PVBOXVDMAPIPE_CMD_RECTSINFO)vboxVdmaGgCmdCreate(&pDevExt->u.primary.Vdma.DmaGg, VBOXVDMAPIPE_CMD_TYPE_RECTSINFO, RT_OFFSETOF(VBOXVDMAPIPE_CMD_RECTSINFO, ContextsRects.UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
     
    20722072    if (pRectsCmd)
    20732073    {
     2074        VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pBlt->Hdr.DstAllocInfo.srcId];
     2075        VBOXWDDM_CONTEXT *pContext = pBlt->Hdr.pContext;
    20742076        pRectsCmd->pContext = pContext;
     2077        pRectsCmd->VidPnSourceId = pBlt->Hdr.SrcAllocInfo.srcId;
    20752078        memcpy(&pRectsCmd->ContextsRects, &pBlt->DstRects, RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
    20762079        vboxWddmRectTranslate(&pRectsCmd->ContextsRects.ContextRect, pSource->VScreenPos.x, pSource->VScreenPos.y);
     
    21842187                                    VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, pSource, &rect);
    21852188                                }
    2186                                 vboxWddmSubmitBltCmd(pDevExt, pSource, pContext, pBlt);
     2189                                vboxWddmSubmitBltCmd(pDevExt, pBlt);
    21872190                                break;
    21882191                            }
     
    21932196                                if (pSrcAlloc->fRcFlags.RenderTarget)
    21942197                                {
    2195                                     vboxWddmSubmitBltCmd(pDevExt, pSource, pContext, pBlt);
     2198                                    vboxWddmSubmitBltCmd(pDevExt, pBlt);
    21962199                                }
    21972200                                break;
     
    22372240                VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
    22382241                pRectsCmd->pContext = pContext;
     2242                pRectsCmd->VidPnSourceId = pPrivateData->SrcAllocInfo.srcId;
    22392243                RECT r;
    22402244                r.left = pSource->VScreenPos.x;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h

    r30973 r31797  
    132132    UINT uLastCompletedCmdFenceId;
    133133    RECT ViewRect;
    134     PVBOXVIDEOCM_CMD_RECTS pLastReportedRects;
     134    PVBOXVIDEOCM_CMD_RECTS_INTERNAL pLastReportedRects;
    135135    VBOXVIDEOCM_CTX CmContext;
    136136} VBOXWDDM_CONTEXT, *PVBOXWDDM_CONTEXT;
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