VirtualBox

Ignore:
Timestamp:
Jul 10, 2012 4:16:18 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
79044
Message:

wddm: new autoresize mechanism basics

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp

    r42081 r42098  
    493493    return (pExt->CurrentMode == 0);
    494494#else
    495     return (!VBoxCommonFromDeviceExt(pExt)->cDisplays || !pExt->aSources[iDisplay].pPrimaryAllocation);
     495    return (!VBoxCommonFromDeviceExt(pExt)->cDisplays
     496# ifndef VBOX_WDDM_MINIPORT
     497            || !pExt->aSources[iDisplay].pPrimaryAllocation
     498# endif
     499                    );
    496500#endif
    497501}
     
    520524        bpp  = bpp  ? bpp :pExt->CurrentModeBPP;
    521525#else
    522         xres = xres ? xres:pExt->aSources[iDisplay].pPrimaryAllocation->AllocData.SurfDesc.width;
    523         yres = yres ? yres:pExt->aSources[iDisplay].pPrimaryAllocation->AllocData.SurfDesc.height;
    524         bpp  = bpp  ? bpp :pExt->aSources[iDisplay].pPrimaryAllocation->AllocData.SurfDesc.bpp;
     526        PVBOXWDDM_ALLOC_DATA pAllocData = pExt->aSources[iDisplay].pPrimaryAllocation ?
     527                  &pExt->aSources[iDisplay].pPrimaryAllocation->AllocData
     528                : &pExt->aSources[iDisplay].AllocData;
     529        xres = xres ? xres:pAllocData->SurfDesc.width;
     530        yres = yres ? yres:pAllocData->SurfDesc.height;
     531        bpp  = bpp  ? bpp :pAllocData->SurfDesc.bpp;
    525532#endif
    526533    }
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r42092 r42098  
    510510}
    511511
    512 typedef struct VBOXWDDMCHILDSTATUSCB
    513 {
    514     PVBOXVDMACBUF_DR pDr;
    515     PKEVENT pEvent;
    516 } VBOXWDDMCHILDSTATUSCB, *PVBOXWDDMCHILDSTATUSCB;
    517 
    518 static DECLCALLBACK(VOID) vboxWddmChildStatusReportCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
    519 {
    520     /* we should be called from our DPC routine */
    521     Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
    522 
    523     PVBOXWDDMCHILDSTATUSCB pCtx = (PVBOXWDDMCHILDSTATUSCB)pvContext;
    524     PVBOXVDMACBUF_DR pDr = pCtx->pDr;
    525     PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD);
    526     VBOXVDMACMD_CHILD_STATUS_IRQ *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHILD_STATUS_IRQ);
     512static NTSTATUS vboxWddmChildStatusDoReportReconnected(PVBOXMP_DEVEXT pDevExt, VBOXVDMACMD_CHILD_STATUS_IRQ *pBody)
     513{
     514    NTSTATUS Status = STATUS_SUCCESS;
    527515
    528516    for (UINT i = 0; i < pBody->cInfos; ++i)
     
    533521            for (D3DDDI_VIDEO_PRESENT_TARGET_ID iChild = 0; iChild < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++iChild)
    534522            {
    535                 NTSTATUS Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, iChild);
     523                Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, iChild);
    536524                if (!NT_SUCCESS(Status))
    537525                {
     
    543531        else
    544532        {
    545             NTSTATUS Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, D3DDDI_ID_UNINITIALIZED);
     533            Status = vboxWddmChildStatusReportPerform(pDevExt, pInfo, D3DDDI_ID_UNINITIALIZED);
    546534            if (!NT_SUCCESS(Status))
    547535            {
     
    552540    }
    553541
     542    return Status;
     543}
     544
     545typedef struct VBOXWDDMCHILDSTATUSCB
     546{
     547    PVBOXVDMACBUF_DR pDr;
     548    PKEVENT pEvent;
     549} VBOXWDDMCHILDSTATUSCB, *PVBOXWDDMCHILDSTATUSCB;
     550
     551static DECLCALLBACK(VOID) vboxWddmChildStatusReportCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
     552{
     553    /* we should be called from our DPC routine */
     554    Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
     555
     556    PVBOXWDDMCHILDSTATUSCB pCtx = (PVBOXWDDMCHILDSTATUSCB)pvContext;
     557    PVBOXVDMACBUF_DR pDr = pCtx->pDr;
     558    PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD);
     559    VBOXVDMACMD_CHILD_STATUS_IRQ *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHILD_STATUS_IRQ);
     560
     561    vboxWddmChildStatusDoReportReconnected(pDevExt, pBody);
     562
    554563    vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDr);
    555564
     
    562571static NTSTATUS vboxWddmChildStatusReportReconnected(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_TARGET_ID idTarget)
    563572{
     573#ifdef VBOX_WDDM_MONITOR_REPLUG_IRQ
    564574    NTSTATUS Status = STATUS_UNSUCCESSFUL;
    565575    UINT cbCmd = VBOXVDMACMD_SIZE_FROMBODYSIZE(sizeof (VBOXVDMACMD_CHILD_STATUS_IRQ));
     
    585595        pBody->aInfos[0].iChild = idTarget;
    586596        pBody->aInfos[0].fFlags = VBOXVDMA_CHILD_STATUS_F_DISCONNECTED | VBOXVDMA_CHILD_STATUS_F_CONNECTED;
    587 
    588597        /* we're going to KeWaitForSingleObject */
    589598        Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
     
    620629
    621630    return Status;
     631#else
     632    VBOXVDMACMD_CHILD_STATUS_IRQ Body = {0};
     633    Body.cInfos = 1;
     634    if (idTarget == D3DDDI_ID_ALL)
     635    {
     636        Body.fFlags |= VBOXVDMACMD_CHILD_STATUS_IRQ_F_APPLY_TO_ALL;
     637    }
     638    Body.aInfos[0].iChild = idTarget;
     639    Body.aInfos[0].fFlags = VBOXVDMA_CHILD_STATUS_F_DISCONNECTED | VBOXVDMA_CHILD_STATUS_F_CONNECTED;
     640    Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL);
     641    return vboxWddmChildStatusDoReportReconnected(pDevExt, &Body);
     642#endif
    622643}
    623644
     
    629650
    630651    Assert(!bChanged[0]);
    631     for (i = 1; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
     652    for (i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
    632653    {
    633654        /* @todo: check that we actually need the current source->target */
     
    40834104            case VBOXESC_REINITVIDEOMODES:
    40844105            {
    4085                 /* clear driver's internal videomodes cache */
    4086                 VBoxWddmInvalidateVideoModesInfo(pDevExt);
    4087                 Status = STATUS_SUCCESS;
     4106                PVBOXWDDM_VIDEOMODES_INFO pInfo = VBoxWddmUpdateVideoModesInfo(pDevExt, NULL);
     4107                Status = vboxWddmChildStatusCheck(pDevExt, pInfo);
     4108                if (!NT_SUCCESS(Status))
     4109                {
     4110                    WARN(("vboxWddmChildStatusCheck failed, Status 0x%x", Status));
     4111                }
    40884112                break;
    40894113            }
     
    61756199    LOGF(("ENTER, hAdapter(0x%x)", hAdapter));
    61766200    vboxVDbgBreakF();
    6177     AssertBreakpoint();
    61786201
    61796202    PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;
     
    65776600        }
    65786601
    6579 //#ifdef VBOX_WDDM_WIN8
    6580 //        LOGREL(("Current win8 video driver only supports display-only mode no matter whether or not host 3D is enabled!"));
    6581 //        g_VBoxDisplayOnly = 1;
    6582 //#endif
     6602#ifdef DEBUG_misha
     6603        /* force g_VBoxDisplayOnly for debugging purposes */
     6604        LOGREL(("Current win8 video driver only supports display-only mode no matter whether or not host 3D is enabled!"));
     6605        g_VBoxDisplayOnly = 1;
     6606#endif
    65836607
    65846608        if (NT_SUCCESS(Status))
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette