VirtualBox

Changeset 38884 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 27, 2011 9:59:15 AM (13 years ago)
Author:
vboxsync
Message:

wddm/3d: rendering fixes

File:
1 edited

Legend:

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

    r38660 r38884  
    20142014}
    20152015#endif
    2016 static PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc)
     2016static PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc, BOOL *pbNeedPresent)
    20172017{
    20182018    PVBOXWDDMDISP_SWAPCHAIN pSwapchain = pBbAlloc->pSwapchain;
     
    20232023        if (pRt->pAlloc != pBbAlloc)
    20242024        {
     2025            if (pBbAlloc == vboxWddmSwapchainGetFb(pSwapchain)->pAlloc)
     2026            {
     2027                /* the current front-buffer present is requested, don't do anything */
     2028                *pbNeedPresent = FALSE;
     2029                return pSwapchain;
     2030            }
    20252031            /* bad, @todo: correct the swapchain by either removing the Rt and adding it to another swapchain
    20262032             * or by removing the pBbAlloc out of it */
     
    20282034        }
    20292035    }
     2036
     2037    *pbNeedPresent = TRUE;
     2038
    20302039    if (!pSwapchain)
    20312040    {
     
    21212130    PVBOXWDDMDISP_ALLOCATION pAlloc = pRt->pAlloc;
    21222131    Assert(pD3D9Surf);
    2123     Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
     2132    Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE
     2133            || pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
    21242134    if (pAlloc->pD3DIf)
    21252135    {
    21262136        if (pSwapchain->fFlags.bChanged)
    21272137        {
    2128             IDirect3DSurface9 *pD3D9OldSurf = (IDirect3DSurface9*)pAlloc->pD3DIf;
     2138            IDirect3DSurface9 *pD3D9OldSurf = NULL;
     2139            if (pAlloc->pD3DIf)
     2140            {
     2141                /* since this can be texture, need to do the vboxWddmSurfGet magic */
     2142                hr = vboxWddmSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9OldSurf);
     2143                if (FAILED(hr))
     2144                {
     2145                    WARN(("vboxWddmSurfGet failed, hr (0x%x)",hr));
     2146                    pD3D9Surf->Release();
     2147                    return hr;
     2148                }
     2149            }
     2150
    21292151            if (pD3D9OldSurf && pD3D9OldSurf != pD3D9Surf)
    21302152            {
     
    21532175                }
    21542176            }
     2177
     2178            if (pD3D9OldSurf)
     2179            {
     2180                pD3D9OldSurf->Release();
     2181            }
     2182        }
     2183        else
     2184        {
     2185            Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
    21552186        }
    21562187        pAlloc->pD3DIf->Release();
    21572188    }
    21582189
     2190    pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    21592191    pAlloc->pD3DIf = pD3D9Surf;
    21602192    pRt->fFlags.Value = 0;
     
    23512383                        if (!pRT->pAlloc->pD3DIf)
    23522384                            continue;
    2353                         IDirect3DSurface9* pD3D9OldSurf = (IDirect3DSurface9*)pRT->pAlloc->pD3DIf;
     2385                        IDirect3DSurface9* pD3D9OldSurf = NULL;
    23542386                        VOID *pvSwapchain = NULL;
     2387                        /* since this can be texture, need to do the vboxWddmSurfGet magic */
     2388                        hr = vboxWddmSurfGet(pRT->pAlloc->pRc, pRT->pAlloc->iAlloc, &pD3D9OldSurf);
     2389                        Assert(hr == S_OK);
    23552390                        tmpHr = pD3D9OldSurf->GetContainer(IID_IDirect3DSwapChain9, &pvSwapchain);
    23562391                        if (tmpHr == S_OK)
     
    23942429                            continue;
    23952430
     2431                        pRT->pAlloc->pD3DIf->Release();
    23962432                        pRT->pAlloc->pD3DIf = pD3D9NewSurf;
    23972433                        pD3D9OldSurf->Release();
     
    24662502        if (hr == S_OK)
    24672503        {
     2504#ifdef DEBUG
    24682505            for (UINT i = 0; i < cSurfs; ++i)
    24692506            {
    24702507                PVBOXWDDMDISP_RENDERTGT pRt = &pSwapchain->aRTs[i];
    2471                 pRt->pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    2472             }
    2473 
     2508                Assert(pRt->pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE
     2509                        || pRt->pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
     2510            }
     2511#endif
    24742512            hr = vboxWddmSwapchainSynch(pDevice, pSwapchain);
    24752513            Assert(hr == S_OK);
     
    26552693static HRESULT vboxWddmSwapchainPresent(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc)
    26562694{
    2657     BOOL bChanged = FALSE;
    2658     PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainFindCreate(pDevice, pBbAlloc);
     2695    BOOL bNeedPresent;
     2696    PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainFindCreate(pDevice, pBbAlloc, &bNeedPresent);
    26592697    Assert(pSwapchain);
     2698    if (!bNeedPresent)
     2699        return S_OK;
    26602700    if (pSwapchain)
    26612701    {
     
    27442784        {
    27452785            PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i];
     2786            pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    27462787            pAlloc->SurfDesc.width = 0x4;
    27472788            pAlloc->SurfDesc.height = 0x4;
     
    37313772    PVBOXWDDMDISP_RESOURCE pSrcRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
    37323773    /* requirements for D3DDevice9::UpdateTexture */
     3774    Assert(pDstRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
     3775    Assert(pSrcRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
    37333776    Assert(pSrcRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM);
    37343777    Assert(pDstRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM);
     
    50905133                    bCreateSwapchain = true;
    50915134                    Assert(bIssueCreateResource);
     5135                    for (UINT i = 0; i < pRc->cAllocations; ++i)
     5136                    {
     5137                        PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
     5138                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
     5139                    }
    50925140                }
    50935141                else
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