VirtualBox

Ignore:
Timestamp:
Jul 21, 2010 12:02:06 PM (14 years ago)
Author:
vboxsync
Message:

wddm/2d: notify host on color fill FB update, bugfix

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h

    r30942 r30953  
    306306   FAST_MUTEX ContextMutex;
    307307   volatile uint32_t cContexts3D;
     308   volatile uint32_t cDMACmdsOutstanding;
    308309
    309310   VBOXSHGSMILIST CtlList;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h

    r30865 r30953  
    374374}
    375375
     376DECLINLINE(bool) vboxWddmRectIsEmpty(RECT * pRect)
     377{
     378    return pRect->left == pRect->right-1 && pRect->top == pRect->bottom-1;
     379}
     380
     381DECLINLINE(bool) vboxWddmRectIsIntersect(RECT * pRect1, RECT * pRect2)
     382{
     383    return !((pRect1->left < pRect2->left && pRect1->right < pRect2->left)
     384            || (pRect2->left < pRect1->left && pRect2->right < pRect1->left)
     385            || (pRect1->top < pRect2->top && pRect1->bottom < pRect2->top)
     386            || (pRect2->top < pRect1->top && pRect2->bottom < pRect1->top));
     387}
     388
     389DECLINLINE(bool) vboxWddmRectIsInclude(RECT * pRect1, RECT * pRect2)
     390{
     391    return ((pRect1->left <= pRect2->left && pRect1->right >= pRect2->right)
     392            && (pRect1->top <= pRect2->top && pRect1->bottom >= pRect2->bottom));
     393}
     394
     395DECLINLINE(void) vboxWddmRectUnited(RECT * pDst, const RECT * pRect1, const RECT * pRect2)
     396{
     397    pDst->left = RT_MIN(pRect1->left, pRect2->left);
     398    pDst->top = RT_MIN(pRect1->top, pRect2->top);
     399    pDst->right = RT_MAX(pRect1->right, pRect2->right);
     400    pDst->bottom = RT_MAX(pRect1->bottom, pRect2->bottom);
     401}
     402
     403DECLINLINE(void) vboxWddmRectTranslate(RECT * pRect, int x, int y)
     404{
     405    pRect->left   += x;
     406    pRect->top    += y;
     407    pRect->right  += x;
     408    pRect->bottom += y;
     409}
     410
    376411DECLINLINE(void) vboxWddmDirtyRegionAddRect(PVBOXWDDM_DIRTYREGION pInfo, const RECT *pRect)
    377412{
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.cpp

    r29798 r30953  
    103103{
    104104    memset(pVbva, 0, sizeof(VBOXVBVAINFO));
     105
     106    KeInitializeSpinLock(&pVbva->Lock);
     107
    105108    int rc = VBoxMapAdapterMemory (pDevExt,
    106109                                       (void**)&pVbva->pVBVA,
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.h

    r29798 r30953  
    2121    VBVARECORD *pRecord;
    2222    D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId;
     23    KSPIN_LOCK Lock;
    2324} VBOXVBVAINFO;
    2425
     
    3334
    3435#define VBOXVBVA_OP(_op, _pdext, _pvbva, _arg) \
    35         if (vboxVbvaBufferBeginUpdate(_pdext, _pvbva)) \
    36         { \
    37             vboxVbva##_op(_pdext, _pvbva, _arg); \
    38             vboxVbvaBufferEndUpdate(_pdext, _pvbva); \
    39         }
     36        do { \
     37            if (vboxVbvaBufferBeginUpdate(_pdext, _pvbva)) \
     38            { \
     39                vboxVbva##_op(_pdext, _pvbva, _arg); \
     40                vboxVbvaBufferEndUpdate(_pdext, _pvbva); \
     41            } \
     42        } while (0)
     43
     44#define VBOXVBVA_OP_WITHLOCK_ATDPC(_op, _pdext, _pvbva, _arg) \
     45        do { \
     46            KeAcquireSpinLockAtDpcLevel(&(_pvbva)->Lock);  \
     47            VBOXVBVA_OP(_op, _pdext, _pvbva, _arg);        \
     48            KeReleaseSpinLockFromDpcLevel(&(_pvbva)->Lock);\
     49        } while (0)
     50
     51#define VBOXVBVA_OP_WITHLOCK(_op, _pdext, _pvbva, _arg) \
     52        do { \
     53            KIRQL OldIrql; \
     54            KeAcquireSpinLock(&(_pvbva)->Lock, &OldIrql);  \
     55            VBOXVBVA_OP(_op, _pdext, _pvbva, _arg);        \
     56            KeReleaseSpinLock(&(_pvbva)->Lock, OldIrql);   \
     57        } while (0)
     58
    4059
    4160#endif /* #ifndef ___VBoxVideoVbva_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp

    r30942 r30953  
    1919#include "../VBoxVideo.h"
    2020
     21#include <iprt/asm.h>
    2122
    2223NTSTATUS vboxVdmaPipeConstruct(PVBOXVDMAPIPE pPipe)
     
    508509        if (pAlloc->offVram != VBOXVIDEOOFFSET_VOID)
    509510        {
     511            RECT UnionRect = {0};
    510512            uint8_t *pvMem = pDevExt->pvVisibleVram + pAlloc->offVram;
    511513            UINT bpp = pAlloc->SurfDesc.bpp;
     
    534536                            }
    535537                        }
     538                        vboxWddmRectUnited(&UnionRect, &UnionRect, pRect);
    536539                    }
    537540                    Status = STATUS_SUCCESS;
     
    544547                    break;
    545548            }
    546         }
    547     }
     549
     550            if (Status == STATUS_SUCCESS)
     551            {
     552                if (pCF->VidPnSourceId != D3DDDI_ID_UNINITIALIZED
     553                        && pAlloc->bAssigned
     554#ifdef VBOXWDDM_RENDER_FROM_SHADOW
     555                        && pAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE
     556#else
     557                        && pAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
     558#endif
     559                        )
     560                {
     561                    if (!vboxWddmRectIsEmpty(&UnionRect))
     562                    {
     563                        PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF->VidPnSourceId];
     564                        VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, &pSource->Vbva, &UnionRect);
     565                    }
     566                }
     567            }
     568        }
     569    }
     570
     571
     572    uint32_t cNew = ASMAtomicDecU32(&pDevExt->cDMACmdsOutstanding);
     573    Assert(cNew < UINT32_MAX/2);
    548574
    549575    NTSTATUS cmplStatus = vboxWddmDmaCmdNotifyCompletion(pDevExt, pContext, pCF->SubmissionFenceId);
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h

    r30942 r30953  
    8888    struct VBOXWDDM_ALLOCATION *pAllocation;
    8989    UINT SubmissionFenceId;
     90    D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
    9091    UINT Color;
    9192    VBOXWDDM_RECTS_INFO Rects;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r30942 r30953  
    223223
    224224    return true;
    225 }
    226 
    227 bool vboxWddmRectIsEmpty(RECTL * pRect)
    228 {
    229     return pRect->left == pRect->right-1 && pRect->top == pRect->bottom-1;
    230 }
    231 
    232 bool vboxWddmRectIntersect(RECTL * pRect1, RECTL * pRect2)
    233 {
    234     return !((pRect1->left < pRect2->left && pRect1->right < pRect2->left)
    235             || (pRect2->left < pRect1->left && pRect2->right < pRect1->left)
    236             || (pRect1->top < pRect2->top && pRect1->bottom < pRect2->top)
    237             || (pRect2->top < pRect1->top && pRect2->bottom < pRect1->top));
    238 }
    239 
    240 bool vboxWddmRectInclude(RECTL * pRect1, RECTL * pRect2)
    241 {
    242     return ((pRect1->left <= pRect2->left && pRect1->right >= pRect2->right)
    243             && (pRect1->top <= pRect2->top && pRect1->bottom >= pRect2->bottom));
    244 }
    245 
    246 void vboxWddmRectUnited(RECT * pDst, const RECT * pRect1, const RECT * pRect2)
    247 {
    248     pDst->left = RT_MIN(pRect1->left, pRect2->left);
    249     pDst->top = RT_MIN(pRect1->top, pRect2->top);
    250     pDst->right = RT_MAX(pRect1->right, pRect2->right);
    251     pDst->bottom = RT_MAX(pRect1->bottom, pRect2->bottom);
    252 }
    253 
    254 void vboxWddmRectTranslate(RECTL * pRect, int x, int y)
    255 {
    256     pRect->left   += x;
    257     pRect->top    += y;
    258     pRect->right  += x;
    259     pRect->bottom += y;
    260225}
    261226#endif
     
    21152080            vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
    21162081            PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW pRFS = (PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW)pPrivateData;
    2117             VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &pRFS->rect);
     2082            uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
     2083            if (!cDMACmdsOutstanding)
     2084                VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &pRFS->rect);
     2085            else
     2086            {
     2087                Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
     2088                VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, &pSource->Vbva, &pRFS->rect);
     2089            }
    21182090            /* get DPC data at IRQL */
    21192091
     
    21602132                                    rect = pBlt->DstRects.ContextRect;
    21612133
    2162                                 VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
     2134                                uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
     2135                                if (!cDMACmdsOutstanding)
     2136                                    VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
     2137                                else
     2138                                {
     2139                                    Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
     2140                                    VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
     2141                                }
    21632142                                vboxWddmSubmitBltCmd(pDevExt, pContext, pBlt);
    21642143                                break;
     
    22412220                PVBOXWDDM_ALLOCATION pDstAlloc = pPrivateData->DstAllocInfo.pAlloc;
    22422221                Assert(pDstAlloc);
     2222                D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
    22432223                if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
    22442224                        && pDstAlloc->bAssigned)
    22452225                {
     2226                    VidPnSourceId = pPrivateData->DstAllocInfo.srcId;
     2227#ifdef VBOXWDDM_RENDER_FROM_SHADOW
    22462228                    VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->DstAllocInfo.srcId];
    22472229                    Assert(pSource->pPrimaryAllocation == pDstAlloc);
     
    22502232                    if (pSource->pShadowAllocation)
    22512233                        pDstAlloc = pSource->pShadowAllocation;
     2234#endif
     2235                }
     2236                else
     2237                {
     2238                    VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
    22522239                }
    22532240                pCFCmd->pContext = pContext;
    22542241                pCFCmd->pAllocation = pDstAlloc;
    22552242                pCFCmd->SubmissionFenceId = pSubmitCommand->SubmissionFenceId;
     2243                pCFCmd->VidPnSourceId = VidPnSourceId;
    22562244                pCFCmd->Color = pCF->Color;
    22572245                memcpy(&pCFCmd->Rects, &pCF->Rects, RT_OFFSETOF(VBOXWDDM_RECTS_INFO, aRects[pCF->Rects.cRects]));
     2246                ASMAtomicIncU32(&pDevExt->cDMACmdsOutstanding);
    22582247                submStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pCFCmd->Hdr);
    22592248                Assert(submStatus == STATUS_SUCCESS);
    22602249                if (submStatus != STATUS_SUCCESS)
     2250                {
     2251                    uint32_t cNew = ASMAtomicDecU32(&pDevExt->cDMACmdsOutstanding);
     2252                    Assert(cNew < UINT32_MAX/2);
    22612253                    vboxVdmaGgCmdDestroy(&pCFCmd->Hdr);
     2254                }
    22622255            }
    22632256
     
    22912284            pDr->Location.phBuf = pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset;
    22922285
    2293             vboxVdmaCBufDrSubmit (pDevExt, &pDevExt->u.primary.Vdma, pDr);
     2286            vboxVdmaCBufDrSubmit(pDevExt, &pDevExt->u.primary.Vdma, pDr);
    22942287            break;
    22952288        }
     
    41674160        {
    41684161            UINT cbCmd = pPresent->DmaBufferPrivateDataSize;
    4169             pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;
     4162            pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL;
    41704163
    41714164            vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
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