- Timestamp:
- Jul 26, 2007 8:33:24 AM (17 years ago)
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/gldrv.h
r3708 r3858 28 28 #define VBOX_OGL_DEBUG_WINDOW_OUTPUT 29 29 #elif defined(RT_OS_LINUX) 30 31 #define GLX_GLXEXT_PROTOTYPES 30 32 #include <X11/Xlib.h> 33 #include <GL/gl.h> 31 34 #include <GL/glx.h> 32 35 #include <GL/glxext.h> 33 34 typedef GLXContextID (*glXGetContextIDEXTProc) (const GLXContext);35 typedef GLXContext (*glXImportContextEXTProc) (Display *, GLXContextID);36 36 37 37 #define VBOX_OGL_DEBUG_WINDOW_OUTPUT … … 87 87 PFNGLXGETVISUALFROMFBCONFIGSGIXPROC glxGetVisualFromFBConfig; 88 88 PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC glxCreateNewContext; 89 //glXGetContextIDEXTProc getContextIDPtr;90 //glXImportContextEXTProc importContextEXTPtr;91 89 #endif 92 90 #endif -
trunk/src/VBox/HostServices/SharedOpenGL/gllindrv.cpp
r3766 r3858 24 24 * 25 25 */ 26 #define GLX_GLXEXT_PROTOTYPES 26 27 27 28 #include "vboxgl.h" … … 30 31 #include <string.h> 31 32 #include <stdio.h> 32 33 /*static int (*X_handler)(Display *, XErrorEvent *) = NULL; 34 static int x_errhandler(Display *d, XErrorEvent *e) 35 { 36 return (X_handler(d, e)); 37 } 38 39 static int (*XIO_handler)(Display *) = NULL; 40 static int xio_errhandler(Display *d) 41 { 42 return (XIO_handler(d)); 43 }*/ 33 #include <GL/gl.h> 34 #include <GL/glx.h> 35 #include <GL/glxext.h> 36 44 37 45 38 /* X11 server connection for all OpenGL clients. … … 81 74 } 82 75 83 84 76 /** 85 * Print parameters for a GLXFBConfig to stdout. 86 * Input: dpy - the X display 87 * screen - the X screen number 88 * fbConfig - the fbconfig handle 89 * horizFormat - if true, print in horizontal format 90 */ 91 void 92 PrintFBConfigInfo(Display *dpy, int screen, GLXFBConfig config) 93 { 94 int bufferSize, level, doubleBuffer, stereo, auxBuffers; 95 int redSize, greenSize, blueSize, alphaSize; 96 int depthSize, stencilSize; 97 int accumRedSize, accumBlueSize, accumGreenSize, accumAlphaSize; 98 // int sampleBuffers, samples; 99 int drawableType, renderType, xRenderable, xVisual, id; 100 101 /* do queries using the GLX 1.3 tokens (same as the SGIX tokens) */ 102 glXGetFBConfigAttrib(dpy, config, GLX_BUFFER_SIZE, &bufferSize); 103 glXGetFBConfigAttrib(dpy, config, GLX_LEVEL, &level); 104 glXGetFBConfigAttrib(dpy, config, GLX_DOUBLEBUFFER, &doubleBuffer); 105 glXGetFBConfigAttrib(dpy, config, GLX_STEREO, &stereo); 106 glXGetFBConfigAttrib(dpy, config, GLX_AUX_BUFFERS, &auxBuffers); 107 glXGetFBConfigAttrib(dpy, config, GLX_RED_SIZE, &redSize); 108 glXGetFBConfigAttrib(dpy, config, GLX_GREEN_SIZE, &greenSize); 109 glXGetFBConfigAttrib(dpy, config, GLX_BLUE_SIZE, &blueSize); 110 glXGetFBConfigAttrib(dpy, config, GLX_ALPHA_SIZE, &alphaSize); 111 glXGetFBConfigAttrib(dpy, config, GLX_DEPTH_SIZE, &depthSize); 112 glXGetFBConfigAttrib(dpy, config, GLX_STENCIL_SIZE, &stencilSize); 113 glXGetFBConfigAttrib(dpy, config, GLX_ACCUM_RED_SIZE, &accumRedSize); 114 glXGetFBConfigAttrib(dpy, config, GLX_ACCUM_GREEN_SIZE, &accumGreenSize); 115 glXGetFBConfigAttrib(dpy, config, GLX_ACCUM_BLUE_SIZE, &accumBlueSize); 116 glXGetFBConfigAttrib(dpy, config, GLX_ACCUM_ALPHA_SIZE, &accumAlphaSize); 117 // glXGetFBConfigAttrib(dpy, config, GLX_SAMPLE_BUFFERS, &sampleBuffers); 118 // glXGetFBConfigAttrib(dpy, config, GLX_SAMPLES, &samples); 119 glXGetFBConfigAttrib(dpy, config, GLX_DRAWABLE_TYPE, &drawableType); 120 glXGetFBConfigAttrib(dpy, config, GLX_RENDER_TYPE, &renderType); 121 glXGetFBConfigAttrib(dpy, config, GLX_X_RENDERABLE, &xRenderable); 122 glXGetFBConfigAttrib(dpy, config, GLX_X_VISUAL_TYPE, &xVisual); 123 if (!xRenderable || !(drawableType & GLX_WINDOW_BIT_SGIX)) 124 xVisual = -1; 125 126 glXGetFBConfigAttrib(dpy, config, GLX_FBCONFIG_ID, &id); 127 128 printf("Id 0x%x\n", id); 129 printf(" Buffer Size: %d\n", bufferSize); 130 printf(" Level: %d\n", level); 131 printf(" Double Buffer: %s\n", doubleBuffer ? "yes" : "no"); 132 printf(" Stereo: %s\n", stereo ? "yes" : "no"); 133 printf(" Aux Buffers: %d\n", auxBuffers); 134 printf(" Red Size: %d\n", redSize); 135 printf(" Green Size: %d\n", greenSize); 136 printf(" Blue Size: %d\n", blueSize); 137 printf(" Alpha Size: %d\n", alphaSize); 138 printf(" Depth Size: %d\n", depthSize); 139 printf(" Stencil Size: %d\n", stencilSize); 140 printf(" Accum Red Size: %d\n", accumRedSize); 141 printf(" Accum Green Size: %d\n", accumGreenSize); 142 printf(" Accum Blue Size: %d\n", accumBlueSize); 143 printf(" Accum Alpha Size: %d\n", accumAlphaSize); 144 // printf(" Sample Buffers: %d\n", sampleBuffers); 145 // printf(" Samples/Pixel: %d\n", samples); 146 printf(" Drawable Types: "); 147 if (drawableType & GLX_WINDOW_BIT) printf("Window "); 148 if (drawableType & GLX_PIXMAP_BIT) printf("Pixmap "); 149 if (drawableType & GLX_PBUFFER_BIT) printf("PBuffer"); 150 printf("\n"); 151 printf(" Render Types: "); 152 if (renderType & GLX_RGBA_BIT_SGIX) printf("RGBA "); 153 if (renderType & GLX_COLOR_INDEX_BIT_SGIX) printf("CI "); 154 printf("\n"); 155 printf(" X Renderable: %s\n", xRenderable ? "yes" : "no"); 156 157 } 158 159 /** 160 * Global init of VBox OpenGL for windows 77 * Global init of VBox OpenGL 161 78 * 162 79 * @returns VBox error code … … 165 82 { 166 83 Log(("vboxglGlobalInit\n")); 167 168 glXDisplay = XOpenDisplay(NULL);169 84 170 85 /*vboxInitOpenGLExtensions();*/ … … 172 87 } 173 88 89 /** 90 * Global deinit of VBox OpenGL 91 * 92 * @returns VBox error code 93 */ 94 int vboxglGlobalUnload() 95 { 96 Log(("vboxglGlobalUnload")); 97 98 if (glXDisplay) 99 XCloseDisplay(glXDisplay); 100 101 return VINF_SUCCESS; 102 } 174 103 175 104 /** … … 184 113 GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, 185 114 GLX_RENDER_TYPE, GLX_RGBA_BIT, 186 GLX_DOUBLEBUFFER, True, /* Request a double-buffered color buffer with */187 GLX_RED_SIZE, 1, /* the maximum number of bits per component */115 GLX_DOUBLEBUFFER, GL_TRUE, /* Request a double-buffered color buffer with */ 116 GLX_RED_SIZE, 1, /* the maximum number of bits per component */ 188 117 GLX_GREEN_SIZE, 1, 189 118 GLX_BLUE_SIZE, 1, … … 195 124 int returnedFBConfigs; 196 125 197 if (!pClient->glxContext) 198 { 199 /* we have to set up a rendering context to be able to use glGetString 200 * a window is created but is not mapped to screen (so it's not visible') 201 * and a GLXContext is bound to it */ 202 screen_num = DefaultScreen(pClient->dpy); 203 pClient->enable.fbConfig = pClient->glxChooseFBConfig(pClient->dpy, screen_num, attribs, &returnedFBConfigs); 204 Log(("vboxglGetString: returned FBConfigs: %d\n", returnedFBConfigs)); 205 pClient->enable.visinfo = pClient->glxGetVisualFromFBConfig(pClient->dpy, pClient->enable.fbConfig[0]); 206 /* Create Window */ 207 attr.background_pixel = 0; 208 attr.border_pixel = 0; 209 attr.colormap = XCreateColormap(pClient->dpy, RootWindow(pClient->dpy, screen_num), pClient->enable.visinfo->visual, AllocNone); 210 attr.event_mask = StructureNotifyMask | ExposureMask; 211 mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; 212 pClient->enable.win = XCreateWindow(pClient->dpy, RootWindow(pClient->dpy, screen_num), 0, 0, 100, 100, 213 0, pClient->enable.visinfo->depth, InputOutput, 214 pClient->enable.visinfo->visual, mask, &attr); 215 /* Create Context */ 216 pClient->enable.ctx = pClient->glxCreateNewContext(pClient->dpy, pClient->enable.fbConfig[0], GLX_RGBA_TYPE, NULL, True); 217 218 glXMakeCurrent(pClient->dpy, pClient->enable.win, pClient->enable.ctx); 219 } 220 else 221 { 222 glXMakeCurrent(pClient->dpy, pClient->xWindow, pClient->glxContext); 223 } 126 /* we have to set up a rendering context to be able to use glGetString 127 * a window is created but is not mapped to screen (so it's not visible') 128 * and a GLXContext is bound to it */ 129 screen_num = DefaultScreen(pClient->dpy); 130 pClient->enable.fbConfig = pClient->glxChooseFBConfig(pClient->dpy, screen_num, attribs, &returnedFBConfigs); 131 Log(("vboxglGetString: returned FBConfigs: %d\n", returnedFBConfigs)); 132 pClient->enable.visinfo = pClient->glxGetVisualFromFBConfig(pClient->dpy, pClient->enable.fbConfig[0]); 133 /* Create Window */ 134 attr.background_pixel = 0; 135 attr.border_pixel = 0; 136 attr.colormap = XCreateColormap(pClient->dpy, RootWindow(pClient->dpy, screen_num), pClient->enable.visinfo->visual, AllocNone); 137 attr.event_mask = StructureNotifyMask | ExposureMask; 138 mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; 139 pClient->enable.win = XCreateWindow(pClient->dpy, RootWindow(pClient->dpy, screen_num), 0, 0, 100, 100, 140 0, pClient->enable.visinfo->depth, InputOutput, 141 pClient->enable.visinfo->visual, mask, &attr); 142 /* Create Context */ 143 pClient->enable.ctx = pClient->glxCreateNewContext(pClient->dpy, pClient->enable.fbConfig[0], GLX_RGBA_TYPE, NULL, GL_TRUE); 144 glXMakeCurrent(pClient->dpy, pClient->enable.win, pClient->enable.ctx); 224 145 225 146 return VINF_SUCCESS; … … 235 156 { 236 157 /* Free all data */ 237 glFlush(); 238 if (!pClient->glxContext) 158 if (pClient->enable.ctx) 239 159 { 240 glXMakeCurrent(pClient->dpy, 0, NULL); 160 glFlush(); 161 glXMakeCurrent(pClient->dpy, None, NULL); 241 162 XDestroyWindow(pClient->dpy, pClient->enable.win); 242 163 glXDestroyContext(pClient->dpy, pClient->enable.ctx); … … 244 165 XFree(pClient->enable.fbConfig); 245 166 } 167 246 168 return VINF_SUCCESS; 247 169 } … … 257 179 int rc = VERR_NOT_IMPLEMENTED; 258 180 Log(("vboxglConnect\n")); 259 //pClient->getContextIDPtr = NULL; 260 //pClient->importContextEXTPtr = NULL; 181 261 182 pClient->PixelFormatToFBConfigMapper = NULL; 262 183 pClient->xWindow = 0; 263 184 185 if (!glXDisplay) 186 glXDisplay = XOpenDisplay(NULL); 187 264 188 pClient->dpy = glXDisplay; 265 189 … … 272 196 if ((major == 1) && (minor >= 3)) { 273 197 Log(("Server GLX 1.3 supported\n")); 274 pClient->glxChooseFBConfig = (PFNGLXCHOOSEFBCONFIGSGIXPROC) glXGetProcAddress (198 pClient->glxChooseFBConfig = (PFNGLXCHOOSEFBCONFIGSGIXPROC) glXGetProcAddressARB( 275 199 (GLubyte *) "glXChooseFBConfig"); 276 pClient->glxGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) glXGetProcAddress (200 pClient->glxGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) glXGetProcAddressARB( 277 201 (GLubyte *) "glXGetVisualFromFBConfig"); 278 pClient->glxCreateNewContext = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) glXGetProcAddress (202 pClient->glxCreateNewContext = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) glXGetProcAddressARB( 279 203 (GLubyte *) "glXCreateNewContext"); 280 204 } else if (vboxglCheckExtension(pClient->dpy, screenNum, "GLX_SGIX_fbconfig")) { 281 205 Log(("GLX_SGIX_fbconfig extension supported\n")); 282 pClient->glxChooseFBConfig = (PFNGLXCHOOSEFBCONFIGSGIXPROC) glXGetProcAddress (206 pClient->glxChooseFBConfig = (PFNGLXCHOOSEFBCONFIGSGIXPROC) glXGetProcAddressARB( 283 207 (GLubyte *) "glXChooseFBConfigSGIX"); 284 pClient->glxGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) glXGetProcAddress (208 pClient->glxGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) glXGetProcAddressARB( 285 209 (GLubyte *) "glXGetVisualFromFBConfigSGIX"); 286 pClient->glxCreateNewContext = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) glXGetProcAddress (210 pClient->glxCreateNewContext = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) glXGetProcAddressARB( 287 211 (GLubyte *) "glXCreateContextWithConfigSGIX"); 288 212 } else { … … 329 253 XVisualInfo *visinfo = NULL; 330 254 unsigned long mask; 331 //GLXContext ctx;332 255 GLXFBConfig fbConfig; 333 256 GLXContextID glrc; … … 342 265 screen_num = DefaultScreen(pClient->dpy); 343 266 fbConfig = pClient->actFBConfig; 344 345 #if 0346 if (!fbConfig) {347 /* Create a standard fbconfig */348 int returnedNumFBConfigs;349 GLXFBConfig *returnedFBConfigs;350 static int attribs[] = {351 GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,352 GLX_RENDER_TYPE, GLX_RGBA_BIT,353 GLX_DOUBLEBUFFER, True, /* Request a double-buffered color buffer with */354 GLX_RED_SIZE, 1, /* the maximum number of bits per component */355 GLX_GREEN_SIZE, 1,356 GLX_BLUE_SIZE, 1,357 None358 };359 360 Log(("Warning: no GLXFBConfig set creating standard one\n"));361 returnedFBConfigs = pClient->glxChooseFBConfig(pClient->dpy, screen_num, attribs, &returnedNumFBConfigs);362 if (!returnedNumFBConfigs) {363 pClient->lastretval = 0;364 pClient->fHasLastError = true;365 pClient->ulLastError = glGetError();366 return;367 }368 fbConfig = returnedFBConfigs[0];369 }370 #endif371 267 372 268 visinfo = pClient->glxGetVisualFromFBConfig(pClient->dpy, fbConfig); … … 387 283 } 388 284 XResizeWindow(pClient->dpy, pClient->xWindow, pClient->winWidth, pClient->winHeight); 389 pClient->glxContext = pClient->glxCreateNewContext(pClient->dpy, fbConfig, GLX_RGBA_TYPE, NULL, True);285 pClient->glxContext = pClient->glxCreateNewContext(pClient->dpy, fbConfig, GLX_RGBA_TYPE, NULL, GL_TRUE); 390 286 391 287 XMapWindow(pClient->dpy, pClient->xWindow); 392 288 XIfEvent(pClient->dpy, &event, WaitForNotify, (XPointer)pClient->xWindow ); 393 //glrc = pClient->getContextIDPtr(ctx); 289 394 290 glrc = 1; 395 291 Assert(glrc); … … 406 302 void vboxglDrvDeleteContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer) 407 303 { 408 //GLXContext ctx;409 304 OGL_CMD(DrvDeleteContext, 1); 410 305 OGL_PARAM(HGLRC, hglrc); 411 306 Log(("DrvDeleteContext %x\n", hglrc)); 412 //ctx = pClient->importContextEXTPtr(pClient->dpy, hglrc); 307 413 308 glXDestroyContext(pClient->dpy, VBOX_OGL_GUEST_TO_HOST_HDC(hglrc)); 414 309 pClient->lastretval = 1; … … 419 314 void vboxglDrvSetContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer) 420 315 { 421 //GLXContext ctx;422 316 OGL_CMD(DrvSetContext, 2); 423 317 OGL_PARAM(HDC, hdc); … … 425 319 Log(("DrvSetContext %x %x\n", hdc, hglrc)); 426 320 #ifdef VBOX_OGL_DEBUG_WINDOW_OUTPUT 427 //ctx = pClient->importContextEXTPtr(pClient->dpy, hglrc); 428 pClient->lastretval = glXMakeCurrent(pClient->dpy, pClient->xWindow, 321 322 pClient->lastretval = glXMakeCurrent(pClient->dpy, pClient->xWindow, 429 323 VBOX_OGL_GUEST_TO_HOST_HDC(hglrc)); 430 324 if (!pClient->lastretval) … … 439 333 void vboxglDrvCopyContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer) 440 334 { 441 //GLXContext ctxSrc, ctxDst;442 335 OGL_CMD(DrvDeleteContext, 3); 443 336 OGL_PARAM(HGLRC, hglrcSrc); … … 445 338 OGL_PARAM(UINT, mask); 446 339 Log(("DrvCopyContext %x %x %x\n", hglrcSrc, hglrcDst, mask)); 447 //ctxSrc = pClient->importContextEXTPtr(pClient->dpy, hglrcSrc); 448 //ctxDst = pClient->importContextEXTPtr(pClient->dpy, hglrcDst); 340 449 341 glXCopyContext(pClient->dpy, VBOX_OGL_GUEST_TO_HOST_HDC(hglrc), VBOX_OGL_GUEST_TO_HOST_HDC(hglrc), mask); 450 342 pClient->lastretval = 1; … … 459 351 Log(("DrvReleaseContext %x\n", hglrc)); 460 352 /* clear current selection */ 461 pClient->lastretval = glXMakeCurrent(pClient->dpy, 0, NULL);353 pClient->lastretval = glXMakeCurrent(pClient->dpy, None, NULL); 462 354 463 355 if (!pClient->lastretval) … … 469 361 void vboxglDrvCreateLayerContext(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer) 470 362 { 363 XSetWindowAttributes attr; 364 XVisualInfo *visinfo = NULL; 365 unsigned long mask; 366 GLXFBConfig fbConfig; 367 GLXContextID glrc; 368 int screen_num; 369 XEvent event; 471 370 OGL_CMD(DrvCreateLayerContext, 2); 472 371 OGL_PARAM(HDC, hdc); … … 475 374 Log(("DrvCreateLayerContext %x\n", hdc)); 476 375 #ifdef VBOX_OGL_DEBUG_WINDOW_OUTPUT 477 pClient->lastretval = 0; /** @todo */ 376 377 screen_num = DefaultScreen(pClient->dpy); 378 fbConfig = pClient->actFBConfig; 379 visinfo = pClient->glxGetVisualFromFBConfig(pClient->dpy, fbConfig); 380 381 if (pClient->xWindow == 0) { 382 383 /* window attributes */ 384 attr.background_pixel = 0; 385 attr.border_pixel = 0; 386 attr.colormap = XCreateColormap(pClient->dpy, RootWindow(pClient->dpy, screen_num ), visinfo->visual, AllocNone); 387 attr.event_mask = StructureNotifyMask | ExposureMask; 388 mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; 389 pClient->xWindow = XCreateWindow(pClient->dpy, 390 RootWindow(pClient->dpy, screen_num), 391 0, 0, pClient->winWidth, pClient->winHeight, 0, 392 visinfo->depth, InputOutput, 393 visinfo->visual, mask, &attr); 394 } 395 XResizeWindow(pClient->dpy, pClient->xWindow, pClient->winWidth, pClient->winHeight); 396 pClient->glxContext = pClient->glxCreateNewContext(pClient->dpy, fbConfig, GLX_RGBA_TYPE, NULL, GL_TRUE); 397 XMapWindow(pClient->dpy, pClient->xWindow); 398 XIfEvent(pClient->dpy, &event, WaitForNotify, (XPointer)pClient->xWindow ); 399 400 glrc = 1; 401 Assert(glrc); 402 403 pClient->lastretval = glrc; 478 404 pClient->fHasLastError = true; 479 405 pClient->ulLastError = glGetError(); … … 529 455 pClient->actFBConfig = pClient->PixelFormatToFBConfigMapper[iPixelFormat-1]; 530 456 screen_num = DefaultScreen(pClient->dpy); 531 PrintFBConfigInfo(pClient->dpy, screen_num, pClient->actFBConfig); 532 Log(("Window width: %d Window height: %d\n", cx, cy)); 457 533 458 pClient->winWidth = cx; 534 459 pClient->winHeight = cy; -
trunk/src/VBox/HostServices/SharedOpenGL/glwindrv.cpp
r3708 r3858 132 132 133 133 /** 134 * Global deinit of VBox OpenGL 135 * 136 * @returns VBox error code 137 */ 138 int vboxglGlobalUnload() 139 { 140 Log(("vboxglGlobalUnload")); 141 142 return VINF_SUCCESS; 143 } 144 145 /** 134 146 * Enable OpenGL 135 147 * -
trunk/src/VBox/HostServices/SharedOpenGL/service.cpp
r3709 r3858 39 39 Log(("svcUnload\n")); 40 40 41 vboxglGlobalUnload(); 41 42 return rc; 42 43 } -
trunk/src/VBox/HostServices/SharedOpenGL/vboxgl.cpp
r3708 r3858 68 68 69 69 vboxglDisableOpenGL(pClient); 70 70 71 return rc; 71 72 } -
trunk/src/VBox/HostServices/SharedOpenGL/vboxgl.h
r3708 r3858 33 33 34 34 /** 35 * Global init of VBox OpenGL for windows35 * Global init of VBox OpenGL 36 36 * 37 37 * @returns VBox error code 38 38 */ 39 39 int vboxglGlobalInit(); 40 41 /** 42 * Global deinit of VBox OpenGL 43 * 44 * @returns VBox error code 45 */ 46 int vboxglGlobalUnload(); 40 47 41 48 /**
Note:
See TracChangeset
for help on using the changeset viewer.