VirtualBox

Changeset 27307 in vbox


Ignore:
Timestamp:
Mar 11, 2010 9:17:00 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
58719
Message:

wddm: bugfix

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

Legend:

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

    r27286 r27307  
    239239        PFNVBOXSHGSMICMDCOMPLETION pfnCallback = (PFNVBOXSHGSMICMDCOMPLETION)pCmd->u64Info1;
    240240        void *pvCallback = (void*)pCmd->u64Info2;
    241         pfnCallback(pHeap, pCmd, pvCallback);
     241        pfnCallback(pHeap, VBoxSHGSMIBufferData(pCmd), pvCallback);
    242242    }
    243243
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoShgsmi.h

    r26556 r27307  
    5252    Assert(pFirst);
    5353    Assert(pLast);
     54    pLast->pNext = NULL;
    5455    if (pList->pLast)
    5556    {
     
    5758        pList->pLast->pNext = pFirst;
    5859        pList->pLast = pLast;
    59         pLast->pNext = NULL;
    6060    }
    6161    else
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r27286 r27307  
    106106        pScreen->i32OriginX      = 0;
    107107        pScreen->i32OriginY      = 0;
    108         pScreen->u32StartOffset  = offVram;
     108        pScreen->u32StartOffset  = (uint32_t)offVram;
    109109        pScreen->u32LineSize     = pAllocation->u.SurfInfo.pitch;
    110110        pScreen->u32Width        = pAllocation->u.SurfInfo.width;
     
    140140
    141141        pView->u32ViewIndex     = pPrimaryInfo->VidPnSourceId;
    142         pView->u32ViewOffset    = offVram;
     142        pView->u32ViewOffset    = (uint32_t)offVram;
    143143        pView->u32ViewSize      = vboxWddmVramReportedSegmentSize(pDevExt)/pDevExt->cSources;
    144144
     
    776776    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)MiniportDeviceContext;
    777777    BOOLEAN bOur = FALSE;
     778    BOOLEAN bNeedDpc = FALSE;
    778779    if (pDevExt->u.primary.pHostFlags) /* If HGSMI is enabled at all. */
    779780    {
     
    782783        vboxSHGSMIListInit(&CtlList);
    783784        vboxSHGSMIListInit(&DmaCmdList);
     785
     786        uint32_t flags = pDevExt->u.primary.pHostFlags->u32HostFlags;
     787        bOur = (flags & HGSMIHOSTFLAGS_IRQ);
    784788        do
    785789        {
    786             uint32_t flags = pDevExt->u.primary.pHostFlags->u32HostFlags;
    787790            if (flags & HGSMIHOSTFLAGS_GCOMMAND_COMPLETED)
    788791            {
    789                 bOur = TRUE;
    790792                /* read the command offset */
    791793                HGSMIOFFSET offCmd = VBoxHGSMIGuestRead(pDevExt);
     
    819821            else if (flags & HGSMIHOSTFLAGS_COMMANDS_PENDING)
    820822            {
    821                 bOur = TRUE;
    822823                AssertBreakpoint();
    823824                /* @todo: FIXME: implement !!! */
    824825            }
    825             else if (flags & HGSMIHOSTFLAGS_IRQ)
    826             {
    827                 bOur = TRUE;
    828                 AssertBreakpoint();
    829                 /* unknown command */
    830             }
    831826            else
    832827                break;
     828
     829            flags = pDevExt->u.primary.pHostFlags->u32HostFlags;
    833830        } while (1);
    834831
    835832        if (!vboxSHGSMIListIsEmpty(&CtlList))
     833        {
    836834            vboxSHGSMIListCat(&pDevExt->CtlList, &CtlList);
     835            bNeedDpc = TRUE;
     836        }
    837837
    838838        if (!vboxSHGSMIListIsEmpty(&DmaCmdList))
     839        {
    839840            vboxSHGSMIListCat(&pDevExt->DmaCmdList, &DmaCmdList);
     841            bNeedDpc = TRUE;
     842        }
    840843
    841844        if (pDevExt->bSetNotifyDxDpc)
    842845        {
     846            Assert(bNeedDpc == TRUE);
    843847            pDevExt->bNotifyDxDpc = TRUE;
    844848            pDevExt->bSetNotifyDxDpc = FALSE;
     849            bNeedDpc = TRUE;
    845850        }
    846851
    847852        if (bOur)
     853        {
    848854            HGSMIClearIrq (pDevExt);
     855#ifdef DEBUG_misha
     856            /* this is not entirely correct since host may concurrently complete some commands and raise a new IRQ while we are here,
     857             * still this allows to check that the host flags are correctly cleared after the ISR */
     858            Assert(pDevExt->u.primary.pHostFlags);
     859            uint32_t flags = pDevExt->u.primary.pHostFlags->u32HostFlags;
     860            Assert(flags == 0);
     861#endif
     862            BOOLEAN bDpcQueued = pDevExt->u.primary.DxgkInterface.DxgkCbQueueDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle);
     863            Assert(bDpcQueued);
     864        }
    849865    }
    850866
     
    889905    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)MiniportDeviceContext;
    890906
    891     VBOXWDDM_DPCDATA dpcData = {0};
     907    VBOXWDDM_GETDPCDATA_CONTEXT context = {0};
    892908    BOOLEAN bRet;
     909
     910    context.pDevExt = pDevExt;
    893911
    894912    /* get DPC data at IRQL */
     
    896914            pDevExt->u.primary.DxgkInterface.DeviceHandle,
    897915            vboxWddmGetDPCDataCallback,
    898             &dpcData,
    899             0,
     916            &context,
     917            0, /* IN ULONG MessageNumber */
    900918            &bRet);
    901919    Assert(Status == STATUS_SUCCESS);
    902920
    903     if (!vboxSHGSMIListIsEmpty(&dpcData.CtlList))
    904     {
    905         int rc = VBoxSHGSMICommandPostprocessCompletion (&pDevExt->u.primary.hgsmiAdapterHeap, &dpcData.CtlList);
     921    if (!vboxSHGSMIListIsEmpty(&context.data.CtlList))
     922    {
     923        int rc = VBoxSHGSMICommandPostprocessCompletion (&pDevExt->u.primary.hgsmiAdapterHeap, &context.data.CtlList);
    906924        AssertRC(rc);
    907925    }
    908926
    909     if (!vboxSHGSMIListIsEmpty(&dpcData.DmaCmdList))
    910     {
    911         int rc = VBoxSHGSMICommandPostprocessCompletion (&pDevExt->u.primary.Vdma.CmdHeap, &dpcData.DmaCmdList);
     927    if (!vboxSHGSMIListIsEmpty(&context.data.DmaCmdList))
     928    {
     929        int rc = VBoxSHGSMICommandPostprocessCompletion (&pDevExt->u.primary.Vdma.CmdHeap, &context.data.DmaCmdList);
    912930        AssertRC(rc);
    913931    }
    914932
    915     if (dpcData.bNotifyDpc)
     933    if (context.data.bNotifyDpc)
    916934        pDevExt->u.primary.DxgkInterface.DxgkCbNotifyDpc(pDevExt->u.primary.DxgkInterface.DeviceHandle);
    917935
     
    26672685                    if (vboxWddmPixFormatConversionSupported(pSrcAlloc->u.SurfInfo.format, pDstAlloc->u.SurfInfo.format))
    26682686                    {
    2669                         memset(pPresent->pPatchLocationListOut, 0, 3*sizeof (D3DDDI_PATCHLOCATIONLIST));
     2687                        memset(pPresent->pPatchLocationListOut, 0, 2*sizeof (D3DDDI_PATCHLOCATIONLIST));
    26702688//                        pPresent->pPatchLocationListOut->PatchOffset = 0;
    2671                         ++pPresent->pPatchLocationListOut;
     2689//                        ++pPresent->pPatchLocationListOut;
    26722690                        pPresent->pPatchLocationListOut->PatchOffset = VBOXVDMACMD_BODY_FIELD_OFFSET(UINT, VBOXVDMACMD_DMA_PRESENT_BLT, offSrc);
    26732691                        pPresent->pPatchLocationListOut->AllocationIndex = DXGK_PRESENT_SOURCE_INDEX;
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