VirtualBox

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

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

DevVGA_SVGA: fixed index/vertex buffer usage with recent Mesa

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 42.1 KB
Line 
1/* $Id: DevVGA-SVGA3d-internal.h 64483 2016-10-29 11:28:48Z 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 PVMSVGA3DMIPMAPLEVEL pMipmapLevels;
526 uint32_t multiSampleCount;
527 SVGA3dTextureFilter autogenFilter;
528#ifdef VMSVGA3D_DIRECT3D
529 D3DFORMAT formatD3D;
530 DWORD fUsageD3D;
531 D3DMULTISAMPLE_TYPE multiSampleTypeD3D;
532#endif
533
534 uint32_t cbBlock; /* block/pixel size in bytes */
535 /* Dirty state; surface was manually updated. */
536 bool fDirty;
537
538#ifdef VMSVGA3D_DIRECT3D
539 /* Handle for shared objects (currently only textures & render targets). */
540 HANDLE hSharedObject;
541 /** Event query inserted after each GPU operation that updates or uses this surface. */
542 IDirect3DQuery9 *pQuery;
543 union
544 {
545 IDirect3DSurface9 *pSurface;
546 IDirect3DCubeTexture9 *pCubeTexture;
547 IDirect3DIndexBuffer9 *pIndexBuffer;
548 IDirect3DTexture9 *pTexture;
549 IDirect3DVertexBuffer9 *pVertexBuffer;
550 } u;
551 union
552 {
553 IDirect3DTexture9 *pTexture;
554 } bounce;
555 /** AVL tree containing VMSVGA3DSHAREDSURFACE structures. */
556 AVLU32TREE pSharedObjectTree;
557 bool fStencilAsTexture;
558 uint32_t fu32ActualUsageFlags;
559#endif
560} VMSVGA3DSURFACE;
561/** Pointer to a 3d surface. */
562typedef VMSVGA3DSURFACE *PVMSVGA3DSURFACE;
563
564#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
565/**
566 * SSM descriptor table for the VMSVGA3DSURFACE structure.
567 */
568static SSMFIELD const g_aVMSVGA3DSURFACEFields[] =
569{
570 SSMFIELD_ENTRY( VMSVGA3DSURFACE, id),
571# ifdef VMSVGA3D_OPENGL
572 SSMFIELD_ENTRY( VMSVGA3DSURFACE, idWeakContextAssociation),
573# else
574 SSMFIELD_ENTRY( VMSVGA3DSURFACE, idAssociatedContext),
575# endif
576 SSMFIELD_ENTRY( VMSVGA3DSURFACE, flags),
577 SSMFIELD_ENTRY( VMSVGA3DSURFACE, format),
578# ifdef VMSVGA3D_OPENGL
579 SSMFIELD_ENTRY( VMSVGA3DSURFACE, internalFormatGL),
580 SSMFIELD_ENTRY( VMSVGA3DSURFACE, formatGL),
581 SSMFIELD_ENTRY( VMSVGA3DSURFACE, typeGL),
582 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, id),
583# endif
584 SSMFIELD_ENTRY( VMSVGA3DSURFACE, faces),
585 SSMFIELD_ENTRY( VMSVGA3DSURFACE, cFaces),
586 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, pMipmapLevels),
587 SSMFIELD_ENTRY( VMSVGA3DSURFACE, multiSampleCount),
588 SSMFIELD_ENTRY( VMSVGA3DSURFACE, autogenFilter),
589# ifdef VMSVGA3D_DIRECT3D
590 SSMFIELD_ENTRY( VMSVGA3DSURFACE, format), /** @todo format duplicated. */
591 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, formatD3D),
592 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, fUsageD3D),
593 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, multiSampleTypeD3D),
594# endif
595 SSMFIELD_ENTRY( VMSVGA3DSURFACE, cbBlock),
596 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, fDirty),
597# ifdef VMSVGA3D_DIRECT3D
598 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, hSharedObject),
599 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, pQuery),
600 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, u.pSurface),
601 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSURFACE, bounce.pTexture),
602 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, pSharedObjectTree),
603 SSMFIELD_ENTRY_IGNORE( VMSVGA3DSURFACE, fStencilAsTexture),
604# endif
605 SSMFIELD_ENTRY_TERM()
606};
607#endif
608
609/** Mask we frequently apply to VMSVGA3DSURFACE::flags for decing what kind
610 * of surface we're dealing. */
611#define VMSVGA3D_SURFACE_HINT_SWITCH_MASK \
612 ( SVGA3D_SURFACE_HINT_INDEXBUFFER | SVGA3D_SURFACE_HINT_VERTEXBUFFER \
613 | SVGA3D_SURFACE_HINT_TEXTURE | SVGA3D_SURFACE_HINT_RENDERTARGET \
614 | SVGA3D_SURFACE_HINT_DEPTHSTENCIL | SVGA3D_SURFACE_CUBEMAP )
615
616/** @def VMSVGA3DSURFACE_HAS_HW_SURFACE
617 * Checks whether the surface has a host hardware/library surface.
618 * @returns true/false
619 * @param a_pSurface The VMSVGA3d surface.
620 */
621#ifdef VMSVGA3D_DIRECT3D
622# define VMSVGA3DSURFACE_HAS_HW_SURFACE(a_pSurface) ((a_pSurface)->u.pSurface != NULL)
623#else
624# define VMSVGA3DSURFACE_HAS_HW_SURFACE(a_pSurface) ((a_pSurface)->oglId.texture != OPENGL_INVALID_ID)
625#endif
626
627
628
629typedef struct VMSVGA3DSHADER
630{
631 uint32_t id;
632 uint32_t cid;
633 SVGA3dShaderType type;
634 uint32_t cbData;
635 void *pShaderProgram;
636 union
637 {
638#ifdef VMSVGA3D_DIRECT3D
639 IDirect3DVertexShader9 *pVertexShader;
640 IDirect3DPixelShader9 *pPixelShader;
641#else
642 void *pVertexShader;
643 void *pPixelShader;
644#endif
645 void *pv;
646 } u;
647} VMSVGA3DSHADER;
648typedef VMSVGA3DSHADER *PVMSVGA3DSHADER;
649
650#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
651/**
652 * SSM descriptor table for the VMSVGA3DSHADER structure.
653 */
654static SSMFIELD const g_aVMSVGA3DSHADERFields[] =
655{
656 SSMFIELD_ENTRY( VMSVGA3DSHADER, id),
657 SSMFIELD_ENTRY( VMSVGA3DSHADER, cid),
658 SSMFIELD_ENTRY( VMSVGA3DSHADER, type),
659 SSMFIELD_ENTRY( VMSVGA3DSHADER, cbData),
660 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSHADER, pShaderProgram),
661 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DSHADER, u.pv),
662 SSMFIELD_ENTRY_TERM()
663};
664#endif
665
666/** @name VMSVGA3D_UPDATE_XXX - ...
667 * @{ */
668#define VMSVGA3D_UPDATE_SCISSORRECT RT_BIT_32(0)
669#define VMSVGA3D_UPDATE_ZRANGE RT_BIT_32(1)
670#define VMSVGA3D_UPDATE_VIEWPORT RT_BIT_32(2)
671#define VMSVGA3D_UPDATE_VERTEXSHADER RT_BIT_32(3)
672#define VMSVGA3D_UPDATE_PIXELSHADER RT_BIT_32(4)
673#define VMSVGA3D_UPDATE_TRANSFORM RT_BIT_32(5)
674#define VMSVGA3D_UPDATE_MATERIAL RT_BIT_32(6)
675/** @} */
676
677/**
678 * VMSVGA3d context.
679 */
680typedef struct VMSVGA3DCONTEXT
681{
682 uint32_t id;
683#ifdef RT_OS_WINDOWS
684# ifdef VMSVGA3D_DIRECT3D
685# ifdef VBOX_VMSVGA3D_WITH_WINE_OPENGL
686 IDirect3DDevice9 *pDevice;
687# else
688 IDirect3DDevice9Ex *pDevice;
689# endif
690# else
691 /* Device context of the context window. */
692 HDC hdc;
693 /* OpenGL rendering context handle. */
694 HGLRC hglrc;
695# endif
696 /* Device context window handle. */
697 HWND hwnd;
698#elif defined(RT_OS_DARWIN)
699 /* OpenGL rendering context */
700 NativeNSOpenGLContextRef cocoaContext;
701 NativeNSViewRef cocoaView;
702 bool fOtherProfile;
703#else
704 /** XGL rendering context handle */
705 GLXContext glxContext;
706 /** Device context window handle */
707 Window window;
708 /** flag whether the window is mapped (=visible) */
709 bool fMapped;
710#endif
711
712#ifdef VMSVGA3D_OPENGL
713 /* Framebuffer object associated with this context. */
714 GLuint idFramebuffer;
715 /* Read and draw framebuffer objects for various operations. */
716 GLuint idReadFramebuffer;
717 GLuint idDrawFramebuffer;
718 /* Last GL error recorded. */
719 GLenum lastError;
720 void *pShaderContext;
721#endif
722
723 /* Current active render target (if any) */
724 uint32_t sidRenderTarget;
725 /* Current selected texture surfaces (if any) */
726 uint32_t aSidActiveTexture[SVGA3D_MAX_TEXTURE_STAGE];
727 /* Per context pixel and vertex shaders. */
728 uint32_t cPixelShaders;
729 PVMSVGA3DSHADER paPixelShader;
730 uint32_t cVertexShaders;
731 PVMSVGA3DSHADER paVertexShader;
732 /* Keep track of the internal state to be able to recreate the context properly (save/restore, window resize). */
733 struct
734 {
735 /** VMSVGA3D_UPDATE_XXX */
736 uint32_t u32UpdateFlags;
737
738 SVGA3dRenderState aRenderState[SVGA3D_RS_MAX];
739 SVGA3dTextureState aTextureState[SVGA3D_MAX_TEXTURE_STAGE][SVGA3D_TS_MAX];
740 VMSVGATRANSFORMSTATE aTransformState[SVGA3D_TRANSFORM_MAX];
741 VMSVGAMATERIALSTATE aMaterial[SVGA3D_FACE_MAX];
742 VMSVGACLIPPLANESTATE aClipPlane[SVGA3D_CLIPPLANE_MAX];
743 VMSVGALIGHTSTATE aLightData[SVGA3D_MAX_LIGHTS];
744
745 uint32_t aRenderTargets[SVGA3D_RT_MAX];
746 SVGA3dRect RectScissor;
747 SVGA3dRect RectViewPort;
748 SVGA3dZRange zRange;
749 uint32_t shidPixel;
750 uint32_t shidVertex;
751
752 uint32_t cPixelShaderConst;
753 PVMSVGASHADERCONST paPixelShaderConst;
754 uint32_t cVertexShaderConst;
755 PVMSVGASHADERCONST paVertexShaderConst;
756 } state;
757} VMSVGA3DCONTEXT;
758/** Pointer to a VMSVGA3d context. */
759typedef VMSVGA3DCONTEXT *PVMSVGA3DCONTEXT;
760
761#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
762/**
763 * SSM descriptor table for the VMSVGA3DCONTEXT structure.
764 */
765static SSMFIELD const g_aVMSVGA3DCONTEXTFields[] =
766{
767 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, id),
768
769# ifdef RT_OS_WINDOWS
770# ifdef VMSVGA3D_DIRECT3D
771 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, pDevice),
772# else
773 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, hdc),
774 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, hglrc),
775# endif
776 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, hwnd),
777# elif defined(RT_OS_DARWIN)
778 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, cocoaContext),
779 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, cocoaView),
780 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, fOtherProfile),
781# else
782 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, glxContext),
783 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, window),
784 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, fMapped),
785# endif
786
787#ifdef VMSVGA3D_OPENGL
788 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, idFramebuffer),
789 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, idReadFramebuffer),
790 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, idDrawFramebuffer),
791 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, lastError),
792 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, pShaderContext),
793#endif
794
795 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, sidRenderTarget),
796 SSMFIELD_ENTRY_IGNORE( VMSVGA3DCONTEXT, aSidActiveTexture),
797 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, cPixelShaders),
798 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, paPixelShader),
799 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, cVertexShaders),
800 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, paVertexShader),
801 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.u32UpdateFlags),
802
803 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aRenderState),
804 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aTextureState),
805 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aTransformState),
806 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aMaterial),
807 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aClipPlane),
808 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aLightData),
809
810 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.aRenderTargets),
811 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.RectScissor),
812 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.RectViewPort),
813 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.zRange),
814 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.shidPixel),
815 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.shidVertex),
816 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.cPixelShaderConst),
817 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, state.paPixelShaderConst),
818 SSMFIELD_ENTRY( VMSVGA3DCONTEXT, state.cVertexShaderConst),
819 SSMFIELD_ENTRY_IGN_HCPTR( VMSVGA3DCONTEXT, state.paVertexShaderConst),
820 SSMFIELD_ENTRY_TERM()
821};
822#endif /* VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS */
823
824
825/**
826 * VMSVGA3d state data.
827 *
828 * Allocated on the heap and pointed to by VMSVGAState::p3dState.
829 */
830typedef struct VMSVGA3DSTATE
831{
832 /** The size of papContexts. */
833 uint32_t cContexts;
834 /** The size of papSurfaces. */
835 uint32_t cSurfaces;
836 /** Contexts indexed by ID. Grown as needed. */
837 PVMSVGA3DCONTEXT *papContexts;
838 /** Surfaces indexed by ID. Grown as needed. */
839 PVMSVGA3DSURFACE *papSurfaces;
840
841#ifdef RT_OS_WINDOWS
842# ifdef VMSVGA3D_DIRECT3D
843# ifdef VBOX_VMSVGA3D_WITH_WINE_OPENGL
844 IDirect3D9 *pD3D9;
845# else
846 IDirect3D9Ex *pD3D9;
847# endif
848 D3DCAPS9 caps;
849 bool fSupportedSurfaceINTZ;
850 bool fSupportedSurfaceNULL;
851# endif
852 /** Window Thread. */
853 R3PTRTYPE(RTTHREAD) pWindowThread;
854 DWORD idWindowThread;
855 HMODULE hInstance;
856 /** Window request semaphore. */
857 RTSEMEVENT WndRequestSem;
858#elif defined(RT_OS_DARWIN)
859#else
860 /* The X display */
861 Display *display;
862 R3PTRTYPE(RTTHREAD) pWindowThread;
863 bool bTerminate;
864#endif
865
866#ifdef VMSVGA3D_OPENGL
867 float rsGLVersion;
868 /* Current active context. */
869 uint32_t idActiveContext;
870
871 struct
872 {
873 PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
874 PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
875 PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
876 PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
877 PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
878 PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
879 PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
880 PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
881 PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
882 PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
883 PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
884 PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
885 PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
886 PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
887 PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
888 PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
889 PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
890 PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
891 PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
892 PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
893 PFNGLPOINTPARAMETERFPROC glPointParameterf;
894#if VBOX_VMSVGA3D_GL_HACK_LEVEL < 0x102
895 PFNGLBLENDCOLORPROC glBlendColor;
896 PFNGLBLENDEQUATIONPROC glBlendEquation;
897#endif
898 PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate;
899 PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
900 PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate;
901 PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate;
902 PFNGLBINDBUFFERPROC glBindBuffer;
903 PFNGLDELETEBUFFERSPROC glDeleteBuffers;
904 PFNGLGENBUFFERSPROC glGenBuffers;
905 PFNGLBUFFERDATAPROC glBufferData;
906 PFNGLMAPBUFFERPROC glMapBuffer;
907 PFNGLUNMAPBUFFERPROC glUnmapBuffer;
908 PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
909 PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
910 PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
911 PFNGLFOGCOORDPOINTERPROC glFogCoordPointer;
912 PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex;
913 PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex;
914 PFNGLACTIVETEXTUREPROC glActiveTexture;
915#if VBOX_VMSVGA3D_GL_HACK_LEVEL < 0x103
916 PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture;
917#endif
918 PFNGLGETPROGRAMIVARBPROC glGetProgramivARB;
919 PFNGLPROVOKINGVERTEXPROC glProvokingVertex;
920 bool fEXT_stencil_two_side;
921 } ext;
922
923 struct
924 {
925 GLint maxActiveLights;
926 GLint maxTextureBufferSize;
927 GLint maxTextures;
928 GLint maxClipDistances;
929 GLint maxColorAttachments;
930 GLint maxRectangleTextureSize;
931 GLint maxTextureAnisotropy;
932 GLint maxVertexShaderInstructions;
933 GLint maxFragmentShaderInstructions;
934 GLint maxVertexShaderTemps;
935 GLint maxFragmentShaderTemps;
936 GLfloat flPointSize[2];
937 SVGA3dPixelShaderVersion fragmentShaderVersion;
938 SVGA3dVertexShaderVersion vertexShaderVersion;
939 bool fS3TCSupported;
940 } caps;
941
942 /** The GL_EXTENSIONS value (space padded) for the default OpenGL profile.
943 * Free with RTStrFree. */
944 R3PTRTYPE(char *) pszExtensions;
945
946 /** The GL_EXTENSIONS value (space padded) for the other OpenGL profile.
947 * Free with RTStrFree.
948 *
949 * This is used to detect shader model version since some implementations
950 * (darwin) hides extensions that have made it into core and probably a
951 * bunch of others when using a OpenGL core profile instead of a legacy one */
952 R3PTRTYPE(char *) pszOtherExtensions;
953 /** The version of the other GL profile. */
954 float rsOtherGLVersion;
955
956 /** Shader talk back interface. */
957 VBOXVMSVGASHADERIF ShaderIf;
958
959# ifdef VMSVGA3D_OPENGL
960 /** The shared context. */
961 VMSVGA3DCONTEXT SharedCtx;
962# endif
963#endif /* VMSVGA3D_OPENGL */
964} VMSVGA3DSTATE;
965
966#ifdef VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS
967/**
968 * SSM descriptor table for the VMSVGA3DSTATE structure.
969 *
970 * @remarks This isn't a complete structure markup, only fields with state.
971 */
972static SSMFIELD const g_aVMSVGA3DSTATEFields[] =
973{
974# ifdef VMSVGA3D_OPENGL
975 SSMFIELD_ENTRY( VMSVGA3DSTATE, rsGLVersion), /** @todo Why are we saving the GL version?? */
976# endif
977 SSMFIELD_ENTRY( VMSVGA3DSTATE, cContexts),
978 SSMFIELD_ENTRY( VMSVGA3DSTATE, cSurfaces),
979 SSMFIELD_ENTRY_TERM()
980};
981#endif /* VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS */
982
983
984#ifdef VMSVGA3D_DIRECT3D
985D3DFORMAT vmsvga3dSurfaceFormat2D3D(SVGA3dSurfaceFormat format);
986D3DMULTISAMPLE_TYPE vmsvga3dMultipeSampleCount2D3D(uint32_t multisampleCount);
987DECLCALLBACK(int) vmsvga3dSharedSurfaceDestroyTree(PAVLU32NODECORE pNode, void *pvParam);
988int vmsvga3dSurfaceFlush(PVGASTATE pThis, PVMSVGA3DSURFACE pSurface);
989#endif /* VMSVGA3D_DIRECT3D */
990
991
992#ifdef VMSVGA3D_OPENGL
993/** Save and setup everything. */
994# define VMSVGA3D_PARANOID_TEXTURE_PACKING
995
996/**
997 * Saved texture packing parameters (shared by both pack and unpack).
998 */
999typedef struct VMSVGAPACKPARAMS
1000{
1001 GLint iAlignment;
1002 GLint cxRow;
1003# ifdef VMSVGA3D_PARANOID_TEXTURE_PACKING
1004 GLint cyImage;
1005 GLboolean fSwapBytes;
1006 GLboolean fLsbFirst;
1007 GLint cSkipRows;
1008 GLint cSkipPixels;
1009 GLint cSkipImages;
1010# endif
1011} VMSVGAPACKPARAMS;
1012/** Pointer to saved texture packing parameters. */
1013typedef VMSVGAPACKPARAMS *PVMSVGAPACKPARAMS;
1014/** Pointer to const saved texture packing parameters. */
1015typedef VMSVGAPACKPARAMS const *PCVMSVGAPACKPARAMS;
1016
1017void vmsvga3dOglSetPackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1018 PVMSVGAPACKPARAMS pSave);
1019void vmsvga3dOglRestorePackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1020 PCVMSVGAPACKPARAMS pSave);
1021void vmsvga3dOglSetUnpackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1022 PVMSVGAPACKPARAMS pSave);
1023void vmsvga3dOglRestoreUnpackParams(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, PVMSVGA3DSURFACE pSurface,
1024 PCVMSVGAPACKPARAMS pSave);
1025
1026/** @name VMSVGA3D_DEF_CTX_F_XXX - vmsvga3dContextDefineOgl flags.
1027 * @{ */
1028/** When clear, the context is created using the default OpenGL profile.
1029 * When set, it's created using the alternative profile. The latter is only
1030 * allowed if the VBOX_VMSVGA3D_DUAL_OPENGL_PROFILE is set. */
1031# define VMSVGA3D_DEF_CTX_F_OTHER_PROFILE RT_BIT_32(0)
1032/** Defining the shared context. */
1033# define VMSVGA3D_DEF_CTX_F_SHARED_CTX RT_BIT_32(1)
1034/** Defining the init time context (EMT). */
1035# define VMSVGA3D_DEF_CTX_F_INIT RT_BIT_32(2)
1036/** @} */
1037int vmsvga3dContextDefineOgl(PVGASTATE pThis, uint32_t cid, uint32_t fFlags);
1038void vmsvga3dSurfaceFormat2OGL(PVMSVGA3DSURFACE pSurface, SVGA3dSurfaceFormat format);
1039
1040#endif /* VMSVGA3D_OPENGL */
1041
1042
1043/* DevVGA-SVGA3d-shared.cpp: */
1044int vmsvga3dSaveShaderConst(PVMSVGA3DCONTEXT pContext, uint32_t reg, SVGA3dShaderType type, SVGA3dShaderConstType ctype,
1045 uint32_t val1, uint32_t val2, uint32_t val3, uint32_t val4);
1046
1047
1048
1049/* Command implementation workers. */
1050void vmsvga3dBackSurfaceDestroy(PVMSVGA3DSTATE pState, PVMSVGA3DSURFACE pSurface);
1051int vmsvga3dBackSurfaceStretchBlt(PVGASTATE pThis, PVMSVGA3DSTATE pState,
1052 PVMSVGA3DSURFACE pDstSurface, uint32_t uDstMipmap, SVGA3dBox const *pDstBox,
1053 PVMSVGA3DSURFACE pSrcSurface, uint32_t uSrcMipmap, SVGA3dBox const *pSrcBox,
1054 SVGA3dStretchBltMode enmMode, PVMSVGA3DCONTEXT pContext);
1055int vmsvga3dBackSurfaceDMACopyBox(PVGASTATE pThis, PVMSVGA3DSTATE pState, PVMSVGA3DSURFACE pSurface, uint32_t uHostMimap,
1056 SVGAGuestPtr GuestPtr, uint32_t cbSrcPitch, SVGA3dTransferType transfer,
1057 SVGA3dCopyBox const *pBox, PVMSVGA3DCONTEXT pContext, int rc, int iBox);
1058
1059int vmsvga3dBackCreateTexture(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContext, uint32_t idAssociatedContext,
1060 PVMSVGA3DSURFACE pSurface);
1061
1062#endif
1063
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