VirtualBox

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

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

bugref:8863: several DevVGA-SVGA fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 42.3 KB
Line 
1/* $Id: DevVGA-SVGA3d-internal.h 67972 2017-07-14 13:44:02Z vboxsync $ */
2/** @file
3 * DevVMWare - VMWare SVGA device - 3D part, internal header.
4 */
5
6/*
7 * Copyright (C) 2013-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
18#ifndef ___DevVGA_SVGA3d_internal_h
19#define ___DevVGA_SVGA3d_internal_h
20
21/*
22 * Assert sane compilation environment.
23 */
24#ifndef IN_RING3
25# error "VMSVGA3D_INCL_INTERNALS is only for ring-3 code"
26#endif
27#ifdef VMSVGA3D_OPENGL
28# ifdef VMSVGA3D_DIRECT3D
29# error "Both VMSVGA3D_DIRECT3D and VMSVGA3D_OPENGL cannot be defined at the same time."
30# endif
31#elif !defined(VMSVGA3D_DIRECT3D)
32# error "Either VMSVGA3D_OPENGL or VMSVGA3D_DIRECT3D must be defined."
33#endif
34
35
36/*********************************************************************************************************************************
37* Header Files *
38*********************************************************************************************************************************/
39#include "DevVGA-SVGA3d.h"
40
41#ifdef RT_OS_WINDOWS
42# include <iprt/win/windows.h>
43# ifdef VMSVGA3D_DIRECT3D
44# include <d3d9.h>
45# include <iprt/avl.h>
46# else
47# include <GL/gl.h>
48# include "vmsvga_glext/wglext.h"
49# endif
50
51#elif defined(RT_OS_DARWIN)
52# include <OpenGL/OpenGL.h>
53# include <OpenGL/gl3.h>
54# include <OpenGL/gl3ext.h>
55# define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
56# include <OpenGL/gl.h>
57# include <OpenGL/glext.h>
58# include "DevVGA-SVGA3d-cocoa.h"
59/* work around conflicting definition of GLhandleARB in VMware's glext.h */
60//#define GL_ARB_shader_objects
61// HACK
62typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer);
63typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);
64typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params);
65# define GL_RGBA_S3TC 0x83A2
66# define GL_ALPHA8_EXT 0x803c
67# define GL_LUMINANCE8_EXT 0x8040
68# define GL_LUMINANCE16_EXT 0x8042
69# define GL_LUMINANCE4_ALPHA4_EXT 0x8043
70# define GL_LUMINANCE8_ALPHA8_EXT 0x8045
71# define GL_INT_2_10_10_10_REV 0x8D9F
72
73#else
74# include <X11/Xlib.h>
75# include <X11/Xatom.h>
76# include <GL/gl.h>
77# include <GL/glx.h>
78# include <GL/glext.h>
79# define VBOX_VMSVGA3D_GL_HACK_LEVEL 0x103
80#endif
81
82#include "vmsvga/svga3d_shaderdefs.h"
83#ifdef VMSVGA3D_OPENGL
84# include "vmsvga_glext/glext.h"
85# include "shaderlib/shaderlib.h"
86#endif
87
88
89/*********************************************************************************************************************************
90* Defined Constants And Macros *
91*********************************************************************************************************************************/
92#ifdef VMSVGA3D_OPENGL
93/** OpenGL: Create a dedicated context for handling surfaces in, thus
94 * avoiding orphaned surfaces after context destruction.
95 *
96 * This cures, for instance, an assertion on fedora 21 that happens in
97 * vmsvga3dSurfaceStretchBlt if the login screen and the desktop has different
98 * sizes. The context of the login screen seems to have just been destroyed
99 * earlier and I believe the driver/X/whoever is attemting to strech the old
100 * screen content onto the new sized screen.
101 *
102 * @remarks This probably comes at a slight preformance expense, as we currently
103 * switches context when setting up the surface the first time. Not sure
104 * if we really need to, but as this is an experiment, I'm playing it safe.
105 * @remarks The define has been made default, thus should no longer be used.
106 */
107# define VMSVGA3D_OGL_WITH_SHARED_CTX
108/** Fake surface ID for the shared context. */
109# define VMSVGA3D_SHARED_CTX_ID UINT32_C(0xffffeeee)
110
111/** @def VBOX_VMSVGA3D_GL_HACK_LEVEL
112 * Turns out that on Linux gl.h may often define the first 2-4 OpenGL versions
113 * worth of extensions, but missing out on a function pointer of fifteen. This
114 * causes headache for us when we use the function pointers below. This hack
115 * changes the code to call the known problematic functions directly.
116 * The value is ((x)<<16 | (y)) where x and y are taken from the GL_VERSION_x_y.
117 */
118# ifndef VBOX_VMSVGA3D_GL_HACK_LEVEL
119# define VBOX_VMSVGA3D_GL_HACK_LEVEL 0
120# endif
121
122/** Invalid OpenGL ID. */
123# define OPENGL_INVALID_ID 0
124
125# define VMSVGA3D_CLEAR_CURRENT_CONTEXT(pState) \
126 do { (pState)->idActiveContext = OPENGL_INVALID_ID; } while (0)
127
128/** @def VMSVGA3D_SET_CURRENT_CONTEXT
129 * Makes sure the @a pContext is the active OpenGL context.
130 * @parm pState The VMSVGA3d state.
131 * @parm pContext The new context.
132 */
133# ifdef RT_OS_WINDOWS
134# define VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext) \
135 do { \
136 if ((pState)->idActiveContext != (pContext)->id) \
137 { \
138 BOOL fMakeCurrentRc = wglMakeCurrent((pContext)->hdc, (pContext)->hglrc); \
139 Assert(fMakeCurrentRc == TRUE); RT_NOREF_PV(fMakeCurrentRc); \
140 LogFlowFunc(("Changing context: %#x -> %#x\n", (pState)->idActiveContext, (pContext)->id)); \
141 (pState)->idActiveContext = (pContext)->id; \
142 } \
143 } while (0)
144
145# elif defined(RT_OS_DARWIN)
146# define VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext) \
147 do { \
148 if ((pState)->idActiveContext != (pContext)->id) \
149 { \
150 vmsvga3dCocoaViewMakeCurrentContext((pContext)->cocoaView, (pContext)->cocoaContext); \
151 LogFlowFunc(("Changing context: %#x -> %#x\n", (pState)->idActiveContext, (pContext)->id)); \
152 (pState)->idActiveContext = (pContext)->id; \
153 } \
154 } while (0)
155# else
156# define VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext) \
157 do { \
158 if ((pState)->idActiveContext != (pContext)->id) \
159 { \
160 Bool fMakeCurrentRc = glXMakeCurrent((pState)->display, \
161 (pContext)->window, \
162 (pContext)->glxContext); \
163 Assert(fMakeCurrentRc == True); RT_NOREF_PV(fMakeCurrentRc); \
164 LogFlowFunc(("Changing context: %#x -> %#x\n", (pState)->idActiveContext, (pContext)->id)); \
165 (pState)->idActiveContext = (pContext)->id; \
166 } \
167 } while (0)
168# endif
169
170/** @def VMSVGA3D_CLEAR_GL_ERRORS
171 * Clears all pending OpenGL errors.
172 *
173 * If I understood this correctly, OpenGL maintains a bitmask internally and
174 * glGetError gets the next bit (clearing it) from the bitmap and translates it
175 * into a GL_XXX constant value which it then returns. A single OpenGL call can
176 * set more than one bit, and they stick around across calls, from what I
177 * understand.
178 *
179 * So in order to be able to use glGetError to check whether a function
180 * succeeded, we need to call glGetError until all error bits have been cleared.
181 * This macro does that (in all types of builds).
182 *
183 * @sa VMSVGA3D_GET_GL_ERROR, VMSVGA3D_GL_IS_SUCCESS
184 */
185# define VMSVGA3D_CLEAR_GL_ERRORS() \
186 do { \
187 if (RT_UNLIKELY(glGetError() != GL_NO_ERROR)) /* predict no errors pending */ \
188 { \
189 uint32_t iErrorClearingLoopsLeft = 64; \
190 while (glGetError() != GL_NO_ERROR && iErrorClearingLoopsLeft > 0) \
191 iErrorClearingLoopsLeft--; \
192 } \
193 } while (0)
194
195/** @def VMSVGA3D_GET_LAST_GL_ERROR
196 * Gets the last OpenGL error, stores it in a_pContext->lastError and returns
197 * it.
198 *
199 * @returns Same as glGetError.
200 * @param a_pContext The context to store the error in.
201 *
202 * @sa VMSVGA3D_GL_IS_SUCCESS, VMSVGA3D_GL_COMPLAIN
203 */
204# define VMSVGA3D_GET_GL_ERROR(a_pContext) ((a_pContext)->lastError = glGetError())
205
206/** @def VMSVGA3D_GL_SUCCESS
207 * Checks whether VMSVGA3D_GET_LAST_GL_ERROR() return GL_NO_ERROR.
208 *
209 * Will call glGetError() and store the result in a_pContext->lastError.
210 * Will predict GL_NO_ERROR outcome.
211 *
212 * @returns True on success, false on error.
213 * @parm a_pContext The context to store the error in.
214 *
215 * @sa VMSVGA3D_GET_GL_ERROR, VMSVGA3D_GL_COMPLAIN
216 */
217# define VMSVGA3D_GL_IS_SUCCESS(a_pContext) RT_LIKELY((((a_pContext)->lastError = glGetError()) == GL_NO_ERROR))
218
219/** @def VMSVGA3D_GL_COMPLAIN
220 * Complains about one or more OpenGL errors (first in a_pContext->lastError).
221 *
222 * Strict builds will trigger an assertion, while other builds will put the
223 * first few occurences in the release log.
224 *
225 * All GL errors will be cleared after invocation. Assumes lastError
226 * is an error, will not check for GL_NO_ERROR.
227 *
228 * @param a_pState The 3D state structure.
229 * @param a_pContext The context that holds the first error.
230 * @param a_LogRelDetails Argument list for LogRel or similar that describes
231 * the operation in greater detail.
232 *
233 * @sa VMSVGA3D_GET_GL_ERROR, VMSVGA3D_GL_IS_SUCCESS
234 */
235# ifdef VBOX_STRICT
236# define VMSVGA3D_GL_COMPLAIN(a_pState, a_pContext, a_LogRelDetails) \
237 do { \
238 AssertMsg((a_pState)->idActiveContext == (a_pContext)->id, \
239 ("idActiveContext=%#x id=%x\n", (a_pState)->idActiveContext, (a_pContext)->id)); \
240 RTAssertMsg2Weak a_LogRelDetails; \
241 GLenum iNextError; \
242 while ((iNextError = glGetError()) != GL_NO_ERROR) \
243 RTAssertMsg2Weak("next error: %#x\n", iNextError); \
244 AssertMsgFailed(("first error: %#x (idActiveContext=%#x)\n", (a_pContext)->lastError, (a_pContext)->id)); \
245 } while (0)
246# else
247# define VMSVGA3D_GL_COMPLAIN(a_pState, a_pContext, a_LogRelDetails) \
248 do { \
249 LogRelMax(32, ("VMSVGA3d: OpenGL error %#x (idActiveContext=%#x) on line %u ", (a_pContext)->lastError, (a_pContext)->id)); \
250 GLenum iNextError; \
251 while ((iNextError = glGetError()) != GL_NO_ERROR) \
252 LogRelMax(32, (" - also error %#x ", iNextError)); \
253 LogRelMax(32, a_LogRelDetails); \
254 } while (0)
255# endif
256
257/** @def VMSVGA3D_GL_GET_AND_COMPLAIN
258 * Combination of VMSVGA3D_GET_GL_ERROR and VMSVGA3D_GL_COMPLAIN, assuming that
259 * there is a pending error.
260 *
261 * @param a_pState The 3D state structure.
262 * @param a_pContext The context that holds the first error.
263 * @param a_LogRelDetails Argument list for LogRel or similar that describes
264 * the operation in greater detail.
265 *
266 * @sa VMSVGA3D_GET_GL_ERROR, VMSVGA3D_GL_IS_SUCCESS, VMSVGA3D_GL_COMPLAIN
267 */
268# define VMSVGA3D_GL_GET_AND_COMPLAIN(a_pState, a_pContext, a_LogRelDetails) \
269 do { \
270 VMSVGA3D_GET_GL_ERROR(a_pContext); \
271 VMSVGA3D_GL_COMPLAIN(a_pState, a_pContext, a_LogRelDetails); \
272 } while (0)
273
274/** @def VMSVGA3D_GL_ASSERT_SUCCESS
275 * Asserts that VMSVGA3D_GL_IS_SUCCESS is true, complains if not.
276 *
277 * Uses VMSVGA3D_GL_COMPLAIN for complaining, so check it out wrt to release
278 * logging in non-strict builds.
279 *
280 * @param a_pState The 3D state structure.
281 * @param a_pContext The context that holds the first error.
282 * @param a_LogRelDetails Argument list for LogRel or similar that describes
283 * the operation in greater detail.
284 *
285 * @sa VMSVGA3D_GET_GL_ERROR, VMSVGA3D_GL_IS_SUCCESS, VMSVGA3D_GL_COMPLAIN
286 */
287# define VMSVGA3D_GL_ASSERT_SUCCESS(a_pState, a_pContext, a_LogRelDetails) \
288 if (VMSVGA3D_GL_IS_SUCCESS(a_pContext)) \
289 { /* likely */ } \
290 else do { \
291 VMSVGA3D_GL_COMPLAIN(a_pState, a_pContext, a_LogRelDetails); \
292 } while (0)
293
294/** @def VMSVGA3D_ASSERT_GL_CALL_EX
295 * Executes the specified OpenGL API call and asserts that it succeeded, variant
296 * with extra logging flexibility.
297 *
298 * ASSUMES no GL errors pending prior to invocation - caller should use
299 * VMSVGA3D_CLEAR_GL_ERRORS if uncertain.
300 *
301 * Uses VMSVGA3D_GL_COMPLAIN for complaining, so check it out wrt to release
302 * logging in non-strict builds.
303 *
304 * @param a_GlCall Expression making an OpenGL call.
305 * @param a_pState The 3D state structure.
306 * @param a_pContext The context that holds the first error.
307 * @param a_LogRelDetails Argument list for LogRel or similar that describes
308 * the operation in greater detail.
309 *
310 * @sa VMSVGA3D_ASSERT_GL_CALL, VMSVGA3D_GL_ASSERT_SUCCESS,
311 * VMSVGA3D_GET_GL_ERROR, VMSVGA3D_GL_IS_SUCCESS, VMSVGA3D_GL_COMPLAIN
312 */
313# define VMSVGA3D_ASSERT_GL_CALL_EX(a_GlCall, a_pState, a_pContext, a_LogRelDetails) \
314 do { \
315 (a_GlCall); \
316 VMSVGA3D_GL_ASSERT_SUCCESS(a_pState, a_pContext, a_LogRelDetails); \
317 } while (0)
318
319/** @def VMSVGA3D_ASSERT_GL_CALL
320 * Executes the specified OpenGL API call and asserts that it succeeded.
321 *
322 * ASSUMES no GL errors pending prior to invocation - caller should use
323 * VMSVGA3D_CLEAR_GL_ERRORS if uncertain.
324 *
325 * Uses VMSVGA3D_GL_COMPLAIN for complaining, so check it out wrt to release
326 * logging in non-strict builds.
327 *
328 * @param a_GlCall Expression making an OpenGL call.
329 * @param a_pState The 3D state structure.
330 * @param a_pContext The context that holds the first error.
331 *
332 * @sa VMSVGA3D_ASSERT_GL_CALL_EX, VMSVGA3D_GL_ASSERT_SUCCESS,
333 * VMSVGA3D_GET_GL_ERROR, VMSVGA3D_GL_IS_SUCCESS, VMSVGA3D_GL_COMPLAIN
334 */
335# define VMSVGA3D_ASSERT_GL_CALL(a_GlCall, a_pState, a_pContext) \
336 VMSVGA3D_ASSERT_GL_CALL_EX(a_GlCall, a_pState, a_pContext, ("%s\n", #a_GlCall))
337
338
339/** @def VMSVGA3D_CHECK_LAST_ERROR
340 * Checks that the last OpenGL error code indicates success.
341 *
342 * Will assert and return VERR_INTERNAL_ERROR in strict builds, in other
343 * builds it will do nothing and is a NOOP.
344 *
345 * @parm pState The VMSVGA3d state.
346 * @parm pContext The context.
347 *
348 * @todo Replace with proper error handling, it's crazy to return
349 * VERR_INTERNAL_ERROR in strict builds and just barge on ahead in
350 * release builds.
351 */
352# ifdef VBOX_STRICT
353# define VMSVGA3D_CHECK_LAST_ERROR(pState, pContext) do { \
354 Assert((pState)->idActiveContext == (pContext)->id); \
355 (pContext)->lastError = glGetError(); \
356 AssertMsgReturn((pContext)->lastError == GL_NO_ERROR, \
357 ("%s (%d): last error 0x%x\n", __FUNCTION__, __LINE__, (pContext)->lastError), \
358 VERR_INTERNAL_ERROR); \
359 } while (0)
360# else
361# define VMSVGA3D_CHECK_LAST_ERROR(pState, pContext) do { } while (0)
362# endif
363
364/** @def VMSVGA3D_CHECK_LAST_ERROR_WARN
365 * Checks that the last OpenGL error code indicates success.
366 *
367 * Will assert in strict builds, otherwise it's a NOOP.
368 *
369 * @parm pState The VMSVGA3d state.
370 * @parm pContext The new context.
371 */
372# ifdef VBOX_STRICT
373# define VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext) do { \
374 Assert((pState)->idActiveContext == (pContext)->id); \
375 (pContext)->lastError = glGetError(); \
376 AssertMsg((pContext)->lastError == GL_NO_ERROR, ("%s (%d): last error 0x%x\n", __FUNCTION__, __LINE__, (pContext)->lastError)); \
377 } while (0)
378# else
379# define VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext) do { } while (0)
380# endif
381
382#endif /* VMSVGA3D_OPENGL */
383
384#ifdef VMSVGA3D_DIRECT3D
385/* Enable to use Wine to convert D3D to opengl */
386//#define VBOX_VMSVGA3D_WITH_WINE_OPENGL
387#endif
388
389
390/*********************************************************************************************************************************
391* Structures and Typedefs *
392*********************************************************************************************************************************/
393/**
394 * Mipmap level.
395 */
396typedef struct VMSVGA3DMIPMAPLEVEL
397{
398 /** The mipmap size. */
399 SVGA3dSize size;
400 /** The size (in bytes) of the mimap data when using the format the surface was
401 * defined with. */
402 uint32_t cbSurface;
403 /** The scanline/pitch size in bytes. */
404 uint32_t cbSurfacePitch;
405 /** Pointer to the mipmap bytes (cbSurface). Often NULL. If the surface has
406 * been realized in hardware, this may be outdated. */
407 void *pSurfaceData;
408 /** Set if pvSurfaceData contains data not realized in hardware or pushed to the
409 * hardware surface yet. */
410 bool fDirty;
411} VMSVGA3DMIPMAPLEVEL;
412/** Pointer to a mipmap level. */
413typedef VMSVGA3DMIPMAPLEVEL *PVMSVGA3DMIPMAPLEVEL;
414
415
416#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
417/**
418 * SSM descriptor table for the VMSVGA3DMIPMAPLEVEL structure.
419 */
420static SSMFIELD const g_aVMSVGA3DMIPMAPLEVELFields[] =
421{
422 SSMFIELD_ENTRY( VMSVGA3DMIPMAPLEVEL, size),
423 SSMFIELD_ENTRY( VMSVGA3DMIPMAPLEVEL, cbSurface),
424 SSMFIELD_ENTRY( VMSVGA3DMIPMAPLEVEL, cbSurfacePitch),
425 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DMIPMAPLEVEL, pSurfaceData),
426 SSMFIELD_ENTRY_IGNORE( VMSVGA3DMIPMAPLEVEL, fDirty),
427 SSMFIELD_ENTRY_TERM()
428};
429#endif
430
431typedef struct VMSVGATRANSFORMSTATE
432{
433 bool fValid;
434 float matrix[16];
435} VMSVGATRANSFORMSTATE;
436typedef VMSVGATRANSFORMSTATE *PVMSVGATRANSFORMSTATE;
437
438typedef struct VMSVGAMATERIALSTATE
439{
440 bool fValid;
441 SVGA3dMaterial material;
442} VMSVGAMATERIALSTATE;
443typedef VMSVGAMATERIALSTATE *PVMSVGAMATERIALSTATE;
444
445typedef struct VMSVGACLIPPLANESTATE
446{
447 bool fValid;
448 float plane[4];
449} VMSVGACLIPPLANESTATE;
450typedef VMSVGACLIPPLANESTATE *PVMSVGACLIPPLANESTATE;
451
452typedef struct VMSVGALIGHTSTATE
453{
454 bool fEnabled;
455 bool fValidData;
456 SVGA3dLightData data;
457} VMSVGALIGHTSTATE;
458typedef VMSVGALIGHTSTATE *PVMSVGALIGHTSTATE;
459
460typedef struct VMSVGASHADERCONST
461{
462 bool fValid;
463 SVGA3dShaderConstType ctype;
464 uint32_t value[4];
465} VMSVGASHADERCONST;
466typedef VMSVGASHADERCONST *PVMSVGASHADERCONST;
467
468#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
469/**
470 * SSM descriptor table for the VMSVGASHADERCONST structure.
471 */
472static SSMFIELD const g_aVMSVGASHADERCONSTFields[] =
473{
474 SSMFIELD_ENTRY( VMSVGASHADERCONST, fValid),
475 SSMFIELD_ENTRY( VMSVGASHADERCONST, ctype),
476 SSMFIELD_ENTRY( VMSVGASHADERCONST, value),
477 SSMFIELD_ENTRY_TERM()
478};
479#endif
480
481#ifdef VMSVGA3D_DIRECT3D
482/**
483 *
484 */
485typedef struct
486{
487 /** Key is context id. */
488 AVLU32NODECORE Core;
489 union
490 {
491 IDirect3DSurface9 *pSurface;
492 IDirect3DTexture9 *pTexture;
493 IDirect3DCubeTexture9 *pCubeTexture;
494 } u;
495} VMSVGA3DSHAREDSURFACE;
496typedef VMSVGA3DSHAREDSURFACE *PVMSVGA3DSHAREDSURFACE;
497#endif /* VMSVGA3D_DIRECT3D */
498
499/**
500 * VMSVGA3d surface.
501 */
502typedef struct VMSVGA3DSURFACE
503{
504 uint32_t id;
505#ifdef VMSVGA3D_OPENGL
506 uint32_t idWeakContextAssociation;
507#else
508 uint32_t idAssociatedContext;
509#endif
510 uint32_t flags;
511 SVGA3dSurfaceFormat format;
512#ifdef VMSVGA3D_OPENGL
513 GLint internalFormatGL;
514 GLint formatGL;
515 GLint typeGL;
516 union
517 {
518 GLuint texture;
519 GLuint buffer;
520 GLuint renderbuffer;
521 } oglId;
522#endif
523 SVGA3dSurfaceFace faces[SVGA3D_MAX_SURFACE_FACES];
524 uint32_t cFaces;
525 uint32_t cMipmapLevels;
526 PVMSVGA3DMIPMAPLEVEL pMipmapLevels;
527 uint32_t multiSampleCount;
528 SVGA3dTextureFilter autogenFilter;
529#ifdef VMSVGA3D_DIRECT3D
530 D3DFORMAT formatD3D;
531 DWORD fUsageD3D;
532 D3DMULTISAMPLE_TYPE multiSampleTypeD3D;
533#endif
534
535 uint32_t cbBlock; /* block/pixel size in bytes */
536 /* Dirty state; surface was manually updated. */
537 bool fDirty;
538
539#ifdef VMSVGA3D_DIRECT3D
540 /* Handle for shared objects (currently only textures & render targets). */
541 HANDLE hSharedObject;
542 /** Event query inserted after each GPU operation that updates or uses this surface. */
543 IDirect3DQuery9 *pQuery;
544 union
545 {
546 IDirect3DSurface9 *pSurface;
547 IDirect3DCubeTexture9 *pCubeTexture;
548 IDirect3DIndexBuffer9 *pIndexBuffer;
549 IDirect3DTexture9 *pTexture;
550 IDirect3DVertexBuffer9 *pVertexBuffer;
551 } u;
552 union
553 {
554 IDirect3DTexture9 *pTexture;
555 } bounce;
556 /** AVL tree containing VMSVGA3DSHAREDSURFACE structures. */
557 AVLU32TREE pSharedObjectTree;
558 bool fStencilAsTexture;
559 uint32_t fu32ActualUsageFlags;
560#endif
561} VMSVGA3DSURFACE;
562/** Pointer to a 3d surface. */
563typedef VMSVGA3DSURFACE *PVMSVGA3DSURFACE;
564
565#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
566/**
567 * SSM descriptor table for the VMSVGA3DSURFACE structure.
568 */
569static SSMFIELD const g_aVMSVGA3DSURFACEFields[] =
570{
571 SSMFIELD_ENTRY( VMSVGA3DSURFACE, id),
572# ifdef VMSVGA3D_OPENGL
573 SSMFIELD_ENTRY( VMSVGA3DSURFACE, idWeakContextAssociation),
574# else
575 SSMFIELD_ENTRY( VMSVGA3DSURFACE, idAssociatedContext),
576# endif
577 SSMFIELD_ENTRY( VMSVGA3DSURFACE, flags),
578 SSMFIELD_ENTRY( VMSVGA3DSURFACE, format),
579# ifdef VMSVGA3D_OPENGL
580 SSMFIELD_ENTRY( VMSVGA3DSURFACE, internalFormatGL),
581 SSMFIELD_ENTRY( VMSVGA3DSURFACE, formatGL),
582 SSMFIELD_ENTRY( VMSVGA3DSURFACE, typeGL),
583 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, id),
584# endif
585 SSMFIELD_ENTRY( VMSVGA3DSURFACE, faces),
586 SSMFIELD_ENTRY( VMSVGA3DSURFACE, cFaces),
587 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, pMipmapLevels),
588 SSMFIELD_ENTRY( VMSVGA3DSURFACE, multiSampleCount),
589 SSMFIELD_ENTRY( VMSVGA3DSURFACE, autogenFilter),
590# ifdef VMSVGA3D_DIRECT3D
591 SSMFIELD_ENTRY( VMSVGA3DSURFACE, format), /** @todo format duplicated. */
592 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, formatD3D),
593 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, fUsageD3D),
594 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, multiSampleTypeD3D),
595# endif
596 SSMFIELD_ENTRY( VMSVGA3DSURFACE, cbBlock),
597 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, fDirty),
598# ifdef VMSVGA3D_DIRECT3D
599 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, hSharedObject),
600 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, pQuery),
601 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, u.pSurface),
602 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, bounce.pTexture),
603 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, pSharedObjectTree),
604 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, fStencilAsTexture),
605# endif
606 SSMFIELD_ENTRY_TERM()
607};
608#endif
609
610/** Mask we frequently apply to VMSVGA3DSURFACE::flags for decing what kind
611 * of surface we're dealing. */
612#define VMSVGA3D_SURFACE_HINT_SWITCH_MASK \
613 ( SVGA3D_SURFACE_HINT_INDEXBUFFER | SVGA3D_SURFACE_HINT_VERTEXBUFFER \
614 | SVGA3D_SURFACE_HINT_TEXTURE | SVGA3D_SURFACE_HINT_RENDERTARGET \
615 | SVGA3D_SURFACE_HINT_DEPTHSTENCIL | SVGA3D_SURFACE_CUBEMAP )
616
617/** @def VMSVGA3DSURFACE_HAS_HW_SURFACE
618 * Checks whether the surface has a host hardware/library surface.
619 * @returns true/false
620 * @param a_pSurface The VMSVGA3d surface.
621 */
622#ifdef VMSVGA3D_DIRECT3D
623# define VMSVGA3DSURFACE_HAS_HW_SURFACE(a_pSurface) ((a_pSurface)->u.pSurface != NULL)
624#else
625# define VMSVGA3DSURFACE_HAS_HW_SURFACE(a_pSurface) ((a_pSurface)->oglId.texture != OPENGL_INVALID_ID)
626#endif
627
628
629
630typedef struct VMSVGA3DSHADER
631{
632 uint32_t id;
633 uint32_t cid;
634 SVGA3dShaderType type;
635 uint32_t cbData;
636 void *pShaderProgram;
637 union
638 {
639#ifdef VMSVGA3D_DIRECT3D
640 IDirect3DVertexShader9 *pVertexShader;
641 IDirect3DPixelShader9 *pPixelShader;
642#else
643 void *pVertexShader;
644 void *pPixelShader;
645#endif
646 void *pv;
647 } u;
648} VMSVGA3DSHADER;
649typedef VMSVGA3DSHADER *PVMSVGA3DSHADER;
650
651#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
652/**
653 * SSM descriptor table for the VMSVGA3DSHADER structure.
654 */
655static SSMFIELD const g_aVMSVGA3DSHADERFields[] =
656{
657 SSMFIELD_ENTRY( VMSVGA3DSHADER, id),
658 SSMFIELD_ENTRY( VMSVGA3DSHADER, cid),
659 SSMFIELD_ENTRY( VMSVGA3DSHADER, type),
660 SSMFIELD_ENTRY( VMSVGA3DSHADER, cbData),
661 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSHADER, pShaderProgram),
662 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSHADER, u.pv),
663 SSMFIELD_ENTRY_TERM()
664};
665#endif
666
667/** @name VMSVGA3D_UPDATE_XXX - ...
668 * @{ */
669#define VMSVGA3D_UPDATE_SCISSORRECT RT_BIT_32(0)
670#define VMSVGA3D_UPDATE_ZRANGE RT_BIT_32(1)
671#define VMSVGA3D_UPDATE_VIEWPORT RT_BIT_32(2)
672#define VMSVGA3D_UPDATE_VERTEXSHADER RT_BIT_32(3)
673#define VMSVGA3D_UPDATE_PIXELSHADER RT_BIT_32(4)
674#define VMSVGA3D_UPDATE_TRANSFORM RT_BIT_32(5)
675#define VMSVGA3D_UPDATE_MATERIAL RT_BIT_32(6)
676/** @} */
677
678/**
679 * VMSVGA3d context.
680 */
681typedef struct VMSVGA3DCONTEXT
682{
683 uint32_t id;
684#ifdef RT_OS_WINDOWS
685# ifdef VMSVGA3D_DIRECT3D
686# ifdef VBOX_VMSVGA3D_WITH_WINE_OPENGL
687 IDirect3DDevice9 *pDevice;
688# else
689 IDirect3DDevice9Ex *pDevice;
690# endif
691# else
692 /* Device context of the context window. */
693 HDC hdc;
694 /* OpenGL rendering context handle. */
695 HGLRC hglrc;
696# endif
697 /* Device context window handle. */
698 HWND hwnd;
699#elif defined(RT_OS_DARWIN)
700 /* OpenGL rendering context */
701 NativeNSOpenGLContextRef cocoaContext;
702 NativeNSViewRef cocoaView;
703 bool fOtherProfile;
704#else
705 /** XGL rendering context handle */
706 GLXContext glxContext;
707 /** Device context window handle */
708 Window window;
709 /** flag whether the window is mapped (=visible) */
710 bool fMapped;
711#endif
712
713#ifdef VMSVGA3D_OPENGL
714 /* Framebuffer object associated with this context. */
715 GLuint idFramebuffer;
716 /* Read and draw framebuffer objects for various operations. */
717 GLuint idReadFramebuffer;
718 GLuint idDrawFramebuffer;
719 /* Last GL error recorded. */
720 GLenum lastError;
721 void *pShaderContext;
722#endif
723
724 /* Current active render target (if any) */
725 uint32_t sidRenderTarget;
726 /* Current selected texture surfaces (if any) */
727 uint32_t aSidActiveTexture[SVGA3D_MAX_TEXTURE_STAGE];
728 /* Per context pixel and vertex shaders. */
729 uint32_t cPixelShaders;
730 PVMSVGA3DSHADER paPixelShader;
731 uint32_t cVertexShaders;
732 PVMSVGA3DSHADER paVertexShader;
733 /* Keep track of the internal state to be able to recreate the context properly (save/restore, window resize). */
734 struct
735 {
736 /** VMSVGA3D_UPDATE_XXX */
737 uint32_t u32UpdateFlags;
738
739 SVGA3dRenderState aRenderState[SVGA3D_RS_MAX];
740 SVGA3dTextureState aTextureState[SVGA3D_MAX_TEXTURE_STAGE][SVGA3D_TS_MAX];
741 VMSVGATRANSFORMSTATE aTransformState[SVGA3D_TRANSFORM_MAX];
742 VMSVGAMATERIALSTATE aMaterial[SVGA3D_FACE_MAX];
743 VMSVGACLIPPLANESTATE aClipPlane[SVGA3D_CLIPPLANE_MAX];
744 VMSVGALIGHTSTATE aLightData[SVGA3D_MAX_LIGHTS];
745
746 uint32_t aRenderTargets[SVGA3D_RT_MAX];
747 SVGA3dRect RectScissor;
748 SVGA3dRect RectViewPort;
749 SVGA3dZRange zRange;
750 uint32_t shidPixel;
751 uint32_t shidVertex;
752
753 uint32_t cPixelShaderConst;
754 PVMSVGASHADERCONST paPixelShaderConst;
755 uint32_t cVertexShaderConst;
756 PVMSVGASHADERCONST paVertexShaderConst;
757 } state;
758} VMSVGA3DCONTEXT;
759/** Pointer to a VMSVGA3d context. */
760typedef VMSVGA3DCONTEXT *PVMSVGA3DCONTEXT;
761
762#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
763/**
764 * SSM descriptor table for the VMSVGA3DCONTEXT structure.
765 */
766static SSMFIELD const g_aVMSVGA3DCONTEXTFields[] =
767{
768 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, id),
769
770# ifdef RT_OS_WINDOWS
771# ifdef VMSVGA3D_DIRECT3D
772 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, pDevice),
773# else
774 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, hdc),
775 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, hglrc),
776# endif
777 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, hwnd),
778# elif defined(RT_OS_DARWIN)
779 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, cocoaContext),
780 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, cocoaView),
781 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, fOtherProfile),
782# else
783 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, glxContext),
784 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, window),
785 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, fMapped),
786# endif
787
788#ifdef VMSVGA3D_OPENGL
789 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, idFramebuffer),
790 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, idReadFramebuffer),
791 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, idDrawFramebuffer),
792 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, lastError),
793 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, pShaderContext),
794#endif
795
796 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, sidRenderTarget),
797 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, aSidActiveTexture),
798 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, cPixelShaders),
799 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, paPixelShader),
800 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, cVertexShaders),
801 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, paVertexShader),
802 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.u32UpdateFlags),
803
804 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aRenderState),
805 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aTextureState),
806 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aTransformState),
807 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aMaterial),
808 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aClipPlane),
809 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aLightData),
810
811 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aRenderTargets),
812 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.RectScissor),
813 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.RectViewPort),
814 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.zRange),
815 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.shidPixel),
816 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.shidVertex),
817 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.cPixelShaderConst),
818 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, state.paPixelShaderConst),
819 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.cVertexShaderConst),
820 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, state.paVertexShaderConst),
821 SSMFIELD_ENTRY_TERM()
822};
823#endif /* VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS */
824
825
826/**
827 * VMSVGA3d state data.
828 *
829 * Allocated on the heap and pointed to by VMSVGAState::p3dState.
830 */
831typedef struct VMSVGA3DSTATE
832{
833 /** The size of papContexts. */
834 uint32_t cContexts;
835 /** The size of papSurfaces. */
836 uint32_t cSurfaces;
837 /** Contexts indexed by ID. Grown as needed. */
838 PVMSVGA3DCONTEXT *papContexts;
839 /** Surfaces indexed by ID. Grown as needed. */
840 PVMSVGA3DSURFACE *papSurfaces;
841
842#ifdef RT_OS_WINDOWS
843# ifdef VMSVGA3D_DIRECT3D
844# ifdef VBOX_VMSVGA3D_WITH_WINE_OPENGL
845 IDirect3D9 *pD3D9;
846# else
847 IDirect3D9Ex *pD3D9;
848# endif
849 D3DCAPS9 caps;
850 bool fSupportedSurfaceINTZ;
851 bool fSupportedSurfaceNULL;
852# endif
853 /** Window Thread. */
854 R3PTRTYPE(RTTHREAD) pWindowThread;
855 DWORD idWindowThread;
856 HMODULE hInstance;
857 /** Window request semaphore. */
858 RTSEMEVENT WndRequestSem;
859#elif defined(RT_OS_DARWIN)
860#else
861 /* The X display */
862 Display *display;
863 R3PTRTYPE(RTTHREAD) pWindowThread;
864 bool bTerminate;
865#endif
866
867#ifdef VMSVGA3D_OPENGL
868 float rsGLVersion;
869 /* Current active context. */
870 uint32_t idActiveContext;
871
872 struct
873 {
874 PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
875 PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
876 PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
877 PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
878 PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
879 PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
880 PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
881 PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
882 PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
883 PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
884 PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
885 PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
886 PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
887 PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
888 PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
889 PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
890 PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
891 PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
892 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
893 PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
894 PFNGLPOINTPARAMETERFPROC glPointParameterf;
895#if VBOX_VMSVGA3D_GL_HACK_LEVEL < 0x102
896 PFNGLBLENDCOLORPROC glBlendColor;
897 PFNGLBLENDEQUATIONPROC glBlendEquation;
898#endif
899 PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate;
900 PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
901 PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate;
902 PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate;
903 PFNGLBINDBUFFERPROC glBindBuffer;
904 PFNGLDELETEBUFFERSPROC glDeleteBuffers;
905 PFNGLGENBUFFERSPROC glGenBuffers;
906 PFNGLBUFFERDATAPROC glBufferData;
907 PFNGLMAPBUFFERPROC glMapBuffer;
908 PFNGLUNMAPBUFFERPROC glUnmapBuffer;
909 PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
910 PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
911 PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
912 PFNGLFOGCOORDPOINTERPROC glFogCoordPointer;
913 PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex;
914 PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex;
915 PFNGLACTIVETEXTUREPROC glActiveTexture;
916#if VBOX_VMSVGA3D_GL_HACK_LEVEL < 0x103
917 PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture;
918#endif
919 PFNGLGETPROGRAMIVARBPROC glGetProgramivARB;
920 PFNGLPROVOKINGVERTEXPROC glProvokingVertex;
921 bool fEXT_stencil_two_side;
922 } ext;
923
924 struct
925 {
926 GLint maxActiveLights;
927 GLint maxTextureBufferSize;
928 GLint maxTextures;
929 GLint maxClipDistances;
930 GLint maxColorAttachments;
931 GLint maxRectangleTextureSize;
932 GLint maxTextureAnisotropy;
933 GLint maxVertexShaderInstructions;
934 GLint maxFragmentShaderInstructions;
935 GLint maxVertexShaderTemps;
936 GLint maxFragmentShaderTemps;
937 GLfloat flPointSize[2];
938 SVGA3dPixelShaderVersion fragmentShaderVersion;
939 SVGA3dVertexShaderVersion vertexShaderVersion;
940 bool fS3TCSupported;
941 } caps;
942
943 /** The GL_EXTENSIONS value (space padded) for the default OpenGL profile.
944 * Free with RTStrFree. */
945 R3PTRTYPE(char *) pszExtensions;
946
947 /** The GL_EXTENSIONS value (space padded) for the other OpenGL profile.
948 * Free with RTStrFree.
949 *
950 * This is used to detect shader model version since some implementations
951 * (darwin) hides extensions that have made it into core and probably a
952 * bunch of others when using a OpenGL core profile instead of a legacy one */
953 R3PTRTYPE(char *) pszOtherExtensions;
954 /** The version of the other GL profile. */
955 float rsOtherGLVersion;
956
957 /** Shader talk back interface. */
958 VBOXVMSVGASHADERIF ShaderIf;
959
960# ifdef VMSVGA3D_OPENGL
961 /** The shared context. */
962 VMSVGA3DCONTEXT SharedCtx;
963# endif
964#endif /* VMSVGA3D_OPENGL */
965} VMSVGA3DSTATE;
966
967#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
968/**
969 * SSM descriptor table for the VMSVGA3DSTATE structure.
970 *
971 * @remarks This isn't a complete structure markup, only fields with state.
972 */
973static SSMFIELD const g_aVMSVGA3DSTATEFields[] =
974{
975# ifdef VMSVGA3D_OPENGL
976 SSMFIELD_ENTRY( VMSVGA3DSTATE, rsGLVersion), /** @todo Why are we saving the GL version?? */
977# endif
978 SSMFIELD_ENTRY( VMSVGA3DSTATE, cContexts),
979 SSMFIELD_ENTRY( VMSVGA3DSTATE, cSurfaces),
980 SSMFIELD_ENTRY_TERM()
981};
982#endif /* VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS */
983
984
985#ifdef VMSVGA3D_DIRECT3D
986D3DFORMAT vmsvga3dSurfaceFormat2D3D(SVGA3dSurfaceFormat format);
987D3DMULTISAMPLE_TYPE vmsvga3dMultipeSampleCount2D3D(uint32_t multisampleCount);
988DECLCALLBACK(int) vmsvga3dSharedSurfaceDestroyTree(PAVLU32NODECORE pNode, void *pvParam);
989int vmsvga3dSurfaceFlush(PVGASTATE pThis, PVMSVGA3DSURFACE pSurface);
990#endif /* VMSVGA3D_DIRECT3D */
991
992
993#ifdef VMSVGA3D_OPENGL
994/** Save and setup everything. */
995# define VMSVGA3D_PARANOID_TEXTURE_PACKING
996
997/**
998 * Saved texture packing parameters (shared by both pack and unpack).
999 */
1000typedef struct VMSVGAPACKPARAMS
1001{
1002 GLint iAlignment;
1003 GLint cxRow;
1004# ifdef VMSVGA3D_PARANOID_TEXTURE_PACKING
1005 GLint cyImage;
1006 GLboolean fSwapBytes;
1007 GLboolean fLsbFirst;
1008 GLint cSkipRows;
1009 GLint cSkipPixels;
1010 GLint cSkipImages;
1011# endif
1012} VMSVGAPACKPARAMS;
1013/** Pointer to saved texture packing parameters. */
1014typedef VMSVGAPACKPARAMS *PVMSVGAPACKPARAMS;
1015/** Pointer to const saved texture packing parameters. */
1016typedef VMSVGAPACKPARAMS const *PCVMSVGAPACKPARAMS;
1017
1018void vmsvga3dOglSetPackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1019 PVMSVGAPACKPARAMS pSave);
1020void vmsvga3dOglRestorePackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1021 PCVMSVGAPACKPARAMS pSave);
1022void vmsvga3dOglSetUnpackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1023 PVMSVGAPACKPARAMS pSave);
1024void vmsvga3dOglRestoreUnpackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1025 PCVMSVGAPACKPARAMS pSave);
1026
1027/** @name VMSVGA3D_DEF_CTX_F_XXX - vmsvga3dContextDefineOgl flags.
1028 * @{ */
1029/** When clear, the context is created using the default OpenGL profile.
1030 * When set, it's created using the alternative profile. The latter is only
1031 * allowed if the VBOX_VMSVGA3D_DUAL_OPENGL_PROFILE is set. */
1032# define VMSVGA3D_DEF_CTX_F_OTHER_PROFILE RT_BIT_32(0)
1033/** Defining the shared context. */
1034# define VMSVGA3D_DEF_CTX_F_SHARED_CTX RT_BIT_32(1)
1035/** Defining the init time context (EMT). */
1036# define VMSVGA3D_DEF_CTX_F_INIT RT_BIT_32(2)
1037/** @} */
1038int vmsvga3dContextDefineOgl(PVGASTATE pThis, uint32_t cid, uint32_t fFlags);
1039void vmsvga3dSurfaceFormat2OGL(PVMSVGA3DSURFACE pSurface, SVGA3dSurfaceFormat format);
1040
1041#endif /* VMSVGA3D_OPENGL */
1042
1043
1044/* DevVGA-SVGA3d-shared.cpp: */
1045int vmsvga3dSaveShaderConst(PVMSVGA3DCONTEXT pContext, uint32_t reg, SVGA3dShaderType type, SVGA3dShaderConstType ctype,
1046 uint32_t val1, uint32_t val2, uint32_t val3, uint32_t val4);
1047
1048
1049
1050/* Command implementation workers. */
1051void vmsvga3dBackSurfaceDestroy(PVMSVGA3DSTATE pState, PVMSVGA3DSURFACE pSurface);
1052int vmsvga3dBackSurfaceStretchBlt(PVGASTATE pThis, PVMSVGA3DSTATE pState,
1053 PVMSVGA3DSURFACE pDstSurface, uint32_t uDstMipmap, SVGA3dBox const *pDstBox,
1054 PVMSVGA3DSURFACE pSrcSurface, uint32_t uSrcMipmap, SVGA3dBox const *pSrcBox,
1055 SVGA3dStretchBltMode enmMode, PVMSVGA3DCONTEXT pContext);
1056int vmsvga3dBackSurfaceDMACopyBox(PVGASTATE pThis, PVMSVGA3DSTATE pState, PVMSVGA3DSURFACE pSurface, uint32_t uHostMimap,
1057 SVGAGuestPtr GuestPtr, uint32_t cbSrcPitch, SVGA3dTransferType transfer,
1058 SVGA3dCopyBox const *pBox, PVMSVGA3DCONTEXT pContext, int rc, int iBox);
1059
1060int vmsvga3dBackCreateTexture(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, uint32_t idAssociatedContext,
1061 PVMSVGA3DSURFACE pSurface);
1062
1063void vmsvgaClipCopyBox(const SVGA3dSize *pSizeSrc,
1064 const SVGA3dSize *pSizeDest,
1065 SVGA3dCopyBox *pBox);
1066void vmsvgaClipBox(const SVGA3dSize *pSize,
1067 SVGA3dBox *pBox);
1068
1069#endif
1070
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