Changeset 43489 in vbox for trunk/src/VBox
- Timestamp:
- Oct 1, 2012 11:55:58 AM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 81049
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/common/VBoxVideoLog.h
r41472 r43489 97 97 #endif 98 98 99 #define WARN_NOBP(_a) _LOGMSG( VBOX_VIDEO_LOG_LOGGER, "WARNING! :", _a)99 #define WARN_NOBP(_a) _LOGMSG(_WARN_LOGGER, "WARNING! :", _a) 100 100 #define WARN(_a) \ 101 101 do \ … … 108 108 WARN(_w); \ 109 109 }\ 110 } while (0) 111 112 #define STOP_FATAL() do { \ 113 AssertReleaseFailed(); \ 114 } while (0) 115 #define ERR(_a) do { \ 116 _LOGMSG(VBOX_VIDEO_LOGREL_LOGGER, "FATAL! :", _a); \ 117 STOP_FATAL(); \ 110 118 } while (0) 111 119 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk
r42314 r43489 129 129 $(VBOX_PATH_CROGL_GENFILES)/pack_bounds_swap.c \ 130 130 wddm/VBoxMPCrUtil.cpp 131 VBoxVideoWddm_DEFS +VBOX_WDDM_WITH_CRCMD131 VBoxVideoWddm_DEFS += VBOX_WDDM_WITH_CRCMD 132 132 endif 133 133 ifdef VBOXWDDM_WITH_VBVA -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r41638 r43489 96 96 LIST_ENTRY SwapchainList3D; 97 97 /* mutex for context list operations */ 98 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 99 KSPIN_LOCK ContextLock; 100 #else 98 101 FAST_MUTEX ContextMutex; 102 #endif 99 103 KSPIN_LOCK SynchLock; 100 104 volatile uint32_t cContexts3D; … … 106 110 107 111 VBOXMP_CRCTLCON CrCtlCon; 112 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 113 VBOXMP_CRSHGSMITRANSPORT CrHgsmiTransport; 114 #endif 108 115 109 116 VBOXWDDM_GLOBAL_POINTER_INFO PointerInfo; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.cpp
r42028 r43489 26 26 27 27 # ifdef VBOX_WDDM_WITH_CRCMD 28 # include <cr_pack.h>29 30 typedef struct VBOXMP_CRSHGSMICON_BUFDR31 {32 uint32_t cbBuf;33 void *pvBuf;34 } VBOXMP_CRSHGSMICON_BUFDR, *PVBOXMP_CRSHGSMICON_BUFDR;35 36 typedef struct VBOXMP_CRSHGSMICON_BUFDR_CACHE37 {38 volatile PVBOXMP_CRSHGSMICON_BUFDR pBufDr;39 } VBOXMP_CRSHGSMICON_BUFDR_CACHE, *PVBOXMP_CRSHGSMICON_BUFDR_CACHE;40 41 typedef struct VBOXMP_CRSHGSMICON42 {43 PVBOXMP_DEVEXT pDevExt;44 PVBOXMP_CRCTLCON pCtlCon;45 uint32_t u32ClientID;46 VBOXMP_CRSHGSMICON_BUFDR_CACHE CmdDrCache;47 VBOXMP_CRSHGSMICON_BUFDR_CACHE WbDrCache;48 } VBOXMP_CRSHGSMICON, *PVBOXMP_CRSHGSMICON;49 50 typedef struct VBOXMP_CRSHGSMIPACKER51 {52 PVBOXMP_CRSHGSMICON pCon;53 CRPackContext CrPacker;54 CRPackBuffer CrBuffer;55 } VBOXMP_CRSHGSMIPACKER, *PVBOXMP_CRSHGSMIPACKER;56 28 57 29 static void* vboxMpCrShgsmiBufferAlloc(PVBOXMP_DEVEXT pDevExt, HGSMISIZE cbData) … … 62 34 static VBOXVIDEOOFFSET vboxMpCrShgsmiBufferOffset(PVBOXMP_DEVEXT pDevExt, void *pvBuffer) 63 35 { 64 return HGSMIPointerToOffset(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx.Heap.area, (const HGSMIBUFFERHEADER *)pvBuffer); 36 return (VBOXVIDEOOFFSET)HGSMIPointerToOffset(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx.Heap.area, (const HGSMIBUFFERHEADER *)pvBuffer); 37 } 38 39 static void* vboxMpCrShgsmiBufferFromOffset(PVBOXMP_DEVEXT pDevExt, VBOXVIDEOOFFSET offBuffer) 40 { 41 return HGSMIOffsetToPointer(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx.Heap.area, (HGSMIOFFSET)offBuffer); 65 42 } 66 43 … … 70 47 } 71 48 72 static void* vboxMpCrShgsmiConAlloc(PVBOXMP_CRSHGSMICON pCon, uint32_t cbBuffer) 49 static VBOXVIDEOOFFSET vboxMpCrShgsmiTransportBufOffset(PVBOXMP_CRSHGSMITRANSPORT pCon, void* pvBuffer) 50 { 51 return vboxMpCrShgsmiBufferOffset(pCon->pDevExt, pvBuffer); 52 } 53 54 static void* vboxMpCrShgsmiTransportBufFromOffset(PVBOXMP_CRSHGSMITRANSPORT pCon, VBOXVIDEOOFFSET offBuffer) 55 { 56 return vboxMpCrShgsmiBufferFromOffset(pCon->pDevExt, offBuffer); 57 } 58 59 void* VBoxMpCrShgsmiTransportBufAlloc(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t cbBuffer) 73 60 { 74 61 return vboxMpCrShgsmiBufferAlloc(pCon->pDevExt, cbBuffer); 75 62 } 76 63 77 static VBOXVIDEOOFFSET vboxMpCrShgsmiConBufOffset(PVBOXMP_CRSHGSMICON pCon, void* pvBuffer) 78 { 79 return vboxMpCrShgsmiBufferOffset(pCon->pDevExt, pvBuffer); 80 } 81 82 83 static void vboxMpCrShgsmiConFree(PVBOXMP_CRSHGSMICON pCon, void* pvBuffer) 64 void VBoxMpCrShgsmiTransportBufFree(PVBOXMP_CRSHGSMITRANSPORT pCon, void* pvBuffer) 84 65 { 85 66 vboxMpCrShgsmiBufferFree(pCon->pDevExt, pvBuffer); 86 67 } 87 68 88 #define VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers) VBOXWDDM_ROUNDBOUND((VBOXVDMACMD_SIZE_FROMBODYSIZE(RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CMD, aBuffers[_cBuffers]))), 8) 89 #define VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(_pDr, _cBuffers, _type) ((_type*)(((uint8_t*)(_pDr)) + VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers))) 90 #define VBOXMP_CRSHGSMICON_DR_SIZE(_cBuffers, _cbCmdBuf) ( VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers) + _cbCmdBuf) 91 92 static int vboxMpCrShgsmiBufCacheBufReinit(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, PVBOXMP_CRSHGSMICON_BUFDR pDr, uint32_t cbRequested) 69 static int vboxMpCrShgsmiBufCacheBufReinit(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, PVBOXMP_CRSHGSMICON_BUFDR pDr, uint32_t cbRequested) 93 70 { 94 71 if (pDr->cbBuf >= cbRequested) … … 96 73 97 74 if (pDr->pvBuf) 98 vboxMpCrShgsmiConFree(pCon, pDr->pvBuf);99 100 pDr->pvBuf = vboxMpCrShgsmiConAlloc(pCon, cbRequested);75 VBoxMpCrShgsmiTransportBufFree(pCon, pDr->pvBuf); 76 77 pDr->pvBuf = VBoxMpCrShgsmiTransportBufAlloc(pCon, cbRequested); 101 78 if (!pDr->pvBuf) 102 79 { 103 WARN((" vboxMpCrShgsmiConAlloc failed"));80 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed")); 104 81 pDr->cbBuf = 0; 105 82 return VERR_NO_MEMORY; … … 110 87 } 111 88 112 static void vboxMpCrShgsmiBufCacheFree(PVBOXMP_CRSHGSMI CONpCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, PVBOXMP_CRSHGSMICON_BUFDR pDr)89 static void vboxMpCrShgsmiBufCacheFree(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, PVBOXMP_CRSHGSMICON_BUFDR pDr) 113 90 { 114 91 if (ASMAtomicCmpXchgPtr(&pCache->pBufDr, pDr, NULL)) … … 116 93 117 94 /* the value is already cached, free the current one */ 118 vboxMpCrShgsmiConFree(pCon, pDr->pvBuf);95 VBoxMpCrShgsmiTransportBufFree(pCon, pDr->pvBuf); 119 96 vboxWddmMemFree(pDr); 120 97 } … … 135 112 } 136 113 137 static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheAlloc(PVBOXMP_CRSHGSMI CONpCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, uint32_t cbBuffer)114 static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheAlloc(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, uint32_t cbBuffer) 138 115 { 139 116 PVBOXMP_CRSHGSMICON_BUFDR pBufDr = vboxMpCrShgsmiBufCacheGetAllocDr(pCache); … … 148 125 } 149 126 150 static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheAllocAny(PVBOXMP_CRSHGSMI CONpCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, uint32_t cbBuffer)127 static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheAllocAny(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, uint32_t cbBuffer) 151 128 { 152 129 PVBOXMP_CRSHGSMICON_BUFDR pBufDr = vboxMpCrShgsmiBufCacheGetAllocDr(pCache); … … 166 143 167 144 168 static int vboxMpCrShgsmiBufCacheInit(PVBOXMP_CRSHGSMI CONpCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache)145 static int vboxMpCrShgsmiBufCacheInit(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache) 169 146 { 170 147 memset(pCache, 0, sizeof (*pCache)); … … 172 149 } 173 150 174 static void vboxMpCrShgsmiBufCacheTerm(PVBOXMP_CRSHGSMI CONpCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache)151 static void vboxMpCrShgsmiBufCacheTerm(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache) 175 152 { 176 153 if (pCache->pBufDr) … … 178 155 } 179 156 180 static int vboxMpCrShgsmiConConnect(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_DEVEXT pDevExt, PVBOXMP_CRCTLCON pCrCtlCon)157 int VBoxMpCrShgsmiTransportCreate(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_DEVEXT pDevExt) 181 158 { 182 159 memset(pCon, 0, sizeof (*pCon)); 183 int rc = vboxMpCrShgsmiBufCacheInit(pCon, &pCon->CmdDrCache); 184 if (RT_SUCCESS(rc)) 160 pCon->pDevExt = pDevExt; 161 return VINF_SUCCESS; 162 int rc; 163 // int rc = vboxMpCrShgsmiBufCacheInit(pCon, &pCon->CmdDrCache); 164 // if (RT_SUCCESS(rc)) 185 165 { 186 166 rc = vboxMpCrShgsmiBufCacheInit(pCon, &pCon->WbDrCache); 187 167 if (RT_SUCCESS(rc)) 188 168 { 189 rc = VBoxMpCrCtlConConnect(pCrCtlCon, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, &pCon->u32ClientID); 190 if (RT_SUCCESS(rc)) 169 } 170 else 171 { 172 WARN(("vboxMpCrShgsmiBufCacheInit2 failed rc %d", rc)); 173 } 174 // vboxMpCrShgsmiBufCacheTerm(pCon, &pCon->CmdDrCache); 175 } 176 // else 177 // { 178 // WARN(("vboxMpCrShgsmiBufCacheInit1 failed rc %d", rc)); 179 // } 180 181 return rc; 182 } 183 184 void VBoxMpCrShgsmiTransportTerm(PVBOXMP_CRSHGSMITRANSPORT pCon) 185 { 186 vboxMpCrShgsmiBufCacheTerm(pCon, &pCon->WbDrCache); 187 // vboxMpCrShgsmiBufCacheTerm(pCon, &pCon->CmdDrCache); 188 } 189 190 //typedef struct VBOXMP_CRHGSMICMD_HDR 191 //{ 192 // union 193 // { 194 // PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnWriteReadCompletion; 195 // PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION pfnWriteCompletion; 196 // }; 197 //} VBOXMP_CRHGSMICMD_HDR, *PVBOXMP_CRHGSMICMD_HDR; 198 199 typedef struct VBOXMP_CRHGSMICMD_BASE 200 { 201 // VBOXMP_CRHGSMICMD_HDR Hdr; 202 CRVBOXHGSMIHDR CmdHdr; 203 } VBOXMP_CRHGSMICMD_BASE, *PVBOXMP_CRHGSMICMD_BASE; 204 205 typedef struct VBOXMP_CRHGSMICMD_WRITEREAD 206 { 207 // VBOXMP_CRHGSMICMD_HDR Hdr; 208 CRVBOXHGSMIWRITEREAD Cmd; 209 } VBOXMP_CRHGSMICMD_WRITEREAD, *PVBOXMP_CRHGSMICMD_WRITEREAD; 210 211 typedef struct VBOXMP_CRHGSMICMD_READ 212 { 213 // VBOXMP_CRHGSMICMD_HDR Hdr; 214 CRVBOXHGSMIREAD Cmd; 215 } VBOXMP_CRHGSMICMD_READ, *PVBOXMP_CRHGSMICMD_READ; 216 217 typedef struct VBOXMP_CRHGSMICMD_WRITE 218 { 219 // VBOXMP_CRHGSMICMD_HDR Hdr; 220 CRVBOXHGSMIWRITE Cmd; 221 } VBOXMP_CRHGSMICMD_WRITE, *PVBOXMP_CRHGSMICMD_WRITE; 222 223 #define VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers) VBOXWDDM_ROUNDBOUND((VBOXVDMACMD_SIZE_FROMBODYSIZE(RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CMD, aBuffers[_cBuffers]))), 8) 224 #define VBOXMP_CRSHGSMICON_DR_CMDCTX_OFFSET(_cBuffers, _cbCmdBuf) ( VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers) + VBOXWDDM_ROUNDBOUND(_cbCmdBuf, 8)) 225 #define VBOXMP_CRSHGSMICON_DR_GET_CRCMD(_pDr) (VBOXVDMACMD_BODY((_pDr), VBOXVDMACMD_CHROMIUM_CMD)) 226 #define VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(_pDr, _cBuffers, _type) ((_type*)(((uint8_t*)(_pDr)) + VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers))) 227 #define VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(_pDr, _cBuffers, _cbCmdBuf, _type) ((_type*)(((uint8_t*)(_pDr)) + VBOXMP_CRSHGSMICON_DR_CMDCTX_OFFSET(_cBuffers, _cbCmdBuf))) 228 #define VBOXMP_CRSHGSMICON_DR_GET_FROM_CMDCTX(_pCtx, _cBuffers, _cbCmdBuf) ((VBOXVDMACMD*)(((uint8_t*)(_pCtx)) - VBOXMP_CRSHGSMICON_DR_CMDCTX_OFFSET(_cBuffers, _cbCmdBuf))) 229 #define VBOXMP_CRSHGSMICON_DR_SIZE(_cBuffers, _cbCmdBuf, _cbCtx) (VBOXMP_CRSHGSMICON_DR_CMDCTX_OFFSET(_cBuffers, _cbCmdBuf) + (_cbCtx)) 230 231 232 static int vboxMpCrShgsmiTransportCmdSubmitDr(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXVDMACBUF_DR pDr, PFNVBOXVDMADDICMDCOMPLETE_DPC pfnComplete) 233 { 234 235 PVBOXVDMADDI_CMD pDdiCmd = VBOXVDMADDI_CMD_FROM_BUF_DR(pDr); 236 PVBOXMP_DEVEXT pDevExt = pCon->pDevExt; 237 vboxVdmaDdiCmdInit(pDdiCmd, 0, 0, pfnComplete, pCon); 238 /* mark command as submitted & invisible for the dx runtime since dx did not originate it */ 239 vboxVdmaDdiCmdSubmittedNotDx(pDdiCmd); 240 int rc = vboxVdmaCBufDrSubmit(pDevExt, &pDevExt->u.primary.Vdma, pDr); 241 if (RT_SUCCESS(rc)) 242 { 243 return VINF_SUCCESS; 244 } 245 246 WARN(("vboxVdmaCBufDrSubmit failed rc %d", rc)); 247 return rc; 248 } 249 250 static int vboxMpCrShgsmiTransportCmdSubmitDmaCmd(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXVDMACMD pHdr, PFNVBOXVDMADDICMDCOMPLETE_DPC pfnComplete) 251 { 252 PVBOXVDMACBUF_DR pDr = VBOXVDMACBUF_DR_FROM_TAIL(pHdr); 253 return vboxMpCrShgsmiTransportCmdSubmitDr(pCon, pDr, pfnComplete); 254 } 255 256 static void vboxMpCrShgsmiTransportCmdTermDmaCmd(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXVDMACMD pHdr) 257 { 258 PVBOXVDMACBUF_DR pDr = VBOXVDMACBUF_DR_FROM_TAIL(pHdr); 259 PVBOXMP_DEVEXT pDevExt = pCon->pDevExt; 260 vboxVdmaCBufDrFree (&pDevExt->u.primary.Vdma, pDr); 261 } 262 263 264 typedef DECLCALLBACK(void) FNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvRx, uint32_t cbRx, void *pvCtx); 265 typedef FNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION *PFNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION; 266 267 static DECLCALLBACK(VOID) vboxMpCrShgsmiTransportSendReadAsyncCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pDdiCmd, PVOID pvContext) 268 { 269 /* we should be called from our DPC routine */ 270 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); 271 272 PVBOXMP_CRSHGSMITRANSPORT pCon = (PVBOXMP_CRSHGSMITRANSPORT)pvContext; 273 PVBOXVDMACBUF_DR pDr = VBOXVDMACBUF_DR_FROM_DDI_CMD(pDdiCmd); 274 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 275 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXMP_CRSHGSMICON_DR_GET_CRCMD(pHdr); 276 const UINT cBuffers = 2; 277 Assert(pBody->cBuffers == cBuffers); 278 PVBOXMP_CRHGSMICMD_READ pWrData = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pHdr, cBuffers, VBOXMP_CRHGSMICMD_READ); 279 CRVBOXHGSMIREAD *pCmd = &pWrData->Cmd; 280 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 281 Assert(pBufCmd->cbBuffer == sizeof (CRVBOXHGSMIREAD)); 282 CRVBOXHGSMIREAD * pWr = (CRVBOXHGSMIREAD*)vboxMpCrShgsmiTransportBufFromOffset(pCon, pBufCmd->offBuffer); 283 PFNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION pfnCompletion = (PFNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION)pBufCmd->u64GuestData; 284 VBOXVDMACMD_CHROMIUM_BUFFER *pRxBuf = &pBody->aBuffers[1]; 285 PVBOXMP_CRSHGSMICON_BUFDR pWbDr = (PVBOXMP_CRSHGSMICON_BUFDR)pRxBuf->u64GuestData; 286 void *pvRx = NULL; 287 uint32_t cbRx = 0; 288 289 int rc = pDr->rc; 290 if (RT_SUCCESS(rc)) 291 { 292 rc = pWr->hdr.result; 293 if (RT_SUCCESS(rc)) 294 { 295 cbRx = pCmd->cbBuffer; 296 if (cbRx) 297 pvRx = pWbDr->pvBuf; 298 } 299 else 300 { 301 WARN(("CRVBOXHGSMIREAD failed, rc %d", rc)); 302 } 303 } 304 else 305 { 306 WARN(("dma command buffer failed rc %d!", rc)); 307 } 308 309 if (pfnCompletion) 310 { 311 void *pvCtx = VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof (VBOXMP_CRHGSMICMD_READ), void); 312 pfnCompletion(pCon, rc, pvRx, cbRx, pvCtx); 313 } 314 315 vboxMpCrShgsmiBufCacheFree(pCon, &pCon->WbDrCache, pWbDr); 316 } 317 318 static void* vboxMpCrShgsmiTransportCmdCreateReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t u32ClientID, PVBOXVDMACBUF_DR pDr, uint32_t cbDrData, PVBOXMP_CRSHGSMICON_BUFDR pWbDr, 319 PFNVBOXMP_CRSHGSMITRANSPORT_SENDREADASYNC_COMPLETION pfnCompletion, uint32_t cbContextData) 320 { 321 const uint32_t cBuffers = 2; 322 const uint32_t cbCmd = VBOXMP_CRSHGSMICON_DR_SIZE(cBuffers, sizeof (VBOXMP_CRHGSMICMD_READ), cbContextData); 323 PVBOXMP_DEVEXT pDevExt = pCon->pDevExt; 324 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 325 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXMP_CRSHGSMICON_DR_GET_CRCMD(pHdr); 326 PVBOXMP_CRHGSMICMD_READ pWrData = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pHdr, cBuffers, VBOXMP_CRHGSMICMD_READ); 327 CRVBOXHGSMIREAD *pCmd = &pWrData->Cmd; 328 329 if (cbCmd > cbContextData) 330 { 331 ERR(("the passed descriptor is less than needed!")); 332 return NULL; 333 } 334 335 memset(pDr, 0, VBOXVDMACBUF_DR_SIZE(cbCmd)); 336 337 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_VRAM_OFFSET; 338 pDr->cbBuf = cbCmd; 339 pDr->rc = VERR_NOT_IMPLEMENTED; 340 pDr->Location.offVramBuf = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd); 341 342 pHdr->enmType = VBOXVDMACMD_TYPE_CHROMIUM_CMD; 343 pHdr->u32CmdSpecific = 0; 344 345 pBody->cBuffers = cBuffers; 346 347 pCmd->hdr.result = VERR_WRONG_ORDER; 348 pCmd->hdr.u32ClientID = u32ClientID; 349 pCmd->hdr.u32Function = SHCRGL_GUEST_FN_WRITE_READ; 350 // pCmd->hdr.u32Reserved = 0; 351 pCmd->iBuffer = 1; 352 353 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 354 pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd); 355 pBufCmd->cbBuffer = sizeof (*pCmd); 356 pBufCmd->u32GuestData = 0; 357 pBufCmd->u64GuestData = (uint64_t)pfnCompletion; 358 359 pBufCmd = &pBody->aBuffers[1]; 360 pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pWbDr->pvBuf); 361 pBufCmd->cbBuffer = pWbDr->cbBuf; 362 pBufCmd->u32GuestData = 0; 363 pBufCmd->u64GuestData = (uint64_t)pWbDr; 364 365 return VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof (VBOXMP_CRHGSMICMD_READ), void); 366 } 367 368 static int vboxMpCrShgsmiTransportCmdSubmitReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext) 369 { 370 VBOXVDMACMD* pHdr = VBOXMP_CRSHGSMICON_DR_GET_FROM_CMDCTX(pvContext, 2, sizeof (VBOXMP_CRHGSMICMD_READ)); 371 return vboxMpCrShgsmiTransportCmdSubmitDmaCmd(pCon, pHdr, vboxMpCrShgsmiTransportSendReadAsyncCompletion); 372 } 373 374 typedef struct VBOXMP_CRHGSMICON_WRR_COMPLETION_CTX 375 { 376 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnCompletion; 377 void *pvContext; 378 379 } VBOXMP_CRHGSMICON_WRR_COMPLETION_CTX, *PVBOXMP_CRHGSMICON_WRR_COMPLETION_CTX; 380 381 static DECLCALLBACK(void) vboxMpCrShgsmiTransportSendWriteReadReadRepostCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvRx, uint32_t cbRx, void *pvCtx) 382 { 383 PVBOXMP_CRHGSMICON_WRR_COMPLETION_CTX pData = (PVBOXMP_CRHGSMICON_WRR_COMPLETION_CTX)pvCtx; 384 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnCompletion = pData->pfnCompletion; 385 if (pfnCompletion) 386 pfnCompletion(pCon, rc, pvRx, cbRx, pData->pvContext); 387 } 388 389 static DECLCALLBACK(VOID) vboxMpCrShgsmiTransportSendWriteReadAsyncCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pDdiCmd, PVOID pvContext) 390 { 391 /* we should be called from our DPC routine */ 392 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); 393 394 PVBOXMP_CRSHGSMITRANSPORT pCon = (PVBOXMP_CRSHGSMITRANSPORT)pvContext; 395 PVBOXVDMACBUF_DR pDr = VBOXVDMACBUF_DR_FROM_DDI_CMD(pDdiCmd); 396 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 397 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXMP_CRSHGSMICON_DR_GET_CRCMD(pHdr); 398 const UINT cBuffers = 3; 399 Assert(pBody->cBuffers == cBuffers); 400 PVBOXMP_CRHGSMICMD_WRITEREAD pWrData = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pHdr, cBuffers, VBOXMP_CRHGSMICMD_WRITEREAD); 401 CRVBOXHGSMIWRITEREAD *pCmd = &pWrData->Cmd; 402 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 403 Assert(pBufCmd->cbBuffer == sizeof (CRVBOXHGSMIWRITEREAD)); 404 CRVBOXHGSMIWRITEREAD * pWr = (CRVBOXHGSMIWRITEREAD*)vboxMpCrShgsmiTransportBufFromOffset(pCon, pBufCmd->offBuffer); 405 VBOXVDMACMD_CHROMIUM_BUFFER *pRxBuf = &pBody->aBuffers[2]; 406 PVBOXMP_CRSHGSMICON_BUFDR pWbDr = (PVBOXMP_CRSHGSMICON_BUFDR)pRxBuf->u64GuestData; 407 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnCompletion = (PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION)pBufCmd->u64GuestData; 408 void *pvRx = NULL; 409 uint32_t cbRx = 0; 410 411 int rc = pDr->rc; 412 if (RT_SUCCESS(rc)) 413 { 414 rc = pWr->hdr.result; 415 if (RT_SUCCESS(rc)) 416 { 417 cbRx = pCmd->cbWriteback; 418 if (cbRx) 419 pvRx = pWbDr->pvBuf; 420 } 421 else if (rc == VERR_BUFFER_OVERFLOW) 422 { 423 /* issue read */ 424 void *pvCtx = VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITEREAD), void); 425 vboxMpCrShgsmiBufCacheFree(pCon, &pCon->WbDrCache, pWbDr); 426 pWbDr = vboxMpCrShgsmiBufCacheAlloc(pCon, &pCon->WbDrCache, pCmd->cbWriteback); 427 if (pWbDr) 191 428 { 192 pCon->pDevExt = pDevExt; 193 pCon->pCtlCon = pCrCtlCon; 194 return VINF_SUCCESS; 429 /* the Read Command is shorter than WriteRead, so just reuse the Write-Read descriptor here */ 430 PVBOXMP_CRHGSMICON_WRR_COMPLETION_CTX pReadCtx = (PVBOXMP_CRHGSMICON_WRR_COMPLETION_CTX)vboxMpCrShgsmiTransportCmdCreateReadAsync(pCon, pCmd->hdr.u32ClientID, 431 pDr, VBOXMP_CRSHGSMICON_DR_SIZE(cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITEREAD), 0), 432 pWbDr, vboxMpCrShgsmiTransportSendWriteReadReadRepostCompletion, sizeof (*pReadCtx)); 433 pReadCtx->pfnCompletion = pfnCompletion; 434 pReadCtx->pvContext = pvCtx; 435 vboxMpCrShgsmiTransportCmdSubmitReadAsync(pCon, pReadCtx); 436 /* don't do completion here, the completion will be called from the read completion we issue here */ 437 pfnCompletion = NULL; 438 /* the current pWbDr was already freed, and we'll free the Read dr in the Read Completion */ 439 pWbDr = NULL; 195 440 } 196 441 else 197 442 { 198 WARN(("VBoxMpCrCtlConConnect failed rc %d", rc)); 443 WARN(("vboxMpCrShgsmiBufCacheAlloc failed for %d", pCmd->cbWriteback)); 444 rc = VERR_NO_MEMORY; 199 445 } 200 vboxMpCrShgsmiBufCacheTerm(pCon, &pCon->WbDrCache);201 446 } 202 447 else 203 448 { 204 WARN(("vboxMpCrShgsmiBufCacheInit2 failed rc %d", rc)); 205 } 206 vboxMpCrShgsmiBufCacheTerm(pCon, &pCon->CmdDrCache); 449 WARN(("CRVBOXHGSMIWRITEREAD failed, rc %d", rc)); 450 } 207 451 } 208 452 else 209 453 { 210 WARN(("vboxMpCrShgsmiBufCacheInit1 failed rc %d", rc)); 211 } 212 213 return rc; 214 } 215 216 static int vboxMpCrShgsmiConDisconnect(PVBOXMP_CRSHGSMICON pCon) 217 { 218 int rc = VBoxMpCrCtlConDisconnect(pCon->pCtlCon, pCon->u32ClientID); 219 if (RT_FAILURE(rc)) 220 { 221 WARN(("VBoxMpCrCtlConDisconnect failed rc %d", rc)); 222 return rc; 223 } 224 225 vboxMpCrShgsmiBufCacheTerm(pCon, &pCon->WbDrCache); 226 vboxMpCrShgsmiBufCacheTerm(pCon, &pCon->CmdDrCache); 227 228 return VINF_SUCCESS; 229 } 230 231 typedef DECLCALLBACK(void) FNVBOXMP_CRSHGSMICON_SEND_COMPLETION(PVBOXMP_CRSHGSMICON pCon, void *pvRx, uint32_t cbRx, void *pvCtx); 232 typedef FNVBOXMP_CRSHGSMICON_SEND_COMPLETION *PFNVBOXMP_CRSHGSMICON_SEND_COMPLETION; 233 234 typedef struct VBOXMP_CRSHGSMICON_SEND_COMPLETION 235 { 236 PVBOXMP_CRSHGSMICON pCon; 237 PFNVBOXMP_CRSHGSMICON_SEND_COMPLETION pvnCompletion; 238 void *pvCompletion; 239 } VBOXMP_CRSHGSMICON_SEND_COMPLETION, *PVBOXMP_CRSHGSMICON_SEND_COMPLETION; 240 241 static DECLCALLBACK(VOID) vboxMpCrShgsmiConSendAsyncCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext) 454 WARN(("dma command buffer failed rc %d!", rc)); 455 } 456 457 if (pfnCompletion) 458 { 459 void *pvCtx = VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITEREAD), void); 460 pfnCompletion(pCon, rc, pvRx, cbRx, pvCtx); 461 } 462 463 if (pWbDr) 464 vboxMpCrShgsmiBufCacheFree(pCon, &pCon->WbDrCache, pWbDr); 465 } 466 467 static DECLCALLBACK(VOID) vboxMpCrShgsmiTransportSendWriteAsyncCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pDdiCmd, PVOID pvContext) 242 468 { 243 469 /* we should be called from our DPC routine */ 244 470 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); 245 471 246 PVBOXMP_CRSHGSMI CON_SEND_COMPLETION pData = (PVBOXMP_CRSHGSMICON_SEND_COMPLETION)pvContext;247 PVBOXVDMACBUF_DR pDr = VBOXVDMACBUF_DR_FROM_DDI_CMD(p Cmd);472 PVBOXMP_CRSHGSMITRANSPORT pCon = (PVBOXMP_CRSHGSMITRANSPORT)pvContext; 473 PVBOXVDMACBUF_DR pDr = VBOXVDMACBUF_DR_FROM_DDI_CMD(pDdiCmd); 248 474 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 249 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHROMIUM_CMD); 250 UINT cBufs = pBody->cBuffers; 251 /* the first one is a command buffer: obtain it and get the result */ 252 253 /* if write back buffer is too small, issue read command. 254 * we can use exactly the same command buffer for it */ 255 /* impl */ 256 Assert(0); 257 } 258 259 static int vboxMpCrShgsmiConSendAsync(PVBOXMP_CRSHGSMICON pCon, void *pvTx, uint32_t cbTx, PFNVBOXMP_CRSHGSMICON_SEND_COMPLETION pfnCompletion, void *pvCompletion) 475 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXMP_CRSHGSMICON_DR_GET_CRCMD(pHdr); 476 const UINT cBuffers = 2; 477 Assert(pBody->cBuffers == cBuffers); 478 PVBOXMP_CRHGSMICMD_WRITE pWrData = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pHdr, cBuffers, VBOXMP_CRHGSMICMD_WRITE); 479 CRVBOXHGSMIWRITE *pCmd = &pWrData->Cmd; 480 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 481 Assert(pBufCmd->cbBuffer == sizeof (CRVBOXHGSMIWRITE)); 482 CRVBOXHGSMIWRITE * pWr = (CRVBOXHGSMIWRITE*)vboxMpCrShgsmiTransportBufFromOffset(pCon, pBufCmd->offBuffer); 483 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION pfnCompletion = (PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION)pBufCmd->u64GuestData; 484 485 int rc = pDr->rc; 486 if (RT_SUCCESS(rc)) 487 { 488 rc = pWr->hdr.result; 489 if (!RT_SUCCESS(rc)) 490 { 491 WARN(("CRVBOXHGSMIWRITE failed, rc %d", rc)); 492 } 493 } 494 else 495 { 496 WARN(("dma command buffer failed rc %d!", rc)); 497 } 498 499 if (pfnCompletion) 500 { 501 void *pvCtx = VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITE), void); 502 pfnCompletion(pCon, rc, pvCtx); 503 } 504 } 505 506 void* VBoxMpCrShgsmiTransportCmdCreateWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t u32ClientID, void *pvBuffer, uint32_t cbBuffer, 507 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnCompletion, uint32_t cbContextData) 260 508 { 261 509 const uint32_t cBuffers = 3; 262 const uint32_t cbCmd = VBOXMP_CRSHGSMICON_DR_SIZE(cBuffers, sizeof (CRVBOXHGSMIWRITEREAD)); 263 PVBOXMP_CRSHGSMICON_BUFDR pCmdDr = vboxMpCrShgsmiBufCacheAlloc(pCon, &pCon->CmdDrCache, cbCmd); 264 if (!pCmdDr) 265 { 266 WARN(("vboxMpCrShgsmiBufCacheAlloc for cmd dr failed")); 267 return VERR_NO_MEMORY; 268 } 510 const uint32_t cbCmd = VBOXMP_CRSHGSMICON_DR_SIZE(cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITEREAD), cbContextData); 511 PVBOXMP_DEVEXT pDevExt = pCon->pDevExt; 512 PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate(&pDevExt->u.primary.Vdma, cbCmd); 513 if (!pDr) 514 { 515 WARN(("vboxVdmaCBufDrCreate failed")); 516 return NULL; 517 } 518 269 519 PVBOXMP_CRSHGSMICON_BUFDR pWbDr = vboxMpCrShgsmiBufCacheAllocAny(pCon, &pCon->WbDrCache, 1000); 270 520 if (!pWbDr) 271 521 { 272 522 WARN(("vboxMpCrShgsmiBufCacheAlloc for wb dr failed")); 273 vboxMpCrShgsmiBufCacheFree(pCon, &pCon->CmdDrCache, pCmdDr); 274 return VERR_NO_MEMORY; 275 } 276 277 PVBOXVDMACBUF_DR pDr = (PVBOXVDMACBUF_DR)pCmdDr->pvBuf; 278 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR; 523 vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDr); 524 return NULL; 525 } 526 527 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 528 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXMP_CRSHGSMICON_DR_GET_CRCMD(pHdr); 529 PVBOXMP_CRHGSMICMD_WRITEREAD pWrData = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pHdr, cBuffers, VBOXMP_CRHGSMICMD_WRITEREAD); 530 CRVBOXHGSMIWRITEREAD *pCmd = &pWrData->Cmd; 531 532 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_VRAM_OFFSET; 279 533 pDr->cbBuf = cbCmd; 280 534 pDr->rc = VERR_NOT_IMPLEMENTED; 281 282 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 535 pDr->Location.offVramBuf = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd); 536 283 537 pHdr->enmType = VBOXVDMACMD_TYPE_CHROMIUM_CMD; 284 538 pHdr->u32CmdSpecific = 0; 285 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXVDMACMD_BODY(pHdr, VBOXVDMACMD_CHROMIUM_CMD); 539 286 540 pBody->cBuffers = cBuffers; 287 CRVBOXHGSMIWRITEREAD *pCmd = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pDr, cBuffers, CRVBOXHGSMIWRITEREAD); 541 288 542 pCmd->hdr.result = VERR_WRONG_ORDER; 289 pCmd->hdr.u32ClientID = pCon->u32ClientID;543 pCmd->hdr.u32ClientID = u32ClientID; 290 544 pCmd->hdr.u32Function = SHCRGL_GUEST_FN_WRITE_READ; 291 545 // pCmd->hdr.u32Reserved = 0; … … 295 549 296 550 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 297 pBufCmd->offBuffer = vboxMpCrShgsmi ConBufOffset(pCon, pCmd);551 pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd); 298 552 pBufCmd->cbBuffer = sizeof (*pCmd); 299 553 pBufCmd->u32GuestData = 0; 300 pBufCmd->u64GuestData = (uint64_t)p CmdDr;554 pBufCmd->u64GuestData = (uint64_t)pfnCompletion; 301 555 302 556 pBufCmd = &pBody->aBuffers[1]; 303 pBufCmd->offBuffer = vboxMpCrShgsmi ConBufOffset(pCon, pvTx);304 pBufCmd->cbBuffer = cb Tx;557 pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pvBuffer); 558 pBufCmd->cbBuffer = cbBuffer; 305 559 pBufCmd->u32GuestData = 0; 306 560 pBufCmd->u64GuestData = 0; 307 561 308 562 pBufCmd = &pBody->aBuffers[2]; 309 pBufCmd->offBuffer = vboxMpCrShgsmi ConBufOffset(pCon, pWbDr->pvBuf);563 pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pWbDr->pvBuf); 310 564 pBufCmd->cbBuffer = pWbDr->cbBuf; 311 565 pBufCmd->u32GuestData = 0; 312 566 pBufCmd->u64GuestData = (uint64_t)pWbDr; 313 567 568 return VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITEREAD), void); 569 } 570 571 void* VBoxMpCrShgsmiTransportCmdCreateWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t u32ClientID, void *pvBuffer, uint32_t cbBuffer, 572 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION pfnCompletion, uint32_t cbContextData) 573 { 574 575 const uint32_t cBuffers = 2; 576 const uint32_t cbCmd = VBOXMP_CRSHGSMICON_DR_SIZE(cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITE), cbContextData); 314 577 PVBOXMP_DEVEXT pDevExt = pCon->pDevExt; 315 PVBOXVDMADDI_CMD pDdiCmd = VBOXVDMADDI_CMD_FROM_BUF_DR(pDr); 316 vboxVdmaDdiCmdInit(pDdiCmd, 0, 0, vboxMpCrShgsmiConSendAsyncCompletion, pDr); 317 /* mark command as submitted & invisible for the dx runtime since dx did not originate it */ 318 vboxVdmaDdiCmdSubmittedNotDx(pDdiCmd); 319 int rc = vboxVdmaCBufDrSubmit(pDevExt, &pDevExt->u.primary.Vdma, pDr); 320 if (RT_SUCCESS(rc)) 321 { 322 return STATUS_SUCCESS; 323 } 324 325 /* impl failure branch */ 326 Assert(0); 327 return rc; 328 } 329 330 static CRMessageOpcodes * 331 vboxMpCrPackerPrependHeader( CRPackBuffer *buf, unsigned int *len, unsigned int senderID ) 332 { 333 UINT num_opcodes; 334 CRMessageOpcodes *hdr; 335 336 Assert(buf); 337 Assert(buf->opcode_current < buf->opcode_start); 338 Assert(buf->opcode_current >= buf->opcode_end); 339 Assert(buf->data_current > buf->data_start); 340 Assert(buf->data_current <= buf->data_end); 341 342 num_opcodes = (UINT)(buf->opcode_start - buf->opcode_current); 343 hdr = (CRMessageOpcodes *) 344 ( buf->data_start - ( ( num_opcodes + 3 ) & ~0x3 ) - sizeof(*hdr) ); 345 346 Assert((void *) hdr >= buf->pack); 347 348 hdr->header.type = CR_MESSAGE_OPCODES; 349 hdr->numOpcodes = num_opcodes; 350 351 *len = (UINT)(buf->data_current - (unsigned char *) hdr); 352 353 return hdr; 354 } 355 356 static void vboxMpCrShgsmiPackerCbFlush(void *pvFlush) 357 { 358 PVBOXMP_CRSHGSMIPACKER pPacker = (PVBOXMP_CRSHGSMIPACKER)pvFlush; 359 360 crPackReleaseBuffer(&pPacker->CrPacker); 361 362 if (pPacker->CrBuffer.opcode_current != pPacker->CrBuffer.opcode_start) 363 { 364 CRMessageOpcodes *pHdr; 365 unsigned int len; 366 pHdr = vboxMpCrPackerPrependHeader(&pPacker->CrBuffer, &len, 0); 367 368 /*Send*/ 369 } 370 371 372 crPackSetBuffer(&pPacker->CrPacker, &pPacker->CrBuffer); 373 crPackResetPointers(&pPacker->CrPacker); 374 } 375 376 int vboxMpCrShgsmiPackerInit(PVBOXMP_CRSHGSMIPACKER pPacker, PVBOXMP_CRSHGSMICON pCon) 377 { 378 memset(pPacker, 0, sizeof (*pPacker)); 379 380 static const HGSMISIZE cbBuffer = 1000; 381 void *pvBuffer = vboxMpCrShgsmiConAlloc(pCon, cbBuffer); 382 if (!pvBuffer) 383 { 384 WARN(("vboxMpCrShgsmiConAlloc failed")); 385 return VERR_NO_MEMORY; 386 } 387 pPacker->pCon = pCon; 388 crPackInitBuffer(&pPacker->CrBuffer, pvBuffer, cbBuffer, cbBuffer); 389 crPackSetBuffer(&pPacker->CrPacker, &pPacker->CrBuffer); 390 crPackFlushFunc(&pPacker->CrPacker, vboxMpCrShgsmiPackerCbFlush); 391 crPackFlushArg(&pPacker->CrPacker, pPacker); 392 // crPackSendHugeFunc( thread->packer, packspuHuge ); 393 return VINF_SUCCESS; 394 } 578 PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate(&pDevExt->u.primary.Vdma, cbCmd); 579 if (!pDr) 580 { 581 WARN(("vboxVdmaCBufDrCreate failed")); 582 return NULL; 583 } 584 585 PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD); 586 VBOXVDMACMD_CHROMIUM_CMD *pBody = VBOXMP_CRSHGSMICON_DR_GET_CRCMD(pHdr); 587 PVBOXMP_CRHGSMICMD_WRITE pWrData = VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(pHdr, cBuffers, VBOXMP_CRHGSMICMD_WRITE); 588 CRVBOXHGSMIWRITE *pCmd = &pWrData->Cmd; 589 590 pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_VRAM_OFFSET; 591 pDr->cbBuf = cbCmd; 592 pDr->rc = VERR_NOT_IMPLEMENTED; 593 pDr->Location.offVramBuf = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd); 594 595 pHdr->enmType = VBOXVDMACMD_TYPE_CHROMIUM_CMD; 596 pHdr->u32CmdSpecific = 0; 597 598 pBody->cBuffers = cBuffers; 599 600 pCmd->hdr.result = VERR_WRONG_ORDER; 601 pCmd->hdr.u32ClientID = u32ClientID; 602 pCmd->hdr.u32Function = SHCRGL_GUEST_FN_WRITE_READ; 603 // pCmd->hdr.u32Reserved = 0; 604 pCmd->iBuffer = 1; 605 606 VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0]; 607 pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd); 608 pBufCmd->cbBuffer = sizeof (*pCmd); 609 pBufCmd->u32GuestData = 0; 610 pBufCmd->u64GuestData = (uint64_t)pfnCompletion; 611 612 pBufCmd = &pBody->aBuffers[1]; 613 pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pvBuffer); 614 pBufCmd->cbBuffer = cbBuffer; 615 pBufCmd->u32GuestData = 0; 616 pBufCmd->u64GuestData = 0; 617 618 return VBOXMP_CRSHGSMICON_DR_GET_CMDCTX(pHdr, cBuffers, sizeof (VBOXMP_CRHGSMICMD_WRITE), void); 619 } 620 621 int VBoxMpCrShgsmiTransportCmdSubmitWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext) 622 { 623 VBOXVDMACMD* pHdr = VBOXMP_CRSHGSMICON_DR_GET_FROM_CMDCTX(pvContext, 3, sizeof (VBOXMP_CRHGSMICMD_WRITEREAD)); 624 return vboxMpCrShgsmiTransportCmdSubmitDmaCmd(pCon, pHdr, vboxMpCrShgsmiTransportSendWriteReadAsyncCompletion); 625 } 626 627 int VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext) 628 { 629 VBOXVDMACMD* pHdr = VBOXMP_CRSHGSMICON_DR_GET_FROM_CMDCTX(pvContext, 2, sizeof (VBOXMP_CRHGSMICMD_WRITE)); 630 return vboxMpCrShgsmiTransportCmdSubmitDmaCmd(pCon, pHdr, vboxMpCrShgsmiTransportSendWriteAsyncCompletion); 631 } 632 633 void VBoxMpCrShgsmiTransportCmdTermWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext) 634 { 635 VBOXVDMACMD* pHdr = VBOXMP_CRSHGSMICON_DR_GET_FROM_CMDCTX(pvContext, 3, sizeof (VBOXMP_CRHGSMICMD_WRITEREAD)); 636 vboxMpCrShgsmiTransportCmdTermDmaCmd(pCon, pHdr); 637 } 638 639 void VBoxMpCrShgsmiTransportCmdTermWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext) 640 { 641 VBOXVDMACMD* pHdr = VBOXMP_CRSHGSMICON_DR_GET_FROM_CMDCTX(pvContext, 2, sizeof (VBOXMP_CRHGSMICMD_WRITE)); 642 vboxMpCrShgsmiTransportCmdTermDmaCmd(pCon, pHdr); 643 } 644 395 645 # endif 396 646 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.h
r40897 r43489 37 37 int VBoxMpCrCtlConCallUserData(PVBOXMP_CRCTLCON pCrCtlCon, struct VBoxGuestHGCMCallInfo *pData, uint32_t cbData); 38 38 39 #ifdef VBOX_WDDM_WITH_CRCMD 40 # include <cr_pack.h> 41 42 typedef struct VBOXMP_CRDATACON 43 { 44 PVBOXMP_CRCTLCON pCtl; 45 uint32_t u32ClientID; 46 } VBOXMP_CRDATACON, *PVBOXMP_CRDATACON; 47 48 DECLINLINE(int) VBoxMpCrDataConCreate(PVBOXMP_CRDATACON pDataCon, PVBOXMP_CRCTLCON pCtlCon) 49 { 50 int rc = VBoxMpCrCtlConConnect(pCtlCon, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, &pDataCon->u32ClientID); 51 if (RT_SUCCESS(rc)) 52 { 53 Assert(pDataCon->u32ClientID); 54 pDataCon->pCtl = pCtlCon; 55 return VINF_SUCCESS; 56 } 57 WARN(("VBoxMpCrCtlConConnect failed, rc %d", rc)); 58 return rc; 59 } 60 61 DECLINLINE(int) VBoxMpCrDataConDestroy(PVBOXMP_CRDATACON pDataCon) 62 { 63 int rc = VBoxMpCrCtlConDisconnect(pDataCon->pCtl, pDataCon->u32ClientID); 64 if (RT_SUCCESS(rc)) 65 { 66 /* sanity */ 67 pDataCon->pCtl = NULL; 68 pDataCon->u32ClientID = 0; 69 return VINF_SUCCESS; 70 } 71 WARN(("VBoxMpCrCtlConDisconnect failed, rc %d", rc)); 72 return rc; 73 } 74 75 typedef struct VBOXMP_CRSHGSMICON_BUFDR 76 { 77 uint32_t cbBuf; 78 void *pvBuf; 79 } VBOXMP_CRSHGSMICON_BUFDR, *PVBOXMP_CRSHGSMICON_BUFDR; 80 81 typedef struct VBOXMP_CRSHGSMICON_BUFDR_CACHE 82 { 83 volatile PVBOXMP_CRSHGSMICON_BUFDR pBufDr; 84 } VBOXMP_CRSHGSMICON_BUFDR_CACHE, *PVBOXMP_CRSHGSMICON_BUFDR_CACHE; 85 86 typedef struct VBOXMP_CRSHGSMITRANSPORT 87 { 88 PVBOXMP_DEVEXT pDevExt; 89 VBOXMP_CRSHGSMICON_BUFDR_CACHE WbDrCache; 90 } VBOXMP_CRSHGSMITRANSPORT, *PVBOXMP_CRSHGSMITRANSPORT; 91 92 /** the rx buffer passed here is only valid in the context of the callback. 93 * the callee must NOT free it or use outside of the callback context. 94 * */ 95 typedef DECLCALLBACK(void) FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvRx, uint32_t cbRx, void *pvCtx); 96 typedef FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION *PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION; 97 98 typedef DECLCALLBACK(void) FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx); 99 typedef FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION *PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION; 100 101 int VBoxMpCrShgsmiTransportCreate(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_DEVEXT pDevExt); 102 void VBoxMpCrShgsmiTransportTerm(PVBOXMP_CRSHGSMITRANSPORT pCon); 103 void* VBoxMpCrShgsmiTransportCmdCreateWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t u32ClientID, void *pvBuffer, uint32_t cbBuffer, 104 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnCompletion, uint32_t cbContextData); 105 void* VBoxMpCrShgsmiTransportCmdCreateWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t u32ClientID, void *pvBuffer, uint32_t cbBuffer, 106 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION pfnCompletion, uint32_t cbContextData); 107 int VBoxMpCrShgsmiTransportCmdSubmitWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext); 108 int VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext); 109 void VBoxMpCrShgsmiTransportCmdTermWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext); 110 void VBoxMpCrShgsmiTransportCmdTermWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext); 111 112 void* VBoxMpCrShgsmiTransportBufAlloc(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t cbBuffer); 113 void VBoxMpCrShgsmiTransportBufFree(PVBOXMP_CRSHGSMITRANSPORT pCon, void* pvBuffer); 114 115 typedef struct VBOXMP_CRPACKER 116 { 117 CRPackContext CrPacker; 118 CRPackBuffer CrBuffer; 119 } VBOXMP_CRPACKER, *PVBOXMP_CRPACKER; 120 121 DECLINLINE(void) VBoxMpCrPackerInit(PVBOXMP_CRPACKER pPacker) 122 { 123 memset(pPacker, 0, sizeof (*pPacker)); 124 } 125 126 DECLINLINE(void) VBoxMpCrPackerTerm(PVBOXMP_CRPACKER pPacker) 127 {} 128 129 DECLINLINE(void) VBoxMpCrPackerTxBufferInit(PVBOXMP_CRPACKER pPacker, void *pvBuffer, uint32_t cbBuffer, uint32_t cCommands) 130 { 131 crPackInitBuffer(&pPacker->CrBuffer, pvBuffer, cbBuffer, cbBuffer, cCommands); 132 crPackSetBuffer(&pPacker->CrPacker, &pPacker->CrBuffer); 133 } 134 135 DECLINLINE(CRMessageOpcodes*) vboxMpCrPackerPrependHeader( const CRPackBuffer *pBuffer, uint32_t *cbData, void **ppvPackBuffer) 136 { 137 UINT num_opcodes; 138 CRMessageOpcodes *hdr; 139 140 Assert(pBuffer); 141 Assert(pBuffer->opcode_current < pBuffer->opcode_start); 142 Assert(pBuffer->opcode_current >= pBuffer->opcode_end); 143 Assert(pBuffer->data_current > pBuffer->data_start); 144 Assert(pBuffer->data_current <= pBuffer->data_end); 145 146 num_opcodes = (UINT)(pBuffer->opcode_start - pBuffer->opcode_current); 147 hdr = (CRMessageOpcodes *) 148 ( pBuffer->data_start - ( ( num_opcodes + 3 ) & ~0x3 ) - sizeof(*hdr) ); 149 150 Assert((void *) hdr >= pBuffer->pack); 151 152 hdr->header.type = CR_MESSAGE_OPCODES; 153 hdr->numOpcodes = num_opcodes; 154 155 *cbData = (UINT)(pBuffer->data_current - (unsigned char *) hdr); 156 *ppvPackBuffer = pBuffer->pack; 157 158 return hdr; 159 } 160 161 DECLINLINE(void*) VBoxMpCrPackerTxBufferComplete(PVBOXMP_CRPACKER pPacker, uint32_t *pcbBuffer, void **ppvPackBuffer) 162 { 163 crPackReleaseBuffer(&pPacker->CrPacker); 164 uint32_t cbData; 165 CRMessageOpcodes *pHdr; 166 void *pvPackBuffer; 167 if (pPacker->CrBuffer.opcode_current != pPacker->CrBuffer.opcode_start) 168 pHdr = vboxMpCrPackerPrependHeader(&pPacker->CrBuffer, &cbData, &pvPackBuffer); 169 else 170 { 171 cbData = 0; 172 pHdr = NULL; 173 pvPackBuffer = NULL; 174 } 175 *pcbBuffer = cbData; 176 *ppvPackBuffer = pvPackBuffer; 177 return pHdr; 178 } 179 180 DECLINLINE(uint32_t) VBoxMpCrPackerTxBufferGetFreeBufferSize(PVBOXMP_CRPACKER pPacker) 181 { 182 return (uint32_t)(pPacker->CrBuffer.data_end - pPacker->CrBuffer.data_start); 183 } 184 185 DECLINLINE(void) vboxMpCrUnpackerRxWriteback(CRMessageWriteback *pWb) 186 { 187 int *pWriteback; 188 memcpy(&pWriteback, &(pWb->writeback_ptr), sizeof (pWriteback)); 189 (*pWriteback)--; 190 } 191 192 DECLINLINE(void) vboxMpCrUnpackerRxReadback(CRMessageReadback *pRb, uint32_t cbRx) 193 { 194 int cbPayload = cbRx - sizeof (*pRb); 195 int *pWriteback; 196 void *pDst; 197 memcpy(&pWriteback, &(pRb->writeback_ptr), sizeof (pWriteback)); 198 memcpy(&pDst, &(pRb->readback_ptr), sizeof (pDst)); 199 200 (*pWriteback)--; 201 memcpy(pDst, ((uint8_t*)pRb) + sizeof (*pRb), cbPayload); 202 } 203 204 DECLINLINE(int) VBoxMpCrUnpackerRxBufferProcess(void *pvBuffer, uint32_t cbBuffer) 205 { 206 CRMessage *pMsg = (CRMessage*)pvBuffer; 207 switch (pMsg->header.type) 208 { 209 case CR_MESSAGE_WRITEBACK: 210 vboxMpCrUnpackerRxWriteback(&(pMsg->writeback)); 211 return VINF_SUCCESS; 212 case CR_MESSAGE_READBACK: 213 vboxMpCrUnpackerRxReadback(&(pMsg->readback), cbBuffer); 214 return VINF_SUCCESS; 215 default: 216 WARN(("unknown msg code %d", pMsg->header.type)); 217 return VERR_NOT_SUPPORTED; 218 } 219 } 220 221 #define VBOXMP_CRCMD_SIZE_WINDOWPOSITION 20 222 #define VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(_cRects) (16 + _cRects * 4 * sizeof(GLint)) 223 224 #endif 39 225 #endif /* #ifndef ___VBoxMPCr_h__ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
r43341 r43489 313 313 vboxWddmSwapchainAllocRemoveAllInternal(pDevExt, pSwapchain, TRUE); 314 314 315 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 315 316 Assert(pSwapchain->pContext); 316 317 if (pSwapchain->pContext) … … 322 323 } 323 324 } 325 #endif 324 326 325 327 vboxWddmSwapchainRelease(pSwapchain); … … 357 359 { 358 360 BOOLEAN bRc; 359 ExAcquireFastMutex(&pDevExt->ContextMutex); 361 VBOXWDDM_CTXLOCK_DATA 362 VBOXWDDM_CTXLOCK_LOCK(pDevExt); 360 363 bRc = vboxWddmSwapchainCtxAddLocked(pDevExt, pContext, pSwapchain); 361 ExReleaseFastMutex(&pDevExt->ContextMutex);364 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 362 365 return bRc; 363 366 } … … 367 370 VOID vboxWddmSwapchainCtxRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_SWAPCHAIN pSwapchain) 368 371 { 369 ExAcquireFastMutex(&pDevExt->ContextMutex); 372 VBOXWDDM_CTXLOCK_DATA 373 VBOXWDDM_CTXLOCK_LOCK(pDevExt); 370 374 vboxWddmSwapchainCtxRemoveLocked(pDevExt, pContext, pSwapchain); 371 ExReleaseFastMutex(&pDevExt->ContextMutex);375 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 372 376 } 373 377 … … 377 381 { 378 382 VBOXWDDM_HTABLE_ITERATOR Iter; 383 VBOXWDDM_CTXLOCK_DATA 379 384 do 380 385 { 381 ExAcquireFastMutex(&pDevExt->ContextMutex);386 VBOXWDDM_CTXLOCK_LOCK(pDevExt); 382 387 vboxWddmHTableIterInit(&pContext->Swapchains, &Iter); 383 388 PVBOXWDDM_SWAPCHAIN pSwapchain = (PVBOXWDDM_SWAPCHAIN)vboxWddmHTableIterNext(&Iter, NULL); … … 388 393 vboxWddmSwapchainCtxRemoveLocked(pDevExt, pContext, pSwapchain); 389 394 390 ExReleaseFastMutex(&pDevExt->ContextMutex);395 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 391 396 /* we must not do vboxWddmSwapchainDestroy inside a context mutex */ 392 397 vboxWddmSwapchainDestroy(pDevExt, pSwapchain); … … 395 400 396 401 /* no swapchains left, we exiteed the while loop via the "break", and we still owning the mutex */ 397 ExReleaseFastMutex(&pDevExt->ContextMutex);402 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 398 403 } 399 404 … … 412 417 Assert(KeGetCurrentIrql() == PASSIVE_LEVEL); 413 418 NTSTATUS Status = STATUS_SUCCESS; 419 VBOXWDDM_CTXLOCK_DATA 414 420 415 421 do { … … 453 459 if (pSwapchainInfo->SwapchainInfo.hSwapchainKm) 454 460 { 455 ExAcquireFastMutex(&pDevExt->ContextMutex);461 VBOXWDDM_CTXLOCK_LOCK(pDevExt); 456 462 pSwapchain = (PVBOXWDDM_SWAPCHAIN)vboxWddmHTableGet(&pContext->Swapchains, (VBOXWDDM_HANDLE)pSwapchainInfo->SwapchainInfo.hSwapchainKm); 457 463 Assert(pSwapchain); 458 464 if (!pSwapchain) 459 465 { 460 ExReleaseFastMutex(&pDevExt->ContextMutex);466 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 461 467 Status = STATUS_INVALID_PARAMETER; 462 468 break; … … 466 472 if (pSwapchain->pContext != pContext) 467 473 { 468 ExReleaseFastMutex(&pDevExt->ContextMutex);474 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 469 475 Status = STATUS_INVALID_PARAMETER; 470 476 break; … … 480 486 } 481 487 482 ExAcquireFastMutex(&pDevExt->ContextMutex);488 VBOXWDDM_CTXLOCK_LOCK(pDevExt); 483 489 BOOLEAN bRc = vboxWddmSwapchainCtxAddLocked(pDevExt, pContext, pSwapchain); 484 490 Assert(bRc); … … 510 516 } 511 517 512 ExReleaseFastMutex(&pDevExt->ContextMutex);518 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 513 519 514 520 if (pSwapchainInfo->SwapchainInfo.cAllocs) … … 1241 1247 UINT cbCmd = VBOXVDMACMD_SIZE_FROMBODYSIZE(RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CMD, aBuffers[cBuffers])); 1242 1248 1243 PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate 1249 PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate(&pDevExt->u.primary.Vdma, cbCmd); 1244 1250 if (pDr) 1245 1251 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r42081 r43489 236 236 BOOLEAN fRenderFromShadowDisabled; 237 237 uint32_t u32CrConClientID; 238 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 239 VBOXMP_CRPACKER CrPacker; 240 #endif 238 241 VBOXWDDM_HTABLE Swapchains; 239 242 VBOXVIDEOCM_CTX CmContext; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
r42158 r43489 383 383 * @param pDevExt 384 384 */ 385 static NTSTATUS vboxVdmaGgDirtyRectsProcess(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_SWAPCHAIN pSwapchain, RECT *pSrcRect, VBOXVDMAPIPE_RECTS *pContextRects) 385 static NTSTATUS vboxVdmaGgDirtyRectsProcess(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_SWAPCHAIN pSwapchain, RECT *pSrcRect, VBOXVDMAPIPE_RECTS *pContextRects 386 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 387 , PVBOXMP_CRPACKER pPacker 388 #endif 389 ) 386 390 { 387 391 PVBOXWDDM_RECTS_INFO pRects = &pContextRects->UpdateRects; 388 392 NTSTATUS Status = STATUS_SUCCESS; 393 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 389 394 PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = NULL; 395 #else 396 void *pvCommandBuffer = NULL; 397 #endif 390 398 uint32_t cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects); 391 399 BOOLEAN fCurChanged = FALSE, fCurRectChanged = FALSE; 392 400 POINT CurPos; 393 401 Assert(KeGetCurrentIrql() < DISPATCH_LEVEL); 394 395 ExAcquireFastMutex(&pDevExt->ContextMutex); 402 VBOXWDDM_CTXLOCK_DATA 403 404 VBOXWDDM_CTXLOCK_LOCK(pDevExt); 396 405 397 406 if (pSwapchain) … … 426 435 } 427 436 437 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 428 438 /* before posting the add visible rects diff, we need to first hide rects for other windows */ 429 439 … … 470 480 } 471 481 } 472 482 #endif 473 483 if (!pSwapchain) 474 484 goto done; … … 476 486 RECT *pVisRects; 477 487 488 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 489 uint32_t cbCommandBuffer = 0, cCommands = 0; 490 ++cCommand; 491 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(pRects->cRects); 492 #endif 478 493 if (fCurRectChanged && fCurChanged) 479 494 { 495 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 496 ++cCommand; 497 cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWPOSITION; 498 499 pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommand); 500 if (!pvCommandBuffer) 501 { 502 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!")); 503 Status = STATUS_NO_MEMORY; 504 goto done; 505 } 506 VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands); 507 crPackWindowPosition(&pPacker->CrPacker, window, CurPos.x, CurPos.y); 508 #else 480 509 cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects + 1); 481 510 if (pCmdInternal) … … 491 520 pCmdInternal->Cmd.RectsInfo.aRects[0].bottom = CurPos.y + pSwapchain->height; 492 521 pVisRects = &pCmdInternal->Cmd.RectsInfo.aRects[1]; 493 } 522 #endif 523 } 524 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 494 525 else 495 526 { … … 523 554 vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pCmdInternal->Cmd.RectsInfo.cRects)); 524 555 pCmdInternal = NULL; 556 #else 557 if (!pvCommandBuffer) 558 { 559 pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommand); 560 if (!pvCommandBuffer) 561 { 562 WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!")); 563 Status = STATUS_NO_MEMORY; 564 goto done; 565 } 566 VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands); 567 } 568 crPackWindowVisibleRegion(&pPacker->CrPacker, window, pRects->cRects, (GLint*)pRects->aRects); 569 #endif 525 570 526 571 done: 527 ExReleaseFastMutex(&pDevExt->ContextMutex); 528 572 VBOXWDDM_CTXLOCK_UNLOCK(pDevExt); 573 574 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 529 575 if (pCmdInternal) 530 576 vboxVideoCmCmdRelease(pCmdInternal); 531 577 #endif 532 578 return Status; 533 579 } … … 747 793 } 748 794 749 static NTSTATUS vboxVdmaGgDmaCmdProcessFast(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd) 795 static NTSTATUS vboxVdmaGgDmaCmdProcessFast(PVBOXMP_DEVEXT pDevExt 796 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 797 , VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd 798 #else 799 , PVBOXWDDM_CONTEXT pContext 800 , PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR *pDmaCmd 801 , VBOXVDMAPIPE_FLAGS_DMACMD fFlags 802 , uint32_t u32FenceId 803 #endif 804 ) 750 805 { 751 806 NTSTATUS Status = STATUS_SUCCESS; 807 DXGK_INTERRUPT_TYPE enmComplType = DXGK_INTERRUPT_DMA_COMPLETED; 808 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 752 809 PVBOXWDDM_CONTEXT pContext = pDmaCmd->pContext; 753 DXGK_INTERRUPT_TYPE enmComplType = DXGK_INTERRUPT_DMA_COMPLETED; 810 VBOXVDMAPIPE_FLAGS_DMACMD fFlags = pDmaCmd->fFlags; 811 #else 812 BOOLEAN fCompleteCmd = TRUE; 813 #endif 754 814 switch (pDmaCmd->enmCmd) 755 815 { 756 816 case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT: 757 817 { 818 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 758 819 PVBOXVDMAPIPE_CMD_DMACMD_BLT pBlt = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)pDmaCmd; 820 #else 821 PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt = (PVBOXWDDM_DMA_PRIVATEDATA_BLT)pDmaCmd; 822 #endif 759 823 PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc; 760 824 PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc; 761 825 762 if ( pBlt->Hdr.fFlags.fRealOp)826 if (fFlags.fRealOp) 763 827 { 764 828 vboxVdmaGgDmaBlt(pDevExt, &pBlt->Blt); … … 790 854 } 791 855 792 if ( pBlt->Hdr.fFlags.fVisibleRegions)856 if (fFlags.fVisibleRegions) 793 857 { 858 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 794 859 Status = STATUS_MORE_PROCESSING_REQUIRED; 795 860 vboxWddmAllocationRetain(pDstAlloc); 796 861 vboxWddmAllocationRetain(pSrcAlloc); 862 #else 863 Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pContext, pDmaCmd, fFlags, u32FenceId); 864 fCompleteCmd = FALSE; 865 #endif 797 866 } 798 867 break; … … 801 870 case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP: 802 871 { 872 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 803 873 PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd; 804 Assert(pFlip->Hdr.fFlags.fVisibleRegions); 805 Assert(!pFlip->Hdr.fFlags.fRealOp); 874 #else 875 PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd; 876 #endif 877 Assert(fFlags.fVisibleRegions); 878 Assert(!fFlags.fRealOp); 806 879 PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc; 807 880 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 808 881 vboxWddmAssignPrimary(pDevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId); 809 if ( pFlip->Hdr.fFlags.fVisibleRegions)882 if (fFlags.fVisibleRegions) 810 883 { 884 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 811 885 Status = STATUS_MORE_PROCESSING_REQUIRED; 812 886 vboxWddmAllocationRetain(pFlip->Flip.Alloc.pAlloc); 887 #else 888 Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pContext, pDmaCmd, fFlags, u32FenceId); 889 fCompleteCmd = FALSE; 890 #endif 813 891 } 814 892 … … 817 895 case VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL: 818 896 { 897 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 819 898 PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCF = (PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL)pDmaCmd; 820 Assert(pCF->Hdr.fFlags.fRealOp); 821 Assert(!pCF->Hdr.fFlags.fVisibleRegions); 899 #else 900 PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pDmaCmd; 901 #endif 902 Assert(fFlags.fRealOp); 903 Assert(!fFlags.fVisibleRegions); 822 904 Status = vboxVdmaGgDmaColorFill(pDevExt, pCF); 823 905 Assert(Status == STATUS_SUCCESS); … … 830 912 } 831 913 914 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 832 915 /* Corresponding Release is done by dma command completion handler */ 833 916 vboxVdmaGgCmdAddRef(&pDmaCmd->Hdr); … … 841 924 Status = tmpStatus; 842 925 } 843 926 #else 927 if (fCompleteCmd) 928 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, enmComplType); 929 #endif 844 930 return Status; 845 931 } 846 932 847 static NTSTATUS vboxVdmaGgDmaCmdProcessSlow(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd) 933 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 934 typedef struct VBOXMP_VDMACR_WRITECOMPLETION 935 { 936 void *pvBufferToFree; 937 } VBOXMP_VDMACR_WRITECOMPLETION, *PVBOXMP_VDMACR_WRITECOMPLETION; 938 939 static DECLCALLBACK(void) vboxVdmaCrWriteCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx) 940 { 941 PVBOXMP_VDMACR_WRITECOMPLETION pData = (PVBOXMP_VDMACR_WRITECOMPLETION)pvCtx; 942 void* pvBufferToFree = pData->pvBufferToFree; 943 if (pvBufferToFree) 944 VBoxMpCrShgsmiTransportBufFree(pCon, pvBufferToFree); 945 946 VBoxMpCrShgsmiTransportCmdTermWriteAsync(pCon, pvCtx); 947 } 948 #endif 949 950 static NTSTATUS vboxVdmaGgDmaCmdProcessSlow(PVBOXMP_DEVEXT pDevExt 951 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 952 , VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd 953 #else 954 , PVBOXWDDM_CONTEXT pContext 955 , PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR *pDmaCmd 956 , VBOXVDMAPIPE_FLAGS_DMACMD fFlags 957 , uint32_t u32FenceId 958 #endif 959 ) 848 960 { 849 961 NTSTATUS Status = STATUS_SUCCESS; 962 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 850 963 PVBOXWDDM_CONTEXT pContext = pDmaCmd->pContext; 964 VBOXVDMAPIPE_FLAGS_DMACMD fFlags = pDmaCmd->fFlags; 965 #else 966 PVBOXMP_CRPACKER pPacker = &pContext->CrPacker; 967 #endif 851 968 DXGK_INTERRUPT_TYPE enmComplType = DXGK_INTERRUPT_DMA_COMPLETED; 852 969 853 Assert( pDmaCmd->fFlags.Value);854 Assert(! pDmaCmd->fFlags.fRealOp);970 Assert(fFlags.Value); 971 Assert(!fFlags.fRealOp); 855 972 856 973 switch (pDmaCmd->enmCmd) … … 865 982 Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS); 866 983 867 if ( pBlt->Hdr.fFlags.fVisibleRegions)984 if (fFlags.fVisibleRegions) 868 985 { 869 986 PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pSrcAlloc); … … 875 992 } 876 993 877 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &pBlt->Blt.SrcRect, &pBlt->Blt.DstRects); 994 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &pBlt->Blt.SrcRect, &pBlt->Blt.DstRects 995 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 996 , pPacker 997 #endif 998 ); 878 999 Assert(Status == STATUS_SUCCESS); 879 1000 … … 886 1007 } 887 1008 1009 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 888 1010 vboxWddmAllocationRelease(pDstAlloc); 889 1011 vboxWddmAllocationRelease(pSrcAlloc); 1012 #endif 890 1013 891 1014 break; … … 897 1020 PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc; 898 1021 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId]; 899 if ( pFlip->Hdr.fFlags.fVisibleRegions)1022 if (fFlags.fVisibleRegions) 900 1023 { 901 1024 PVBOXWDDM_SWAPCHAIN pSwapchain; … … 916 1039 Rects.UpdateRects.cRects = 1; 917 1040 Rects.UpdateRects.aRects[0] = Rects.ContextRect; 918 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &SrcRect, &Rects); 1041 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &SrcRect, &Rects 1042 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1043 , pPacker 1044 #endif 1045 ); 919 1046 Assert(Status == STATUS_SUCCESS); 920 1047 vboxWddmSwapchainRelease(pSwapchain); … … 926 1053 } 927 1054 1055 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 928 1056 vboxWddmAllocationRelease(pAlloc); 1057 #endif 929 1058 930 1059 break; … … 938 1067 } 939 1068 1069 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 940 1070 vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr); 1071 #else 1072 uint32_t cbBuffer 1073 void * pvPackBuffer; 1074 void * pvBuffer = VBoxMpCrPackerTxBufferComplete(pPacker, &cbBuffer, &pvPackBuffer); 1075 if (pvBuffer) 1076 { 1077 PVBOXMP_VDMACR_WRITECOMPLETION pvCompletionData = VBoxMpCrShgsmiTransportCmdCreateWriteAsync(&pDevExt->CrHgsmiTransport, pContext->u32CrConClientID, pvBuffer, cbBuffer, 1078 vboxVdmaCrWriteCompletion, sizeof (*pvCompletionData)); 1079 if (pvCompletionData) 1080 { 1081 int rc = VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(&pDevExt->CrHgsmiTransport, pvCompletionData); 1082 if (!RT_SUCCESS(rc)) 1083 { 1084 WARN(("VBoxMpCrShgsmiTransportCmdSubmitWriteAsync failed, rc %d", rc)); 1085 Status = STATUS_UNSUCCESSFUL; 1086 } 1087 } 1088 else 1089 { 1090 WARN(("VBoxMpCrShgsmiTransportCmdCreateWriteAsync failed")); 1091 Status = STATUS_NO_MEMORY; 1092 } 1093 } 1094 1095 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, DXGK_INTERRUPT_DMA_COMPLETED); 1096 if (!NT_SUCCESS(Status)) 1097 { 1098 WARN(("vboxVdmaDdiCmdFenceComplete failed, Status 0x%x", Status)); 1099 } 1100 #endif 941 1101 942 1102 return Status; 943 1103 } 944 1104 1105 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 945 1106 static DECLCALLBACK(UINT) vboxVdmaGgCmdCancelVisitor(PVBOXVIDEOCM_CTX pContext, PVOID pvCmd, uint32_t cbCmd, PVOID pvVisitor) 946 1107 { … … 1091 1252 break; 1092 1253 } 1093 /* correspondin fRelease is done by the pipe command handler */1254 /* corresponding Release is done by the pipe command handler */ 1094 1255 vboxVdmaGgCmdAddRef(pCmd); 1095 1256 return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr); … … 1193 1354 return Status; 1194 1355 } 1356 #else /* if defined VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS */ 1357 NTSTATUS vboxVdmaGgCmdProcess(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd) 1358 { 1359 switch (pCmd->enmType) 1360 { 1361 case VBOXVDMAPIPE_CMD_TYPE_DMACMD: 1362 { 1363 PVBOXVDMAPIPE_CMD_DMACMD pDmaCmd = (PVBOXVDMAPIPE_CMD_DMACMD)pCmd; 1364 NTSTATUS Status = vboxVdmaGgDmaCmdProcessFast(pDevExt, pDmaCmd); 1365 if (Status == STATUS_MORE_PROCESSING_REQUIRED) 1366 break; 1367 return Status; 1368 } 1369 default: 1370 break; 1371 } 1372 /* corresponding Release is done by the pipe command handler */ 1373 vboxVdmaGgCmdAddRef(pCmd); 1374 return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr); 1375 } 1376 1377 #endif 1195 1378 1196 1379 /* end */ -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h
r42154 r43489 341 341 vboxVdmaGgCmdDestroy(pDevExt, pDr); 342 342 } 343 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 343 344 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent); 344 345 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain); 346 #endif 345 347 346 348 NTSTATUS vboxVdmaPostHideSwapchain(PVBOXWDDM_SWAPCHAIN pSwapchain); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r43286 r43489 1122 1122 pDevExt->cContexts2D = 0; 1123 1123 pDevExt->cUnlockedVBVADisabled = 0; 1124 ExInitializeFastMutex(&pDevExt->ContextMutex);1124 VBOXWDDM_CTXLOCK_INIT(pDevExt); 1125 1125 KeInitializeSpinLock(&pDevExt->SynchLock); 1126 1126 … … 1137 1137 #endif 1138 1138 VBoxWddmSlInit(pDevExt); 1139 1140 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1141 VBoxMpCrShgsmiTransportCreate(&pDevExt->CrHgsmiTransport, pDevExt); 1142 #endif 1139 1143 1140 1144 for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) … … 1226 1230 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)MiniportDeviceContext; 1227 1231 NTSTATUS Status = STATUS_SUCCESS; 1232 1233 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 1234 VBoxMpCrShgsmiTransportTerm(&pDevExt->CrHgsmiTransport); 1235 #endif 1228 1236 1229 1237 VBoxWddmSlTerm(pDevExt); … … 6137 6145 pInfo->crVersionMajor, pInfo->crVersionMinor, 6138 6146 &pContext->u32CrConClientID); 6139 if (!RT_SUCCESS(rc)) 6147 if (RT_SUCCESS(rc)) 6148 { 6149 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 6150 VBoxMpCrPackerInit(&pContext->CrPacker); 6151 #endif 6152 } 6153 else 6140 6154 { 6141 6155 WARN(("VBoxMpCrCtlConConnect failed rc (%d)", rc)); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h
r42158 r43489 215 215 #endif 216 216 217 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS 218 # define VBOXWDDM_CTXLOCK_INIT(_p) do { \ 219 KeInitializeSpinLock(&(_p)->ContextLock); \ 220 } while (0) 221 # define VBOXWDDM_CTXLOCK_DATA KIRQL _ctxLockOldIrql; 222 # define VBOXWDDM_CTXLOCK_LOCK(_p) do { \ 223 KeAcquireSpinLock(&(_p)->ContextLock, &_ctxLockOldIrql); \ 224 } while (0) 225 # define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \ 226 KeReleaseSpinLock(&(_p)->ContextLock, _ctxLockOldIrql); \ 227 } while (0) 228 #else 229 # define VBOXWDDM_CTXLOCK_INIT(_p) do { \ 230 ExInitializeFastMutex(&(_p)->ContextMutex); \ 231 } while (0) 232 # define VBOXWDDM_CTXLOCK_LOCK(_p) do { \ 233 ExAcquireFastMutex(&(_p)->ContextMutex); \ 234 } while (0) 235 # define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \ 236 ExReleaseFastMutex(&(_p)->ContextMutex); \ 237 } while (0) 238 # define VBOXWDDM_CTXLOCK_DATA 239 #endif 240 217 241 #endif /* #ifndef ___VBoxMPWddm_h___ */ 218 242
Note:
See TracChangeset
for help on using the changeset viewer.