VirtualBox

Ignore:
Timestamp:
Oct 15, 2010 11:10:10 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: chromium hgsmi fixes

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

Legend:

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

    r33146 r33171  
    5454    if (g_hVBoxCrHgsmiProvider)
    5555    {
     56        if (g_pfnVBoxDispCrHgsmiInit)
     57        {
     58            g_pfnVBoxDispCrHgsmiInit(pCallbacks);
     59        }
    5660        ++g_cVBoxCrHgsmiProvider;
    5761        return VINF_SUCCESS;
     
    7377    {
    7478        hClient = g_pfnVBoxDispCrHgsmiQueryClient();
     79#ifdef DEBUG_misha
     80        Assert(hClient);
     81#endif
    7582        if (hClient)
    7683            return hClient;
     
    7885    PVBOXUHGSMI_PRIVATE_KMT pHgsmiGL = gt_pHgsmiGL;
    7986    if (pHgsmiGL)
     87    {
     88        Assert(pHgsmiGL->BasePrivate.hClient);
    8089        return pHgsmiGL->BasePrivate.hClient;
     90    }
    8191    pHgsmiGL = (PVBOXUHGSMI_PRIVATE_KMT)RTMemAllocZ(sizeof (*pHgsmiGL));
    8292    if (pHgsmiGL)
     
    8494        HRESULT hr = vboxUhgsmiKmtCreate(pHgsmiGL, TRUE /* bD3D tmp for injection thread*/);
    8595        Assert(hr == S_OK);
    86         hClient = g_VBoxCrHgsmiCallbacks.pfnClientCreate(&pHgsmiGL->BasePrivate.Base);
    87         Assert(hClient);
    88         pHgsmiGL->BasePrivate.hClient = hClient;
    89         gt_pHgsmiGL = pHgsmiGL;
     96        if (hr == S_OK)
     97        {
     98            hClient = g_VBoxCrHgsmiCallbacks.pfnClientCreate(&pHgsmiGL->BasePrivate.Base);
     99            Assert(hClient);
     100            pHgsmiGL->BasePrivate.hClient = hClient;
     101            gt_pHgsmiGL = pHgsmiGL;
     102        }
    90103    }
    91104    else
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r33117 r33171  
    732732#endif
    733733
    734 VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks)
    735 {
    736 #ifdef VBOX_WITH_CRHGSMI
    737     g_VBoxCrHgsmiCallbacks = *pCallbacks;
    738 #endif
    739     return VINF_SUCCESS;
    740 }
    741 
    742734#ifdef VBOX_WITH_CRHGSMI
    743735static __declspec(thread) PVBOXUHGSMI_PRIVATE_BASE gt_pHgsmi = NULL;
    744736#endif
    745737
     738VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks)
     739{
     740#ifdef VBOX_WITH_CRHGSMI
     741    vboxDispLock(); /* the lock is needed here only to ensure callbacks are not initialized & used concurrently
     742                     * @todo: make a separate call used to init the per-thread info and make the VBoxDispCrHgsmiInit be called only once */
     743    g_VBoxCrHgsmiCallbacks = *pCallbacks;
     744    PVBOXUHGSMI_PRIVATE_BASE pHgsmi = gt_pHgsmi;
     745#ifdef DEBUG_misha
     746    Assert(pHgsmi);
     747#endif
     748    if (pHgsmi)
     749    {
     750        if (!pHgsmi->hClient)
     751        {
     752            pHgsmi->hClient = g_VBoxCrHgsmiCallbacks.pfnClientCreate(&pHgsmi->Base);
     753            Assert(pHgsmi->hClient);
     754        }
     755    }
     756    vboxDispUnlock();
     757#endif
     758    return VINF_SUCCESS;
     759}
     760
    746761VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiTerm()
    747762{
     
    753768#ifdef VBOX_WITH_CRHGSMI
    754769    PVBOXUHGSMI_PRIVATE_BASE pHgsmi = gt_pHgsmi;
     770#ifdef DEBUG_misha
     771    Assert(pHgsmi);
     772#endif
    755773    if (pHgsmi)
     774    {
     775        Assert(pHgsmi->hClient);
    756776        return pHgsmi->hClient;
     777    }
    757778#endif
    758779    return NULL;
     
    760781
    761782#ifdef VBOX_WITH_CRHGSMI
    762 static int vboxUhgsmiGlobalRetain()
    763 {
    764     int rc = VINF_SUCCESS;
     783static HRESULT vboxUhgsmiGlobalRetain()
     784{
     785    HRESULT hr = S_OK;
    765786    vboxDispLock();
    766787    if (!g_cVBoxUhgsmiKmtRefs)
    767788    {
    768         rc = vboxUhgsmiKmtCreate(&g_VBoxUhgsmiKmt, TRUE);
    769         AssertRC(rc);
    770     }
    771 
    772     if (RT_SUCCESS(rc))
     789        hr = vboxUhgsmiKmtCreate(&g_VBoxUhgsmiKmt, TRUE);
     790        Assert(hr == S_OK);
     791        /* can not do it here because callbacks may not be set yet
     792         * @todo: need to call the cr lib from here to get the callbacks
     793         * rather than making the cr lib call us */
     794//        if (hr == S_OK)
     795//        {
     796//            g_VBoxUhgsmiKmt.BasePrivate.hClient = g_VBoxCrHgsmiCallbacks.pfnClientCreate(&g_VBoxUhgsmiKmt.BasePrivate.Base);
     797//            Assert(g_VBoxUhgsmiKmt.BasePrivate.hClient);
     798//        }
     799    }
     800
     801    if (hr == S_OK)
    773802    {
    774803        ++g_cVBoxUhgsmiKmtRefs;
     
    776805    vboxDispUnlock();
    777806
    778     return rc;
    779 }
    780 
    781 static int vboxUhgsmiGlobalRelease()
    782 {
    783     int rc = VINF_SUCCESS;
     807    return hr;
     808}
     809
     810static HRESULT vboxUhgsmiGlobalRelease()
     811{
     812    HRESULT hr = S_OK;
    784813    vboxDispLock();
    785814    --g_cVBoxUhgsmiKmtRefs;
    786815    if (!g_cVBoxUhgsmiKmtRefs)
    787816    {
    788         rc = vboxUhgsmiKmtDestroy(&g_VBoxUhgsmiKmt);
    789         AssertRC(rc);
     817        if (g_VBoxUhgsmiKmt.BasePrivate.hClient)
     818            g_VBoxCrHgsmiCallbacks.pfnClientDestroy(g_VBoxUhgsmiKmt.BasePrivate.hClient);
     819        hr = vboxUhgsmiKmtDestroy(&g_VBoxUhgsmiKmt);
     820        Assert(hr == S_OK);
    790821    }
    791822    vboxDispUnlock();
    792     return rc;
     823    return hr;
    793824}
    794825
     
    803834}
    804835
    805 int vboxUhgsmiGlobalSetCurrent()
    806 {
    807     int rc = vboxUhgsmiGlobalRetain();
    808     AssertRC(rc);
    809     if (RT_SUCCESS(rc))
     836HRESULT vboxUhgsmiGlobalSetCurrent()
     837{
     838    HRESULT hr = vboxUhgsmiGlobalRetain();
     839    Assert(hr == S_OK);
     840    if (hr == S_OK)
    810841        vboxDispCrHgsmiClientSet(&g_VBoxUhgsmiKmt.BasePrivate);
    811     return rc;
    812 }
    813 
    814 int vboxUhgsmiGlobalClearCurrent()
     842    return hr;
     843}
     844
     845HRESULT vboxUhgsmiGlobalClearCurrent()
    815846{
    816847    vboxUhgsmiGlobalRelease();
    817848    vboxDispCrHgsmiClientClear();
    818     return VINF_SUCCESS;
     849    return S_OK;
    819850}
    820851
     
    69676998        pDevice->pDevice9If->Release();
    69686999    }
     7000
     7001#ifdef VBOX_WITH_CRHGSMI
     7002    vboxDispLock();
     7003    if (pDevice->Uhgsmi.BasePrivate.hClient)
     7004        g_VBoxCrHgsmiCallbacks.pfnClientDestroy(pDevice->Uhgsmi.BasePrivate.hClient);
     7005    vboxDispUnlock();
     7006#endif
    69697007
    69707008    HRESULT hr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
     
    77277765            {
    77287766#ifdef VBOX_WITH_CRHGSMI
    7729                 int rc = vboxUhgsmiGlobalRetain();
    7730                 AssertRC(rc);
    7731                 if (RT_SUCCESS(rc))
     7767                hr = vboxUhgsmiGlobalRetain();
     7768                Assert(hr == S_OK);
     7769                if (hr == S_OK)
    77327770#endif
    77337771                {
     
    77727810#endif
    77737811                }
    7774 #ifdef VBOX_WITH_CRHGSMI
    7775                 else
    7776                 {
    7777                     hr = E_FAIL;
    7778                 }
    7779 #endif
    77807812            } while (0);
    77817813        }
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h

    r33116 r33171  
    267267
    268268#ifdef VBOX_WITH_CRHGSMI
    269 int vboxUhgsmiGlobalSetCurrent();
    270 int vboxUhgsmiGlobalClearCurrent();
     269HRESULT vboxUhgsmiGlobalSetCurrent();
     270HRESULT vboxUhgsmiGlobalClearCurrent();
    271271#endif
    272272
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiBase.h

    r33146 r33171  
    9393    fLockFlags.WriteOnly = fFlags.bWriteOnly;
    9494    fLockFlags.DonotWait = fFlags.bDonotWait;
    95     fLockFlags.Discard = fFlags.bDiscard;
     95//    fLockFlags.Discard = fFlags.bDiscard;
    9696    *pfFlags = fLockFlags;
    9797    return VINF_SUCCESS;
     
    129129                  NULL, /* LPSECURITY_ATTRIBUTES lpSemaphoreAttributes */
    130130                  0, /* LONG lInitialCount */
    131                   ~0L, /* LONG lMaximumCount */
     131                  (LONG)((~0UL) >> 1), /* LONG lMaximumCount */
    132132                  NULL /* LPCTSTR lpName */
    133133                );
     
    187187        memset(pAllocationList, 0, sizeof (D3DDDI_ALLOCATIONLIST));
    188188        pAllocationList->hAllocation = pBuffer->hAllocation;
     189        pAllocationList->Value = 0;
    189190        pAllocationList->WriteOperation = !pBufInfo->fFlags.bHostReadOnly;
    190191        pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r33165 r33171  
    6060    {
    6161        pInfo->offAlloc = (VBOXVIDEOOFFSET)pDmaAlloc->PhysicalAddress.QuadPart;
     62        pInfo->segmentIdAlloc = pDmaAlloc->SegmentId;
     63    }
     64    else
     65        pInfo->segmentIdAlloc = 0;
     66    pInfo->srcId = pAlloc->SurfDesc.VidPnSourceId;
     67}
     68
     69static void vboxWddmPopulateDmaAllocInfoWithOffset(PVBOXWDDM_DMA_ALLOCINFO pInfo, PVBOXWDDM_ALLOCATION pAlloc, DXGK_ALLOCATIONLIST *pDmaAlloc, uint32_t offStart)
     70{
     71    pInfo->pAlloc = pAlloc;
     72    if (pDmaAlloc->SegmentId)
     73    {
     74        pInfo->offAlloc = (VBOXVIDEOOFFSET)pDmaAlloc->PhysicalAddress.QuadPart + offStart;
    6275        pInfo->segmentIdAlloc = pDmaAlloc->SegmentId;
    6376    }
     
    14371450        case VBOXWDDM_ALLOC_TYPE_UMD_HGSMI_BUFFER:
    14381451        {
    1439             ObDereferenceObject(pAllocation->pSynchEvent);
     1452            if (pAllocation->pSynchEvent)
     1453            {
     1454                ObDereferenceObject(pAllocation->pSynchEvent);
     1455            }
    14401456            break;
    14411457        }
     
    15771593                    pAllocation->SurfDesc.cbSize = pAllocInfo->cbBuffer;
    15781594                    pAllocationInfo->Flags.CpuVisible = 1;
    1579                     pAllocationInfo->Flags.SynchronousPaging = 1;
     1595//                    pAllocationInfo->Flags.SynchronousPaging = 1;
    15801596                    pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_MAXIMUM;
    15811597                    switch (pAllocInfo->enmSynchType)
     
    15951611                        case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
    15961612                            pAllocation->pSynchEvent = NULL;
    1597                             Status == STATUS_SUCCESS;
     1613                            Status = STATUS_SUCCESS;
    15981614                            break;
    15991615                        default:
     
    20332049                        DXGK_ALLOCATIONLIST *pAllocation2Patch = (DXGK_ALLOCATIONLIST*)(pPrivateBuf + pPatchList->PatchOffset);
    20342050                        pAllocation2Patch->SegmentId = pAllocationList->SegmentId;
    2035                         pAllocation2Patch->PhysicalAddress = pAllocationList->PhysicalAddress;
     2051                        pAllocation2Patch->PhysicalAddress.QuadPart = pAllocationList->PhysicalAddress.QuadPart + pPatchList->AllocationOffset;
     2052                        Assert(!(pAllocationList->PhysicalAddress.QuadPart & 0xfffUL)); /* <- just a check to ensure allocation offset does not go here */
    20362053                    }
    20372054                }
     
    25432560
    25442561    NTSTATUS Status = STATUS_SUCCESS;
     2562    PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)hAdapter;
    25452563
    25462564    dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
     
    25512569        case DXGK_OPERATION_TRANSFER:
    25522570        {
     2571            PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBuildPagingBuffer->Transfer.hAllocation;
     2572            uint8_t* pvVramBase = pDevExt->pvVisibleVram;
     2573            SIZE_T cbSize = pBuildPagingBuffer->Transfer.TransferSize;
     2574            uint8_t *pvSrc, *pvDst;
     2575            if (pBuildPagingBuffer->Transfer.Source.SegmentId)
     2576            {
     2577#ifdef DEBUG_misha
     2578                Assert(pBuildPagingBuffer->Transfer.Source.SegmentAddress.QuadPart);
     2579#endif
     2580                pvSrc  = pvVramBase + pBuildPagingBuffer->Transfer.Source.SegmentAddress.QuadPart;
     2581                pvSrc += pBuildPagingBuffer->Transfer.TransferOffset;
     2582            }
     2583            else
     2584            {
     2585                pvSrc  = (uint8_t*)MmGetMdlVirtualAddress(pBuildPagingBuffer->Transfer.Source.pMdl);
     2586                pvSrc += pBuildPagingBuffer->Transfer.MdlOffset * 0x1000 /* page size */;
     2587            }
     2588
     2589            if (pBuildPagingBuffer->Transfer.Destination.SegmentId)
     2590            {
     2591#ifdef DEBUG_misha
     2592                Assert(pBuildPagingBuffer->Transfer.Destination.SegmentAddress.QuadPart);
     2593#endif
     2594                pvDst  = pvVramBase + pBuildPagingBuffer->Transfer.Destination.SegmentAddress.QuadPart;
     2595                pvDst += pBuildPagingBuffer->Transfer.TransferOffset;
     2596            }
     2597            else
     2598            {
     2599                pvDst  = (uint8_t*)MmGetMdlVirtualAddress(pBuildPagingBuffer->Transfer.Destination.pMdl);
     2600                pvDst += pBuildPagingBuffer->Transfer.MdlOffset * 0x1000 /* page size */;
     2601            }
     2602
     2603            memcpy(pvDst, pvSrc, cbSize);
    25532604//            pBuildPagingBuffer->pDmaBuffer = (uint8_t*)pBuildPagingBuffer->pDmaBuffer + VBOXVDMACMD_SIZE(VBOXVDMACMD_DMA_BPB_TRANSFER);
    25542605            break;
     
    40674118            {
    40684119                PVBOXWDDM_ALLOCATION pAlloc = vboxWddmGetAllocationFromAllocList(pDevExt, pAllocationList);
    4069                 vboxWddmPopulateDmaAllocInfo(&pSubmInfo->Alloc, pAlloc, pAllocationList);
     4120                vboxWddmPopulateDmaAllocInfoWithOffset(&pSubmInfo->Alloc, pAlloc, pAllocationList, pSubmUmInfo->offData);
    40704121
    40714122                pSubmInfo->cbData = pSubmUmInfo->cbData;
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