VirtualBox

Ignore:
Timestamp:
Jun 21, 2010 5:03:55 PM (15 years ago)
Author:
vboxsync
Message:

wddm/3d: create render target resource & issue present request for getting d3d render visible regions, size and position

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

Legend:

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

    r30317 r30346  
    10781078        fFlags |= D3DLOCK_DONOTWAIT;
    10791079    return fFlags;
    1080 }
    1081 
    1082 static void vboxResourcePopulateRcDesc(VBOXWDDM_RC_DESC *pDesc, D3DDDIARG_CREATERESOURCE* pResource)
    1083 {
    1084     pDesc->fFlags = pResource->Flags;
    1085     pDesc->enmFormat = pResource->Format;
    1086     pDesc->enmPool = pResource->Pool;
    1087     pDesc->enmMultisampleType = pResource->MultisampleType;
    1088     pDesc->MultisampleQuality = pResource->MultisampleQuality;
    1089     pDesc->MipLevels = pResource->MipLevels;
    1090     pDesc->Fvf = pResource->Fvf;
    1091     pDesc->VidPnSourceId = pResource->VidPnSourceId;
    1092     pDesc->RefreshRate = pResource->RefreshRate;
    1093     pDesc->enmRotation = pResource->Rotation;
    10941080}
    10951081
     
    25652551}
    25662552
     2553static void vboxWddmRequestAllocFree(D3DDDICB_ALLOCATE* pAlloc)
     2554{
     2555    RTMemFree(pAlloc);
     2556}
     2557
    25672558static D3DDDICB_ALLOCATE* vboxWddmRequestAllocAlloc(D3DDDIARG_CREATERESOURCE* pResource)
    25682559{
     
    26102601    PVBOXWDDMDISP_ADAPTER pAdapter = pDevice->pAdapter;
    26112602
    2612     if (VBOXDISPMODE_IS_3D(pAdapter))
    2613     {
    2614         PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(pResource->SurfCount);
    2615         Assert(pRc);
    2616         if (pRc)
    2617         {
    2618             pRc->hResource = pResource->hResource;
    2619             pRc->pDevice = pDevice;
    2620             pRc->fFlags = VBOXWDDM_RESOURCE_F_TYPE_GENERIC;
    2621             vboxResourcePopulateRcDesc(&pRc->RcDesc, pResource);
    2622             pRc->cAllocations = pResource->SurfCount;
    2623             for (UINT i = 0; i < pResource->SurfCount; ++i)
    2624             {
    2625                 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    2626                 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
    2627                 pAllocation->hAllocation = NULL;
    2628                 pAllocation->enmType = VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC;
    2629                 pAllocation->pvMem = (void*)pSurf->pSysMem;
    2630                 pAllocation->SurfDesc.pitch = pSurf->SysMemPitch;
    2631                 pAllocation->SurfDesc.slicePitch = pSurf->SysMemSlicePitch;
    2632                 pAllocation->SurfDesc.depth = pSurf->Depth;
    2633                 pAllocation->SurfDesc.width = pSurf->Width;
    2634                 pAllocation->SurfDesc.height = pSurf->Height;
    2635                 pAllocation->SurfDesc.format = pResource->Format;
    2636             }
    2637 
     2603    PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(pResource->SurfCount);
     2604    Assert(pRc);
     2605    if (pRc)
     2606    {
     2607        bool bIssueCreateResource = false;
     2608
     2609        pRc->hResource = pResource->hResource;
     2610        pRc->hKMResource = NULL;
     2611        pRc->pDevice = pDevice;
     2612        pRc->fFlags = VBOXWDDM_RESOURCE_F_TYPE_GENERIC;
     2613        pRc->RcDesc.fFlags = pResource->Flags;
     2614        pRc->RcDesc.enmFormat = pResource->Format;
     2615        pRc->RcDesc.enmPool = pResource->Pool;
     2616        pRc->RcDesc.enmMultisampleType = pResource->MultisampleType;
     2617        pRc->RcDesc.MultisampleQuality = pResource->MultisampleQuality;
     2618        pRc->RcDesc.MipLevels = pResource->MipLevels;
     2619        pRc->RcDesc.Fvf = pResource->Fvf;
     2620        pRc->RcDesc.VidPnSourceId = pResource->VidPnSourceId;
     2621        pRc->RcDesc.RefreshRate = pResource->RefreshRate;
     2622        pRc->RcDesc.enmRotation = pResource->Rotation;
     2623        pRc->cAllocations = pResource->SurfCount;
     2624        for (UINT i = 0; i < pResource->SurfCount; ++i)
     2625        {
     2626            PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
     2627            CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
     2628            pAllocation->hAllocation = NULL;
     2629            pAllocation->enmType = VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC;
     2630            pAllocation->pvMem = (void*)pSurf->pSysMem;
     2631            pAllocation->SurfDesc.pitch = pSurf->SysMemPitch;
     2632            pAllocation->SurfDesc.slicePitch = pSurf->SysMemSlicePitch;
     2633            pAllocation->SurfDesc.depth = pSurf->Depth;
     2634            pAllocation->SurfDesc.width = pSurf->Width;
     2635            pAllocation->SurfDesc.height = pSurf->Height;
     2636            pAllocation->SurfDesc.format = pResource->Format;
     2637        }
     2638
     2639        if (VBOXDISPMODE_IS_3D(pAdapter))
     2640        {
    26382641            if (pResource->Flags.RenderTarget)
    26392642            {
     
    26422645                Assert(!pDevice->pDevice9If);
    26432646                Assert(!pDevice->hWnd);
     2647                bIssueCreateResource = true;
    26442648                hr = VBoxDispWndCreate(pAdapter, pResource->pSurfList[0].Width, pResource->pSurfList[0].Height, &hWnd);
    26452649                Assert(hr == S_OK);
     
    29482952                Assert(0);
    29492953            }
    2950 
    2951             if (hr == S_OK)
    2952                 pResource->hResource = pRc;
    2953             else
    2954                 vboxResourceFree(pRc);
    29552954        }
    29562955        else
    2957         {
    2958             hr = E_OUTOFMEMORY;
    2959         }
    2960 
    2961     }
    2962     else
    2963     {
    2964         PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(pResource->SurfCount);
    2965         Assert(pRc);
    2966         if (pRc)
    2967         {
    2968             pRc->hResource = pResource->hResource;
    2969             pRc->hKMResource = NULL;
    2970             pRc->pDevice = pDevice;
    2971             pRc->fFlags = VBOXWDDM_RESOURCE_F_TYPE_GENERIC;
    2972             pRc->RcDesc.fFlags = pResource->Flags;
    2973             pRc->RcDesc.enmFormat = pResource->Format;
    2974             pRc->RcDesc.enmPool = pResource->Pool;
    2975             pRc->RcDesc.enmMultisampleType = pResource->MultisampleType;
    2976             pRc->RcDesc.MultisampleQuality = pResource->MultisampleQuality;
    2977             pRc->RcDesc.MipLevels = pResource->MipLevels;
    2978             pRc->RcDesc.Fvf = pResource->Fvf;
    2979             pRc->RcDesc.VidPnSourceId = pResource->VidPnSourceId;
    2980             pRc->RcDesc.RefreshRate = pResource->RefreshRate;
    2981             pRc->RcDesc.enmRotation = pResource->Rotation;
    2982             pRc->cAllocations = pResource->SurfCount;
    2983 
     2956            bIssueCreateResource = true;
     2957
     2958
     2959        if (hr == S_OK && bIssueCreateResource)
     2960        {
    29842961            D3DDDICB_ALLOCATE *pDdiAllocate = vboxWddmRequestAllocAlloc(pResource);
    29852962            Assert(pDdiAllocate);
     
    30052982                    pDdiAllocI->VidPnSourceId = pResource->VidPnSourceId;
    30062983                    pDdiAllocI->Flags.Value = 0;
    3007                     if (pResource->Flags.Primary)
     2984                    if (pResource->Flags.Primary && pResource->Flags.RenderTarget)
    30082985                        pDdiAllocI->Flags.Primary = 1;
    30092986
     
    30413018                if (hr == S_OK)
    30423019                {
     3020                    pRc->hKMResource = pDdiAllocate->hKMResource;
     3021
    30433022                    for (UINT i = 0; i < pResource->SurfCount; ++i)
    30443023                    {
     
    30533032                    }
    30543033                }
     3034
     3035                vboxWddmRequestAllocFree(pDdiAllocate);
    30553036            }
    30563037            else
     
    30643045                vboxResourceFree(pRc);
    30653046        }
     3047
     3048        if (hr == S_OK)
     3049            pResource->hResource = pRc;
    30663050        else
    3067         {
    3068             hr = E_OUTOFMEMORY;
    3069         }
    3070     }
     3051            vboxResourceFree(pRc);
     3052    }
     3053    else
     3054    {
     3055        hr = E_OUTOFMEMORY;
     3056    }
     3057
    30713058
    30723059    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
     
    31043091        }
    31053092    }
    3106     else
     3093
     3094    Assert(pRc->hResource);
     3095    Assert(pRc->hKMResource || VBOXDISPMODE_IS_3D(pAdapter));
     3096    if (pRc->hKMResource)
    31073097    {
    31083098        if (!(pRc->fFlags & VBOXWDDM_RESOURCE_F_OPENNED))
     
    31103100            D3DDDICB_DEALLOCATE Dealloc;
    31113101            Dealloc.hResource = pRc->hResource;
    3112             Assert(pRc->hResource);
    31133102            /* according to the docs the below two are ignored in case we set the hResource */
    31143103            Dealloc.NumAllocations = 0;
     
    31573146#endif
    31583147    }
     3148#if 1
    31593149    else
     3150#endif
    31603151    {
    31613152        D3DDDICB_PRESENT DdiPresent = {0};
     
    31633154        {
    31643155            PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
     3156            Assert(pRc->hKMResource);
    31653157            Assert(pRc->cAllocations > pData->SrcSubResourceIndex);
    31663158            PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SrcSubResourceIndex];
     
    31713163        {
    31723164            PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hDstResource;
     3165            Assert(pRc->hKMResource);
    31733166            Assert(pRc->cAllocations > pData->DstSubResourceIndex);
    31743167            PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->DstSubResourceIndex];
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r30317 r30346  
    15421542                                    Status = STATUS_UNSUCCESSFUL;
    15431543                            }
     1544                            else
    15441545#endif
     1546                            if (pAllocInfo->fFlags.RenderTarget)
     1547                            {
     1548                                pAllocationInfo->Flags.CpuVisible = 1;
     1549                                Assert(pAllocation->SurfDesc.bpp);
     1550                                Assert(pAllocation->SurfDesc.pitch);
     1551                                Assert(pAllocation->SurfDesc.cbSize);
     1552                            }
    15451553                        }
    15461554//                        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