VirtualBox

Changeset 41058 in vbox


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
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/VBoxUhgsmi.h

    r36536 r41058  
    3333
    3434typedef struct VBOXUHGSMI_BUFFER *PVBOXUHGSMI_BUFFER;
    35 typedef void* HVBOXUHGSMI_SYNCHOBJECT;
    3635
    37 typedef enum
     36typedef struct VBOXUHGSMI_BUFFER_TYPE_FLAGS
    3837{
    39     VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE = 0,
    40     VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT,
    41     VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE
    42 } VBOXUHGSMI_SYNCHOBJECT_TYPE;
     38    union
     39    {
     40        struct
     41        {
     42            uint32_t fCommand    : 1;
     43            uint32_t Reserved    : 31;
     44        };
     45        uint32_t Value;
     46    };
     47} VBOXUHGSMI_BUFFER_TYPE_FLAGS;
    4348
    4449typedef struct VBOXUHGSMI_BUFFER_LOCK_FLAGS
     
    6772            uint32_t bHostReadOnly          : 1;
    6873            uint32_t bHostWriteOnly         : 1;
    69             uint32_t bDoNotRetire           : 1; /**< the buffer will be uset in a subsequent command */
    70             uint32_t bDoNotSignalCompletion : 1; /**< do not signal notification object on completion for this alloc */
     74            uint32_t bDoNotRetire           : 1; /**< the buffer will be used in a subsequent command */
    7175            uint32_t bEntireBuffer          : 1;
    72             uint32_t Reserved               : 27;
     76            uint32_t Reserved               : 28;
    7377        };
    7478        uint32_t Value;
     
    7882/* the caller can specify NULL as a hSynch and specify a valid enmSynchType to make UHGSMI create a proper object itself,
    7983 *  */
    80 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_CREATE(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
    81         VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
    82         PVBOXUHGSMI_BUFFER* ppBuf);
     84typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_CREATE(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fType, PVBOXUHGSMI_BUFFER* ppBuf);
    8385typedef FNVBOXUHGSMI_BUFFER_CREATE *PFNVBOXUHGSMI_BUFFER_CREATE;
    8486
     
    9193} VBOXUHGSMI_BUFFER_SUBMIT, *PVBOXUHGSMI_BUFFER_SUBMIT;
    9294
    93 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers);
    94 typedef FNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH *PFNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH;
     95typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_SUBMIT(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers);
     96typedef FNVBOXUHGSMI_BUFFER_SUBMIT *PFNVBOXUHGSMI_BUFFER_SUBMIT;
    9597
    9698typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_DESTROY(PVBOXUHGSMI_BUFFER pBuf);
     
    106108{
    107109    PFNVBOXUHGSMI_BUFFER_CREATE pfnBufferCreate;
    108     PFNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH pfnBufferSubmitAsynch;
     110    PFNVBOXUHGSMI_BUFFER_SUBMIT pfnBufferSubmit;
    109111    /** User custom data. */
    110112    void *pvUserData;
     
    119121    /* r/o data added for ease of access and simplicity
    120122     * modifying it leads to unpredictable behavior */
    121     HVBOXUHGSMI_SYNCHOBJECT hSynch;
    122     VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
     123    VBOXUHGSMI_BUFFER_TYPE_FLAGS fType;
    123124    uint32_t cbBuffer;
    124     bool bSynchCreated;
    125125    /** User custom data. */
    126126    void *pvUserData;
    127127} VBOXUHGSMI_BUFFER;
    128128
     129#define VBoxUhgsmiBufferCreate(_pUhgsmi, _cbBuf, _fType, _ppBuf) ((_pUhgsmi)->pfnBufferCreate(_pUhgsmi, _cbBuf, _fType, _ppBuf))
     130#define VBoxUhgsmiBufferSubmit(_pUhgsmi, _aBuffers, _cBuffers) ((_pUhgsmi)->pfnBufferSubmit(_pUhgsmi, _aBuffers, _cBuffers))
     131
     132#define VBoxUhgsmiBufferLock(_pBuf, _offLock, _cbLock, _fFlags, _pvLock) ((_pBuf)->pfnLock(_pBuf, _offLock, _cbLock, _fFlags, _pvLock))
     133#define VBoxUhgsmiBufferUnlock(_pBuf) ((_pBuf)->pfnUnlock(_pBuf))
     134#define VBoxUhgsmiBufferDestroy(_pBuf) ((_pBuf)->pfnDestroy(_pBuf))
     135
    129136#endif
    130137
  • trunk/include/VBox/VBoxVideo.h

    r39603 r41058  
    13741374    VBOXVIDEOOFFSET offBuffer;
    13751375    uint32_t cbBuffer;
    1376     uint32_t u32GuesData;
    1377     uint64_t u64GuesData;
     1376    uint32_t u32GuestData;
     1377    uint64_t u64GuestData;
    13781378} VBOXVDMACMD_CHROMIUM_BUFFER, *PVBOXVDMACMD_CHROMIUM_BUFFER;
    13791379
  • 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;
  • trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c

    r40961 r41058  
    247247{
    248248    int rc;
     249    VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0};
    249250    pClient->pHgsmi = pHgsmi;
    250     rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1),
    251                             VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT,
    252                             NULL,
    253                             &pClient->pCmdBuffer);
     251    Flags.fCommand = 1;
     252    rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), Flags, &pClient->pCmdBuffer);
    254253    AssertRC(rc);
    255254    if (RT_SUCCESS(rc))
    256255    {
    257         rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1),
    258                                         VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT,
    259                                         NULL,
    260                                         &pClient->pHGBuffer);
     256        Flags.Value = 0;
     257        rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), Flags, &pClient->pHGBuffer);
    261258        AssertRC(rc);
    262259        if (RT_SUCCESS(rc))
     
    373370    if (!buf)
    374371    {
     372        VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0};
    375373        crDebug("Buffer pool %p was empty; allocating new %d byte buffer.",
    376374                        (void *) pClient->bufpool,
    377375                        cbSize);
    378         rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, cbSize,
    379                                 VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE, NULL,
    380                                 &buf);
     376        rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, cbSize, Flags, &buf);
    381377        AssertRC(rc);
    382378        if (RT_FAILURE(rc))
     
    529525//                                                       * which is needed for getting the result */
    530526}
    531 
    532 #ifdef RT_OS_WINDOWS
    533 #define CRVBOXHGSMI_BUF_WAIT(_pBub) WaitForSingleObject((_pBub)->hSynch, INFINITE);
    534 #else
    535 # error "Port Me!!"
    536 #endif
    537 
    538 DECLINLINE(void) _crVBoxHGSMIWaitCmd(PCRVBOXHGSMI_CLIENT pClient)
    539 {
    540     int rc = CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);
    541     CRASSERT(rc == 0);
    542 }
    543527#endif
    544528
     
    18451829    aSubmit[1].fFlags.bHostWriteOnly = 1;
    18461830
    1847     rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 2);
     1831    rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2);
    18481832    AssertRC(rc);
    18491833    if (RT_FAILURE(rc))
    18501834    {
    1851         crError("pfnBufferSubmitAsynch failed with %d \n", rc);
     1835        crError("pfnBufferSubmit failed with %d \n", rc);
    18521836        return;
    18531837    }
    1854 
    1855     _crVBoxHGSMIWaitCmd(pClient);
    18561838
    18571839    parms = (CRVBOXHGSMIREAD *)_crVBoxHGSMICmdBufferLockRo(pClient, sizeof (*parms));
     
    19791961        aSubmit[2].fFlags.Value = 0;
    19801962
    1981         rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 3);
     1963        rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 3);
    19821964        AssertRC(rc);
    19831965        if (RT_FAILURE(rc))
    19841966        {
    1985             crError("pfnBufferSubmitAsynch failed with %d \n", rc);
     1967            crError("pfnBufferSubmit failed with %d \n", rc);
    19861968            break;
    19871969        }
    1988 
    1989         _crVBoxHGSMIWaitCmd(pClient);
    19901970
    19911971        parms = (CRVBOXHGSMIWRITEREAD *)_crVBoxHGSMICmdBufferLockRo(pClient, sizeof (*parms));
     
    20151995            else if (VERR_BUFFER_OVERFLOW == rc)
    20161996            {
     1997                VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0};
    20171998                PVBOXUHGSMI_BUFFER pOldBuf = pClient->pHGBuffer;
    20181999                CRASSERT(!pClient->pvHGBuffer);
     
    20202001                crDebug("Reallocating host buffer from %d to %d bytes", conn->cbHostBufferAllocated, cbWriteback);
    20212002
    2022                 rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(cbWriteback),
    2023                                 VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE, NULL, &pClient->pHGBuffer);
     2003                rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(cbWriteback), Flags, &pClient->pHGBuffer);
    20242004                AssertRC(rc);
    20252005                if (RT_SUCCESS(rc))
     
    20902070        aSubmit[1].fFlags.bHostReadOnly = 1;
    20912071
    2092         rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 2);
     2072        rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2);
    20932073        AssertRC(rc);
    20942074        if (RT_SUCCESS(rc))
    20952075        {
    2096             _crVBoxHGSMIWaitCmd(pClient);
    2097                 /* @todo: do we need to wait for completion actually?
    2098                  * NOTE: in case we do not need completion,
    2099                  * we MUST specify bDoNotSignalCompletion flag for the command buffer */
    2100 //                CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);
    2101 
    21022076            callRes = _crVBoxHGSMICmdBufferGetRc(pClient);
    21032077        }
     
    21052079        {
    21062080            /* we can not recover at this point, report error & exit */
    2107             crError("pfnBufferSubmitAsynch failed with %d \n", rc);
     2081            crError("pfnBufferSubmit failed with %d \n", rc);
    21082082        }
    21092083    }
     
    21292103        aSubmit[1].fFlags.bHostReadOnly = 1;
    21302104
    2131         rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 2);
     2105        rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2);
    21322106        AssertRC(rc);
    21332107        if (RT_SUCCESS(rc))
    21342108        {
    2135             _crVBoxHGSMIWaitCmd(pClient);
    2136                 /* @todo: do we need to wait for completion actually?
    2137                  * NOTE: in case we do not need completion,
    2138                  * we MUST specify bDoNotSignalCompletion flag for the command buffer */
    2139 //                CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);
    2140 
    21412109            callRes = _crVBoxHGSMICmdBufferGetRc(pClient);
    21422110        }
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