VirtualBox

Ignore:
Timestamp:
Aug 16, 2010 10:59:01 AM (14 years ago)
Author:
vboxsync
Message:

wddm: multimonitor support

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk

    r30855 r31687  
    9090    wddm/VBoxDispCm.cpp \
    9191    wddm/VBoxDispMp.cpp \
     92    wddm/VBoxScreen.cpp \
    9293    wddm/VBoxDispMpTst.cpp \
    9394        wddm/VBoxDispD3D.def \
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r30986 r31687  
    2323#include "VBoxDispD3DCmn.h"
    2424#include "VBoxDispD3D.h"
     25#include "VBoxScreen.h"
    2526
    2627#ifdef VBOXDISPMP_TEST
     
    3435
    3536#define VBOXWDDMDISP_WITH_TMPWORKAROUND 1
     37
     38static VBOXSCREENMONRUNNER g_VBoxScreenMonRunner;
    3639
    3740//#define VBOXWDDMOVERLAY_TEST
     
    13441347                    LPVOID    lpReserved)
    13451348{
    1346     BOOL bOk = TRUE;
    1347 
    13481349    switch (dwReason)
    13491350    {
    13501351        case DLL_PROCESS_ATTACH:
    13511352        {
     1353            vboxVDbgPrint(("VBoxDispD3D: DLL loaded.\n"));
    13521354#ifdef VBOXWDDMDISP_DEBUG
    13531355            vboxVDbgVEHandlerRegister();
     
    13571359            HRESULT hr = vboxDispCmInit();
    13581360            Assert(hr == S_OK);
     1361            if (hr == S_OK)
     1362            {
    13591363#ifdef VBOXDISPMP_TEST
    1360             if (hr == S_OK)
    1361             {
    13621364                hr = vboxDispMpTstStart();
    13631365                Assert(hr == S_OK);
    1364             }
     1366                if (hr == S_OK)
    13651367#endif
    1366             if (hr == S_OK)
    1367                 vboxVDbgPrint(("VBoxDispD3D: DLL loaded.\n"));
    1368             else
    1369                 bOk = FALSE;
    1370 
     1368                {
     1369                    hr = VBoxScreenMRunnerStart(&g_VBoxScreenMonRunner);
     1370                    Assert(hr == S_OK);
     1371                    /* succeed in any way */
     1372                    hr = S_OK;
     1373                    if (hr == S_OK)
     1374                    {
     1375                        vboxVDbgPrint(("VBoxDispD3D: DLL loaded OK\n"));
     1376                        return TRUE;
     1377                    }
     1378#ifdef VBOXDISPMP_TEST
     1379                    vboxDispMpTstStop();
     1380#endif
     1381                }
     1382                vboxDispCmTerm();
     1383            }
    13711384//                VbglR3Init();
    13721385            break;
     
    13781391            vboxVDbgVEHandlerUnregister();
    13791392#endif
    1380             HRESULT hr;
    1381 #ifdef VBOXDISPMP_TEST
    1382             hr = vboxDispMpTstStop();
     1393            HRESULT hr = VBoxScreenMRunnerStop(&g_VBoxScreenMonRunner);
    13831394            Assert(hr == S_OK);
    13841395            if (hr == S_OK)
    1385 #endif
    1386             {
    1387                 hr = vboxDispCmTerm();
     1396            {
     1397#ifdef VBOXDISPMP_TEST
     1398                hr = vboxDispMpTstStop();
    13881399                Assert(hr == S_OK);
    13891400                if (hr == S_OK)
    1390                     vboxVDbgPrint(("VBoxDispD3D: DLL unloaded.\n"));
    1391                 else
    1392                     bOk = FALSE;
     1401#endif
     1402                {
     1403                    hr = vboxDispCmTerm();
     1404                    Assert(hr == S_OK);
     1405                    if (hr == S_OK)
     1406                    {
     1407                        vboxVDbgPrint(("VBoxDispD3D: DLL unloaded.\n"));
     1408                        return TRUE;
     1409                    }
     1410                }
    13931411            }
    13941412//                VbglR3Term();
     
    13981416
    13991417        default:
    1400             break;
    1401     }
    1402     return bOk;
     1418            return TRUE;
     1419    }
     1420    return FALSE;
    14031421}
    14041422
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h

    r30953 r31687  
    178178    VBOXWDDM_VHWA Vhwa;
    179179#endif
     180    POINT VScreenPos;
    180181    VBOXWDDM_POINTER_INFO PointerInfo;
    181182} VBOXWDDM_SOURCE, *PVBOXWDDM_SOURCE;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h

    r30953 r31687  
    239239} VBOXDISPIFESCAPE_DBGPRINT, *PVBOXDISPIFESCAPE_DBGPRINT;
    240240AssertCompile(RT_OFFSETOF(VBOXDISPIFESCAPE_DBGPRINT, EscapeHdr) == 0);
     241
     242typedef struct VBOXSCREENLAYOUT_ELEMENT
     243{
     244    D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
     245    POINT pos;
     246} VBOXSCREENLAYOUT_ELEMENT, *PVBOXSCREENLAYOUT_ELEMENT;
     247
     248typedef struct VBOXSCREENLAYOUT
     249{
     250    uint32_t cScreens;
     251    VBOXSCREENLAYOUT_ELEMENT aScreens[1];
     252} VBOXSCREENLAYOUT, *PVBOXSCREENLAYOUT;
     253
     254typedef struct VBOXDISPIFESCAPE_SCREENLAYOUT
     255{
     256    VBOXDISPIFESCAPE EscapeHdr;
     257    VBOXSCREENLAYOUT ScreenLayout;
     258} VBOXDISPIFESCAPE_SCREENLAYOUT, *PVBOXDISPIFESCAPE_SCREENLAYOUT;
    241259
    242260/* query info func */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp

    r30973 r31687  
    562562                    {
    563563                        PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF->VidPnSourceId];
     564                        vboxWddmRectTranslate(&UnionRect, pSource->VScreenPos.x, pSource->VScreenPos.y);
    564565                        VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, &pSource->Vbva, &UnionRect);
    565566                    }
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r30973 r31687  
    8787}
    8888
    89 NTSTATUS vboxWddmGhDisplayPostInfoScreen (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation)
     89NTSTATUS vboxWddmGhDisplayPostInfoScreen (PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pAllocation, POINT * pVScreenPos)
    9090{
    9191    VBOXVIDEOOFFSET offVram = pAllocation->offVram;
     
    105105
    106106        pScreen->u32ViewIndex    = pAllocation->SurfDesc.VidPnSourceId;
    107         pScreen->i32OriginX      = 0;
    108         pScreen->i32OriginY      = 0;
     107        pScreen->i32OriginX      = pVScreenPos->x;
     108        pScreen->i32OriginY      = pVScreenPos->y;
    109109        pScreen->u32StartOffset  = 0; //(uint32_t)offVram; /* we pretend the view is located at the start of each framebuffer */
    110110        pScreen->u32LineSize     = pAllocation->SurfDesc.pitch;
     
    169169}
    170170
     171NTSTATUS vboxWddmGhDisplayUpdateScreenPos(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, POINT *pVScreenPos)
     172{
     173    if (pSource->VScreenPos.x == pVScreenPos->x
     174            && pSource->VScreenPos.y == pVScreenPos->y)
     175        return STATUS_SUCCESS;
     176
     177    pSource->VScreenPos = *pVScreenPos;
     178
     179    PVBOXWDDM_ALLOCATION pAllocation = VBOXWDDM_FB_ALLOCATION(pSource);
     180    NTSTATUS Status = vboxWddmGhDisplayPostInfoScreen(pDevExt, pAllocation, &pSource->VScreenPos);
     181    Assert(Status == STATUS_SUCCESS);
     182    return Status;
     183}
    171184
    172185NTSTATUS vboxWddmGhDisplaySetInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource)
    173186{
    174 
    175 #ifndef VBOXWDDM_RENDER_FROM_SHADOW
    176     PVBOXWDDM_ALLOCATION pAllocation = pSource->pPrimaryAllocation;
    177 #else
    178     PVBOXWDDM_ALLOCATION pAllocation = pSource->pShadowAllocation;
    179 #endif
     187    PVBOXWDDM_ALLOCATION pAllocation = VBOXWDDM_FB_ALLOCATION(pSource);
    180188    VBOXVIDEOOFFSET offVram = vboxWddmValidatePrimary(pAllocation);
    181189    Assert(offVram != VBOXVIDEOOFFSET_VOID);
     
    194202        if (Status == STATUS_SUCCESS)
    195203        {
    196             Status = vboxWddmGhDisplayPostInfoScreen(pDevExt, pAllocation);
     204            Status = vboxWddmGhDisplayPostInfoScreen(pDevExt, pAllocation, &pSource->VScreenPos);
    197205            Assert(Status == STATUS_SUCCESS);
    198206            if (Status != STATUS_SUCCESS)
     
    16991707    DXGKARG_DESCRIBEALLOCATION*  pDescribeAllocation)
    17001708{
    1701 //    dfprintf(("==> "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
     1709    dfprintf(("==> "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
    17021710
    17031711    vboxVDbgBreakFv();
     
    17121720    pDescribeAllocation->PrivateDriverFormatAttribute = 0;
    17131721
    1714 //    dfprintf(("<== "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
     1722    dfprintf(("<== "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
    17151723
    17161724    return STATUS_SUCCESS;
     
    20582066}
    20592067
    2060 static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
     2068static void vboxWddmSubmitBltCmd(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_DMA_PRESENT_BLT pBlt)
    20612069{
    20622070    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]));
     
    20662074        pRectsCmd->pContext = pContext;
    20672075        memcpy(&pRectsCmd->ContextsRects, &pBlt->DstRects, RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pBlt->DstRects.UpdateRects.cRects]));
     2076        vboxWddmRectTranslate(&pRectsCmd->ContextsRects.ContextRect, pSource->VScreenPos.x, pSource->VScreenPos.y);
     2077        for (UINT i = 0; i < pRectsCmd->ContextsRects.UpdateRects.cRects; ++i)
     2078        {
     2079            vboxWddmRectTranslate(&pRectsCmd->ContextsRects.UpdateRects.aRects[i], pSource->VScreenPos.x, pSource->VScreenPos.y);
     2080        }
    20682081        NTSTATUS tmpStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pRectsCmd->Hdr);
    20692082        Assert(tmpStatus == STATUS_SUCCESS);
     
    21112124            vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
    21122125            PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW pRFS = (PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW)pPrivateData;
     2126            vboxWddmRectTranslate(&pRFS->rect, pSource->VScreenPos.x, pSource->VScreenPos.y);
    21132127            uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
    21142128            if (!cDMACmdsOutstanding)
     
    21632177                                    rect = pBlt->DstRects.ContextRect;
    21642178
     2179                                vboxWddmRectTranslate(&rect, pSource->VScreenPos.x, pSource->VScreenPos.y);
     2180
    21652181                                uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
    21662182                                if (!cDMACmdsOutstanding)
     
    21712187                                    VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
    21722188                                }
    2173                                 vboxWddmSubmitBltCmd(pDevExt, pContext, pBlt);
     2189                                vboxWddmSubmitBltCmd(pDevExt, pSource, pContext, pBlt);
    21742190                                break;
    21752191                            }
     
    21802196                                if (pSrcAlloc->fRcFlags.RenderTarget)
    21812197                                {
    2182                                     vboxWddmSubmitBltCmd(pDevExt, pContext, pBlt);
     2198                                    vboxWddmSubmitBltCmd(pDevExt, pSource, pContext, pBlt);
    21832199                                }
    21842200                                break;
     
    22222238            {
    22232239                PVBOXWDDM_ALLOCATION pAlloc = pPrivateData->SrcAllocInfo.pAlloc;
     2240                VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
    22242241                pRectsCmd->pContext = pContext;
    22252242                RECT r;
    2226                 r.top = 0;
    2227                 r.left = 0;
    2228                 r.right = pAlloc->SurfDesc.width;
    2229                 r.bottom = pAlloc->SurfDesc.height;
     2243                r.left = pSource->VScreenPos.x;
     2244                r.top = pSource->VScreenPos.y;
     2245                r.right = pAlloc->SurfDesc.width + pSource->VScreenPos.x;
     2246                r.bottom = pAlloc->SurfDesc.height + pSource->VScreenPos.y;
    22302247                pRectsCmd->ContextsRects.ContextRect = r;
    22312248                pRectsCmd->ContextsRects.UpdateRects.cRects = 1;
     
    28432860                Status = STATUS_SUCCESS;
    28442861                break;
     2862            case VBOXESC_SCREENLAYOUT:
     2863            {
     2864                Assert(pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT));
     2865                if (pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT))
     2866                {
     2867                    PVBOXDISPIFESCAPE_SCREENLAYOUT pLo = (PVBOXDISPIFESCAPE_SCREENLAYOUT)pEscapeHdr;
     2868                    Assert(pLo->ScreenLayout.cScreens <= (UINT)pDevExt->u.primary.cDisplays);
     2869                    for (UINT i = 0; i < pLo->ScreenLayout.cScreens; ++i)
     2870                    {
     2871                        PVBOXSCREENLAYOUT_ELEMENT pEl = &pLo->ScreenLayout.aScreens[i];
     2872                        Assert(pEl->VidPnSourceId < (UINT)pDevExt->u.primary.cDisplays);
     2873                        if (pEl->VidPnSourceId < (UINT)pDevExt->u.primary.cDisplays)
     2874                        {
     2875                            PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pEl->VidPnSourceId];
     2876                            NTSTATUS tmpStatus = vboxWddmGhDisplayUpdateScreenPos(pDevExt, pSource, &pEl->pos);
     2877                            Assert(tmpStatus == STATUS_SUCCESS);
     2878                        }
     2879                    }
     2880                    Status = STATUS_SUCCESS;
     2881                    break;
     2882                }
     2883                else
     2884                {
     2885                    drprintf((__FUNCTION__": VBOXESC_SCREENLAYOUT: incorrect buffer size (%d) < sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT) (%d)\n",
     2886                            pEscape->PrivateDriverDataSize, sizeof (VBOXDISPIFESCAPE_SCREENLAYOUT)));
     2887                    AssertBreakpoint();
     2888                    Status = STATUS_INVALID_PARAMETER;
     2889                }
     2890            }
    28452891            case VBOXESC_REINITVIDEOMODES:
    28462892                VBoxWddmInvalidateModesTable(pDevExt);
     
    29252971    PAGED_CODE();
    29262972
    2927 //    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
     2973    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
    29282974
    29292975    vboxVDbgBreakFv();
     
    30163062    pIsSupportedVidPnArg->IsVidPnSupported = bSupported;
    30173063
    3018 //    dfprintf(("<== "__FUNCTION__ ", status(0x%x), context(0x%x)\n", Status, hAdapter));
     3064    dfprintf(("<== "__FUNCTION__ ", status(0x%x), context(0x%x)\n", Status, hAdapter));
    30193065
    30203066    return Status;
     
    31333179    PAGED_CODE();
    31343180
    3135 //    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
     3181    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
    31363182
    31373183    vboxVDbgBreakFv();
     
    31803226        drprintf((__FUNCTION__ ": DxgkCbQueryVidPnInterface failed Status(0x%x)\n", Status));
    31813227
    3182 //    dfprintf(("<== "__FUNCTION__ ", status(0x%x), context(0x%x)\n", Status, hAdapter));
     3228    dfprintf(("<== "__FUNCTION__ ", status(0x%x), context(0x%x)\n", Status, hAdapter));
    31833229
    31843230    return Status;
     
    34853531    DXGKARG_GETSCANLINE*  pGetScanLine)
    34863532{
    3487 //    dfprintf(("==> "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
     3533    dfprintf(("==> "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
    34883534
    34893535    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
     
    35133559    }
    35143560
    3515 //    dfprintf(("<== "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
     3561    dfprintf(("<== "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
    35163562
    35173563    return STATUS_SUCCESS;
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/Makefile.kmk

    r30973 r31687  
    126126    LIB_TO_DATADIR=\"\" \
    127127    BIN_TO_DATADIR=\"\"
    128 if "$(KBUILD_TYPE)" != "debug" || !defined(DEBUG_misha)
     128if "$(KBUILD_TYPE)" != "debug" || defined(DEBUG_misha)
    129129 wined3d_DEFS        += WINE_NO_DEBUG_MSGS
    130130endif
     
    183183    LIB_TO_DATADIR=\"\" \
    184184    BIN_TO_DATADIR=\"\"
    185 if "$(KBUILD_TYPE)" != "debug" || !defined(DEBUG_misha)
     185if "$(KBUILD_TYPE)" != "debug" || defined(DEBUG_misha)
    186186 VBoxD3D8_DEFS       += WINE_NO_DEBUG_MSGS
    187187endif
     
    220220    LIB_TO_DATADIR=\"\" \
    221221    BIN_TO_DATADIR=\"\"
    222 if "$(KBUILD_TYPE)" != "debug" || !defined(DEBUG_misha)
     222if "$(KBUILD_TYPE)" != "debug" || defined(DEBUG_misha)
    223223 VBoxD3D9_DEFS       += WINE_NO_DEBUG_MSGS
    224224endif
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