VirtualBox

Ignore:
Timestamp:
Apr 7, 2014 5:08:07 PM (11 years ago)
Author:
vboxsync
Message:

wddm: do not allocate VRAM for host-side or dummy allocations

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h

    r50940 r50987  
    244244}
    245245
     246/* 128 MB */
     247DECLINLINE(ULONG) vboxWddmVramCpuInvisibleSegmentSize(PVBOXMP_DEVEXT pDevExt)
     248{
     249    return 128 * 1024 * 1024;
     250}
     251
    246252#ifdef VBOXWDDM_RENDER_FROM_SHADOW
    247 DECLINLINE(ULONG) vboxWddmVramCpuInvisibleSegmentSize(PVBOXMP_DEVEXT pDevExt)
    248 {
    249     return vboxWddmVramCpuVisibleSegmentSize(pDevExt);
    250 }
    251253
    252254DECLINLINE(bool) vboxWddmCmpSurfDescsBase(VBOXWDDM_SURFACE_DESC *pDesc1, VBOXWDDM_SURFACE_DESC *pDesc2)
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp

    r50940 r50987  
    652652    {
    653653        PVBOXWDDM_ALLOCATION pAlloc = pCF->Alloc.pAlloc;
    654         Assert(pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
    655         if (pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID)
     654        if (pAlloc->AllocData.Addr.SegmentId && pAlloc->AllocData.Addr.SegmentId != 1)
     655        {
     656            WARN(("request to collor fill invalid allocation"));
     657            return STATUS_INVALID_PARAMETER;
     658        }
     659
     660        VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAlloc->AllocData.Addr);
     661        if (offVram != VBOXVIDEOOFFSET_VOID)
    656662        {
    657663            RECT UnionRect = {0};
    658             uint8_t *pvMem = pDevExt->pvVisibleVram + pAlloc->AllocData.Addr.offVram;
     664            uint8_t *pvMem = pDevExt->pvVisibleVram + offVram;
    659665            UINT bpp = pAlloc->AllocData.SurfDesc.bpp;
    660666            Assert(bpp);
     
    721727            }
    722728        }
     729        else
     730            WARN(("invalid offVram"));
    723731    }
    724732
     
    743751    enmSrcFormat = pSrcAlloc->SurfDesc.format;
    744752    enmDstFormat = pDstAlloc->SurfDesc.format;
     753
     754    if (pDstAlloc->Addr.SegmentId && pDstAlloc->Addr.SegmentId != 1)
     755    {
     756        WARN(("request to collor blit invalid allocation"));
     757        return STATUS_INVALID_PARAMETER;
     758    }
     759
     760    if (pSrcAlloc->Addr.SegmentId && pSrcAlloc->Addr.SegmentId != 1)
     761    {
     762        WARN(("request to collor blit invalid allocation"));
     763        return STATUS_INVALID_PARAMETER;
     764    }
    745765
    746766    if (enmSrcFormat != enmDstFormat)
     
    20352055        return STATUS_INVALID_PARAMETER;
    20362056
    2037     Assert(pSource->pPrimaryAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
    2038     Assert(pSource->pShadowAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
    2039     if (pSource->pPrimaryAllocation->AllocData.Addr.offVram == VBOXVIDEOOFFSET_VOID)
     2057    if (vboxWddmAddrFramOffset(&pSource->pPrimaryAllocation->AllocData.Addr) == VBOXVIDEOOFFSET_VOID)
     2058    {
     2059        WARN(("invalid primary"));
    20402060        return STATUS_INVALID_PARAMETER;
    2041     if (pSource->pShadowAllocation->AllocData.Addr.offVram == VBOXVIDEOOFFSET_VOID)
     2061    }
     2062    if (vboxWddmAddrFramOffset(&pSource->pShadowAllocation->AllocData.Addr) == VBOXVIDEOOFFSET_VOID)
     2063    {
     2064        WARN(("invalid secondary"));
    20422065        return STATUS_INVALID_PARAMETER;
     2066    }
    20432067
    20442068    NTSTATUS Status = vboxVdmaGgDmaBltPerform(pDevExt, &pSource->pShadowAllocation->AllocData, pRect, &pSource->pPrimaryAllocation->AllocData, pRect);
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVhwa.cpp

    r44529 r50987  
    538538    memset(pInfo, 0, sizeof(VBOXVHWA_SURFACEDESC));
    539539
     540    if (pSurf->AllocData.Addr.SegmentId != 1)
     541    {
     542        WARN(("invalid segment id!"));
     543        return VERR_INVALID_PARAMETER;
     544    }
     545
    540546    pInfo->height = pSurf->AllocData.SurfDesc.height;
    541547    pInfo->width = pSurf->AllocData.SurfDesc.width;
     
    814820    Assert(pOverlay->pCurentAlloc != pAlloc);
    815821    int rc = VINF_SUCCESS;
     822
     823    if (pFbSurf->AllocData.Addr.SegmentId != 1)
     824    {
     825        WARN(("invalid segment id on flip"));
     826        return VERR_INVALID_PARAMETER;
     827    }
     828
    816829    if (pFlipInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAYFLIP_INFO))
    817830    {
     
    889902    }
    890903#endif
     904
     905    if (pAlloc->AllocData.Addr.SegmentId != 1)
     906    {
     907        WARN(("invalid segment id on color fill"));
     908        return VERR_INVALID_PARAMETER;
     909    }
     910
    891911    Assert(pAlloc->hHostHandle);
    892912    Assert(pAlloc->pResource);
     
    971991    Assert(pFbSurf->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
    972992    int rc = VINF_SUCCESS;
     993
     994    if (pFbSurf->AllocData.Addr.SegmentId != 1)
     995    {
     996        WARN(("invalid segment id on overlay update"));
     997        return VERR_INVALID_PARAMETER;
     998    }
     999
    9731000    if (pOverlayInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAY_INFO))
    9741001    {
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r50984 r50987  
    263263NTSTATUS vboxWddmGhDisplayPostInfoView(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData)
    264264{
    265     VBOXVIDEOOFFSET offVram = pAllocData->Addr.offVram;
     265    VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAllocData->Addr);
    266266    if (offVram == VBOXVIDEOOFFSET_VOID)
    267267    {
     
    300300        return STATUS_SUCCESS;
    301301
    302     if (pAllocData->Addr.offVram == VBOXVIDEOOFFSET_VOID)
    303     {
    304         WARN(("pAllocData->Addr.offVram == VBOXVIDEOOFFSET_VOID"));
     302    VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAllocData->Addr);;
     303    if (offVram == VBOXVIDEOOFFSET_VOID)
     304    {
     305        WARN(("offVram == VBOXVIDEOOFFSET_VOID"));
    305306        return STATUS_UNSUCCESSFUL;
    306307    }
     
    310311    USHORT bpp    = pAllocData->SurfDesc.bpp;
    311312    ULONG cbLine  = VBOXWDDM_ROUNDBOUND(((width * bpp) + 7) / 8, 4);
    312     ULONG yOffset = (ULONG)pAllocData->Addr.offVram / cbLine;
    313     ULONG xOffset = (ULONG)pAllocData->Addr.offVram % cbLine;
     313    ULONG yOffset = (ULONG)offVram / cbLine;
     314    ULONG xOffset = (ULONG)offVram % cbLine;
    314315
    315316    if (bpp == 4)
     
    413414            pFbAlloc = pRealFbAlloc;
    414415
    415         if (!pFbAlloc || pFbAlloc->AllocData.Addr.offVram == VBOXVIDEOOFFSET_VOID)
     416        if (!pFbAlloc || vboxWddmAddrFramOffset(&pFbAlloc->AllocData.Addr) == VBOXVIDEOOFFSET_VOID)
    416417        {
    417418            return false;
     
    474475        }
    475476
    476         Assert(pToAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
    477         Assert(pFromAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
    478         if (pToAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID
    479                 && pFromAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID)
     477        if (pToAllocation->AllocData.Addr.SegmentId == 1 && pToAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID
     478                && pFromAllocation->AllocData.Addr.SegmentId == 1 && pFromAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID)
    480479        {
    481480            RECT Rect;
     
    487486                    &pToAllocation->AllocData, &Rect);
    488487        }
     488        else
     489            WARN(("invalid allocation data"));
    489490
    490491        /* ensure we issue resize command on next update */
     
    14251426            for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
    14261427            {
    1427                 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i];
    1428                 PVBOXWDDM_ALLOCATION pPrimary = pSource->pPrimaryAllocation;
    1429                 if (pPrimary && pPrimary->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID)
     1428                PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[i];
     1429                if (pTarget->fConnected)
    14301430                {
    14311431                    memset(&notify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA));
    14321432                    notify.InterruptType = DXGK_INTERRUPT_CRTC_VSYNC;
    1433                     /* @todo: !!!this is not correct in case we want source[i]->target[i!=j] mapping */
    14341433                    notify.CrtcVsync.VidPnTargetId = i;
    1435                     notify.CrtcVsync.PhysicalAddress.QuadPart = pPrimary->AllocData.Addr.offVram;
    14361434                    pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, &notify);
    1437 
    14381435                    bNeedDpc = TRUE;
    14391436                }
     
    15961593                for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
    15971594                {
    1598                     PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i];
    1599                     PVBOXWDDM_ALLOCATION pPrimary = pSource->pPrimaryAllocation;
    1600                     if (pPrimary && pPrimary->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID)
     1595                    PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[i];
     1596                    if (pTarget->fConnected)
    16011597                    {
    16021598                        memset(&notify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA));
    16031599                        notify.InterruptType = DXGK_INTERRUPT_CRTC_VSYNC;
    1604                         /* @todo: !!!this is not correct in case we want source[i]->target[i!=j] mapping */
    16051600                        notify.CrtcVsync.VidPnTargetId = i;
    1606                         notify.CrtcVsync.PhysicalAddress.QuadPart = pPrimary->AllocData.Addr.offVram;
    16071601                        pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, &notify);
    1608 
    1609                         pDevExt->bNotifyDxDpc = TRUE;
     1602                        bNeedDpc = TRUE;
    16101603                    }
    16111604                }
     
    20642057             * DXGK_QUERYSEGMENTIN *pQsIn = (DXGK_QUERYSEGMENTIN*)pQueryAdapterInfo->pInputData; */
    20652058            DXGK_QUERYSEGMENTOUT *pQsOut = (DXGK_QUERYSEGMENTOUT*)pQueryAdapterInfo->pOutputData;
    2066 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
    20672059# define VBOXWDDM_SEGMENTS_COUNT 2
    2068 #else
    2069 # define VBOXWDDM_SEGMENTS_COUNT 1
    2070 #endif
    20712060            if (!pQsOut->pSegmentDescriptor)
    20722061            {
     
    20762065            else if (pQsOut->NbSegment != VBOXWDDM_SEGMENTS_COUNT)
    20772066            {
    2078                 AssertBreakpoint();
    2079                 LOGREL(("NbSegment (%d) != 1", pQsOut->NbSegment));
     2067                WARN(("NbSegment (%d) != 1", pQsOut->NbSegment));
    20802068                Status = STATUS_INVALID_PARAMETER;
    20812069            }
     
    20942082                pDr->Flags.Value = 0;
    20952083                pDr->Flags.CpuVisible = 1;
    2096 #ifdef VBOXWDDM_RENDER_FROM_SHADOW
     2084
    20972085                ++pDr;
    20982086                /* create cpu-invisible segment of the same size */
     
    21062094                pDr->CommitLimit = pDr->Size;
    21072095                pDr->Flags.Value = 0;
    2108 #endif
    21092096
    21102097                pQsOut->PagingBufferSegmentId = 0;
    2111                 pQsOut->PagingBufferSize = 1024;
    2112                 pQsOut->PagingBufferPrivateDataSize = 0; /* @todo: do we need a private buffer ? */
     2098                pQsOut->PagingBufferSize = 0xc00;
     2099                pQsOut->PagingBufferPrivateDataSize = 0;
    21132100            }
    21142101            }
     
    24202407                    {
    24212408                        case VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE:
    2422 #if 0 //defined(VBOXWDDM_RENDER_FROM_SHADOW)
    2423                             pAllocationInfo->SupportedReadSegmentSet = 2;
    2424                             pAllocationInfo->SupportedWriteSegmentSet = 2;
    2425 #endif
    2426 #ifndef VBOXWDDM_RENDER_FROM_SHADOW
    2427                             pAllocationInfo->Flags.CpuVisible = 1;
    2428 #endif
    24292409                            break;
    24302410                        case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
     
    24552435                                Assert(pAllocation->AllocData.SurfDesc.pitch);
    24562436                                Assert(pAllocation->AllocData.SurfDesc.cbSize);
    2457                                 if (!pAllocInfo->fFlags.SharedResource)
    2458                                 {
    2459                                     pAllocationInfo->Flags.CpuVisible = 1;
    2460                                 }
    2461                                 else
     2437
     2438//                                if (!pAllocInfo->fFlags.SharedResource && !pAllocInfo->hostID)
     2439//                                    pAllocationInfo->Flags.CpuVisible = 1;
     2440
     2441                                Assert(!pAllocationInfo->Flags.CpuVisible);
     2442
     2443                                if (pAllocInfo->fFlags.SharedResource)
    24622444                                {
    24632445                                    pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle;
     
    24682450                                    }
    24692451#endif
     2452                                }
     2453
     2454//                                if (pAllocInfo->hostID)
     2455                                {
     2456                                    pAllocationInfo->SupportedReadSegmentSet = 2;
     2457                                    pAllocationInfo->SupportedWriteSegmentSet = 2;
    24702458                                }
    24712459                            }
     
    34933481            uint32_t offVRAM;
    34943482            BOOLEAN fIn;
     3483            UINT SegmentId;
    34953484
    34963485            if (pBuildPagingBuffer->Transfer.Source.SegmentId)
    34973486            {
     3487                SegmentId = pBuildPagingBuffer->Transfer.Source.SegmentId;
    34983488                Assert(!pBuildPagingBuffer->Transfer.Destination.SegmentId);
    34993489                Assert(!pBuildPagingBuffer->Transfer.Source.SegmentAddress.HighPart);
     
    35043494            else
    35053495            {
     3496                SegmentId = pBuildPagingBuffer->Transfer.Destination.SegmentId;
    35063497                Assert(pBuildPagingBuffer->Transfer.Destination.SegmentId);
    35073498                Assert(!pBuildPagingBuffer->Transfer.Source.SegmentId);
     
    35103501                pMdl = pBuildPagingBuffer->Transfer.Source.pMdl;
    35113502                fIn = TRUE;
     3503            }
     3504
     3505            if (SegmentId != 1)
     3506            {
     3507                WARN(("SegmentId"));
     3508                cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     3509                break;
    35123510            }
    35133511
     
    71687166    PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;
    71697167    PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pPresentDisplayOnly->VidPnSourceId];
    7170     Assert(pSource->AllocData.Addr.SegmentId);
     7168    Assert(pSource->AllocData.Addr.SegmentId == 1);
    71717169    VBOXWDDM_ALLOC_DATA SrcAllocData;
    71727170    SrcAllocData.SurfDesc.width = pPresentDisplayOnly->Pitch * pPresentDisplayOnly->BytesPerPixel;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h

    r50940 r50987  
    236236    KeReleaseSpinLock(&pSource->AllocationLock, OldIrql);
    237237    return pPrimary;
     238}
     239
     240DECLINLINE(VBOXVIDEOOFFSET) vboxWddmAddrFramOffset(const VBOXWDDM_ADDR *pAddr)
     241{
     242    return (pAddr->offVram != VBOXVIDEOOFFSET_VOID && pAddr->SegmentId) ?
     243            (pAddr->SegmentId == 1 ? pAddr->offVram : 0)
     244            : VBOXVIDEOOFFSET_VOID;
    238245}
    239246
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