VirtualBox

Ignore:
Timestamp:
Jul 2, 2010 4:03:52 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: better Blt impl + bugfixes

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

Legend:

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

    r30570 r30582  
    11871187        fFlags |= D3DLOCK_DONOTWAIT;
    11881188    return fFlags;
     1189}
     1190
     1191D3DTEXTUREFILTERTYPE vboxDDI2D3DBltFlags(D3DDDI_BLTFLAGS fFlags)
     1192{
     1193    if (fFlags.Point)
     1194    {
     1195        /* no flags other than [Begin|Continue|End]PresentToDwm are set */
     1196        Assert((fFlags.Value & (~(0x00000100 | 0x00000200 | 0x00000400))) == 1);
     1197        return D3DTEXF_POINT;
     1198    }
     1199    if (fFlags.Linear)
     1200    {
     1201        /* no flags other than [Begin|Continue|End]PresentToDwm are set */
     1202        Assert((fFlags.Value & (~(0x00000100 | 0x00000200 | 0x00000400))) == 2);
     1203        return D3DTEXF_LINEAR;
     1204    }
     1205    /* no flags other than [Begin|Continue|End]PresentToDwm are set */
     1206    Assert((fFlags.Value & (~(0x00000100 | 0x00000200 | 0x00000400))) == 0);
     1207    return D3DTEXF_NONE;
    11891208}
    11901209
     
    16181637    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)hTexture;
    16191638//    Assert(pRc);
    1620     IDirect3DTexture9 *pD3DIfTex = pRc ? (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf : NULL;
     1639    IDirect3DTexture9 *pD3DIfTex;
     1640    if (pRc)
     1641    {
     1642        Assert(pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
     1643        pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
     1644    }
     1645    else
     1646        pD3DIfTex = NULL;
     1647
    16211648//    Assert(pD3DIfTex);
    16221649    HRESULT hr = pDevice->pDevice9If->SetTexture(Stage, pD3DIfTex);
     
    23142341    if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
    23152342    {
    2316         if (pRc->RcDesc.fFlags.Texture || pRc->RcDesc.fFlags.Value == 0)
     2343        if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE)
    23172344        {
    23182345            PVBOXWDDMDISP_ALLOCATION pTexAlloc = &pRc->aAllocations[0];
     
    24202447            }
    24212448        }
    2422         else if (pRc->RcDesc.fFlags.VertexBuffer)
     2449        else if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_VERTEXBUFFER)
    24232450        {
    24242451            Assert(pData->SubResourceIndex < pRc->cAllocations);
     
    25172544            }
    25182545        }
    2519         else if (pRc->RcDesc.fFlags.IndexBuffer)
     2546        else if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_INDEXBUFFER)
    25202547        {
    25212548            Assert(pData->SubResourceIndex < pRc->cAllocations);
     
    27032730    if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
    27042731    {
    2705         if (pRc->RcDesc.fFlags.Texture || pRc->RcDesc.fFlags.Value == 0)
     2732        if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE)
    27062733        {
    27072734            Assert(pData->SubResourceIndex < pRc->cAllocations);
     
    27322759            }
    27332760        }
    2734         else if (pRc->RcDesc.fFlags.VertexBuffer)
     2761        else if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_VERTEXBUFFER)
    27352762        {
    27362763            Assert(pData->SubResourceIndex < pRc->cAllocations);
     
    27722799            }
    27732800        }
    2774         else if (pRc->RcDesc.fFlags.IndexBuffer)
     2801        else if (pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_INDEXBUFFER)
    27752802        {
    27762803            Assert(pData->SubResourceIndex < pRc->cAllocations);
     
    29793006                    {
    29803007                        Assert(pD3D9Surf);
     3008                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
     3009                        pAllocation->pD3DIf = pD3D9Surf;
    29813010                        if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    29823011                        {
     
    29963025                            Assert(!pAllocation->pvMem);
    29973026                        }
    2998                         pAllocation->pD3DIf = pD3D9Surf;
    29993027                    }
    30003028                    else
     
    30253053                    {
    30263054                        Assert(pD3D9VBuf);
     3055                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_VERTEXBUFFER;
     3056                        pAllocation->pD3DIf = pD3D9VBuf;
    30273057                        if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    30283058                        {
     
    30433073                            Assert(!pAllocation->pvMem);
    30443074                        }
    3045                         pAllocation->pD3DIf = pD3D9VBuf;
    30463075                    }
    30473076                    else
     
    30743103                    {
    30753104                        Assert(pD3D9IBuf);
     3105                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_INDEXBUFFER;
     3106                        pAllocation->pD3DIf = pD3D9IBuf;
    30763107                        if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    30773108                        {
     
    30923123                            Assert(!pAllocation->pvMem);
    30933124                        }
    3094                         pAllocation->pD3DIf = pD3D9IBuf;
    30953125                    }
    30963126                    else
     
    31213151                }
    31223152#endif
     3153
     3154                if (pResource->Flags.RenderTarget)
     3155                    bIssueCreateResource = true;
    31233156
    31243157                PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[0];
     
    31383171                {
    31393172                    Assert(pD3DIfTex);
     3173                    pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_TEXTURE;
     3174                    pAllocation->pD3DIf = pD3DIfTex;
    31403175                    if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    31413176                    {
     
    31603195                        }
    31613196                    }
    3162                     pAllocation->pD3DIf = pD3DIfTex;
    31633197                }
    31643198#ifdef DEBUG
     
    31923226                        D3DPRESENT_PARAMETERS params;
    31933227                        memset(&params, 0, sizeof (params));
    3194             //            params.BackBufferWidth = 0;
    3195             //            params.BackBufferHeight = 0;
     3228                        //            params.BackBufferWidth = 0;
     3229                        //            params.BackBufferHeight = 0;
    31963230                        params.BackBufferFormat = vboxDDI2D3DFormat(pResource->Format);
    31973231                        Assert(pResource->SurfCount);
     
    32013235                            params.SwapEffect = D3DSWAPEFFECT_DISCARD;
    32023236                        params.hDeviceWindow = hWnd;
    3203                         /* @todo: it seems there should be a way to detect this correctly since
    3204                          * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */
     3237                                    /* @todo: it seems there should be a way to detect this correctly since
     3238                                     * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */
    32053239                        params.Windowed = TRUE;
    3206             //            params.EnableAutoDepthStencil = FALSE;
    3207             //            params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
    3208             //            params.Flags;
    3209             //            params.FullScreen_RefreshRateInHz;
    3210             //            params.FullScreen_PresentationInterval;
     3240                        //            params.EnableAutoDepthStencil = FALSE;
     3241                        //            params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
     3242                        //            params.Flags;
     3243                        //            params.FullScreen_RefreshRateInHz;
     3244                        //            params.FullScreen_PresentationInterval;
    32113245                        hr = pAdapter->pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, fFlags, &params, &pDevice9If);
    32123246                        Assert(hr == S_OK);
     
    32223256                {
    32233257                    Assert(pDevice->hWnd);
    3224 
    32253258                }
    32263259
     
    32353268                        IDirect3DSurface9* pD3D9Surf;
    32363269                        hr = pDevice->pDevice9If->CreateRenderTarget(pAllocation->SurfDesc.width,
    3237                                     pAllocation->SurfDesc.height,
    3238                                     vboxDDI2D3DFormat(pResource->Format),
    3239                                     vboxDDI2D3DMultiSampleType(pResource->MultisampleType),
    3240                                     pResource->MultisampleQuality,
    3241                                     !pResource->Flags.NotLockable /* BOOL Lockable */,
    3242                                     &pD3D9Surf,
    3243                                     NULL /* HANDLE* pSharedHandle */
    3244                                   );
     3270                                pAllocation->SurfDesc.height,
     3271                                vboxDDI2D3DFormat(pResource->Format),
     3272                                vboxDDI2D3DMultiSampleType(pResource->MultisampleType),
     3273                                pResource->MultisampleQuality,
     3274                                !pResource->Flags.NotLockable /* BOOL Lockable */,
     3275                                &pD3D9Surf,
     3276                                NULL /* HANDLE* pSharedHandle */
     3277                                );
    32453278                        Assert(hr == S_OK);
    32463279                        if (hr == S_OK)
    32473280                        {
    32483281                            Assert(pD3D9Surf);
     3282                            pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
     3283                            pAllocation->pD3DIf = pD3D9Surf;
    32493284                            if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM)
    32503285                            {
     
    32643299                                Assert(!pAllocation->pvMem);
    32653300                            }
    3266                             pAllocation->pD3DIf = pD3D9Surf;
    32673301                        }
    32683302                        else
     
    34723506    PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];
    34733507    Assert(pRc->RcDesc.fFlags.RenderTarget);
     3508    Assert(pRc->aAllocations[pData->SubResourceIndex].enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
    34743509    Assert(pAlloc->hAllocation);
    34753510    D3DDDICB_SETDISPLAYMODE DdiDm = {0};
     
    36103645    Assert(pDevice->pDevice9If);
    36113646    IDirect3DVertexDeclaration9 *pDecl = (IDirect3DVertexDeclaration9*)hShaderHandle;
    3612     HRESULT hr = pDecl->Release();
    3613     Assert(hr == S_OK);
     3647    HRESULT hr = S_OK;
     3648    pDecl->Release();
    36143649    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
    36153650    return hr;
     
    36533688    Assert(pDevice->pDevice9If);
    36543689    IDirect3DVertexShader9 *pShader = (IDirect3DVertexShader9*)hShaderHandle;
    3655     HRESULT hr = pShader->Release();
    3656     Assert(hr == S_OK);
     3690    HRESULT hr = S_OK;
     3691    pShader->Release();
    36573692    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
    36583693    return hr;
     
    37503785    return E_FAIL;
    37513786}
    3752 static HRESULT vboxWddmLockRect(PVBOXWDDMDISP_ALLOCATION pAlloc, UINT iAlloc, D3DDDI_RESOURCEFLAGS fAllocType,
     3787static HRESULT vboxWddmLockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc,
    37533788        D3DLOCKED_RECT * pLockedRect,
    37543789        CONST RECT *pRect,
     
    37563791{
    37573792    HRESULT hr = E_FAIL;
    3758     Assert(!pAlloc->LockInfo.cLocks);
    3759     if (fAllocType.Texture || fAllocType.Value == 0)
    3760     {
    3761         IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pAlloc->pD3DIf;
    3762         Assert(pD3DIfTex);
    3763         hr = pD3DIfTex->LockRect(iAlloc, pLockedRect, pRect, fLockFlags);
    3764         Assert(hr == S_OK);
    3765     }
    3766     else if (fAllocType.RenderTarget)
    3767     {
    3768         IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pAlloc->pD3DIf;
    3769         Assert(pD3DIfSurf);
    3770         hr = pD3DIfSurf->LockRect(pLockedRect, pRect, fLockFlags);
    3771         Assert(hr == S_OK);
    3772     }
    3773     else
    3774     {
    3775         AssertBreakpoint();
    3776     }
    3777     return hr;
    3778 }
    3779 static HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_ALLOCATION pAlloc, UINT iAlloc, D3DDDI_RESOURCEFLAGS fAllocType)
    3780 {
    3781     HRESULT hr = E_FAIL;
    3782     Assert(!pAlloc->LockInfo.cLocks);
    3783     if (fAllocType.Texture || fAllocType.Value == 0)
    3784     {
    3785         IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pAlloc->pD3DIf;
    3786         Assert(pD3DIfTex);
    3787         hr = pD3DIfTex->UnlockRect(iAlloc);
    3788         Assert(hr == S_OK);
    3789     }
    3790     else if (fAllocType.RenderTarget)
    3791     {
    3792         IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pAlloc->pD3DIf;
    3793         Assert(pD3DIfSurf);
    3794         hr = pD3DIfSurf->UnlockRect();
    3795         Assert(hr == S_OK);
    3796     }
    3797     else
    3798     {
    3799         AssertBreakpoint();
    3800     }
    3801     return hr;
    3802 }
     3793    Assert(!pRc->aAllocations[iAlloc].LockInfo.cLocks);
     3794    Assert(pRc->cAllocations > iAlloc);
     3795    switch (pRc->aAllocations[0].enmD3DIfType)
     3796    {
     3797        case VBOXDISP_D3DIFTYPE_SURFACE:
     3798        {
     3799            IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;
     3800            Assert(pD3DIfSurf);
     3801            hr = pD3DIfSurf->LockRect(pLockedRect, pRect, fLockFlags);
     3802            Assert(hr == S_OK);
     3803            break;
     3804        }
     3805        case VBOXDISP_D3DIFTYPE_TEXTURE:
     3806        {
     3807            IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
     3808            Assert(pD3DIfTex);
     3809            hr = pD3DIfTex->LockRect(iAlloc, pLockedRect, pRect, fLockFlags);
     3810            Assert(hr == S_OK);
     3811            break;
     3812        }
     3813        default:
     3814            AssertBreakpoint();
     3815            break;
     3816    }
     3817    return hr;
     3818}
     3819static HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc)
     3820{
     3821    HRESULT hr = S_OK;
     3822    Assert(pRc->cAllocations > iAlloc);
     3823    switch (pRc->aAllocations[0].enmD3DIfType)
     3824    {
     3825        case VBOXDISP_D3DIFTYPE_SURFACE:
     3826        {
     3827            IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;
     3828            Assert(pD3DIfSurf);
     3829            hr = pD3DIfSurf->UnlockRect();
     3830            Assert(hr == S_OK);
     3831            break;
     3832        }
     3833        case VBOXDISP_D3DIFTYPE_TEXTURE:
     3834        {
     3835            IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
     3836            Assert(pD3DIfTex);
     3837            hr = pD3DIfTex->UnlockRect(iAlloc);
     3838            Assert(hr == S_OK);
     3839            break;
     3840        }
     3841        default:
     3842            AssertBreakpoint();
     3843            hr = E_FAIL;
     3844            break;
     3845    }
     3846    return hr;
     3847}
     3848
     3849/* on success increments the surface ref counter,
     3850 * i.e. one must call pSurf->Release() once the surface is not needed*/
     3851static HRESULT vboxWddmSurfGet(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc, IDirect3DSurface9 **ppSurf)
     3852{
     3853    HRESULT hr = S_OK;
     3854    Assert(pRc->cAllocations > iAlloc);
     3855    switch (pRc->aAllocations[0].enmD3DIfType)
     3856    {
     3857        case VBOXDISP_D3DIFTYPE_SURFACE:
     3858        {
     3859            IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pRc->aAllocations[iAlloc].pD3DIf;
     3860            Assert(pD3DIfSurf);
     3861            pD3DIfSurf->AddRef();
     3862            *ppSurf = pD3DIfSurf;
     3863            break;
     3864        }
     3865        case VBOXDISP_D3DIFTYPE_TEXTURE:
     3866        {
     3867            IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
     3868            IDirect3DSurface9 *pSurfaceLevel;
     3869            Assert(pD3DIfTex);
     3870            hr = pD3DIfTex->GetSurfaceLevel(iAlloc, &pSurfaceLevel);
     3871            Assert(hr == S_OK);
     3872            if (hr == S_OK)
     3873            {
     3874                *ppSurf = pSurfaceLevel;
     3875            }
     3876            break;
     3877        }
     3878        default:
     3879            AssertBreakpoint();
     3880            hr = E_FAIL;
     3881            break;
     3882    }
     3883    return hr;
     3884}
     3885
    38033886static HRESULT APIENTRY vboxWddmDDevBlt(HANDLE hDevice, CONST D3DDDIARG_BLT* pData)
    38043887{
     
    38113894    Assert(pDstRc->cAllocations > pData->DstSubResourceIndex);
    38123895    Assert(pSrcRc->cAllocations > pData->SrcSubResourceIndex);
    3813     PVBOXWDDMDISP_ALLOCATION pSrcAlloc = &pSrcRc->aAllocations[pData->SrcSubResourceIndex];
    3814     PVBOXWDDMDISP_ALLOCATION pDstAlloc = &pDstRc->aAllocations[pData->DstSubResourceIndex];
    38153896    HRESULT hr = S_OK;
    3816     if ((pDstRc->RcDesc.fFlags.Texture || pDstRc->RcDesc.fFlags.Value == 0)
     3897    /* try StretchRect */
     3898    IDirect3DSurface9 *pSrcSurfIf = NULL;
     3899    IDirect3DSurface9 *pDstSurfIf = NULL;
     3900    hr = vboxWddmSurfGet(pSrcRc, pData->SrcSubResourceIndex, &pSrcSurfIf);
     3901    Assert(hr == S_OK);
     3902    if (hr == S_OK)
     3903    {
     3904        Assert(pSrcSurfIf);
     3905        hr = vboxWddmSurfGet(pDstRc, pData->DstSubResourceIndex, &pDstSurfIf);
     3906        Assert(hr == S_OK);
     3907        if (hr == S_OK)
     3908        {
     3909            Assert(pDstSurfIf);
     3910            /* we support only Point & Linear, we ignore [Begin|Continue|End]PresentToDwm */
     3911            Assert((pData->Flags.Value & (~(0x00000100 | 0x00000200 | 0x00000400 | 0x00000001  | 0x00000002))) == 0);
     3912            hr = pDevice->pDevice9If->StretchRect(pSrcSurfIf,
     3913                                &pData->SrcRect,
     3914                                pDstSurfIf,
     3915                                &pData->DstRect,
     3916                                vboxDDI2D3DBltFlags(pData->Flags));
     3917            Assert(hr == S_OK);
     3918            pDstSurfIf->Release();
     3919        }
     3920        pSrcSurfIf->Release();
     3921    }
     3922
     3923    if (hr != S_OK)
     3924    {
     3925        /* todo: fallback to memcpy or whatever ? */
     3926        AssertBreakpoint();
     3927    }
     3928
     3929
     3930#if 0
     3931    if ((use pAlloc->enmD3DIfType instead!!! pDstRc->RcDesc.fFlags.Texture || pDstRc->RcDesc.fFlags.Value == 0)
    38173932            && (pSrcRc->RcDesc.fFlags.Texture || pSrcRc->RcDesc.fFlags.Value == 0))
    38183933    {
     
    39154030        }
    39164031    }
     4032#endif
    39174033
    39184034    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    40504166    Assert(pDevice->pDevice9If);
    40514167    IDirect3DPixelShader9 *pShader = (IDirect3DPixelShader9*)hShaderHandle;
    4052     HRESULT hr = pShader->Release();
    4053     Assert(hr == S_OK);
     4168    HRESULT hr = S_OK;
     4169    pShader->Release();
    40544170    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
    40554171    return hr;
     
    47014817        HRESULT hr = VBoxDispWorkerDestroy(&pAdapter->WndWorker);
    47024818        Assert(hr == S_OK);
    4703         hr = pAdapter->pD3D9If->Release();
    4704         Assert(hr == S_OK);
     4819        pAdapter->pD3D9If->Release();
    47054820        VBoxDispD3DClose(&pAdapter->D3D);
    47064821    }
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h

    r30554 r30582  
    129129} VBOXWDDMDISP_LOCKINFO;
    130130
     131typedef enum
     132{
     133    VBOXDISP_D3DIFTYPE_UNDEFINED = 0,
     134    VBOXDISP_D3DIFTYPE_SURFACE,
     135    VBOXDISP_D3DIFTYPE_TEXTURE,
     136    VBOXDISP_D3DIFTYPE_VERTEXBUFFER,
     137    VBOXDISP_D3DIFTYPE_INDEXBUFFER
     138} VBOXDISP_D3DIFTYPE;
     139
    131140typedef struct VBOXWDDMDISP_ALLOCATION
    132141{
     
    134143    VBOXWDDM_ALLOC_TYPE enmType;
    135144    void* pvMem;
    136     /* object type depends on resource type */
     145    /* object type is defined by enmD3DIfType enum */
    137146    IUnknown *pD3DIf;
     147    VBOXDISP_D3DIFTYPE enmD3DIfType;
    138148    VBOXWDDMDISP_LOCKINFO LockInfo;
    139149    VBOXWDDM_DIRTYREGION DirtyRegion; /* <- dirty region to notify host about */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r30566 r30582  
    19311931            case VBOXVDMACMD_TYPE_DMA_PRESENT_SHADOW2PRIMARY:
    19321932            case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT:
    1933             case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP:
    1934             {
    1935                 const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[0];
     1933            {
     1934                Assert(pPatch->PatchLocationListSubmissionLength == 2);
     1935                const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart];
    19361936                Assert(pPatchList->AllocationIndex == DXGK_PRESENT_SOURCE_INDEX);
    19371937                Assert(pPatchList->PatchOffset == 0);
     
    19411941                pPrivateData->SrcAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
    19421942
    1943                 pPatchList = &pPatch->pPatchLocationList[1];
     1943                pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart + 1];
    19441944                Assert(pPatchList->AllocationIndex == DXGK_PRESENT_DESTINATION_INDEX);
    19451945                Assert(pPatchList->PatchOffset == 4);
     
    19491949                pPrivateData->DstAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pDstAllocationList->PhysicalAddress.QuadPart;
    19501950                break;
     1951            }
     1952            case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP:
     1953            {
     1954                Assert(pPatch->PatchLocationListSubmissionLength == 1);
     1955                const D3DDDI_PATCHLOCATIONLIST* pPatchList = &pPatch->pPatchLocationList[pPatch->PatchLocationListSubmissionStart];
     1956                Assert(pPatchList->AllocationIndex == DXGK_PRESENT_SOURCE_INDEX);
     1957                Assert(pPatchList->PatchOffset == 0);
     1958                const DXGK_ALLOCATIONLIST *pSrcAllocationList = &pPatch->pAllocationList[pPatchList->AllocationIndex];
     1959                Assert(pSrcAllocationList->SegmentId);
     1960                pPrivateData->SrcAllocInfo.segmentIdAlloc = pSrcAllocationList->SegmentId;
     1961                pPrivateData->SrcAllocInfo.offAlloc = (VBOXVIDEOOFFSET)pSrcAllocationList->PhysicalAddress.QuadPart;
    19511962            }
    19521963            default:
     
    21872198            if (pRectsCmd)
    21882199            {
    2189                 PVBOXWDDM_ALLOCATION pDstAlloc = pPrivateData->DstAllocInfo.pAlloc;
     2200                PVBOXWDDM_ALLOCATION pAlloc = pPrivateData->SrcAllocInfo.pAlloc;
    21902201                pRectsCmd->pContext = pContext;
    21912202                RECT r;
    21922203                r.top = 0;
    21932204                r.left = 0;
    2194                 r.right = pDstAlloc->SurfDesc.width;
    2195                 r.bottom = pDstAlloc->SurfDesc.height;
     2205                r.right = pAlloc->SurfDesc.width;
     2206                r.bottom = pAlloc->SurfDesc.height;
    21962207                pRectsCmd->ContextsRects.ContextRect = r;
    21972208                pRectsCmd->ContextsRects.UpdateRects.cRects = 1;
     
    40474058    else if (pPresent->Flags.Flip)
    40484059    {
    4049         Assert(pPresent->Flags.Value == 1); /* only Blt is set, we do not support anything else for now */
     4060        Assert(pPresent->Flags.Value == 4); /* only Blt is set, we do not support anything else for now */
    40504061        DXGK_ALLOCATIONLIST *pSrc =  &pPresent->pAllocationList[DXGK_PRESENT_SOURCE_INDEX];
    4051         DXGK_ALLOCATIONLIST *pDst =  &pPresent->pAllocationList[DXGK_PRESENT_DESTINATION_INDEX];
    40524062        PVBOXWDDM_ALLOCATION pSrcAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pSrc);
    40534063        Assert(pSrcAlloc);
    40544064        if (pSrcAlloc)
    40554065        {
    4056             PVBOXWDDM_ALLOCATION pDstAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pDst);
    4057             Assert(pDstAlloc);
    4058             if (pDstAlloc)
    4059             {
    4060                 Assert(cContexts3D);
    4061                 pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP;
    4062 
    4063                 vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
    4064                 vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
    4065 
    4066                 UINT cbCmd = sizeof (VBOXVDMACMD_DMA_PRESENT_FLIP);
    4067                 pPresent->pDmaBufferPrivateData = (uint8_t*)pPresent->pDmaBufferPrivateData + cbCmd;
    4068                 pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    4069                 Assert(pPresent->DmaSize >= VBOXWDDM_DUMMY_DMABUFFER_SIZE);
    4070 
    4071                 memset(pPresent->pPatchLocationListOut, 0, 2*sizeof (D3DDDI_PATCHLOCATIONLIST));
    4072                 pPresent->pPatchLocationListOut->PatchOffset = 0;
    4073                 pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX;
    4074                 ++pPresent->pPatchLocationListOut;
    4075                 pPresent->pPatchLocationListOut->PatchOffset = 4;
    4076                 pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_DESTINATION_INDEX;
    4077                 ++pPresent->pPatchLocationListOut;
    4078             }
    4079             else
    4080             {
    4081                 /* this should not happen actually */
    4082                 drprintf((__FUNCTION__": failed to get Dst Allocation info for hDeviceSpecificAllocation(0x%x)\n",pDst->hDeviceSpecificAllocation));
    4083                 Status = STATUS_INVALID_HANDLE;
    4084             }
     4066            Assert(cContexts3D);
     4067            pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP;
     4068
     4069            vboxWddmPopulateDmaAllocInfo(&pPrivateData->SrcAllocInfo, pSrcAlloc, pSrc);
     4070
     4071            UINT cbCmd = sizeof (VBOXVDMACMD_DMA_PRESENT_FLIP);
     4072            pPresent->pDmaBufferPrivateData = (uint8_t*)pPresent->pDmaBufferPrivateData + cbCmd;
     4073            pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     4074            Assert(pPresent->DmaSize >= VBOXWDDM_DUMMY_DMABUFFER_SIZE);
     4075
     4076            memset(pPresent->pPatchLocationListOut, 0, sizeof (D3DDDI_PATCHLOCATIONLIST));
     4077            pPresent->pPatchLocationListOut->PatchOffset = 0;
     4078            pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX;
     4079            ++pPresent->pPatchLocationListOut;
    40854080        }
    40864081        else
    40874082        {
    40884083            /* this should not happen actually */
    4089             drprintf((__FUNCTION__": failed to get Src Allocation info for hDeviceSpecificAllocation(0x%x)\n",pSrc->hDeviceSpecificAllocation));
     4084            drprintf((__FUNCTION__": failed to get pSrc Allocation info for hDeviceSpecificAllocation(0x%x)\n",pSrc->hDeviceSpecificAllocation));
    40904085            Status = STATUS_INVALID_HANDLE;
    40914086        }
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