VirtualBox

source: vbox/trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h@ 84909

Last change on this file since 84909 was 84849, checked in by vboxsync, 5 years ago

DevVGA-SVGA3d: Jettison the titlebar and border of the window we pass to CreateDeviceEx, as things goes sideways if we don't have any pixels in the client area. The titlebar size and stuff changes with the subsystem/os version number in the PE header, so when the new linker started putting 6.00 there instead of 5.02, things stopped working on a bunch of W10 systems. bugref:8489

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.8 KB
Line 
1/* $Id: DevVGA-SVGA3d.h 84849 2020-06-16 14:23:39Z vboxsync $ */
2/** @file
3 * DevVMWare - VMWare SVGA device - 3D part.
4 */
5
6/*
7 * Copyright (C) 2013-2020 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 VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA3d_h
19#define VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA3d_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24#include "vmsvga/svga3d_reg.h"
25#include "vmsvga/svga_escape.h"
26#include "vmsvga/svga_overlay.h"
27
28
29/** Arbitrary limit */
30#define SVGA3D_MAX_SHADER_IDS 0x800
31/** D3D allows up to 8 texture stages. */
32#define SVGA3D_MAX_TEXTURE_STAGES 8
33/** Samplers: 16 Pixel Shader + 1 Displacement Map + 4 Vertex Shader */
34#define SVGA3D_MAX_SAMPLERS_PS 16
35#define SVGA3D_MAX_SAMPLERS_DMAP 1
36#define SVGA3D_MAX_SAMPLERS_VS 4
37#define SVGA3D_MAX_SAMPLERS (SVGA3D_MAX_SAMPLERS_PS + SVGA3D_MAX_SAMPLERS_DMAP + SVGA3D_MAX_SAMPLERS_VS)
38/** Arbitrary upper limit; seen 8 so far. */
39#define SVGA3D_MAX_LIGHTS 32
40/** Arbitrary upper limit; 2GB enough for 32768x16384*4. */
41#define SVGA3D_MAX_SURFACE_MEM_SIZE 0x80000000
42
43
44/**@def FLOAT_FMT_STR
45 * Format string bits to go with FLOAT_FMT_ARGS. */
46#define FLOAT_FMT_STR "%s%u.%06u"
47/** @def FLOAT_FMT_ARGS
48 * Format arguments for a float value, corresponding to FLOAT_FMT_STR.
49 * @param r The floating point value to format. */
50#define FLOAT_FMT_ARGS(r) (r) >= 0.0f ? "" : "-", (unsigned)RT_ABS(r), (unsigned)(RT_ABS((r) - (unsigned)(r)) * 1000000.0f)
51
52
53/* DevVGA-SVGA.cpp: */
54void vmsvgaR33dSurfaceUpdateHeapBuffersOnFifoThread(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, uint32_t sid);
55
56
57/* DevVGA-SVGA3d-ogl.cpp & DevVGA-SVGA3d-win.cpp: */
58int vmsvga3dInit(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC);
59int vmsvga3dPowerOn(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC);
60int vmsvga3dLoadExec(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass);
61int vmsvga3dSaveExec(PPDMDEVINS pDevIns, PVGASTATECC pThisCC, PSSMHANDLE pSSM);
62int vmsvga3dTerminate(PVGASTATECC pThisCC);
63int vmsvga3dReset(PVGASTATECC pThisCC);
64void vmsvga3dUpdateHostScreenViewport(PVGASTATECC pThisCC, uint32_t idScreen, VMSVGAVIEWPORT const *pOldViewport);
65int vmsvga3dQueryCaps(PVGASTATECC pThisCC, uint32_t idx3dCaps, uint32_t *pu32Val);
66
67int vmsvga3dSurfaceDefine(PVGASTATECC pThisCC, uint32_t sid, uint32_t surfaceFlags, SVGA3dSurfaceFormat format,
68 SVGA3dSurfaceFace face[SVGA3D_MAX_SURFACE_FACES], uint32_t multisampleCount,
69 SVGA3dTextureFilter autogenFilter, uint32_t cMipLevels, SVGA3dSize *pMipLevelSize);
70int vmsvga3dSurfaceDestroy(PVGASTATECC pThisCC, uint32_t sid);
71int vmsvga3dSurfaceCopy(PVGASTATECC pThisCC, SVGA3dSurfaceImageId dest, SVGA3dSurfaceImageId src,
72 uint32_t cCopyBoxes, SVGA3dCopyBox *pBox);
73int vmsvga3dSurfaceStretchBlt(PVGASTATE pThis, PVGASTATECC pThisCC,
74 SVGA3dSurfaceImageId const *pDstSfcImg, SVGA3dBox const *pDstBox,
75 SVGA3dSurfaceImageId const *pSrcSfcImg, SVGA3dBox const *pSrcBox, SVGA3dStretchBltMode enmMode);
76int vmsvga3dSurfaceDMA(PVGASTATE pThis, PVGASTATECC pThisCC, SVGA3dGuestImage guest, SVGA3dSurfaceImageId host, SVGA3dTransferType transfer, uint32_t cCopyBoxes, SVGA3dCopyBox *pBoxes);
77int vmsvga3dSurfaceBlitToScreen(PVGASTATE pThis, PVGASTATECC pThisCC, uint32_t dest, SVGASignedRect destRect, SVGA3dSurfaceImageId srcImage, SVGASignedRect srcRect, uint32_t cRects, SVGASignedRect *pRect);
78
79int vmsvga3dContextDefine(PVGASTATECC pThisCC, uint32_t cid);
80int vmsvga3dContextDestroy(PVGASTATECC pThisCC, uint32_t cid);
81
82int vmsvga3dChangeMode(PVGASTATECC pThisCC);
83
84int vmsvga3dDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen);
85int vmsvga3dDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen);
86
87int vmsvga3dSetTransform(PVGASTATECC pThisCC, uint32_t cid, SVGA3dTransformType type, float matrix[16]);
88int vmsvga3dSetZRange(PVGASTATECC pThisCC, uint32_t cid, SVGA3dZRange zRange);
89int vmsvga3dSetRenderState(PVGASTATECC pThisCC, uint32_t cid, uint32_t cRenderStates, SVGA3dRenderState *pRenderState);
90int vmsvga3dSetRenderTarget(PVGASTATECC pThisCC, uint32_t cid, SVGA3dRenderTargetType type, SVGA3dSurfaceImageId target);
91int vmsvga3dSetTextureState(PVGASTATECC pThisCC, uint32_t cid, uint32_t cTextureStates, SVGA3dTextureState *pTextureState);
92int vmsvga3dSetMaterial(PVGASTATECC pThisCC, uint32_t cid, SVGA3dFace face, SVGA3dMaterial *pMaterial);
93int vmsvga3dSetLightData(PVGASTATECC pThisCC, uint32_t cid, uint32_t index, SVGA3dLightData *pData);
94int vmsvga3dSetLightEnabled(PVGASTATECC pThisCC, uint32_t cid, uint32_t index, uint32_t enabled);
95int vmsvga3dSetViewPort(PVGASTATECC pThisCC, uint32_t cid, SVGA3dRect *pRect);
96int vmsvga3dSetClipPlane(PVGASTATECC pThisCC, uint32_t cid, uint32_t index, float plane[4]);
97int vmsvga3dCommandClear(PVGASTATECC pThisCC, uint32_t cid, SVGA3dClearFlag clearFlag, uint32_t color, float depth, uint32_t stencil, uint32_t cRects, SVGA3dRect *pRect);
98int vmsvga3dCommandPresent(PVGASTATE pThis, PVGASTATECC pThisCC, uint32_t sid, uint32_t cRects, SVGA3dCopyRect *pRect);
99int vmsvga3dDrawPrimitives(PVGASTATECC pThisCC, uint32_t cid, uint32_t numVertexDecls, SVGA3dVertexDecl *pVertexDecl, uint32_t numRanges, SVGA3dPrimitiveRange *pNumRange, uint32_t cVertexDivisor, SVGA3dVertexDivisor *pVertexDivisor);
100int vmsvga3dSetScissorRect(PVGASTATECC pThisCC, uint32_t cid, SVGA3dRect *pRect);
101int vmsvga3dGenerateMipmaps(PVGASTATECC pThisCC, uint32_t sid, SVGA3dTextureFilter filter);
102
103int vmsvga3dShaderDefine(PVGASTATECC pThisCC, uint32_t cid, uint32_t shid, SVGA3dShaderType type, uint32_t cbData, uint32_t *pShaderData);
104int vmsvga3dShaderDestroy(PVGASTATECC pThisCC, uint32_t cid, uint32_t shid, SVGA3dShaderType type);
105int vmsvga3dShaderSet(PVGASTATECC pThisCC, struct VMSVGA3DCONTEXT *pContext, uint32_t cid, SVGA3dShaderType type, uint32_t shid);
106int vmsvga3dShaderSetConst(PVGASTATECC pThisCC, uint32_t cid, uint32_t reg, SVGA3dShaderType type, SVGA3dShaderConstType ctype, uint32_t cRegisters, uint32_t *pValues);
107
108int vmsvga3dQueryBegin(PVGASTATECC pThisCC, uint32_t cid, SVGA3dQueryType type);
109int vmsvga3dQueryEnd(PVGASTATECC pThisCC, uint32_t cid, SVGA3dQueryType type, SVGAGuestPtr guestResult);
110int vmsvga3dQueryWait(PVGASTATE pThis, PVGASTATECC pThisCC, uint32_t cid, SVGA3dQueryType type, SVGAGuestPtr guestResult);
111
112/* DevVGA-SVGA3d-shared.h: */
113#if defined(RT_OS_WINDOWS) && defined(IN_RING3)
114# include <iprt/win/windows.h>
115
116# define WM_VMSVGA3D_WAKEUP (WM_APP+1)
117# define WM_VMSVGA3D_CREATEWINDOW (WM_APP+2)
118# define WM_VMSVGA3D_DESTROYWINDOW (WM_APP+3)
119# define WM_VMSVGA3D_EXIT (WM_APP+5)
120# if 0
121# define WM_VMSVGA3D_CREATE_DEVICE (WM_APP+6)
122typedef struct VMSVGA3DCREATEDEVICEPARAMS
123{
124 struct VMSVGA3DSTATE *pState;
125 struct VMSVGA3DCONTEXT *pContext;
126 struct _D3DPRESENT_PARAMETERS_ *pPresParams;
127 HRESULT hrc;
128} VMSVGA3DCREATEDEVICEPARAMS;
129# endif
130
131DECLCALLBACK(int) vmsvga3dWindowThread(RTTHREAD ThreadSelf, void *pvUser);
132int vmsvga3dSendThreadMessage(RTTHREAD pWindowThread, RTSEMEVENT WndRequestSem, UINT msg, WPARAM wParam, LPARAM lParam);
133int vmsvga3dContextWindowCreate(HINSTANCE hInstance, RTTHREAD pWindowThread, RTSEMEVENT WndRequestSem, HWND *pHwnd);
134
135#endif
136
137void vmsvga3dUpdateHeapBuffersForSurfaces(PVGASTATECC pThisCC, uint32_t sid);
138void vmsvga3dInfoContextWorker(PVGASTATECC pThisCC, PCDBGFINFOHLP pHlp, uint32_t cid, bool fVerbose);
139void vmsvga3dInfoSurfaceWorker(PPDMDEVINS pDevIns, PVGASTATE pThis, PVGASTATECC pThisCC, PCDBGFINFOHLP pHlp, uint32_t sid,
140 bool fVerbose, uint32_t cxAscii, bool fInvY, const char *pszBitmapPath);
141
142/* DevVGA-SVGA3d-shared.cpp: */
143
144/**
145 * Structure for use with vmsvga3dInfoU32Flags.
146 */
147typedef struct VMSVGAINFOFLAGS32
148{
149 /** The flags. */
150 uint32_t fFlags;
151 /** The corresponding mnemonic. */
152 const char *pszJohnny;
153} VMSVGAINFOFLAGS32;
154/** Pointer to a read-only flag translation entry. */
155typedef VMSVGAINFOFLAGS32 const *PCVMSVGAINFOFLAGS32;
156void vmsvga3dInfoU32Flags(PCDBGFINFOHLP pHlp, uint32_t fFlags, const char *pszPrefix, PCVMSVGAINFOFLAGS32 paFlags, uint32_t cFlags);
157
158/**
159 * Structure for use with vmsvgaFormatEnumValueEx and vmsvgaFormatEnumValue.
160 */
161typedef struct VMSVGAINFOENUM
162{
163 /** The enum value. */
164 int32_t iValue;
165 /** The corresponding value name. */
166 const char *pszName;
167} VMSVGAINFOENUM;
168/** Pointer to a read-only enum value translation entry. */
169typedef VMSVGAINFOENUM const *PCVMSVGAINFOENUM;
170/**
171 * Structure for use with vmsvgaFormatEnumValueEx and vmsvgaFormatEnumValue.
172 */
173typedef struct VMSVGAINFOENUMMAP
174{
175 /** Pointer to the value mapping array. */
176 PCVMSVGAINFOENUM paValues;
177 /** The number of value mappings. */
178 size_t cValues;
179 /** The prefix. */
180 const char *pszPrefix;
181#ifdef RT_STRICT
182 /** Indicates whether we've checked that it's sorted or not. */
183 bool *pfAsserted;
184#endif
185} VMSVGAINFOENUMMAP;
186typedef VMSVGAINFOENUMMAP const *PCVMSVGAINFOENUMMAP;
187/** @def VMSVGAINFOENUMMAP_MAKE
188 * Macro for defining a VMSVGAINFOENUMMAP, silently dealing with pfAsserted.
189 *
190 * @param a_Scope The scope. RT_NOTHING or static.
191 * @param a_VarName The variable name for this map.
192 * @param a_aValues The variable name of the value mapping array.
193 * @param a_pszPrefix The value name prefix.
194 */
195#ifdef VBOX_STRICT
196# define VMSVGAINFOENUMMAP_MAKE(a_Scope, a_VarName, a_aValues, a_pszPrefix) \
197 static bool RT_CONCAT(a_VarName,_AssertedSorted) = false; \
198 a_Scope VMSVGAINFOENUMMAP const a_VarName = { \
199 a_aValues, RT_ELEMENTS(a_aValues), a_pszPrefix, &RT_CONCAT(a_VarName,_AssertedSorted) \
200 }
201#else
202# define VMSVGAINFOENUMMAP_MAKE(a_Scope, a_VarName, a_aValues, a_pszPrefix) \
203 a_Scope VMSVGAINFOENUMMAP const a_VarName = { a_aValues, RT_ELEMENTS(a_aValues), a_pszPrefix }
204#endif
205extern VMSVGAINFOENUMMAP const g_SVGA3dSurfaceFormat2String;
206const char *vmsvgaLookupEnum(int32_t iValue, PCVMSVGAINFOENUMMAP pEnumMap);
207char *vmsvgaFormatEnumValueEx(char *pszBuffer, size_t cbBuffer, const char *pszName, int32_t iValue,
208 bool fPrefix, PCVMSVGAINFOENUMMAP pEnumMap);
209char *vmsvgaFormatEnumValue(char *pszBuffer, size_t cbBuffer, const char *pszName, uint32_t uValue,
210 const char *pszPrefix, const char * const *papszValues, size_t cValues);
211
212/**
213 * ASCII "art" scanline printer callback.
214 *
215 * @param pszLine The line to output.
216 * @param pvUser The user argument.
217 */
218typedef DECLCALLBACK(void) FMVMSVGAASCIIPRINTLN(const char *pszLine, void *pvUser);
219/** Pointer to an ASCII "art" print line callback. */
220typedef FMVMSVGAASCIIPRINTLN *PFMVMSVGAASCIIPRINTLN;
221void vmsvga3dAsciiPrint(PFMVMSVGAASCIIPRINTLN pfnPrintLine, void *pvUser, void const *pvImage, size_t cbImage,
222 uint32_t cx, uint32_t cy, uint32_t cbScanline, SVGA3dSurfaceFormat enmFormat, bool fInvY,
223 uint32_t cchMaxX, uint32_t cchMaxY);
224DECLCALLBACK(void) vmsvga3dAsciiPrintlnInfo(const char *pszLine, void *pvUser);
225DECLCALLBACK(void) vmsvga3dAsciiPrintlnLog(const char *pszLine, void *pvUser);
226
227char *vmsvga3dFormatRenderState(char *pszBuffer, size_t cbBuffer, SVGA3dRenderState const *pRenderState);
228char *vmsvga3dFormatTextureState(char *pszBuffer, size_t cbBuffer, SVGA3dTextureState const *pTextureState);
229void vmsvga3dInfoHostWindow(PCDBGFINFOHLP pHlp, uint64_t idHostWindow);
230
231uint32_t vmsvga3dSurfaceFormatSize(SVGA3dSurfaceFormat format,
232 uint32_t *pu32BlockWidth,
233 uint32_t *pu32BlockHeight);
234
235#ifdef LOG_ENABLED
236const char *vmsvga3dGetCapString(uint32_t idxCap);
237const char *vmsvga3dGet3dFormatString(uint32_t format);
238const char *vmsvga3dGetRenderStateName(uint32_t state);
239const char *vmsvga3dTextureStateToString(SVGA3dTextureStateName textureState);
240const char *vmsvgaTransformToString(SVGA3dTransformType type);
241const char *vmsvgaDeclUsage2String(SVGA3dDeclUsage usage);
242const char *vmsvgaDeclType2String(SVGA3dDeclType type);
243const char *vmsvgaDeclMethod2String(SVGA3dDeclMethod method);
244const char *vmsvgaSurfaceType2String(SVGA3dSurfaceFormat format);
245const char *vmsvga3dPrimitiveType2String(SVGA3dPrimitiveType PrimitiveType);
246#endif
247
248#endif /* !VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA3d_h */
249
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