VirtualBox

source: vbox/trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h@ 82084

Last change on this file since 82084 was 82079, checked in by vboxsync, 5 years ago

DevVGA: Map the first page of the FIFO into ring-0 so we can safely access the SVGA_FIFO_MIN, SVGA_FIFO_PITCHLOCK, and SVGA_FIFO_BUSY registers from there. bugref:9218

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.0 KB
Line 
1/* $Id: DevVGA-SVGA.h 82079 2019-11-21 12:46:06Z vboxsync $ */
2/** @file
3 * VMware SVGA device
4 */
5/*
6 * Copyright (C) 2013-2019 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 */
16
17#ifndef VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA_h
18#define VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA_h
19#ifndef RT_WITHOUT_PRAGMA_ONCE
20# pragma once
21#endif
22
23#ifndef VBOX_WITH_VMSVGA
24# error "VBOX_WITH_VMSVGA is not defined"
25#endif
26
27#include <VBox/vmm/pdmthread.h>
28
29#include "vmsvga/svga3d_reg.h"
30
31/** Default FIFO size. */
32#define VMSVGA_FIFO_SIZE _2M
33/** The old FIFO size. */
34#define VMSVGA_FIFO_SIZE_OLD _128K
35
36/** Default scratch region size. */
37#define VMSVGA_SCRATCH_SIZE 0x100
38/** Surface memory available to the guest. */
39#define VMSVGA_SURFACE_SIZE (512*1024*1024)
40/** Maximum GMR pages. */
41#define VMSVGA_MAX_GMR_PAGES 0x100000
42/** Maximum nr of GMR ids. */
43#define VMSVGA_MAX_GMR_IDS _8K
44/** Maximum number of GMR descriptors. */
45#define VMSVGA_MAX_GMR_DESC_LOOP_COUNT VMSVGA_MAX_GMR_PAGES
46
47#define VMSVGA_VAL_UNINITIALIZED (unsigned)-1
48
49/** For validating X and width values.
50 * The code assumes it's at least an order of magnitude less than UINT32_MAX. */
51#define VMSVGA_MAX_X _1M
52/** For validating Y and height values.
53 * The code assumes it's at least an order of magnitude less than UINT32_MAX. */
54#define VMSVGA_MAX_Y _1M
55
56/* u32ActionFlags */
57#define VMSVGA_ACTION_CHANGEMODE_BIT 0
58#define VMSVGA_ACTION_CHANGEMODE RT_BIT(VMSVGA_ACTION_CHANGEMODE_BIT)
59
60
61#ifdef DEBUG
62/* Enable to log FIFO register accesses. */
63//# define DEBUG_FIFO_ACCESS
64/* Enable to log GMR page accesses. */
65//# define DEBUG_GMR_ACCESS
66#endif
67
68#define VMSVGA_FIFO_EXTCMD_NONE 0
69#define VMSVGA_FIFO_EXTCMD_TERMINATE 1
70#define VMSVGA_FIFO_EXTCMD_SAVESTATE 2
71#define VMSVGA_FIFO_EXTCMD_LOADSTATE 3
72#define VMSVGA_FIFO_EXTCMD_RESET 4
73#define VMSVGA_FIFO_EXTCMD_UPDATE_SURFACE_HEAP_BUFFERS 5
74
75/** Size of the region to backup when switching into svga mode. */
76#define VMSVGA_VGA_FB_BACKUP_SIZE _512K
77
78/** @def VMSVGA_WITH_VGA_FB_BACKUP
79 * Enables correct VGA MMIO read/write handling when VMSVGA is enabled. It
80 * is SLOW and probably not entirely right, but it helps with getting 3dmark
81 * output and other stuff. */
82#define VMSVGA_WITH_VGA_FB_BACKUP 1
83
84/** @def VMSVGA_WITH_VGA_FB_BACKUP_AND_IN_RING3
85 * defined(VMSVGA_WITH_VGA_FB_BACKUP) && defined(IN_RING3) */
86#if (defined(VMSVGA_WITH_VGA_FB_BACKUP) && defined(IN_RING3)) || defined(DOXYGEN_RUNNING)
87# define VMSVGA_WITH_VGA_FB_BACKUP_AND_IN_RING3 1
88#else
89# undef VMSVGA_WITH_VGA_FB_BACKUP_AND_IN_RING3
90#endif
91
92/** @def VMSVGA_WITH_VGA_FB_BACKUP_AND_IN_RZ
93 * defined(VMSVGA_WITH_VGA_FB_BACKUP) && !defined(IN_RING3) */
94#if (defined(VMSVGA_WITH_VGA_FB_BACKUP) && !defined(IN_RING3)) || defined(DOXYGEN_RUNNING)
95# define VMSVGA_WITH_VGA_FB_BACKUP_AND_IN_RZ 1
96#else
97# undef VMSVGA_WITH_VGA_FB_BACKUP_AND_IN_RZ
98#endif
99
100
101typedef struct
102{
103 PSSMHANDLE pSSM;
104 uint32_t uVersion;
105 uint32_t uPass;
106} VMSVGA_STATE_LOAD;
107typedef VMSVGA_STATE_LOAD *PVMSVGA_STATE_LOAD;
108
109/** Host screen viewport.
110 * (4th quadrant with negated Y values - usual Windows and X11 world view.) */
111typedef struct VMSVGAVIEWPORT
112{
113 uint32_t x; /**< x coordinate (left). */
114 uint32_t y; /**< y coordinate (top). */
115 uint32_t cx; /**< width. */
116 uint32_t cy; /**< height. */
117 /** Right side coordinate (exclusive). Same as x + cx. */
118 uint32_t xRight;
119 /** First quadrant low y coordinate.
120 * Same as y + cy - 1 in window coordinates. */
121 uint32_t yLowWC;
122 /** First quadrant high y coordinate (exclusive) - yLowWC + cy.
123 * Same as y - 1 in window coordinates. */
124 uint32_t yHighWC;
125 /** Alignment padding. */
126 uint32_t uAlignment;
127} VMSVGAVIEWPORT;
128
129/**
130 * Screen object state.
131 */
132typedef struct VMSVGASCREENOBJECT
133{
134 /** SVGA_SCREEN_* flags. */
135 uint32_t fuScreen;
136 /** The screen object id. */
137 uint32_t idScreen;
138 /** The screen dimensions. */
139 int32_t xOrigin;
140 int32_t yOrigin;
141 uint32_t cWidth;
142 uint32_t cHeight;
143 /** Offset of the screen buffer in the guest VRAM. */
144 uint32_t offVRAM;
145 /** Scanline pitch. */
146 uint32_t cbPitch;
147 /** Bits per pixel. */
148 uint32_t cBpp;
149 bool fDefined;
150 bool fModified;
151} VMSVGASCREENOBJECT;
152
153/** Pointer to the private VMSVGA ring-3 state structure.
154 * @todo Still not entirely satisfired with the type name, but better than
155 * the previous lower/upper case only distinction. */
156typedef struct VMSVGAR3STATE *PVMSVGAR3STATE;
157/** Pointer to the private (implementation specific) VMSVGA3d state. */
158typedef struct VMSVGA3DSTATE *PVMSVGA3DSTATE;
159
160
161/**
162 * The VMSVGA device state.
163 *
164 * This instantatiated as VGASTATE::svga.
165 */
166typedef struct VMSVGAState
167{
168 /** The R3 FIFO pointer. */
169 R3PTRTYPE(uint32_t *) pFIFOR3;
170 /** The R0 FIFO pointer.
171 * @note This only points to the _first_ _page_ of the FIFO! */
172 R0PTRTYPE(uint32_t *) pFIFOR0;
173 /** R3 Opaque pointer to svga state. */
174 R3PTRTYPE(PVMSVGAR3STATE) pSvgaR3State;
175 /** R3 Opaque pointer to 3d state. */
176 R3PTRTYPE(PVMSVGA3DSTATE) p3dState;
177 /** The separate VGA frame buffer in svga mode.
178 * Unlike the the boch-based VGA device implementation, VMSVGA seems to have a
179 * separate frame buffer for VGA and allows concurrent use of both. The SVGA
180 * SDK is making use of this to do VGA text output while testing other things in
181 * SVGA mode, displaying the result by switching back to VGA text mode. So,
182 * when entering SVGA mode we copy the first part of the frame buffer here and
183 * direct VGA accesses here instead. It is copied back when leaving SVGA mode. */
184 R3PTRTYPE(uint8_t *) pbVgaFrameBufferR3;
185 /** R3 Opaque pointer to an external fifo cmd parameter. */
186 R3PTRTYPE(void * volatile) pvFIFOExtCmdParam;
187
188 /** Guest physical address of the FIFO memory range. */
189 RTGCPHYS GCPhysFIFO;
190 /** Size in bytes of the FIFO memory range.
191 * This may be smaller than cbFIFOConfig after restoring an old VM state. */
192 uint32_t cbFIFO;
193 /** The configured FIFO size. */
194 uint32_t cbFIFOConfig;
195 /** SVGA id. */
196 uint32_t u32SVGAId;
197 /** SVGA extensions enabled or not. */
198 uint32_t fEnabled;
199 /** SVGA memory area configured status. */
200 uint32_t fConfigured;
201 /** Device is busy handling FIFO requests (VMSVGA_BUSY_F_FIFO,
202 * VMSVGA_BUSY_F_EMT_FORCE). */
203 uint32_t volatile fBusy;
204#define VMSVGA_BUSY_F_FIFO RT_BIT_32(0) /**< The normal true/false busy FIFO bit. */
205#define VMSVGA_BUSY_F_EMT_FORCE RT_BIT_32(1) /**< Bit preventing race status flickering when EMT kicks the FIFO thread. */
206 /** Traces (dirty page detection) enabled or not. */
207 uint32_t fTraces;
208 /** Guest OS identifier. */
209 uint32_t u32GuestId;
210 /** Scratch region size (VMSVGAState::au32ScratchRegion). */
211 uint32_t cScratchRegion;
212 /** Irq status. */
213 uint32_t u32IrqStatus;
214 /** Irq mask. */
215 uint32_t u32IrqMask;
216 /** Pitch lock. */
217 uint32_t u32PitchLock;
218 /** Current GMR id. (SVGA_REG_GMR_ID) */
219 uint32_t u32CurrentGMRId;
220 /** Register caps. */
221 uint32_t u32RegCaps;
222 uint32_t Padding0; /* Used to be I/O port base address. */
223 /** Port io index register. */
224 uint32_t u32IndexReg;
225 /** The support driver session handle for use with FIFORequestSem. */
226 R3R0PTRTYPE(PSUPDRVSESSION) pSupDrvSession;
227 /** FIFO request semaphore. */
228 SUPSEMEVENT FIFORequestSem;
229 /** FIFO external command semaphore. */
230 R3PTRTYPE(RTSEMEVENT) FIFOExtCmdSem;
231 /** FIFO IO Thread. */
232 R3PTRTYPE(PPDMTHREAD) pFIFOIOThread;
233 /** The last seen SVGA_FIFO_CURSOR_COUNT value.
234 * Used by the FIFO thread and its watchdog. */
235 uint32_t uLastCursorUpdateCount;
236 /** Indicates that the FIFO thread is sleeping and might need waking up. */
237 bool volatile fFIFOThreadSleeping;
238 /** The legacy GFB mode registers. If used, they correspond to screen 0. */
239 /** True when the guest modifies the GFB mode registers. */
240 bool fGFBRegisters;
241 bool afPadding[2];
242 uint32_t uWidth;
243 uint32_t uHeight;
244 uint32_t uBpp;
245 uint32_t cbScanline;
246 /** Maximum width supported. */
247 uint32_t u32MaxWidth;
248 /** Maximum height supported. */
249 uint32_t u32MaxHeight;
250 /** Viewport rectangle, i.e. what's currently visible of the target host
251 * window. This is usually (0,0)(uWidth,uHeight), but if the window is
252 * shrunk and scrolling applied, both the origin and size may differ. */
253 VMSVGAVIEWPORT viewport;
254 /** Action flags */
255 uint32_t u32ActionFlags;
256 /** SVGA 3d extensions enabled or not. */
257 bool f3DEnabled;
258 /** VRAM page monitoring enabled or not. */
259 bool fVRAMTracking;
260 /** External command to be executed in the FIFO thread. */
261 uint8_t volatile u8FIFOExtCommand;
262 /** Set by vmsvgaR3RunExtCmdOnFifoThread when it temporarily resumes the FIFO
263 * thread and does not want it do anything but the command. */
264 bool volatile fFifoExtCommandWakeup;
265#ifdef DEBUG_GMR_ACCESS
266 /** GMR debug access handler type handle. */
267 PGMPHYSHANDLERTYPE hGmrAccessHandlerType;
268#endif
269#if defined(VMSVGA_USE_FIFO_ACCESS_HANDLER) || defined(DEBUG_FIFO_ACCESS)
270 /** FIFO debug access handler type handle. */
271 PGMPHYSHANDLERTYPE hFifoAccessHandlerType;
272#elif defined(DEBUG_GMR_ACCESS)
273 uint32_t uPadding1;
274#endif
275 /** Number of GMRs. */
276 uint32_t cGMR;
277 uint32_t uScreenOffset; /* Used only for loading older saved states. */
278
279 /** Scratch array.
280 * Putting this at the end since it's big it probably not . */
281 uint32_t au32ScratchRegion[VMSVGA_SCRATCH_SIZE];
282
283 STAMCOUNTER StatRegBitsPerPixelWr;
284 STAMCOUNTER StatRegBusyWr;
285 STAMCOUNTER StatRegCursorXxxxWr;
286 STAMCOUNTER StatRegDepthWr;
287 STAMCOUNTER StatRegDisplayHeightWr;
288 STAMCOUNTER StatRegDisplayIdWr;
289 STAMCOUNTER StatRegDisplayIsPrimaryWr;
290 STAMCOUNTER StatRegDisplayPositionXWr;
291 STAMCOUNTER StatRegDisplayPositionYWr;
292 STAMCOUNTER StatRegDisplayWidthWr;
293 STAMCOUNTER StatRegEnableWr;
294 STAMCOUNTER StatRegGmrIdWr;
295 STAMCOUNTER StatRegGuestIdWr;
296 STAMCOUNTER StatRegHeightWr;
297 STAMCOUNTER StatRegIdWr;
298 STAMCOUNTER StatRegIrqMaskWr;
299 STAMCOUNTER StatRegNumDisplaysWr;
300 STAMCOUNTER StatRegNumGuestDisplaysWr;
301 STAMCOUNTER StatRegPaletteWr;
302 STAMCOUNTER StatRegPitchLockWr;
303 STAMCOUNTER StatRegPseudoColorWr;
304 STAMCOUNTER StatRegReadOnlyWr;
305 STAMCOUNTER StatRegScratchWr;
306 STAMCOUNTER StatRegSyncWr;
307 STAMCOUNTER StatRegTopWr;
308 STAMCOUNTER StatRegTracesWr;
309 STAMCOUNTER StatRegUnknownWr;
310 STAMCOUNTER StatRegWidthWr;
311
312 STAMCOUNTER StatRegBitsPerPixelRd;
313 STAMCOUNTER StatRegBlueMaskRd;
314 STAMCOUNTER StatRegBusyRd;
315 STAMCOUNTER StatRegBytesPerLineRd;
316 STAMCOUNTER StatRegCapabilitesRd;
317 STAMCOUNTER StatRegConfigDoneRd;
318 STAMCOUNTER StatRegCursorXxxxRd;
319 STAMCOUNTER StatRegDepthRd;
320 STAMCOUNTER StatRegDisplayHeightRd;
321 STAMCOUNTER StatRegDisplayIdRd;
322 STAMCOUNTER StatRegDisplayIsPrimaryRd;
323 STAMCOUNTER StatRegDisplayPositionXRd;
324 STAMCOUNTER StatRegDisplayPositionYRd;
325 STAMCOUNTER StatRegDisplayWidthRd;
326 STAMCOUNTER StatRegEnableRd;
327 STAMCOUNTER StatRegFbOffsetRd;
328 STAMCOUNTER StatRegFbSizeRd;
329 STAMCOUNTER StatRegFbStartRd;
330 STAMCOUNTER StatRegGmrIdRd;
331 STAMCOUNTER StatRegGmrMaxDescriptorLengthRd;
332 STAMCOUNTER StatRegGmrMaxIdsRd;
333 STAMCOUNTER StatRegGmrsMaxPagesRd;
334 STAMCOUNTER StatRegGreenMaskRd;
335 STAMCOUNTER StatRegGuestIdRd;
336 STAMCOUNTER StatRegHeightRd;
337 STAMCOUNTER StatRegHostBitsPerPixelRd;
338 STAMCOUNTER StatRegIdRd;
339 STAMCOUNTER StatRegIrqMaskRd;
340 STAMCOUNTER StatRegMaxHeightRd;
341 STAMCOUNTER StatRegMaxWidthRd;
342 STAMCOUNTER StatRegMemorySizeRd;
343 STAMCOUNTER StatRegMemRegsRd;
344 STAMCOUNTER StatRegMemSizeRd;
345 STAMCOUNTER StatRegMemStartRd;
346 STAMCOUNTER StatRegNumDisplaysRd;
347 STAMCOUNTER StatRegNumGuestDisplaysRd;
348 STAMCOUNTER StatRegPaletteRd;
349 STAMCOUNTER StatRegPitchLockRd;
350 STAMCOUNTER StatRegPsuedoColorRd;
351 STAMCOUNTER StatRegRedMaskRd;
352 STAMCOUNTER StatRegScratchRd;
353 STAMCOUNTER StatRegScratchSizeRd;
354 STAMCOUNTER StatRegSyncRd;
355 STAMCOUNTER StatRegTopRd;
356 STAMCOUNTER StatRegTracesRd;
357 STAMCOUNTER StatRegUnknownRd;
358 STAMCOUNTER StatRegVramSizeRd;
359 STAMCOUNTER StatRegWidthRd;
360 STAMCOUNTER StatRegWriteOnlyRd;
361} VMSVGAState;
362
363typedef struct VGAState *PVGASTATE;
364
365DECLCALLBACK(int) vmsvgaR3PciIORegionFifoMapUnmap(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t iRegion,
366 RTGCPHYS GCPhysAddress, RTGCPHYS cb, PCIADDRESSSPACE enmType);
367DECLCALLBACK(VBOXSTRICTRC) vmsvgaIORead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb);
368DECLCALLBACK(VBOXSTRICTRC) vmsvgaIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb);
369
370DECLCALLBACK(void) vmsvgaPortSetViewport(PPDMIDISPLAYPORT pInterface, uint32_t uScreenId,
371 uint32_t x, uint32_t y, uint32_t cx, uint32_t cy);
372
373int vmsvgaInit(PPDMDEVINS pDevIns);
374int vmsvgaReset(PPDMDEVINS pDevIns);
375int vmsvgaDestruct(PPDMDEVINS pDevIns);
376int vmsvgaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass);
377int vmsvgaLoadDone(PPDMDEVINS pDevIns);
378int vmsvgaSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM);
379DECLCALLBACK(void) vmsvgaR3PowerOn(PPDMDEVINS pDevIns);
380DECLCALLBACK(void) vmsvgaR3PowerOff(PPDMDEVINS pDevIns);
381void vmsvgaFIFOWatchdogTimer(PVGASTATE pThis);
382
383#ifdef IN_RING3
384VMSVGASCREENOBJECT *vmsvgaGetScreenObject(PVGASTATE pThis, uint32_t idScreen);
385int vmsvgaUpdateScreen(PVGASTATE pThis, VMSVGASCREENOBJECT *pScreen, int x, int y, int w, int h);
386#endif
387
388void vmsvgaGMRFree(PVGASTATE pThis, uint32_t idGMR);
389int vmsvgaGMRTransfer(PVGASTATE pThis, const SVGA3dTransferType enmTransferType,
390 uint8_t *pbHstBuf, uint32_t cbHstBuf, uint32_t offHst, int32_t cbHstPitch,
391 SVGAGuestPtr gstPtr, uint32_t offGst, int32_t cbGstPitch,
392 uint32_t cbWidth, uint32_t cHeight);
393
394void vmsvgaClipCopyBox(const SVGA3dSize *pSizeSrc,
395 const SVGA3dSize *pSizeDest,
396 SVGA3dCopyBox *pBox);
397void vmsvgaClipBox(const SVGA3dSize *pSize,
398 SVGA3dBox *pBox);
399void vmsvgaClipRect(SVGASignedRect const *pBound,
400 SVGASignedRect *pRect);
401
402#endif /* !VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA_h */
403
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