Changeset 16480 in vbox for trunk/src/VBox
- Timestamp:
- Feb 3, 2009 10:31:14 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 42370
- Location:
- trunk/src/VBox
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/Makefile.kmk
r16381 r16480 143 143 $(VBOX_LIB_VBGL_R3) \ 144 144 $(PATH_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) \ 145 $(VBOX_PATH_ADDITIONS)/VBoxOGLcrutil$(VBOX_SUFF_DLL) 145 $(VBOX_PATH_ADDITIONS)/VBoxOGLcrutil$(VBOX_SUFF_DLL) \ 146 Xcomposite 146 147 endif 147 148 -
trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/context.c
r16456 r16480 138 138 #elif defined(GLX) 139 139 winInfo->drawable = (GLXDrawable) spuWin; 140 winInfo->pVisibleRegions = NULL; 140 141 #endif 141 142 winInfo->spuWindow = spuWin; … … 203 204 winInfo->dpyName[MAX_DPY_NAME-1] = 0; 204 205 winInfo->dpy = dpy; 206 winInfo->pVisibleRegions = NULL; 205 207 #elif defined(Darwin) 206 208 winInfo->connection = _CGSDefaultConnection(); // store our connection as default -
trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/load.c
r16456 r16480 75 75 static ViewportFunc_t origViewport; 76 76 77 78 77 static void stubCheckWindowState(void) 79 78 { … … 112 111 stubUpdateWindowGeometry(window, bForceUpdate); 113 112 114 #if def WINDOWS113 #if defined(GLX) || defined (WINDOWS) 115 114 if (stub.trackWindowVisibleRgn) 116 115 { … … 288 287 #ifdef WINDOWS 289 288 defaultWin->hVisibleRegion = INVALID_HANDLE_VALUE; 289 #elif defined(GLX) 290 defaultWin->pVisibleRegions = NULL; 290 291 #endif 291 292 crHashtableAdd(stub.windowTable, 0, defaultWin); -
trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/stub.c
r15532 r16480 9 9 #include "cr_mem.h" 10 10 #include "stub.h" 11 12 #ifdef GLX 13 #include <X11/extensions/Xcomposite.h> 14 #include <X11/extensions/Xfixes.h> 15 #endif 11 16 12 17 /** … … 88 93 { 89 94 DeleteObject(winInfo->hVisibleRegion); 95 } 96 #elif defined(GLX) 97 if (winInfo->pVisibleRegions) 98 { 99 XFree(winInfo->pVisibleRegions); 90 100 } 91 101 #endif … … 380 390 UnhookWindowsHookEx(stub.hMessageHook); 381 391 } 382 #endif 392 #elif defined(GLX) //#ifdef WINDOWS 393 static GLboolean stubCheckXExtensions(WindowInfo *pWindow) 394 { 395 int evb, erb, vmi=0, vma=0; 396 397 if (XCompositeQueryExtension(pWindow->dpy, &evb, &erb) 398 && XCompositeQueryVersion(pWindow->dpy, &vma, &vmi) 399 && (vma>0 || vmi>=4)) 400 { 401 crDebug("XComposite %i.%i", vma, vmi); 402 vma=0; 403 vmi=0; 404 if (XFixesQueryExtension(pWindow->dpy, &evb, &erb) 405 && XFixesQueryVersion(pWindow->dpy, &vma, &vmi) 406 && vma>=2) 407 { 408 crDebug("XFixes %i.%i", vma, vmi); 409 return GL_TRUE; 410 } 411 else 412 { 413 crWarning("XFixes not found or old version (%i.%i), no VisibilityTracking", vma, vmi); 414 } 415 } 416 else 417 { 418 crWarning("XComposite not found or old version (%i.%i), no VisibilityTracking", vma, vmi); 419 } 420 return GL_FALSE; 421 } 422 423 /* 424 * Updates visible regions for given spu window. 425 * Returns GL_TRUE if regions changed since last call, GL_FALSE overwise. 426 */ 427 GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow) 428 { 429 static GLboolean bExtensionsChecked = GL_FALSE; 430 431 XserverRegion xreg; 432 int cRects, i; 433 XRectangle *pXRects; 434 GLint* pGLRects; 435 436 if (bExtensionsChecked || stubCheckXExtensions(pWindow)) 437 { 438 bExtensionsChecked = GL_TRUE; 439 } 440 else 441 { 442 stub.trackWindowVisibleRgn = 0; 443 return GL_FALSE; 444 } 445 446 /*@todo see comment regarding size/position updates and XSync, same applies to those functions but 447 * it seems there's no way to get even based updates for this. Or I've failed to find the appropriate extension. 448 */ 449 xreg = XCompositeCreateRegionFromBorderClip(pWindow->dpy, pWindow->drawable); 450 pXRects = XFixesFetchRegion(pWindow->dpy, xreg, &cRects); 451 XFixesDestroyRegion(pWindow->dpy, xreg); 452 453 if (!pWindow->pVisibleRegions 454 || pWindow->cVisibleRegions!=cRects 455 || crMemcmp(pWindow->pVisibleRegions, pXRects, cRects * sizeof(XRectangle))) 456 { 457 pWindow->pVisibleRegions = pXRects; 458 pWindow->cVisibleRegions = cRects; 459 460 pGLRects = crAlloc(4*cRects*sizeof(GLint)); 461 if (!pGLRects) 462 { 463 crWarning("stubUpdateWindowVisibileRegions: failed to allocate %i bytes", 4*cRects*sizeof(GLint)); 464 return GL_FALSE; 465 } 466 467 /*crDebug("Got %i rects.", cRects);*/ 468 for (i=0; i<cRects; ++i) 469 { 470 pGLRects[4*i+0] = pXRects[i].x; 471 pGLRects[4*i+1] = pXRects[i].y; 472 pGLRects[4*i+2] = pXRects[i].x+pXRects[i].width; 473 pGLRects[4*i+3] = pXRects[i].y+pXRects[i].height; 474 /*crDebug("Rect[%i]=(%i,%i,%i,%i)", i, pGLRects[4*i+0], pGLRects[4*i+1], pGLRects[4*i+2], pGLRects[4*i+3]);*/ 475 } 476 477 crDebug("Dispatched WindowVisibleRegion (%i, cRects=%i)", pWindow->spuWindow, cRects); 478 stub.spuDispatch.WindowVisibleRegion(pWindow->spuWindow, cRects, pGLRects); 479 crFree(pGLRects); 480 return GL_TRUE; 481 } 482 else 483 { 484 XFree(pXRects); 485 } 486 487 return GL_FALSE; 488 } 489 #endif //#ifdef WINDOWS -
trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/stub.h
r16387 r16480 122 122 Display *dpy; 123 123 GLXDrawable drawable; 124 XRectangle *pVisibleRegions; 125 GLint cVisibleRegions; 124 126 #endif 125 127 }; … … 183 185 extern DECLEXPORT(SPUDispatchTable) stubNULLDispatch; 184 186 187 #if defined(GLX) || defined (WINDOWS) 188 extern GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow); 189 #endif 185 190 186 191 #ifdef WINDOWS … … 191 196 extern void stubInstallWindowMessageHook(); 192 197 extern void stubUninstallWindowMessageHook(); 193 194 extern GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow);195 198 196 199 #elif defined(DARWIN) -
trunk/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c
r15532 r16480 30 30 { 31 31 GLint i, size, cnt; 32 #ifdef WINDOWS33 RECT *pRECT = (RECT*) pRects;34 #else35 #endif36 32 37 33 GET_PACKER_CONTEXT(pc); … … 48 44 for (i=0; i<cRects; ++i) 49 45 { 50 #ifdef WINDOWS 51 WRITE_DATA(cnt, GLint, (GLint) pRECT[i].left); 52 WRITE_DATA(cnt+4, GLint, (GLint) pRECT[i].top); 53 WRITE_DATA(cnt+8, GLint, (GLint) pRECT[i].right); 54 WRITE_DATA(cnt+12, GLint, (GLint) pRECT[i].bottom); 46 WRITE_DATA(cnt, GLint, (GLint) pRects[4*i+0]); 47 WRITE_DATA(cnt+4, GLint, (GLint) pRects[4*i+1]); 48 WRITE_DATA(cnt+8, GLint, (GLint) pRects[4*i+2]); 49 WRITE_DATA(cnt+12, GLint, (GLint) pRects[4*i+3]); 55 50 cnt += 16; 56 #else57 #endif58 51 } 59 52 WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
Note:
See TracChangeset
for help on using the changeset viewer.