VirtualBox

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

Last change on this file since 47070 was 47070, checked in by vboxsync, 12 years ago

wddm: fix 3D disabled case

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