VirtualBox

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/Miniport/wddm
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • 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