VirtualBox

Changeset 29928 in vbox


Ignore:
Timestamp:
May 31, 2010 8:55:34 PM (15 years ago)
Author:
vboxsync
Message:

wddm/2d: overlay surface creation/open fixes

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

Legend:

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

    r29922 r29928  
    556556    {
    557557        /* should be set by host */
    558         Assert(pInfo->flags & VBOXVHWA_SD_PITCH);
     558//        Assert(pInfo->flags & VBOXVHWA_SD_PITCH);
    559559        pSurf->SurfDesc.cbSize = pInfo->sizeX * pInfo->sizeY;
    560560        Assert(pSurf->SurfDesc.cbSize);
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r29922 r29928  
    3636{
    3737    ExFreePool(pvMem);
     38}
     39
     40DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromOpenData(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OPENALLOCATION pOa)
     41{
     42    DXGKARGCB_GETHANDLEDATA GhData;
     43    GhData.hObject = pOa->hAllocation;
     44    GhData.Type = DXGK_HANDLE_ALLOCATION;
     45    GhData.Flags.Value = 0;
     46    return (PVBOXWDDM_ALLOCATION)pDevExt->u.primary.DxgkInterface.DxgkCbGetHandleData(&GhData);
    3847}
    3948
     
    15241533                                if (RT_SUCCESS(rc))
    15251534                                {
    1526                                     pAllocInfo->SurfDesc = pAllocation->SurfDesc;
     1535                                    pAllocationInfo->Size = pAllocation->SurfDesc.cbSize;
    15271536                                }
    15281537                                else
     
    32613270
    32623271    NTSTATUS Status = STATUS_SUCCESS;
    3263 
    3264     for (UINT i = 0; i < pOpenAllocation->NumAllocations; ++i)
    3265     {
    3266         DXGK_OPENALLOCATIONINFO* pInfo = &pOpenAllocation->pOpenAllocation[i];
    3267         PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));
    3268         pOa->hAllocation = pInfo->hAllocation;
    3269         pInfo->hDeviceSpecificAllocation = pOa;
    3270     }
    3271 
     3272    PVBOXWDDM_DEVICE pDevice = (PVBOXWDDM_DEVICE)hDevice;
     3273    PDEVICE_EXTENSION pDevExt = pDevice->pAdapter;
     3274    PVBOXWDDM_RCINFO pRcInfo = NULL;
     3275    if (pOpenAllocation->PrivateDriverSize)
     3276    {
     3277        Assert(pOpenAllocation->PrivateDriverSize == sizeof (VBOXWDDM_RCINFO));
     3278        Assert(pOpenAllocation->pPrivateDriverData);
     3279        if (pOpenAllocation->PrivateDriverSize >= sizeof (VBOXWDDM_RCINFO))
     3280        {
     3281            pRcInfo = (PVBOXWDDM_RCINFO)pOpenAllocation->pPrivateDriverData;
     3282            Assert(pRcInfo->cAllocInfos == pOpenAllocation->NumAllocations);
     3283        }
     3284        else
     3285            Status = STATUS_INVALID_PARAMETER;
     3286    }
     3287
     3288    if (Status == STATUS_SUCCESS)
     3289    {
     3290        for (UINT i = 0; i < pOpenAllocation->NumAllocations; ++i)
     3291        {
     3292            DXGK_OPENALLOCATIONINFO* pInfo = &pOpenAllocation->pOpenAllocation[i];
     3293            Assert(pInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_ALLOCINFO));
     3294            Assert(pInfo->pPrivateDriverData);
     3295            PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));
     3296            pOa->hAllocation = pInfo->hAllocation;
     3297            pInfo->hDeviceSpecificAllocation = pOa;
     3298
     3299            if (pRcInfo)
     3300            {
     3301#ifdef VBOX_WITH_VIDEOHWACCEL
     3302                if (pRcInfo->RcDesc.fFlags.Overlay)
     3303                {
     3304                    if (pInfo->PrivateDriverDataSize >= sizeof (VBOXWDDM_ALLOCINFO))
     3305                    {
     3306                        PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pInfo->pPrivateDriverData;
     3307                        PVBOXWDDM_ALLOCATION pAllocation = vboxWddmGetAllocationFromOpenData(pDevExt, pOa);
     3308                        Assert(pAllocation);
     3309                        if (pAllocation)
     3310                        {
     3311                            /* we have queried host for some surface info, like pitch & size,
     3312                             * need to return it back to the UMD (User Mode Drive) */
     3313                            pAllocInfo->SurfDesc = pAllocation->SurfDesc;
     3314                            /* success, just contionue */
     3315                            continue;
     3316                        }
     3317                        else
     3318                            Status = STATUS_INVALID_PARAMETER;
     3319                    }
     3320                    else
     3321                        Status = STATUS_INVALID_PARAMETER;
     3322
     3323                    /* we are here in case of error */
     3324                    AssertBreakpoint();
     3325
     3326                    for (UINT j = 0; j < i; ++j)
     3327                    {
     3328                        DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j];
     3329                        PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation;
     3330                        vboxWddmMemFree(pOa2Free);
     3331                    }
     3332                }
     3333#endif
     3334            }
     3335        }
     3336    }
    32723337    dfprintf(("<== "__FUNCTION__ ", hDevice(0x%x)\n", hDevice));
    32733338
     
    33153380#define VBOXVDMACMD_DMA_PRESENT_BLT_MINSIZE() (VBOXVDMACMD_SIZE(VBOXVDMACMD_DMA_PRESENT_BLT))
    33163381#define VBOXVDMACMD_DMA_PRESENT_BLT_SIZE(_c) (VBOXVDMACMD_BODY_FIELD_OFFSET(UINT, VBOXVDMACMD_DMA_PRESENT_BLT, aDstSubRects[_c]))
    3317 
    3318 DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromOpenData(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_OPENALLOCATION pOa)
    3319 {
    3320     DXGKARGCB_GETHANDLEDATA GhData;
    3321     GhData.hObject = pOa->hAllocation;
    3322     GhData.Type = DXGK_HANDLE_ALLOCATION;
    3323     GhData.Flags.Value = 0;
    3324     return (PVBOXWDDM_ALLOCATION)pDevExt->u.primary.DxgkInterface.DxgkCbGetHandleData(&GhData);
    3325 }
    33263382
    33273383DECLINLINE(PVBOXWDDM_ALLOCATION) vboxWddmGetAllocationFromAllocList(PDEVICE_EXTENSION pDevExt, DXGK_ALLOCATIONLIST *pAllocList)
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