VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.h@ 71590

Last change on this file since 71590 was 71590, checked in by vboxsync, 7 years ago

DevVGA,HGSMI,++: Code cleanup in progress. bugref:9094

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.7 KB
Line 
1/* $Id: VBoxMPCr.h 71590 2018-03-31 18:34:28Z vboxsync $ */
2/** @file
3 * VBox WDDM Miniport driver
4 */
5
6/*
7 * Copyright (C) 2012-2017 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___VBoxMPCr_h__
19#define ___VBoxMPCr_h__
20
21#ifdef VBOX_WITH_CROGL
22
23# include <VBox/VBoxGuestLib.h>
24
25typedef struct VBOXMP_CRCTLCON
26{
27 VBGLCRCTLHANDLE hCrCtl;
28 uint32_t cCrCtlRefs;
29} VBOXMP_CRCTLCON, *PVBOXMP_CRCTLCON;
30
31void VBoxMpCrCtlConInit(void);
32
33bool VBoxMpCrCtlConIs3DSupported(void);
34
35int VBoxMpCrCtlConConnect(PVBOXMP_DEVEXT pDevExt, PVBOXMP_CRCTLCON pCrCtlCon,
36 uint32_t crVersionMajor, uint32_t crVersionMinor,
37 uint32_t *pu32ClientID);
38int VBoxMpCrCtlConDisconnect(PVBOXMP_DEVEXT pDevExt, PVBOXMP_CRCTLCON pCrCtlCon, uint32_t u32ClientID);
39int VBoxMpCrCtlConCall(PVBOXMP_CRCTLCON pCrCtlCon, struct VBGLIOCHGCMCALL *pData, uint32_t cbData);
40int VBoxMpCrCtlConCallUserData(PVBOXMP_CRCTLCON pCrCtlCon, struct VBGLIOCHGCMCALL *pData, uint32_t cbData);
41
42# include <cr_pack.h>
43
44typedef struct VBOXMP_CRSHGSMICON_BUFDR
45{
46 uint32_t cbBuf;
47 void RT_UNTRUSTED_VOLATILE_HOST *pvBuf;
48} VBOXMP_CRSHGSMICON_BUFDR, *PVBOXMP_CRSHGSMICON_BUFDR;
49
50typedef struct VBOXMP_CRSHGSMICON_BUFDR_CACHE
51{
52 volatile PVBOXMP_CRSHGSMICON_BUFDR pBufDr;
53} VBOXMP_CRSHGSMICON_BUFDR_CACHE, *PVBOXMP_CRSHGSMICON_BUFDR_CACHE;
54
55typedef struct VBOXMP_CRSHGSMITRANSPORT
56{
57 PVBOXMP_DEVEXT pDevExt;
58 VBOXMP_CRSHGSMICON_BUFDR_CACHE WbDrCache;
59} VBOXMP_CRSHGSMITRANSPORT, *PVBOXMP_CRSHGSMITRANSPORT;
60
61/** the rx buffer passed here is only valid in the context of the callback.
62 * the callee must NOT free it or use outside of the callback context.
63 * */
64typedef DECLCALLBACK(void) FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc,
65 void RT_UNTRUSTED_VOLATILE_HOST *pvRx,
66 uint32_t cbRx, void *pvCtx);
67typedef FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION *PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION;
68
69typedef DECLCALLBACK(void) FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx);
70typedef FNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION *PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION;
71
72int VBoxMpCrShgsmiTransportCreate(PVBOXMP_CRSHGSMITRANSPORT pCon, PVBOXMP_DEVEXT pDevExt);
73void VBoxMpCrShgsmiTransportTerm(PVBOXMP_CRSHGSMITRANSPORT pCon);
74void* VBoxMpCrShgsmiTransportCmdCreateWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t u32ClientID, void *pvBuffer, uint32_t cbBuffer,
75 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEREADASYNC_COMPLETION pfnCompletion, uint32_t cbContextData);
76void* VBoxMpCrShgsmiTransportCmdCreateWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t u32ClientID, void *pvBuffer, uint32_t cbBuffer,
77 PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION pfnCompletion, uint32_t cbContextData);
78int VBoxMpCrShgsmiTransportCmdSubmitWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext);
79int VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext);
80void VBoxMpCrShgsmiTransportCmdTermWriteReadAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext);
81void VBoxMpCrShgsmiTransportCmdTermWriteAsync(PVBOXMP_CRSHGSMITRANSPORT pCon, void *pvContext);
82
83void RT_UNTRUSTED_VOLATILE_HOST *VBoxMpCrShgsmiTransportBufAlloc(PVBOXMP_CRSHGSMITRANSPORT pCon, uint32_t cbBuffer);
84void VBoxMpCrShgsmiTransportBufFree(PVBOXMP_CRSHGSMITRANSPORT pCon, void RT_UNTRUSTED_VOLATILE_HOST *pvBuffer);
85
86typedef struct VBOXMP_CRPACKER
87{
88 CRPackContext CrPacker;
89 CRPackBuffer CrBuffer;
90} VBOXMP_CRPACKER, *PVBOXMP_CRPACKER;
91
92DECLINLINE(void) VBoxMpCrPackerInit(PVBOXMP_CRPACKER pPacker)
93{
94 memset(pPacker, 0, sizeof (*pPacker));
95}
96
97DECLINLINE(void) VBoxMpCrPackerTerm(PVBOXMP_CRPACKER pPacker)
98{
99 RT_NOREF(pPacker);
100}
101
102DECLINLINE(void) VBoxMpCrPackerTxBufferInit(PVBOXMP_CRPACKER pPacker, void RT_UNTRUSTED_VOLATILE_HOST *pvBuffer,
103 uint32_t cbBuffer, uint32_t cCommands)
104{
105 crPackInitBuffer(&pPacker->CrBuffer, (void *)pvBuffer, cbBuffer, cbBuffer, cCommands);
106 crPackSetBuffer(&pPacker->CrPacker, &pPacker->CrBuffer);
107}
108
109DECLINLINE(CRMessageOpcodes*) vboxMpCrPackerPrependHeader( const CRPackBuffer *pBuffer, uint32_t *cbData, void **ppvPackBuffer)
110{
111 UINT num_opcodes;
112 CRMessageOpcodes *hdr;
113
114 Assert(pBuffer);
115 Assert(pBuffer->opcode_current < pBuffer->opcode_start);
116 Assert(pBuffer->opcode_current >= pBuffer->opcode_end);
117 Assert(pBuffer->data_current > pBuffer->data_start);
118 Assert(pBuffer->data_current <= pBuffer->data_end);
119
120 num_opcodes = (UINT)(pBuffer->opcode_start - pBuffer->opcode_current);
121 hdr = (CRMessageOpcodes *)
122 ( pBuffer->data_start - ( ( num_opcodes + 3 ) & ~0x3 ) - sizeof(*hdr) );
123
124 Assert((void *) hdr >= pBuffer->pack);
125
126 hdr->header.type = CR_MESSAGE_OPCODES;
127 hdr->numOpcodes = num_opcodes;
128
129 *cbData = (UINT)(pBuffer->data_current - (unsigned char *) hdr);
130 *ppvPackBuffer = pBuffer->pack;
131
132 return hdr;
133}
134
135DECLINLINE(void*) VBoxMpCrPackerTxBufferComplete(PVBOXMP_CRPACKER pPacker, uint32_t *pcbBuffer, void **ppvPackBuffer)
136{
137 crPackReleaseBuffer(&pPacker->CrPacker);
138 uint32_t cbData;
139 CRMessageOpcodes *pHdr;
140 void *pvPackBuffer;
141 if (pPacker->CrBuffer.opcode_current != pPacker->CrBuffer.opcode_start)
142 pHdr = vboxMpCrPackerPrependHeader(&pPacker->CrBuffer, &cbData, &pvPackBuffer);
143 else
144 {
145 cbData = 0;
146 pHdr = NULL;
147 pvPackBuffer = NULL;
148 }
149 *pcbBuffer = cbData;
150 *ppvPackBuffer = pvPackBuffer;
151 return pHdr;
152}
153
154DECLINLINE(uint32_t) VBoxMpCrPackerTxBufferGetFreeBufferSize(PVBOXMP_CRPACKER pPacker)
155{
156 return (uint32_t)(pPacker->CrBuffer.data_end - pPacker->CrBuffer.data_start);
157}
158
159DECLINLINE(void) vboxMpCrUnpackerRxWriteback(CRMessageWriteback *pWb)
160{
161 int *pWriteback;
162 memcpy(&pWriteback, &(pWb->writeback_ptr), sizeof (pWriteback));
163 (*pWriteback)--;
164}
165
166DECLINLINE(void) vboxMpCrUnpackerRxReadback(CRMessageReadback *pRb, uint32_t cbRx)
167{
168 int cbPayload = cbRx - sizeof (*pRb);
169 int *pWriteback;
170 void *pDst;
171 memcpy(&pWriteback, &(pRb->writeback_ptr), sizeof (pWriteback));
172 memcpy(&pDst, &(pRb->readback_ptr), sizeof (pDst));
173
174 (*pWriteback)--;
175 memcpy(pDst, ((uint8_t*)pRb) + sizeof (*pRb), cbPayload);
176}
177
178DECLINLINE(int) VBoxMpCrUnpackerRxBufferProcess(void *pvBuffer, uint32_t cbBuffer)
179{
180 CRMessage *pMsg = (CRMessage*)pvBuffer;
181 switch (pMsg->header.type)
182 {
183 case CR_MESSAGE_WRITEBACK:
184 vboxMpCrUnpackerRxWriteback(&(pMsg->writeback));
185 return VINF_SUCCESS;
186 case CR_MESSAGE_READBACK:
187 vboxMpCrUnpackerRxReadback(&(pMsg->readback), cbBuffer);
188 return VINF_SUCCESS;
189 default:
190 WARN(("unknown msg code %d", pMsg->header.type));
191 return VERR_NOT_SUPPORTED;
192 }
193}
194
195DECLINLINE(void *) VBoxMpCrCmdRxReadbackData(CRMessageReadback RT_UNTRUSTED_VOLATILE_HOST *pRx)
196{
197 return (void *)(pRx + 1);
198}
199
200DECLINLINE(uint32_t) VBoxMpCrCmdRxReadbackDataSize(CRMessageReadback RT_UNTRUSTED_VOLATILE_HOST *pRx, uint32_t cbRx)
201{
202 RT_NOREF(pRx);
203 return cbRx - sizeof(*pRx);
204}
205int VBoxMpCrCmdRxReadbackHandler(CRMessageReadback RT_UNTRUSTED_VOLATILE_HOST *pRx, uint32_t cbRx);
206int VBoxMpCrCmdRxHandler(CRMessageHeader RT_UNTRUSTED_VOLATILE_HOST *pRx, uint32_t cbRx);
207
208/* must be called after calling VBoxMpCrCtlConIs3DSupported only */
209uint32_t VBoxMpCrGetHostCaps(void);
210
211#define VBOXMP_CRCMD_HEADER_SIZE sizeof (CRMessageOpcodes)
212/* last +4 below is 4-aligned command opcode size (i.e. ((1 + 3) & ~3)) */
213#define VBOXMP_CRCMD_SIZE_WINDOWPOSITION (20 + 4)
214#define VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(_cRects) (16 + (_cRects) * 4 * sizeof (GLint) + 4)
215#define VBOXMP_CRCMD_SIZE_VBOXTEXPRESENT(_cRects) (28 + (_cRects) * 4 * sizeof (GLint) + 4)
216#define VBOXMP_CRCMD_SIZE_WINDOWSHOW (16 + 4)
217#define VBOXMP_CRCMD_SIZE_WINDOWSIZE (20 + 4)
218#define VBOXMP_CRCMD_SIZE_GETCHROMIUMPARAMETERVCR (36 + 4)
219#define VBOXMP_CRCMD_SIZE_CHROMIUMPARAMETERICR (16 + 4)
220#define VBOXMP_CRCMD_SIZE_WINDOWCREATE (256 + 28 + 4)
221#define VBOXMP_CRCMD_SIZE_WINDOWDESTROY (12 + 4)
222#define VBOXMP_CRCMD_SIZE_CREATECONTEXT (256 + 32 + 4)
223#define VBOXMP_CRCMD_SIZE_DESTROYCONTEXT (12 + 4)
224
225#endif /* #ifdef VBOX_WITH_CROGL */
226
227#endif /* #ifndef ___VBoxMPCr_h__ */
228
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette