VirtualBox

Ignore:
Timestamp:
Jun 16, 2010 12:15:34 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
62734
Message:

wddm/2d: kernel(miniport) part impl

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp

    r30215 r30239  
    676676int vboxVhwaHlpDestroyPrimary(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
    677677{
    678 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
    679     PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
    680 #else
    681     PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
    682 #endif
     678    PVBOXWDDM_ALLOCATION pFbSurf = VBOXWDDM_FB_ALLOCATION(pSource);
    683679
    684680    int rc = vboxVhwaHlpDestroySurface(pDevExt, pFbSurf, VidPnSourceId);
     
    689685int vboxVhwaHlpCreatePrimary(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
    690686{
    691 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
    692     PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
    693 #else
    694     PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
    695 #endif
     687    PVBOXWDDM_ALLOCATION pFbSurf = VBOXWDDM_FB_ALLOCATION(pSource);
    696688    Assert(pSource->Vhwa.cOverlaysCreated == 1);
    697689    Assert(pFbSurf->hHostHandle == VBOXVHWA_SURFHANDLE_INVALID);
     
    728720    else
    729721    {
    730 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
    731         PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
    732 #else
    733         PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
    734 #endif
     722        PVBOXWDDM_ALLOCATION pFbSurf = VBOXWDDM_FB_ALLOCATION(pSource);
    735723        Assert(pFbSurf->hHostHandle);
    736724        if (pFbSurf->hHostHandle)
     
    772760}
    773761
    774 int vboxVhwaHlpCreateOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, uint32_t cBackBuffers, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
     762int vboxVhwaHlpOverlayFlip(PVBOXWDDM_OVERLAY pOverlay, const DXGKARG_FLIPOVERLAY *pFlipInfo)
     763{
     764    PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pFlipInfo->hSource;
     765    Assert(pAlloc->hHostHandle);
     766    Assert(pAlloc->pResource);
     767    Assert(pAlloc->pResource == pOverlay->pResource);
     768    Assert(pFlipInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAYFLIP_INFO));
     769    Assert(pFlipInfo->pPrivateDriverData);
     770    PVBOXWDDM_SOURCE pSource = &pOverlay->pDevExt->aSources[pOverlay->VidPnSourceId];
     771    Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
     772    PVBOXWDDM_ALLOCATION pFbSurf = VBOXWDDM_FB_ALLOCATION(pSource);
     773    Assert(pFbSurf);
     774    Assert(pFbSurf->hHostHandle);
     775    Assert(pFbSurf->offVram != VBOXVIDEOOFFSET_VOID);
     776    Assert(pOverlay->pCurentAlloc);
     777    Assert(pOverlay->pCurentAlloc->pResource == pOverlay->pResource);
     778    Assert(pOverlay->pCurentAlloc != pAlloc);
     779    int rc = VINF_SUCCESS;
     780    if (pFlipInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAYFLIP_INFO))
     781    {
     782        PVBOXWDDM_OVERLAYFLIP_INFO pOurInfo = (PVBOXWDDM_OVERLAYFLIP_INFO)pFlipInfo->pPrivateDriverData;
     783
     784        VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pOverlay->pDevExt, pOverlay->VidPnSourceId,
     785                VBOXVHWACMD_TYPE_SURF_FLIP, sizeof(VBOXVHWACMD_SURF_FLIP));
     786        Assert(pCmd);
     787        if(pCmd)
     788        {
     789            VBOXVHWACMD_SURF_FLIP * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_FLIP);
     790
     791            memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_FLIP));
     792
     793//            pBody->TargGuestSurfInfo;
     794//            pBody->CurrGuestSurfInfo;
     795            pBody->u.in.hTargSurf = pAlloc->hHostHandle;
     796            pBody->u.in.offTargSurface = pFlipInfo->SrcPhysicalAddress.QuadPart;
     797            pAlloc->offVram = pFlipInfo->SrcPhysicalAddress.QuadPart;
     798            pBody->u.in.hCurrSurf = pOverlay->pCurentAlloc->hHostHandle;
     799            pBody->u.in.offCurrSurface = pOverlay->pCurentAlloc->offVram;
     800            if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_VALID)
     801            {
     802                pBody->u.in.xUpdatedTargMemValid = 1;
     803                if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_RECT_VALID)
     804                    pBody->u.in.xUpdatedTargMemRect = *(VBOXVHWA_RECTL*)((void*)&pOurInfo->DirtyRegion.Rect);
     805                else
     806                {
     807                    pBody->u.in.xUpdatedTargMemRect.right = pAlloc->SurfDesc.width;
     808                    pBody->u.in.xUpdatedTargMemRect.bottom = pAlloc->SurfDesc.height;
     809                    /* top & left are zero-inited with the above memset */
     810                }
     811            }
     812
     813            /* we're not interested in completion, just send the command */
     814            vboxVhwaCommandSubmitAsynchAndComplete(pOverlay->pDevExt, pCmd);
     815
     816            rc = VINF_SUCCESS;
     817        }
     818        else
     819            rc = VERR_OUT_OF_RESOURCES;
     820    }
     821    else
     822        rc = VERR_INVALID_PARAMETER;
     823
     824    return rc;
     825}
     826
     827AssertCompile(sizeof (RECT) == sizeof (VBOXVHWA_RECTL));
     828AssertCompile(RT_SIZEOFMEMB(RECT, left) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, left));
     829AssertCompile(RT_SIZEOFMEMB(RECT, right) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, right));
     830AssertCompile(RT_SIZEOFMEMB(RECT, top) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, top));
     831AssertCompile(RT_SIZEOFMEMB(RECT, bottom) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, bottom));
     832AssertCompile(RT_OFFSETOF(RECT, left) == RT_OFFSETOF(VBOXVHWA_RECTL, left));
     833AssertCompile(RT_OFFSETOF(RECT, right) == RT_OFFSETOF(VBOXVHWA_RECTL, right));
     834AssertCompile(RT_OFFSETOF(RECT, top) == RT_OFFSETOF(VBOXVHWA_RECTL, top));
     835AssertCompile(RT_OFFSETOF(RECT, bottom) == RT_OFFSETOF(VBOXVHWA_RECTL, bottom));
     836
     837int vboxVhwaHlpOverlayUpdate(PVBOXWDDM_OVERLAY pOverlay, const DXGK_OVERLAYINFO *pOverlayInfo)
     838{
     839    PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pOverlayInfo->hAllocation;
     840    Assert(pAlloc->hHostHandle);
     841    Assert(pAlloc->pResource);
     842    Assert(pAlloc->pResource == pOverlay->pResource);
     843    Assert(pOverlayInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAY_INFO));
     844    Assert(pOverlayInfo->pPrivateDriverData);
     845    PVBOXWDDM_SOURCE pSource = &pOverlay->pDevExt->aSources[pOverlay->VidPnSourceId];
     846    Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
     847    PVBOXWDDM_ALLOCATION pFbSurf = VBOXWDDM_FB_ALLOCATION(pSource);
     848    Assert(pFbSurf);
     849    Assert(pFbSurf->hHostHandle);
     850    Assert(pFbSurf->offVram != VBOXVIDEOOFFSET_VOID);
     851    int rc = VINF_SUCCESS;
     852    if (pOverlayInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAY_INFO))
     853    {
     854        PVBOXWDDM_OVERLAY_INFO pOurInfo = (PVBOXWDDM_OVERLAY_INFO)pOverlayInfo->pPrivateDriverData;
     855
     856        VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pOverlay->pDevExt, pOverlay->VidPnSourceId,
     857                VBOXVHWACMD_TYPE_SURF_OVERLAY_UPDATE, sizeof(VBOXVHWACMD_SURF_OVERLAY_UPDATE));
     858        Assert(pCmd);
     859        if(pCmd)
     860        {
     861            VBOXVHWACMD_SURF_OVERLAY_UPDATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_UPDATE);
     862
     863            memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_OVERLAY_UPDATE));
     864
     865            pBody->u.in.hDstSurf = pFbSurf->hHostHandle;
     866            pBody->u.in.offDstSurface = pFbSurf->offVram;
     867            pBody->u.in.dstRect = *(VBOXVHWA_RECTL*)((void*)&pOverlayInfo->DstRect);
     868            pBody->u.in.hSrcSurf = pAlloc->hHostHandle;
     869            pBody->u.in.offSrcSurface = pOverlayInfo->PhysicalAddress.QuadPart;
     870            pAlloc->offVram = pOverlayInfo->PhysicalAddress.QuadPart;
     871            pBody->u.in.srcRect = *(VBOXVHWA_RECTL*)((void*)&pOverlayInfo->SrcRect);
     872            pBody->u.in.flags |= VBOXVHWA_OVER_SHOW;
     873            if (pOurInfo->OverlayDesc.fFlags & VBOXWDDM_OVERLAY_F_CKEY_DST)
     874            {
     875                pBody->u.in.flags |= VBOXVHWA_OVER_KEYDESTOVERRIDE /* ?? VBOXVHWA_OVER_KEYDEST */;
     876                pBody->u.in.desc.DstCK.high = pOurInfo->OverlayDesc.DstColorKeyHigh;
     877                pBody->u.in.desc.DstCK.low = pOurInfo->OverlayDesc.DstColorKeyLow;
     878            }
     879
     880            if (pOurInfo->OverlayDesc.fFlags & VBOXWDDM_OVERLAY_F_CKEY_SRC)
     881            {
     882                pBody->u.in.flags |= VBOXVHWA_OVER_KEYSRCOVERRIDE /* ?? VBOXVHWA_OVER_KEYSRC */;
     883                pBody->u.in.desc.SrcCK.high = pOurInfo->OverlayDesc.SrcColorKeyHigh;
     884                pBody->u.in.desc.SrcCK.low = pOurInfo->OverlayDesc.SrcColorKeyLow;
     885            }
     886
     887            if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_VALID)
     888            {
     889                pBody->u.in.xUpdatedSrcMemValid = 1;
     890                if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_RECT_VALID)
     891                    pBody->u.in.xUpdatedSrcMemRect = *(VBOXVHWA_RECTL*)((void*)&pOurInfo->DirtyRegion.Rect);
     892                else
     893                {
     894                    pBody->u.in.xUpdatedSrcMemRect.right = pAlloc->SurfDesc.width;
     895                    pBody->u.in.xUpdatedSrcMemRect.bottom = pAlloc->SurfDesc.height;
     896                    /* top & left are zero-inited with the above memset */
     897                }
     898            }
     899
     900            /* we're not interested in completion, just send the command */
     901            vboxVhwaCommandSubmitAsynchAndComplete(pOverlay->pDevExt, pCmd);
     902
     903            pOverlay->pCurentAlloc = pAlloc;
     904
     905            rc = VINF_SUCCESS;
     906        }
     907        else
     908            rc = VERR_OUT_OF_RESOURCES;
     909    }
     910    else
     911        rc = VERR_INVALID_PARAMETER;
     912
     913    return rc;
     914}
     915
     916int vboxVhwaHlpOverlayDestroy(PVBOXWDDM_OVERLAY pOverlay)
     917{
     918    int rc = VINF_SUCCESS;
     919    for (uint32_t i = 0; i < pOverlay->pResource->cAllocations; ++i)
     920    {
     921        PVBOXWDDM_ALLOCATION pCurAlloc = &pOverlay->pResource->aAllocations[i];
     922        rc = vboxVhwaHlpDestroySurface(pOverlay->pDevExt, pCurAlloc, pOverlay->VidPnSourceId);
     923        AssertRC(rc);
     924    }
     925
     926    if (RT_SUCCESS(rc))
     927    {
     928        int tmpRc = vboxVhwaHlpCheckTerm(pOverlay->pDevExt, pOverlay->VidPnSourceId);
     929        AssertRC(tmpRc);
     930    }
     931
     932    return rc;
     933}
     934
     935
     936int vboxVhwaHlpOverlayCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, DXGK_OVERLAYINFO *pOverlayInfo,
     937        /* OUT */ PVBOXWDDM_OVERLAY pOverlay)
    775938{
    776939    int rc = vboxVhwaHlpCheckInit(pDevExt, VidPnSourceId);
     
    778941    if (RT_SUCCESS(rc))
    779942    {
    780         rc = vboxVhwaHlpCreateSurface(pDevExt, pSurf,
    781                     0, cBackBuffers, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
    782                     VidPnSourceId);
    783         AssertRC(rc);
    784     }
    785 
    786     return rc;
    787 }
    788 
    789 int vboxVhwaHlpDestroyOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
    790 {
    791     int rc = vboxVhwaHlpDestroySurface(pDevExt, pSurf, VidPnSourceId);
    792     AssertRC(rc);
    793     if (RT_SUCCESS(rc))
    794     {
    795         rc = vboxVhwaHlpCheckTerm(pDevExt, VidPnSourceId);
    796         AssertRC(rc);
    797     }
    798 
    799     return rc;
    800 }
     943        PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pOverlayInfo->hAllocation;
     944        PVBOXWDDM_RESOURCE pRc = pAlloc->pResource;
     945        Assert(pRc);
     946        for (uint32_t i = 0; i < pRc->cAllocations; ++i)
     947        {
     948            PVBOXWDDM_ALLOCATION pCurAlloc = &pRc->aAllocations[i];
     949            rc = vboxVhwaHlpCreateSurface(pDevExt, pAlloc,
     950                        0, pRc->cAllocations - 1, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
     951                        VidPnSourceId);
     952            AssertRC(rc);
     953            if (!RT_SUCCESS(rc))
     954            {
     955                int tmpRc;
     956                for (uint32_t j = i; j < pRc->cAllocations; ++j)
     957                {
     958                    PVBOXWDDM_ALLOCATION pDestroyAlloc = &pRc->aAllocations[j];
     959                    tmpRc = vboxVhwaHlpDestroySurface(pDevExt, pDestroyAlloc, VidPnSourceId);
     960                    AssertRC(tmpRc);
     961                }
     962                break;
     963            }
     964        }
     965
     966        if (RT_SUCCESS(rc))
     967        {
     968            pOverlay->pDevExt = pDevExt;
     969            pOverlay->pResource = pRc;
     970            pOverlay->VidPnSourceId = VidPnSourceId;
     971            rc = vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo);
     972            if (!RT_SUCCESS(rc))
     973            {
     974                int tmpRc = vboxVhwaHlpOverlayDestroy(pOverlay);
     975                AssertRC(tmpRc);
     976            }
     977        }
     978
     979        if (RT_FAILURE(rc))
     980        {
     981            int tmpRc = vboxVhwaHlpCheckTerm(pDevExt, VidPnSourceId);
     982            AssertRC(tmpRc);
     983            AssertRC(rc);
     984        }
     985    }
     986
     987    return rc;
     988}
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h

    r29922 r30239  
    5454void vboxVHWAFree(PDEVICE_EXTENSION pDevExt);
    5555
    56 int vboxVhwaHlpCreateOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, uint32_t cBackBuffers, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId);
    57 int vboxVhwaHlpDestroyOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId);
     56int vboxVhwaHlpOverlayFlip(PVBOXWDDM_OVERLAY pOverlay, const DXGKARG_FLIPOVERLAY *pFlipInfo);
     57int vboxVhwaHlpOverlayUpdate(PVBOXWDDM_OVERLAY pOverlay, const DXGK_OVERLAYINFO *pOverlayInfo);
     58int vboxVhwaHlpOverlayDestroy(PVBOXWDDM_OVERLAY pOverlay);
     59int vboxVhwaHlpOverlayCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, DXGK_OVERLAYINFO *pOverlayInfo, /* OUT */ PVBOXWDDM_OVERLAY pOverlay);
     60
    5861int vboxVhwaHlpGetSurfInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf);
    5962
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r30215 r30239  
    32513251    DXGKARG_CREATEOVERLAY  *pCreateOverlay)
    32523252{
    3253     dfprintf(("==> "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
    3254 
    3255     AssertBreakpoint();
    3256 
    3257     dfprintf(("<== "__FUNCTION__ ", hAdapter(0x%x)\n", hAdapter));
    3258 
    3259     return STATUS_NOT_IMPLEMENTED;
     3253    dfprintf(("==> "__FUNCTION__ ", hAdapter(0x%p)\n", hAdapter));
     3254
     3255    NTSTATUS Status = STATUS_SUCCESS;
     3256    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
     3257    PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OVERLAY));
     3258    Assert(pOverlay);
     3259    if (pOverlay)
     3260    {
     3261        int rc = vboxVhwaHlpOverlayCreate(pDevExt, pCreateOverlay->VidPnSourceId, &pCreateOverlay->OverlayInfo, pOverlay);
     3262        AssertRC(rc);
     3263        if (RT_FAILURE(rc))
     3264            Status = STATUS_UNSUCCESSFUL;
     3265    }
     3266    else
     3267        Status = STATUS_NO_MEMORY;
     3268
     3269    dfprintf(("<== "__FUNCTION__ ", hAdapter(0x%p)\n", hAdapter));
     3270
     3271    return Status;
    32603272}
    32613273
     
    34103422{
    34113423    return vboxWddmGetAllocationFromOpenData(pDevExt, (PVBOXWDDM_OPENALLOCATION)pAllocList->hDeviceSpecificAllocation);
    3412 }
    3413 
    3414 DECLINLINE(VBOXVIDEOOFFSET) vboxWddmOffsetFromPhAddress(PHYSICAL_ADDRESS phAddr)
    3415 {
    3416     return (VBOXVIDEOOFFSET)(phAddr.QuadPart ? phAddr.QuadPart - VBE_DISPI_LFB_PHYSICAL_ADDRESS : VBOXVIDEOOFFSET_VOID);
    34173424}
    34183425
     
    37823789    CONST DXGKARG_UPDATEOVERLAY  *pUpdateOverlay)
    37833790{
    3784     dfprintf(("==> "__FUNCTION__ ", hOverlay(0x%x)\n", hOverlay));
    3785     AssertBreakpoint();
    3786     dfprintf(("<== "__FUNCTION__ ", hOverlay(0x%x)\n", hOverlay));
    3787     return STATUS_NOT_IMPLEMENTED;
     3791    dfprintf(("==> "__FUNCTION__ ", hOverlay(0x%p)\n", hOverlay));
     3792
     3793    NTSTATUS Status = STATUS_SUCCESS;
     3794    PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay;
     3795    Assert(pOverlay);
     3796    int rc = vboxVhwaHlpOverlayUpdate(pOverlay, &pUpdateOverlay->OverlayInfo);
     3797    AssertRC(rc);
     3798    if (RT_FAILURE(rc))
     3799        Status = STATUS_UNSUCCESSFUL;
     3800
     3801    dfprintf(("<== "__FUNCTION__ ", hOverlay(0x%p)\n", hOverlay));
     3802
     3803    return Status;
    37883804}
    37893805
     
    37943810    CONST DXGKARG_FLIPOVERLAY  *pFlipOverlay)
    37953811{
    3796     dfprintf(("==> "__FUNCTION__ ", hOverlay(0x%x)\n", hOverlay));
    3797     AssertBreakpoint();
    3798     dfprintf(("<== "__FUNCTION__ ", hOverlay(0x%x)\n", hOverlay));
    3799     return STATUS_NOT_IMPLEMENTED;
     3812    dfprintf(("==> "__FUNCTION__ ", hOverlay(0x%p)\n", hOverlay));
     3813
     3814    NTSTATUS Status = STATUS_SUCCESS;
     3815    PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay;
     3816    Assert(pOverlay);
     3817    int rc = vboxVhwaHlpOverlayFlip(pOverlay, pFlipOverlay);
     3818    AssertRC(rc);
     3819    if (RT_FAILURE(rc))
     3820        Status = STATUS_UNSUCCESSFUL;
     3821
     3822    dfprintf(("<== "__FUNCTION__ ", hOverlay(0x%p)\n", hOverlay));
     3823
     3824    return Status;
    38003825}
    38013826
     
    38053830    CONST HANDLE  hOverlay)
    38063831{
    3807     dfprintf(("==> "__FUNCTION__ ", hOverlay(0x%x)\n", hOverlay));
    3808     AssertBreakpoint();
    3809     dfprintf(("<== "__FUNCTION__ ", hOverlay(0x%x)\n", hOverlay));
    3810     return STATUS_NOT_IMPLEMENTED;
     3832    dfprintf(("==> "__FUNCTION__ ", hOverlay(0x%p)\n", hOverlay));
     3833
     3834    NTSTATUS Status = STATUS_SUCCESS;
     3835    PVBOXWDDM_OVERLAY pOverlay = (PVBOXWDDM_OVERLAY)hOverlay;
     3836    Assert(pOverlay);
     3837    int rc = vboxVhwaHlpOverlayDestroy(pOverlay);
     3838    AssertRC(rc);
     3839    if (RT_SUCCESS(rc))
     3840        vboxWddmMemFree(pOverlay);
     3841    else
     3842        Status = STATUS_UNSUCCESSFUL;
     3843
     3844    dfprintf(("<== "__FUNCTION__ ", hOverlay(0x%p)\n", hOverlay));
     3845
     3846    return Status;
    38113847}
    38123848
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h

    r29922 r30239  
    4949
    5050/* allocation */
     51//#define VBOXWDDM_ALLOCATIONINDEX_VOID (~0U)
    5152typedef struct VBOXWDDM_ALLOCATION
    5253{
     
    7374} VBOXWDDM_RESOURCE, *PVBOXWDDM_RESOURCE;
    7475
     76DECLINLINE(PVBOXWDDM_RESOURCE) vboxWddmResourceForAlloc(PVBOXWDDM_ALLOCATION pAlloc)
     77{
     78#if 0
     79    if(pAlloc->iIndex == VBOXWDDM_ALLOCATIONINDEX_VOID)
     80        return NULL;
     81    PVBOXWDDM_RESOURCE pRc = (PVBOXWDDM_RESOURCE)(((uint8_t*)pAlloc) - RT_OFFSETOF(VBOXWDDM_RESOURCE, aAllocations[pAlloc->iIndex]));
     82    return pRc;
     83#else
     84    return pAlloc->pResource;
     85#endif
     86}
     87
     88typedef struct VBOXWDDM_OVERLAY
     89{
     90    PDEVICE_EXTENSION pDevExt;
     91    PVBOXWDDM_RESOURCE pResource;
     92    PVBOXWDDM_ALLOCATION pCurentAlloc;
     93    D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
     94} VBOXWDDM_OVERLAY, *PVBOXWDDM_OVERLAY;
    7595
    7696typedef enum
     
    121141} VBOXWDDM_OPENALLOCATION, *PVBOXWDDM_OPENALLOCATION;
    122142
     143#ifdef VBOXWDDM_RENDER_FROM_SHADOW
     144# define VBOXWDDM_FB_ALLOCATION(_pSrc) ((_pSrc)->pShadowAllocation)
     145#else
     146# define VBOXWDDM_FB_ALLOCATION(_pSrc) ((_pSrc)->pPrimaryAllocation)
     147#endif
     148
     149//DECLINLINE(VBOXVIDEOOFFSET) vboxWddmOffsetFromPhAddress(PHYSICAL_ADDRESS phAddr)
     150//{
     151//    return (VBOXVIDEOOFFSET)(phAddr.QuadPart ? phAddr.QuadPart - VBE_DISPI_LFB_PHYSICAL_ADDRESS : VBOXVIDEOOFFSET_VOID);
     152//}
     153
    123154#endif /* #ifndef ___VBoxVideoWddm_h___ */
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette