VirtualBox

Ignore:
Timestamp:
Apr 25, 2012 9:42:29 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77623
Message:

crHgsmi cleanup & adjustments

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h

    r40747 r41058  
    3535
    3636/* One would increase this whenever definitions in this file are changed */
    37 #define VBOXVIDEOIF_VERSION 12
     37#define VBOXVIDEOIF_VERSION 13
    3838
    3939#define VBOXWDDM_NODE_ID_SYSTEM           0
     
    113113            uint32_t cbBuffer;
    114114            uint64_t hSynch;
    115             VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
     115            VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
    116116        };
    117117    };
     
    180180typedef struct VBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO
    181181{
    182     VBOXUHGSMI_BUFFER_SUBMIT_FLAGS fSubFlags;
     182    uint32_t bDoNotSignalCompletion;
    183183    uint32_t offData;
    184184    uint32_t cbData;
     
    438438    uint64_t pvData;
    439439    uint64_t hSynch;
    440     VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
     440    VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
    441441} VBOXVIDEOCM_UM_ALLOC, *PVBOXVIDEOCM_UM_ALLOC;
    442442
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp

    r40716 r41058  
    57165716        }
    57175717    }
     5718
     5719    VBOXVDBG_BREAK_SHARED(pRc);
    57185720
    57195721    if (hr == S_OK)
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h

    r40483 r41058  
    5858{
    5959    VBOXUHGSMI_BUFFER Base;
     60    HANDLE hSynch;
    6061    D3DKMT_HANDLE hAllocation;
    6162} VBOXUHGSMI_BUFFER_PRIVATE_BASE, *PVBOXUHGSMI_BUFFER_PRIVATE_BASE;
     
    119120}
    120121
    121 DECLINLINE(int) vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT *phSynch, bool *pbSynchCreated)
     122DECLINLINE(int) vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, HANDLE *phSynch)
    122123{
    123     bool bSynchCreated = false;
     124    *phSynch = NULL;
    124125
    125     switch (enmSynchType)
     126    if (fUhgsmiType.fCommand)
    126127    {
    127         case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
    128             if (!*phSynch)
    129             {
    130                 *phSynch = CreateEvent(
     128        *phSynch = CreateEvent(
    131129                  NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes */
    132130                  FALSE, /* BOOL bManualReset */
    133131                  FALSE, /* BOOL bInitialState */
    134132                  NULL /* LPCTSTR lpName */
    135                 );
    136                 Assert(*phSynch);
    137                 if (!*phSynch)
    138                 {
    139                     DWORD winEr = GetLastError();
    140                     /* todo: translate winer */
    141                     return VERR_GENERAL_FAILURE;
    142                 }
    143                 bSynchCreated = true;
    144             }
    145             break;
    146         case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
    147             if (!*phSynch)
    148             {
    149                 *phSynch = CreateSemaphore(
    150                   NULL, /* LPSECURITY_ATTRIBUTES lpSemaphoreAttributes */
    151                   0, /* LONG lInitialCount */
    152                   (LONG)((~0UL) >> 1), /* LONG lMaximumCount */
    153                   NULL /* LPCTSTR lpName */
    154                 );
    155                 Assert(*phSynch);
    156                 if (!*phSynch)
    157                 {
    158                     DWORD winEr = GetLastError();
    159                     /* todo: translate winer */
    160                     return VERR_GENERAL_FAILURE;
    161                 }
    162                 bSynchCreated = true;
    163             }
    164             break;
    165         case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
    166             Assert(!*phSynch);
    167             if (*phSynch)
    168                 return VERR_INVALID_PARAMETER;
    169             break;
    170         default:
    171             Assert(0);
    172             return VERR_INVALID_PARAMETER;
     133            );
     134        Assert(*phSynch);
     135        if (!*phSynch)
     136        {
     137            DWORD winEr = GetLastError();
     138            /* todo: translate winer */
     139            return VERR_GENERAL_FAILURE;
     140        }
    173141    }
    174     *pbSynchCreated = bSynchCreated;
    175142    return VINF_SUCCESS;
    176143}
     
    211178        pAllocationList->WriteOperation = !pBufInfo->fFlags.bHostReadOnly;
    212179        pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire;
    213         pBufSubmInfo->fSubFlags = pBufInfo->fFlags;
     180        pBufSubmInfo->bDoNotSignalCompletion = 0;
    214181        if (pBufInfo->fFlags.bEntireBuffer)
    215182        {
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp

    r36867 r41058  
    4444    if (hr == S_OK)
    4545    {
    46         if (pBuffer->BasePrivate.Base.bSynchCreated)
    47         {
    48             CloseHandle(pBuffer->BasePrivate.Base.hSynch);
    49         }
     46        if (pBuffer->BasePrivate.hSynch)
     47            CloseHandle(pBuffer->BasePrivate.hSynch);
    5048        RTMemFree(pBuffer);
    5149        return VINF_SUCCESS;
     
    9593}
    9694
    97 DECLCALLBACK(int) vboxUhgsmiD3DBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
    98         VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
    99         PVBOXUHGSMI_BUFFER* ppBuf)
    100 {
    101     bool bSynchCreated = false;
     95DECLCALLBACK(int) vboxUhgsmiD3DBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf)
     96{
     97    HANDLE hSynch = NULL;
    10298    if (!cbBuf)
    10399        return VERR_INVALID_PARAMETER;
    104100
    105     int rc = vboxUhgsmiBaseEventChkCreate(enmSynchType, &hSynch, &bSynchCreated);
     101    int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch);
    106102    AssertRC(rc);
    107103    if (RT_FAILURE(rc))
     
    134130        Buf.AllocInfo.cbBuffer = cbBuf;
    135131        Buf.AllocInfo.hSynch = hSynch;
    136         Buf.AllocInfo.enmSynchType = enmSynchType;
     132        Buf.AllocInfo.fUhgsmiType = fUhgsmiType;
    137133
    138134        HRESULT hr = pPrivate->pDevice->RtCallbacks.pfnAllocateCb(pPrivate->pDevice->hDevice, &Buf.DdiAlloc);
     
    146142            pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiD3DBufferDestroy;
    147143
    148             pBuf->BasePrivate.Base.hSynch = hSynch;
    149             pBuf->BasePrivate.Base.enmSynchType = enmSynchType;
     144            pBuf->BasePrivate.Base.fType = fUhgsmiType;
    150145            pBuf->BasePrivate.Base.cbBuffer = cbBuf;
    151             pBuf->BasePrivate.Base.bSynchCreated = bSynchCreated;
    152146
    153147            pBuf->pDevice = pPrivate->pDevice;
     
    164158        rc = VERR_NO_MEMORY;
    165159
    166     if (bSynchCreated)
     160    if (hSynch)
    167161        CloseHandle(hSynch);
    168162
     
    170164}
    171165
    172 DECLCALLBACK(int) vboxUhgsmiD3DBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
     166DECLCALLBACK(int) vboxUhgsmiD3DBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
    173167{
    174168    PVBOXUHGSMI_PRIVATE_D3D pHg = VBOXUHGSMID3D_GET(pHgsmi);
     
    215209{
    216210    pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate;
    217     pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiD3DBufferSubmitAsynch;
     211    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit;
    218212    pHgsmi->BasePrivate.hClient = NULL;
    219213    pHgsmi->pDevice = pDevice;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp

    r40483 r41058  
    3939    PVBOXUHGSMI_PRIVATE_KMT pHgsmi;
    4040    VBOXVIDEOCM_UM_ALLOC Alloc;
     41    HANDLE hSynch;
    4142} VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC, *PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC;
    4243
     
    5657    if (NT_SUCCESS(Status))
    5758    {
    58         if (pBuffer->BasePrivate.Base.bSynchCreated)
    59         {
    60             CloseHandle(pBuffer->BasePrivate.Base.hSynch);
    61         }
     59        if (pBuffer->BasePrivate.hSynch)
     60            CloseHandle(pBuffer->BasePrivate.hSynch);
    6261        RTMemFree(pBuffer);
    6362        return VINF_SUCCESS;
     
    123122}
    124123
    125 DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
    126         VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
    127         PVBOXUHGSMI_BUFFER* ppBuf)
    128 {
    129     bool bSynchCreated = false;
     124DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf)
     125{
     126    HANDLE hSynch = NULL;
    130127    if (!cbBuf)
    131128        return VERR_INVALID_PARAMETER;
    132129
    133     int rc = vboxUhgsmiBaseEventChkCreate(enmSynchType, &hSynch, &bSynchCreated);
     130    int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch);
    134131    AssertRC(rc);
    135132    if (RT_FAILURE(rc))
     
    161158        Buf.AllocInfo.cbBuffer = cbBuf;
    162159        Buf.AllocInfo.hSynch = (uint64_t)hSynch;
    163         Buf.AllocInfo.enmSynchType = enmSynchType;
     160        Buf.AllocInfo.fUhgsmiType = fUhgsmiType;
    164161
    165162        NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTCreateAllocation(&Buf.DdiAlloc);
     
    174171            pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiKmtBufferDestroy;
    175172
    176             pBuf->BasePrivate.Base.hSynch = hSynch;
    177             pBuf->BasePrivate.Base.enmSynchType = enmSynchType;
     173            pBuf->BasePrivate.Base.fType = fUhgsmiType;
    178174            pBuf->BasePrivate.Base.cbBuffer = cbBuf;
    179             pBuf->BasePrivate.Base.bSynchCreated = bSynchCreated;
    180175
    181176            pBuf->pHgsmi = pPrivate;
     
    197192        rc = VERR_NO_MEMORY;
    198193
    199     if (bSynchCreated)
     194    if (hSynch)
    200195        CloseHandle(hSynch);
    201196
     
    203198}
    204199
    205 DECLCALLBACK(int) vboxUhgsmiKmtBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
     200DECLCALLBACK(int) vboxUhgsmiKmtBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
    206201{
    207202    PVBOXUHGSMI_PRIVATE_KMT pHg = VBOXUHGSMIKMT_GET(pHgsmi);
     
    275270    if (NT_SUCCESS(Status))
    276271    {
    277         if (pBuffer->Base.bSynchCreated)
    278         {
    279             CloseHandle(pBuffer->Base.hSynch);
    280         }
     272        if (pBuffer->hSynch)
     273            CloseHandle(pBuffer->hSynch);
    281274        RTMemFree(pBuffer);
    282275        return VINF_SUCCESS;
     
    290283}
    291284
    292 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
    293         VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
    294         PVBOXUHGSMI_BUFFER* ppBuf)
    295 {
    296     bool bSynchCreated = false;
     285DECLCALLBACK(int) vboxUhgsmiKmtEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf)
     286{
     287    HANDLE hSynch = NULL;
    297288    if (!cbBuf)
    298289        return VERR_INVALID_PARAMETER;
    299290
    300     int rc = vboxUhgsmiBaseEventChkCreate(enmSynchType, &hSynch, &bSynchCreated);
     291    int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch);
    301292    AssertRC(rc);
    302293    if (RT_FAILURE(rc))
     
    330321        Buf.AllocInfo.Alloc.cbData = cbBuf;
    331322        Buf.AllocInfo.Alloc.hSynch = (uint64_t)hSynch;
    332         Buf.AllocInfo.Alloc.enmSynchType = enmSynchType;
     323        Buf.AllocInfo.Alloc.fUhgsmiType = fUhgsmiType;
    333324
    334325        NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&Buf.DdiEscape);
     
    340331            pBuf->Base.pfnLock = vboxUhgsmiKmtEscBufferLock;
    341332            pBuf->Base.pfnUnlock = vboxUhgsmiKmtEscBufferUnlock;
    342 //            pBuf->Base.pfnAdjustValidDataRange = vboxUhgsmiKmtBufferAdjustValidDataRange;
    343333            pBuf->Base.pfnDestroy = vboxUhgsmiKmtEscBufferDestroy;
    344334
    345             pBuf->Base.hSynch = hSynch;
    346             pBuf->Base.enmSynchType = enmSynchType;
     335            pBuf->Base.fType = fUhgsmiType;
    347336            pBuf->Base.cbBuffer = Buf.AllocInfo.Alloc.cbData;
    348             pBuf->Base.bSynchCreated = bSynchCreated;
     337
     338            pBuf->hSynch = hSynch;
    349339
    350340            *ppBuf = &pBuf->Base;
     
    363353        rc = VERR_NO_MEMORY;
    364354
    365     if (bSynchCreated)
     355    if (hSynch)
    366356        CloseHandle(hSynch);
    367357
     
    369359}
    370360
    371 DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
     361DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
    372362{
    373363    /* we no chromium will not submit more than three buffers actually,
     
    379369    } Buf;
    380370
    381     if (cBuffers > RT_ELEMENTS(Buf.aBufInfos) + 1)
    382     {
    383         Assert(0);
     371    if (!cBuffers || cBuffers > RT_ELEMENTS(Buf.aBufInfos) + 1)
     372    {
     373        WARN(("invalid cBuffers!"));
    384374        return VERR_INVALID_PARAMETER;
    385375    }
    386376
    387 
     377    HANDLE hSynch = VBOXUHGSMIKMTESC_GET_BUFFER(aBuffers[0].pBuf)->hSynch;
     378    if (!hSynch)
     379    {
     380        WARN(("the fist buffer is not command!"));
     381        return VERR_INVALID_PARAMETER;
     382    }
    388383    PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi);
    389384    D3DKMT_ESCAPE DdiEscape = {0};
     
    405400        PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuf = VBOXUHGSMIKMTESC_GET_BUFFER(pBufInfo->pBuf);
    406401        pSubmInfo->hAlloc = pBuf->Alloc.hAlloc;
    407         pSubmInfo->Info.fSubFlags = pBufInfo->fFlags;
     402        pSubmInfo->Info.bDoNotSignalCompletion = 0;
    408403        if (pBufInfo->fFlags.bEntireBuffer)
    409404        {
     
    421416    if (NT_SUCCESS(Status))
    422417    {
    423         return VINF_SUCCESS;
     418        DWORD dwResult = WaitForSingleObject(hSynch, INFINITE);
     419        if (dwResult == WAIT_OBJECT_0)
     420            return VINF_SUCCESS;
     421        WARN(("wait failed, (0x%x)", dwResult));
     422        return VERR_GENERAL_FAILURE;
    424423    }
    425424    else
     
    570569{
    571570    pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate;
    572     pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiKmtBufferSubmitAsynch;
     571    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtBufferSubmit;
    573572    pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall;
    574573    pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID;
     
    582581{
    583582    pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtEscBufferCreate;
    584     pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiKmtEscBufferSubmitAsynch;
     583    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtEscBufferSubmit;
    585584    pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall;
    586585    pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp

    r40566 r41058  
    949949    VBOXWDDM_HANDLE hSessionHandle;
    950950    PVBOXVIDEOCM_ALLOC pAlloc;
    951     union
    952     {
    953         PKEVENT pSynchEvent;
    954         PRKSEMAPHORE pSynchSemaphore;
    955     };
    956     VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
     951    PKEVENT pSynchEvent;
     952    VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
    957953    volatile uint32_t cRefs;
    958954    MDL Mdl;
     
    10381034    PVBOXVIDEOCM_ALLOC_MGR pMgr = pContext->pMgr;
    10391035    NTSTATUS Status = STATUS_SUCCESS;
    1040 
    1041     union
    1042     {
    1043         PKEVENT pSynchEvent;
    1044         PRKSEMAPHORE pSynchSemaphore;
    1045     };
    1046 
    1047     switch (pUmAlloc->enmSynchType)
    1048     {
    1049         case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
    1050             Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
    1051                     (PVOID*)&pSynchEvent,
    1052                     NULL);
    1053             Assert(Status == STATUS_SUCCESS);
    1054             Assert(pSynchEvent);
    1055             break;
    1056         case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
    1057             Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExSemaphoreObjectType, UserMode,
    1058                     (PVOID*)&pSynchSemaphore,
    1059                     NULL);
    1060             Assert(Status == STATUS_SUCCESS);
    1061             Assert(pSynchSemaphore);
    1062             break;
    1063         case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
    1064             pSynchEvent = NULL;
    1065             Status = STATUS_SUCCESS;
    1066             break;
    1067         default:
    1068             LOGREL(("ERROR: invalid synch info type(%d)", pUmAlloc->enmSynchType));
    1069             AssertBreakpoint();
    1070             Status = STATUS_INVALID_PARAMETER;
    1071             break;
     1036    PKEVENT pSynchEvent = NULL;
     1037
     1038    if (pUmAlloc->hSynch)
     1039    {
     1040        Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
     1041                (PVOID*)&pSynchEvent,
     1042                NULL);
     1043        Assert(Status == STATUS_SUCCESS);
     1044        Assert(pSynchEvent);
    10721045    }
    10731046
     
    11021075                    pAllocRef->pContext = pContext;
    11031076                    pAllocRef->pAlloc = pAlloc;
    1104                     pAllocRef->enmSynchType = pUmAlloc->enmSynchType;
     1077                    pAllocRef->fUhgsmiType = pUmAlloc->fUhgsmiType;
    11051078                    pAllocRef->pSynchEvent = pSynchEvent;
    11061079                    ExAcquireFastMutex(&pContext->Mutex);
     
    11331106
    11341107        if (pSynchEvent)
    1135         {
    11361108            ObDereferenceObject(pSynchEvent);
    1137         }
    11381109    }
    11391110    else
     
    11601131        *ppAlloc = pAllocRef->pAlloc;
    11611132        if (pAllocRef->pSynchEvent)
    1162         {
    11631133            ObDereferenceObject(pAllocRef->pSynchEvent);
    1164         }
    11651134        vboxWddmMemFree(pAllocRef);
    11661135    }
     
    12441213    {
    12451214        VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i];
    1246         PVBOXVIDEOCM_ALLOC_REF pRef = (PVBOXVIDEOCM_ALLOC_REF)pBufCmd->u64GuesData;
    1247         if (!pBufCmd->u32GuesData)
     1215        PVBOXVIDEOCM_ALLOC_REF pRef = (PVBOXVIDEOCM_ALLOC_REF)pBufCmd->u64GuestData;
     1216        if (!pBufCmd->u32GuestData)
    12481217        {
    12491218            /* signal completion */
    1250             switch (pRef->enmSynchType)
    1251             {
    1252                 case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
    1253                     KeSetEvent(pRef->pSynchEvent, 3, FALSE);
    1254                     break;
    1255                 case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
    1256                     KeReleaseSemaphore(pRef->pSynchSemaphore,
    1257                         3,
    1258                         1,
    1259                         FALSE);
    1260                     break;
    1261                 case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
    1262                     break;
    1263                 default:
    1264                     Assert(0);
    1265             }
     1219            if (pRef->pSynchEvent)
     1220                KeSetEvent(pRef->pSynchEvent, 3, FALSE);
    12661221        }
    12671222
     
    13101265                pBufCmd->offBuffer = pRef->pAlloc->offData + pBufInfo->Info.offData;
    13111266                pBufCmd->cbBuffer = pBufInfo->Info.cbData;
    1312                 pBufCmd->u32GuesData = pBufInfo->Info.fSubFlags.bDoNotSignalCompletion;
    1313                 pBufCmd->u64GuesData = (uint64_t)pRef;
     1267                pBufCmd->u32GuestData = pBufInfo->Info.bDoNotSignalCompletion;
     1268                pBufCmd->u64GuestData = (uint64_t)pRef;
    13141269            }
    13151270            else
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r40842 r41058  
    150150    AVLPVNODECORE ShRcTreeEntry;
    151151#endif
    152     VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
    153     union
    154     {
    155         PKEVENT pSynchEvent;
    156         PRKSEMAPHORE pSynchSemaphore;
    157     };
     152    VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
     153    PKEVENT pSynchEvent;
    158154} VBOXWDDM_ALLOCATION, *PVBOXWDDM_ALLOCATION;
    159155
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r40897 r41058  
    19621962        {
    19631963            if (pAllocation->pSynchEvent)
    1964             {
    19651964                ObDereferenceObject(pAllocation->pSynchEvent);
    1966             }
    19671965            break;
    19681966        }
     
    21512149                {
    21522150                    pAllocationInfo->Size = pAllocInfo->cbBuffer;
    2153                     pAllocation->enmSynchType = pAllocInfo->enmSynchType;
     2151                    pAllocation->fUhgsmiType = pAllocInfo->fUhgsmiType;
    21542152                    pAllocation->SurfDesc.cbSize = pAllocInfo->cbBuffer;
    21552153                    pAllocationInfo->Flags.CpuVisible = 1;
    21562154//                    pAllocationInfo->Flags.SynchronousPaging = 1;
    21572155                    pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_MAXIMUM;
    2158                     switch (pAllocInfo->enmSynchType)
     2156                    if (pAllocInfo->hSynch)
    21592157                    {
    2160                         case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
    2161                             Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
    2162                                     (PVOID*)&pAllocation->pSynchEvent,
    2163                                     NULL);
    2164                             Assert(Status == STATUS_SUCCESS);
    2165                             break;
    2166                         case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
    2167                             Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExSemaphoreObjectType, UserMode,
    2168                                     (PVOID*)&pAllocation->pSynchSemaphore,
    2169                                     NULL);
    2170                             Assert(Status == STATUS_SUCCESS);
    2171                             break;
    2172                         case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
    2173                             pAllocation->pSynchEvent = NULL;
    2174                             Status = STATUS_SUCCESS;
    2175                             break;
    2176                         default:
    2177                             LOGREL(("ERROR: invalid synch info type(%d)", pAllocInfo->enmSynchType));
    2178                             AssertBreakpoint();
    2179                             Status = STATUS_INVALID_PARAMETER;
    2180                             break;
     2158                        Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
     2159                                (PVOID*)&pAllocation->pSynchEvent,
     2160                                NULL);
     2161                        Assert(Status == STATUS_SUCCESS);
    21812162                    }
    21822163                    break;
     
    27632744    {
    27642745        VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i];
    2765         if (!pBufCmd->u32GuesData)
     2746        if (!pBufCmd->u32GuestData)
    27662747        {
    27672748            /* signal completion */
    2768             PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBufCmd->u64GuesData;
    2769             switch (pAlloc->enmSynchType)
    2770             {
    2771                 case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
    2772                     KeSetEvent(pAlloc->pSynchEvent, 3, FALSE);
    2773                     break;
    2774                 case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
    2775                     KeReleaseSemaphore(pAlloc->pSynchSemaphore,
    2776                         3,
    2777                         1,
    2778                         FALSE);
    2779                     break;
    2780                 case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
    2781                     break;
    2782                 default:
    2783                     Assert(0);
    2784             }
     2749            PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBufCmd->u64GuestData;
     2750            if (pAlloc->pSynchEvent)
     2751                KeSetEvent(pAlloc->pSynchEvent, 3, FALSE);
    27852752        }
    27862753    }
     
    30353002                pBufCmd->offBuffer = pBufInfo->Alloc.offAlloc;
    30363003                pBufCmd->cbBuffer = pBufInfo->cbData;
    3037                 pBufCmd->u32GuesData = pBufInfo->bDoNotSignalCompletion;
    3038                 pBufCmd->u64GuesData = (uint64_t)pBufInfo->Alloc.pAlloc;
     3004                pBufCmd->u32GuestData = pBufInfo->bDoNotSignalCompletion;
     3005                pBufCmd->u64GuestData = (uint64_t)pBufInfo->Alloc.pAlloc;
    30393006            }
    30403007
     
    51365103
    51375104                pSubmInfo->cbData = pSubmUmInfo->cbData;
    5138                 pSubmInfo->bDoNotSignalCompletion = pSubmUmInfo->fSubFlags.bDoNotSignalCompletion;
     5105                pSubmInfo->bDoNotSignalCompletion = pSubmUmInfo->bDoNotSignalCompletion;
    51395106
    51405107                pPLL->AllocationIndex = i;
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