VirtualBox

source: vbox/trunk/include/VBox/VBoxVideoGuest.h@ 64650

Last change on this file since 64650 was 64650, checked in by vboxsync, 8 years ago

bugref:8614: Additions/common/VBoxVideo: make the code more self-contained: my last attempt at removing all assertions from debug versions of the Linux video driver was not correct: I missed some places, and forgot that LINUX_VERSION_CODE is only defined when Linux headers are included. Hopefully fix that.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.0 KB
Line 
1/** @file
2 * VBox Host Guest Shared Memory Interface (HGSMI).
3 * OS-independent guest structures.
4 */
5
6/*
7 * Copyright (C) 2006-2016 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 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28#ifndef ___VBox_VBoxVideoGuest_h___
29#define ___VBox_VBoxVideoGuest_h___
30
31#include <VBox/HGSMI/HGSMI.h>
32#include <VBox/HGSMI/HGSMIChSetup.h>
33#include <VBox/VBoxVideo.h>
34
35#include <iprt/err.h> /* The functions in here return IPRT errors. */
36
37#ifdef VBOX_XPDM_MINIPORT
38# include <iprt/nt/miniport.h>
39# include <ntddvdeo.h> /* sdk, clean */
40# include <iprt/nt/Video.h>
41#elif defined VBOX_GUESTR3XORGMOD
42# include <compiler.h>
43#else
44# include <iprt/asm-amd64-x86.h>
45#endif
46
47#ifdef VBOX_WDDM_MINIPORT
48# include "wddm/VBoxMPShgsmi.h"
49 typedef VBOXSHGSMI HGSMIGUESTCMDHEAP;
50# define HGSMIGUESTCMDHEAP_GET(_p) (&(_p)->Heap)
51#else
52 typedef HGSMIHEAP HGSMIGUESTCMDHEAP;
53# define HGSMIGUESTCMDHEAP_GET(_p) (_p)
54#endif
55
56#if defined(IN_RING0) && defined(RT_OS_LINUX)
57# define VBVOAssert(a) do {} while(0)
58# define VBVOAssertPtr(a) do {} while(0)
59# define VBVOAssertReturnVoid(a) if (!(a)) return
60# define VBVOAssertRC(a) do {} while(0)
61# define VBVOAssertPtrNullReturnVoid(a) do {} while(0)
62# define VBVOAssertPtrReturnVoid(a) if (!(a)) return
63#else
64# define VBVOAssert Assert
65# define VBVOAssertPtr AssertPtr
66# define VBVOAssertReturnVoid AssertReturnVoid
67# define VBVOAssertRC AssertRC
68# define VBVOAssertPtrNullReturnVoid AssertPtrNullReturnVoid
69# define VBVOAssertPtrReturnVoid AssertPtrReturnVoid
70#endif
71
72RT_C_DECLS_BEGIN
73
74/**
75 * Structure grouping the context needed for submitting commands to the host
76 * via HGSMI
77 */
78typedef struct HGSMIGUESTCOMMANDCONTEXT
79{
80 /** Information about the memory heap located in VRAM from which data
81 * structures to be sent to the host are allocated. */
82 HGSMIGUESTCMDHEAP heapCtx;
83 /** The I/O port used for submitting commands to the host by writing their
84 * offsets into the heap. */
85 RTIOPORT port;
86} HGSMIGUESTCOMMANDCONTEXT, *PHGSMIGUESTCOMMANDCONTEXT;
87
88
89/**
90 * Structure grouping the context needed for receiving commands from the host
91 * via HGSMI
92 */
93typedef struct HGSMIHOSTCOMMANDCONTEXT
94{
95 /** Information about the memory area located in VRAM in which the host
96 * places data structures to be read by the guest. */
97 HGSMIAREA areaCtx;
98 /** Convenience structure used for matching host commands to handlers. */
99 /** @todo handlers are registered individually in code rather than just
100 * passing a static structure in order to gain extra flexibility. There is
101 * currently no expected usage case for this though. Is the additional
102 * complexity really justified? */
103 HGSMICHANNELINFO channels;
104 /** Flag to indicate that one thread is currently processing the command
105 * queue. */
106 volatile bool fHostCmdProcessing;
107 /* Pointer to the VRAM location where the HGSMI host flags are kept. */
108 volatile HGSMIHOSTFLAGS *pfHostFlags;
109 /** The I/O port used for receiving commands from the host as offsets into
110 * the memory area and sending back confirmations (command completion,
111 * IRQ acknowlegement). */
112 RTIOPORT port;
113} HGSMIHOSTCOMMANDCONTEXT, *PHGSMIHOSTCOMMANDCONTEXT;
114
115
116/**
117 * Structure grouping the context needed for sending graphics acceleration
118 * information to the host via VBVA. Each screen has its own VBVA buffer.
119 */
120typedef struct VBVABUFFERCONTEXT
121{
122 /** Offset of the buffer in the VRAM section for the screen */
123 uint32_t offVRAMBuffer;
124 /** Length of the buffer in bytes */
125 uint32_t cbBuffer;
126 /** This flag is set if we wrote to the buffer faster than the host could
127 * read it. */
128 bool fHwBufferOverflow;
129 /** The VBVA record that we are currently preparing for the host, NULL if
130 * none. */
131 struct VBVARECORD *pRecord;
132 /** Pointer to the VBVA buffer mapped into the current address space. Will
133 * be NULL if VBVA is not enabled. */
134 struct VBVABUFFER *pVBVA;
135} VBVABUFFERCONTEXT, *PVBVABUFFERCONTEXT;
136
137/** @name Helper functions
138 * @{ */
139/** Write an 8-bit value to an I/O port. */
140DECLINLINE(void) VBoxVideoCmnPortWriteUchar(RTIOPORT Port, uint8_t Value)
141{
142#ifdef VBOX_XPDM_MINIPORT
143 VideoPortWritePortUchar((PUCHAR)Port, Value);
144#elif defined VBOX_GUESTR3XORGMOD
145 outb(Port, Value);
146#else /** @todo make these explicit */
147 ASMOutU8(Port, Value);
148#endif
149}
150
151/** Write a 16-bit value to an I/O port. */
152DECLINLINE(void) VBoxVideoCmnPortWriteUshort(RTIOPORT Port, uint16_t Value)
153{
154#ifdef VBOX_XPDM_MINIPORT
155 VideoPortWritePortUshort((PUSHORT)Port,Value);
156#elif defined VBOX_GUESTR3XORGMOD
157 outw(Port, Value);
158#else
159 ASMOutU16(Port, Value);
160#endif
161}
162
163/** Write a 32-bit value to an I/O port. */
164DECLINLINE(void) VBoxVideoCmnPortWriteUlong(RTIOPORT Port, uint32_t Value)
165{
166#ifdef VBOX_XPDM_MINIPORT
167 VideoPortWritePortUlong((PULONG)Port,Value);
168#elif defined VBOX_GUESTR3XORGMOD
169 outl(Port, Value);
170#else
171 ASMOutU32(Port, Value);
172#endif
173}
174
175/** Read an 8-bit value from an I/O port. */
176DECLINLINE(uint8_t) VBoxVideoCmnPortReadUchar(RTIOPORT Port)
177{
178#ifdef VBOX_XPDM_MINIPORT
179 return VideoPortReadPortUchar((PUCHAR)Port);
180#elif defined VBOX_GUESTR3XORGMOD
181 return inb(Port);
182#else
183 return ASMInU8(Port);
184#endif
185}
186
187/** Read a 16-bit value from an I/O port. */
188DECLINLINE(uint16_t) VBoxVideoCmnPortReadUshort(RTIOPORT Port)
189{
190#ifdef VBOX_XPDM_MINIPORT
191 return VideoPortReadPortUshort((PUSHORT)Port);
192#elif defined VBOX_GUESTR3XORGMOD
193 return inw(Port);
194#else
195 return ASMInU16(Port);
196#endif
197}
198
199/** Read a 32-bit value from an I/O port. */
200DECLINLINE(uint32_t) VBoxVideoCmnPortReadUlong(RTIOPORT Port)
201{
202#ifdef VBOX_XPDM_MINIPORT
203 return VideoPortReadPortUlong((PULONG)Port);
204#elif defined VBOX_GUESTR3XORGMOD
205 return inl(Port);
206#else
207 return ASMInU32(Port);
208#endif
209}
210
211/** @} */
212
213/** @name Base HGSMI APIs
214 * @{ */
215
216/** Acknowlege an IRQ. */
217DECLINLINE(void) VBoxHGSMIClearIrq(PHGSMIHOSTCOMMANDCONTEXT pCtx)
218{
219 VBoxVideoCmnPortWriteUlong(pCtx->port, HGSMIOFFSET_VOID);
220}
221
222DECLHIDDEN(void) VBoxHGSMIHostCmdComplete(PHGSMIHOSTCOMMANDCONTEXT pCtx,
223 void *pvMem);
224DECLHIDDEN(void) VBoxHGSMIProcessHostQueue(PHGSMIHOSTCOMMANDCONTEXT pCtx);
225DECLHIDDEN(bool) VBoxHGSMIIsSupported(void);
226DECLHIDDEN(void *) VBoxHGSMIBufferAlloc(PHGSMIGUESTCOMMANDCONTEXT pCtx,
227 HGSMISIZE cbData,
228 uint8_t u8Ch,
229 uint16_t u16Op);
230DECLHIDDEN(void) VBoxHGSMIBufferFree(PHGSMIGUESTCOMMANDCONTEXT pCtx,
231 void *pvBuffer);
232DECLHIDDEN(int) VBoxHGSMIBufferSubmit(PHGSMIGUESTCOMMANDCONTEXT pCtx,
233 void *pvBuffer);
234DECLHIDDEN(void) VBoxHGSMIGetBaseMappingInfo(uint32_t cbVRAM,
235 uint32_t *poffVRAMBaseMapping,
236 uint32_t *pcbMapping,
237 uint32_t *poffGuestHeapMemory,
238 uint32_t *pcbGuestHeapMemory,
239 uint32_t *poffHostFlags);
240DECLHIDDEN(int) VBoxHGSMIReportFlagsLocation(PHGSMIGUESTCOMMANDCONTEXT pCtx,
241 HGSMIOFFSET offLocation);
242DECLHIDDEN(int) VBoxHGSMISendCapsInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx,
243 uint32_t fCaps);
244/** @todo we should provide a cleanup function too as part of the API */
245DECLHIDDEN(int) VBoxHGSMISetupGuestContext(PHGSMIGUESTCOMMANDCONTEXT pCtx,
246 void *pvGuestHeapMemory,
247 uint32_t cbGuestHeapMemory,
248 uint32_t offVRAMGuestHeapMemory,
249 const HGSMIENV *pEnv);
250DECLHIDDEN(void) VBoxHGSMIGetHostAreaMapping(PHGSMIGUESTCOMMANDCONTEXT pCtx,
251 uint32_t cbVRAM,
252 uint32_t offVRAMBaseMapping,
253 uint32_t *poffVRAMHostArea,
254 uint32_t *pcbHostArea);
255DECLHIDDEN(void) VBoxHGSMISetupHostContext(PHGSMIHOSTCOMMANDCONTEXT pCtx,
256 void *pvBaseMapping,
257 uint32_t offHostFlags,
258 void *pvHostAreaMapping,
259 uint32_t offVRAMHostArea,
260 uint32_t cbHostArea);
261DECLHIDDEN(int) VBoxHGSMISendHostCtxInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx,
262 HGSMIOFFSET offVRAMFlagsLocation,
263 uint32_t fCaps,
264 uint32_t offVRAMHostArea,
265 uint32_t cbHostArea);
266DECLHIDDEN(int) VBoxQueryConfHGSMI(PHGSMIGUESTCOMMANDCONTEXT pCtx,
267 uint32_t u32Index, uint32_t *pulValue);
268DECLHIDDEN(int) VBoxQueryConfHGSMIDef(PHGSMIGUESTCOMMANDCONTEXT pCtx,
269 uint32_t u32Index, uint32_t u32DefValue, uint32_t *pulValue);
270DECLHIDDEN(int) VBoxHGSMIUpdatePointerShape(PHGSMIGUESTCOMMANDCONTEXT pCtx,
271 uint32_t fFlags,
272 uint32_t cHotX,
273 uint32_t cHotY,
274 uint32_t cWidth,
275 uint32_t cHeight,
276 uint8_t *pPixels,
277 uint32_t cbLength);
278DECLHIDDEN(int) VBoxHGSMICursorPosition(PHGSMIGUESTCOMMANDCONTEXT pCtx, bool fReportPosition, uint32_t x, uint32_t y,
279 uint32_t *pxHost, uint32_t *pyHost);
280
281/** @} */
282
283/** @name VBVA APIs
284 * @{ */
285DECLHIDDEN(bool) VBoxVBVAEnable(PVBVABUFFERCONTEXT pCtx,
286 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx,
287 struct VBVABUFFER *pVBVA, int32_t cScreen);
288DECLHIDDEN(void) VBoxVBVADisable(PVBVABUFFERCONTEXT pCtx,
289 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx,
290 int32_t cScreen);
291DECLHIDDEN(bool) VBoxVBVABufferBeginUpdate(PVBVABUFFERCONTEXT pCtx,
292 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx);
293DECLHIDDEN(void) VBoxVBVABufferEndUpdate(PVBVABUFFERCONTEXT pCtx);
294DECLHIDDEN(bool) VBoxVBVAWrite(PVBVABUFFERCONTEXT pCtx,
295 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx,
296 const void *pv, uint32_t cb);
297DECLHIDDEN(bool) VBoxVBVAOrderSupported(PVBVABUFFERCONTEXT pCtx, unsigned code);
298DECLHIDDEN(void) VBoxVBVASetupBufferContext(PVBVABUFFERCONTEXT pCtx,
299 uint32_t offVRAMBuffer,
300 uint32_t cbBuffer);
301
302/** @} */
303
304/** @name Modesetting APIs
305 * @{ */
306
307DECLHIDDEN(uint32_t) VBoxHGSMIGetMonitorCount(PHGSMIGUESTCOMMANDCONTEXT pCtx);
308DECLHIDDEN(uint32_t) VBoxVideoGetVRAMSize(void);
309DECLHIDDEN(bool) VBoxVideoAnyWidthAllowed(void);
310DECLHIDDEN(uint16_t) VBoxHGSMIGetScreenFlags(PHGSMIGUESTCOMMANDCONTEXT pCtx);
311
312struct VBVAINFOVIEW;
313/**
314 * Callback funtion called from @a VBoxHGSMISendViewInfo to initialise
315 * the @a VBVAINFOVIEW structure for each screen.
316 *
317 * @returns iprt status code
318 * @param pvData context data for the callback, passed to @a
319 * VBoxHGSMISendViewInfo along with the callback
320 * @param pInfo array of @a VBVAINFOVIEW structures to be filled in
321 * @todo explicitly pass the array size
322 */
323typedef DECLCALLBACK(int) FNHGSMIFILLVIEWINFO(void *pvData,
324 struct VBVAINFOVIEW *pInfo,
325 uint32_t cViews);
326/** Pointer to a FNHGSMIFILLVIEWINFO callback */
327typedef FNHGSMIFILLVIEWINFO *PFNHGSMIFILLVIEWINFO;
328
329DECLHIDDEN(int) VBoxHGSMISendViewInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx,
330 uint32_t u32Count,
331 PFNHGSMIFILLVIEWINFO pfnFill,
332 void *pvData);
333DECLHIDDEN(void) VBoxVideoSetModeRegisters(uint16_t cWidth, uint16_t cHeight,
334 uint16_t cVirtWidth, uint16_t cBPP,
335 uint16_t fFlags,
336 uint16_t cx, uint16_t cy);
337DECLHIDDEN(bool) VBoxVideoGetModeRegisters(uint16_t *pcWidth,
338 uint16_t *pcHeight,
339 uint16_t *pcVirtWidth,
340 uint16_t *pcBPP,
341 uint16_t *pfFlags);
342DECLHIDDEN(void) VBoxVideoDisableVBE(void);
343DECLHIDDEN(void) VBoxHGSMIProcessDisplayInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx,
344 uint32_t cDisplay,
345 int32_t cOriginX,
346 int32_t cOriginY,
347 uint32_t offStart,
348 uint32_t cbPitch,
349 uint32_t cWidth,
350 uint32_t cHeight,
351 uint16_t cBPP,
352 uint16_t fFlags);
353DECLHIDDEN(int) VBoxHGSMIUpdateInputMapping(PHGSMIGUESTCOMMANDCONTEXT pCtx, int32_t cOriginX, int32_t cOriginY,
354 uint32_t cWidth, uint32_t cHeight);
355DECLHIDDEN(int) VBoxHGSMIGetModeHints(PHGSMIGUESTCOMMANDCONTEXT pCtx,
356 unsigned cScreens, VBVAMODEHINT *paHints);
357
358/** @} */
359
360RT_C_DECLS_END
361
362#endif
363
Note: See TracBrowser for help on using the repository browser.

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