Changeset 69390 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/render
- Timestamp:
- Oct 26, 2017 5:17:51 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 118714
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL/render
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/render/render.def
-
Property svn:keywords
changed from
Id
toId Revision
-
Property svn:keywords
changed from
-
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu.c
-
Property svn:keywords
changed from
Id
toId Revision
-
Property svn:keywords
changed from
-
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_agl.c
-
Property svn:keywords
changed from
Id
toId Revision
-
Property svn:keywords
changed from
-
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa.c
r62489 r69390 1 /* $Id$ */ 1 2 /** @file 2 3 * VirtualBox OpenGL Cocoa Window System implementation -
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m
r56276 r69390 62 62 * this is our own one, before use. Really neat concept of Objective-C/Cocoa 63 63 * ;) 64 * 64 * 65 65 */ 66 66 67 /******************************************************************************* 68 * Header Files * 69 *******************************************************************************/ 67 68 /********************************************************************************************************************************* 69 * Header Files * 70 *********************************************************************************************************************************/ 70 71 #ifdef IN_VMSVGA3D 71 72 # define LOG_GROUP LOG_GROUP_DEV_VMSVGA … … 108 109 109 110 110 /******************************************************************************* 111 * Defined Constants And Macros *112 ******************************************************************************* /111 /********************************************************************************************************************************* 112 * Defined Constants And Macros * 113 *********************************************************************************************************************************/ 113 114 /* Debug macros */ 114 /** @def FBO 115 /** @def FBO 115 116 * Disable this to see how the output is without the FBO in the middle of the processing chain. */ 116 117 #define FBO 1 117 118 /** @def CR_RENDER_FORCE_PRESENT_MAIN_THREAD 118 * Force present schedule to main thread. */ 119 * Force present schedule to main thread. */ 119 120 /** @def SHOW_WINDOW_BACKGROUND 120 * Define this to see the window background even if the window is clipped. */ 121 /** @def DEBUG_VERBOSE 121 * Define this to see the window background even if the window is clipped. */ 122 /** @def DEBUG_VERBOSE 122 123 * Define this to get some debug info about the messages flow. */ 123 124 #if 0 || defined(DOXYGEN_RUNNING) … … 204 205 if (RT_UNLIKELY(iGlCheckErr != GL_NO_ERROR)) \ 205 206 AssertMsgFailed((a_szOp ": iGlCheckErr=%#x\n", iGlCheckErr)); \ 206 } while (0) 207 } while (0) 207 208 #else 208 209 # define DEBUG_CLEAR_GL_ERRORS() do {} while (0) … … 240 241 241 242 /** 242 * Works functions that creates a NSOpenGLPixelFormat instance. 243 * 243 * Works functions that creates a NSOpenGLPixelFormat instance. 244 * 244 245 * @returns Instance. 245 246 * @param fVisParams Context flags. … … 367 368 fAdjusted = true; 368 369 } 369 370 370 371 return fAdjusted; 371 372 #endif … … 373 374 374 375 375 /** 376 * State carrying structure for use with vboxCtxEnter and vboxCtxLeave 377 */ 376 /** 377 * State carrying structure for use with vboxCtxEnter and vboxCtxLeave 378 */ 378 379 typedef struct VBOX_CR_RENDER_CTX_INFO 379 380 { … … 387 388 static void vboxCtxEnter(NSOpenGLContext *pNewCtx, PVBOX_CR_RENDER_CTX_INFO pCtxInfo) 388 389 { 389 NSOpenGLContext *pOldCtx = vboxCtxGetCurrent(); 390 NSOpenGLContext *pOldCtx = vboxCtxGetCurrent(); 390 391 NSView *pOldView = pOldCtx ? [pOldCtx view] : nil; 391 392 NSView *pNewView = [pNewCtx view]; … … 393 394 Assert(pNewCtx); 394 395 395 if ( pOldCtx != pNewCtx 396 if ( pOldCtx != pNewCtx 396 397 || pOldView != pNewView) 397 398 { 398 399 if (pOldCtx != nil) 399 400 glFlush(); 400 401 401 402 DEBUG_CLEAR_GL_ERRORS(); 402 403 [pNewCtx makeCurrentContext]; 403 404 DEBUG_CHECK_GL_ERROR("makeCurrentContext"); 404 405 405 406 pCtxInfo->fIsValid = true; 406 407 pCtxInfo->pCtx = pOldCtx; 407 408 /** @todo r=bird: Why do we save the NEW VIEW here? vboxCtxLeave calls it 'pOldView'. Bug? */ 408 pCtxInfo->pView = pNewView; 409 pCtxInfo->pView = pNewView; 409 410 } 410 411 else … … 413 414 pCtxInfo->fIsValid = false; 414 415 } 415 } 416 416 } 417 417 418 static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo) 418 419 { … … 421 422 NSOpenGLContext *pOldCtx = pCtxInfo->pCtx; 422 423 NSView *pOldView = pCtxInfo->pView; 423 424 424 425 glFlush(); 425 426 if (pOldCtx != nil) … … 430 431 /** @todo r=bird: Figure out what we really want to do here, and either rename 431 432 * pOldView or fix the code. */ 432 if ([pOldCtx view] != pOldView) 433 if ([pOldCtx view] != pOldView) 433 434 { 434 435 DEBUG_CLEAR_GL_ERRORS(); … … 436 437 DEBUG_CHECK_GL_ERROR("setView"); 437 438 } 438 439 439 440 DEBUG_CLEAR_GL_ERRORS(); 440 441 [pOldCtx makeCurrentContext]; 441 442 DEBUG_CHECK_GL_ERROR("makeCurrentContext"); 442 443 443 444 #ifdef VBOX_STRICT 444 445 { … … 458 459 459 460 460 /** 461 /** 461 462 * Custom OpenGL context class. 462 463 * 463 464 * This implementation doesn't allow to set a view to the context, but save the 464 * view for later use. Also it saves a copy of the pixel format used to create 465 * that context for later use. 466 */ 465 * view for later use. Also it saves a copy of the pixel format used to create 466 * that context for later use. 467 */ 467 468 @interface OverlayOpenGLContext: NSOpenGLContext 468 469 { … … 509 510 510 511 @implementation VBoxTaskPerformSelector 511 512 512 513 /** 513 514 * Initializes a VBoxTaskPerformSelector. 514 * 515 * 515 516 * @param aObject The object (reference not consumed). 516 517 * @param aSelector The method selector. … … 550 551 551 552 /** 552 * 553 * 553 554 */ 554 555 @interface VBoxTaskComposite : VBoxTask … … 589 590 /** 590 591 * Adds a task to the composite task object. 591 * 592 * 592 593 * @param pTask Task to add. Reference is NOT consumed. 593 594 */ … … 621 622 break; 622 623 } 623 624 624 625 NSUInteger count = [m_pArray count]; 625 626 Assert(m_CurIndex <= count); … … 634 635 VBoxTask *pTask = (VBoxTask *)[m_pArray objectAtIndex:m_CurIndex]; 635 636 Assert(pTask != nil); 636 637 637 638 ++m_CurIndex; 638 639 639 640 /* 640 641 * Remove the first 1025 empty entires. … … 649 650 } 650 651 RTCritSectLeave(&m_Lock); 651 652 652 653 /* 653 654 * Run the task and release it. … … 667 668 [pTask release]; 668 669 } 669 670 670 671 [m_pArray release]; 671 672 RTCritSectDelete(&m_Lock); … … 677 678 678 679 /** 679 * 680 * 680 * 681 * 681 682 */ 682 683 @interface VBoxMainThreadTaskRunner : NSObject … … 702 703 m_pTasks = [[VBoxTaskComposite alloc] init]; 703 704 } 704 705 705 706 return self; 706 707 } … … 728 729 [self performSelectorOnMainThread:@selector(runTasks) withObject:nil waitUntilDone:NO]; 729 730 } 730 731 731 732 DEBUG_FUNC_LEAVE(); 732 733 } … … 734 735 /** 735 736 * Adds a task calling an object method (selector). 736 * 737 * 737 738 * @param aObject The object (reference not consumed).. 738 739 * @param aSelector The method selector. … … 746 747 } 747 748 748 749 749 750 /** 750 751 * Internal method for running the pending tasks. … … 757 758 /** @todo r=bird: This release and the retain in the add method aren't 758 759 * necessarily balanced if there are more than one call to add(). 759 * 760 * 760 761 * This could probably end up deleting the singleton prematurely and leave 761 762 * globalInstance() returning pointers to a stale object in freed memory, … … 773 774 } 774 775 775 /** 776 * Callback for calling runTasks via renderspuCalloutClient. 777 * @param pvUser The VBoxMainThreadTaskRunner singleton. 778 */ 776 /** 777 * Callback for calling runTasks via renderspuCalloutClient. 778 * @param pvUser The VBoxMainThreadTaskRunner singleton. 779 */ 779 780 static DECLCALLBACK(void) VBoxMainThreadTaskRunner_RcdRunCallback(void *pvUser) 780 781 { … … 786 787 } 787 788 788 /** 789 * Runs pending tasks synchronously, if possible in the current context. 790 * 789 /** 790 * Runs pending tasks synchronously, if possible in the current context. 791 * 791 792 * @returns true if executed tasks, false if not possible. 792 793 */ … … 794 795 { 795 796 #ifndef IN_VMSVGA3D 796 /* 797 /* 797 798 * Call on main thread (?) via renderspuCalloutClient (whatever that is). 798 799 */ … … 804 805 } 805 806 #endif 806 807 807 808 /* 808 809 * Run directly if on main thread. … … 813 814 return true; 814 815 } 815 816 816 817 /* Not possible. */ 817 818 return false; … … 834 835 #endif 835 836 836 /** 837 * The custom view class. 838 * 839 * This is the main class of the cocoa OpenGL implementation. It manages a 840 * frame buffer object for the rendering of the guest applications. The guest 837 /** 838 * The custom view class. 839 * 840 * This is the main class of the cocoa OpenGL implementation. It manages a 841 * frame buffer object for the rendering of the guest applications. The guest 841 842 * applications render in this frame buffer which is bound to an OpenGL texture. 842 * To display the guest content, a secondary shared OpenGL context of the main 843 * To display the guest content, a secondary shared OpenGL context of the main 843 844 * OpenGL context is created. The secondary context is marked as non-opaque and 844 * the texture is displayed on an object which is composed out of the several 845 * visible region rectangles. 846 */ 845 * the texture is displayed on an object which is composed out of the several 846 * visible region rectangles. 847 */ 847 848 @interface OverlayView : NSView 848 849 { … … 850 851 NSView *m_pParentView; 851 852 NSWindow *m_pOverlayWin; 852 853 853 854 NSOpenGLContext *m_pGLCtx; 854 855 NSOpenGLContext *m_pSharedGLCtx; 855 856 RTTHREAD m_Thread; 856 857 857 858 GLuint m_FBOId; 858 859 … … 875 876 876 877 /** @name Position/Size tracking 877 * @{ */ 878 * @{ */ 878 879 NSPoint m_Pos; 879 880 NSSize m_Size; … … 883 884 NSRect m_RootRect; 884 885 float m_yInvRootOffset; 885 886 886 887 #ifndef IN_VMSVGA3D 887 888 CR_BLITTER *m_pBlitter; … … 894 895 bool m_fEverSized; 895 896 } 896 - (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView *)pParentView winInfo:(WindowInfo *)pWinInfo 897 - (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView *)pParentView winInfo:(WindowInfo *)pWinInfo 897 898 fVisParams:(GLbitfield) fVisParams; 898 899 - (void)setGLCtx:(NSOpenGLContext*)pCtx; … … 960 961 @end 961 962 962 /** 963 /** 963 964 * Helper view. 964 965 * … … 967 968 * (which happens on fullscreen/seamless entry/exit) the overlay 968 969 * window is informed & can add them self as a child window 969 * again. 970 */ 970 * again. 971 */ 971 972 @class OverlayWindow; 972 973 @interface OverlayHelperView: NSView … … 978 979 @end 979 980 980 /** 981 /** 981 982 * Custom window class. 982 983 * … … 984 985 * Its a direct child of the Qt Main window. It marks its background 985 986 * transparent & non opaque to make clipping possible. It also disable mouse 986 * events and handle frame change events of the parent view. 987 */ 987 * events and handle frame change events of the parent view. 988 */ 988 989 @interface OverlayWindow : NSWindow 989 990 { … … 1027 1028 if (self) 1028 1029 { 1029 /* 1030 /* 1030 1031 * We need a lock cause the thumb image could be accessed from the main 1031 1032 * thread when someone is calling display on the dock tile & from the 1032 * OpenGL thread when the thumbnail is updated. 1033 */ 1033 * OpenGL thread when the thumbnail is updated. 1034 */ 1034 1035 m_Lock = [[NSLock alloc] init]; 1035 1036 } 1036 1037 1037 1038 DEBUG_FUNC_LEAVE(); 1038 1039 1039 1040 return self; 1040 1041 } … … 1043 1044 { 1044 1045 DEBUG_FUNC_ENTER(); 1045 1046 1046 1047 [self cleanup]; 1047 1048 [m_Lock release]; 1048 1049 1049 1050 [super dealloc]; 1050 1051 1051 1052 DEBUG_FUNC_LEAVE(); 1052 1053 } … … 1055 1056 { 1056 1057 DEBUG_FUNC_ENTER(); 1057 1058 1058 1059 if (m_ThumbImage != nil) 1059 1060 { … … 1067 1068 m_ThumbBitmap = nil; 1068 1069 } 1069 1070 1070 1071 DEBUG_FUNC_LEAVE(); 1071 1072 } … … 1191 1192 1192 1193 [super dealloc]; 1193 1194 1194 1195 DEBUG_FUNC_LEAVE(); 1195 1196 } … … 1201 1202 GLint val; 1202 1203 [m_pPixelFormat getValues:&val forAttribute:NSOpenGLPFADoubleBuffer forVirtualScreen:0]; 1203 1204 1204 1205 DEBUG_FUNC_LEAVE(); 1205 1206 return val == GL_TRUE ? YES : NO; … … 1238 1239 m_pView = NULL;; 1239 1240 [super clearDrawable]; 1240 1241 1241 1242 DEBUG_FUNC_LEAVE(); 1242 1243 } … … 1282 1283 1283 1284 [m_pOverlayWindow parentWindowChanged:[self window]]; 1284 1285 1285 1286 DEBUG_FUNC_LEAVE(); 1286 1287 } … … 1310 1311 [m_pOverlayView setOverlayWin: self]; 1311 1312 1312 #ifdef IN_VMSVGA3D 1313 #ifdef IN_VMSVGA3D 1313 1314 NSRect frame = [pParentView frame]; 1314 1315 frame.origin.x = frame.origin.x = 0; … … 1368 1369 1369 1370 [super dealloc]; 1370 1371 1371 1372 DEBUG_FUNC_LEAVE(); 1372 1373 } … … 1377 1378 DEBUG_MSG(("OWIN(%p): parentWindowFrameChanged\n", (void *)self)); 1378 1379 1379 /* 1380 /* 1380 1381 * Reposition this window with the help of the OverlayView. Perform the 1381 * call in the OpenGL thread. 1382 */ 1382 * call in the OpenGL thread. 1383 */ 1383 1384 /* 1384 1385 [m_pOverlayView performSelector:@selector(vboxReshapePerform) onThread:m_Thread withObject:nil waitUntilDone:YES]; … … 1386 1387 1387 1388 if ([m_pOverlayView isEverSized]) 1388 { 1389 { 1389 1390 if ([NSThread isMainThread]) 1390 1391 [m_pOverlayView vboxReshapePerform]; … … 1392 1393 [self performSelectorOnMainThread:@selector(vboxReshapePerform) withObject:nil waitUntilDone:NO]; 1393 1394 } 1394 1395 1395 1396 DEBUG_FUNC_LEAVE(); 1396 1397 } … … 1415 1416 [pWindow addChildWindow:self ordered:NSWindowAbove]; 1416 1417 1417 /* 1418 /* 1418 1419 * Reshape the overlay view after a short waiting time to let the main 1419 1420 * window resize itself properly. … … 1425 1426 1426 1427 if ([m_pOverlayView isEverSized]) 1427 { 1428 { 1428 1429 if ([NSThread isMainThread]) 1429 1430 [m_pOverlayView vboxReshapePerform]; 1430 1431 else 1431 1432 [self performSelectorOnMainThread:@selector(vboxReshapePerform) withObject:nil waitUntilDone:NO]; 1432 } 1433 } 1434 1433 } 1434 } 1435 1435 1436 DEBUG_FUNC_LEAVE(); 1436 1437 } … … 1447 1448 @implementation OverlayView 1448 1449 1449 - (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView *)pParentView winInfo:(WindowInfo *)pWinInfo 1450 - (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView *)pParentView winInfo:(WindowInfo *)pWinInfo 1450 1451 fVisParams:(GLbitfield) fVisParams 1451 1452 { 1452 COCOA_LOG_FLOW(("%s: self=%p aThread=%p pParentView=%p pWinInfo=%p fVisParams=%#x\n", __PRETTY_FUNCTION__, (void *)self, 1453 COCOA_LOG_FLOW(("%s: self=%p aThread=%p pParentView=%p pWinInfo=%p fVisParams=%#x\n", __PRETTY_FUNCTION__, (void *)self, 1453 1454 (void *)aThread, (void *)pParentView, (void *)pWinInfo, fVisParams)); 1454 1455 … … 1495 1496 1496 1497 [self setGLCtx:nil]; 1497 1498 1498 1499 if (m_pSharedGLCtx) 1499 1500 { … … 1503 1504 [m_pSharedGLCtx release]; 1504 1505 m_pSharedGLCtx = nil; 1505 1506 1506 1507 1507 1508 #ifndef IN_VMSVGA3D … … 1513 1514 1514 1515 [self clearVisibleRegions]; 1515 1516 1516 1517 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); 1517 1518 } … … 1529 1530 - (void)drawRect:(NSRect)aRect 1530 1531 { 1531 COCOA_LOG_FLOW(("%s: self=%p aRect=%d,%d %d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)aRect.origin.x, (int)aRect.origin.y, 1532 COCOA_LOG_FLOW(("%s: self=%p aRect=%d,%d %d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)aRect.origin.x, (int)aRect.origin.y, 1532 1533 (int)aRect.size.width, (int)aRect.size.height)); 1533 1534 … … 1561 1562 [pCtx retain]; 1562 1563 } 1563 1564 1564 1565 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); 1565 1566 } … … 1582 1583 1583 1584 m_pParentView = pView; 1584 1585 1585 1586 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); 1586 1587 } … … 1591 1592 1592 1593 m_pOverlayWin = pWin; 1593 1594 1594 1595 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); 1595 1596 } … … 1603 1604 - (void)vboxSetPosUI:(NSPoint)pos 1604 1605 { 1605 COCOA_LOG_FLOW(("%s: self=%p pos=%d,%d (old pos=%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, (int)pos.x, (int)pos.y, 1606 COCOA_LOG_FLOW(("%s: self=%p pos=%d,%d (old pos=%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, (int)pos.x, (int)pos.y, 1606 1607 (int)m_Pos.x, (int)m_Pos.y)); 1607 1608 … … 1629 1630 - (void)vboxSetPos:(NSPoint)pos 1630 1631 { 1631 COCOA_LOG_FLOW(("%s: self=%p pos=%d,%d (old pos=%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, (int)pos.x, (int)pos.y, 1632 COCOA_LOG_FLOW(("%s: self=%p pos=%d,%d (old pos=%d,%d)\n", __PRETTY_FUNCTION__, (void *)self, (int)pos.x, (int)pos.y, 1632 1633 (int)m_Pos.x, (int)m_Pos.y)); 1633 1634 … … 1656 1657 BOOL fIsMain = [NSThread isMainThread]; 1657 1658 NSWindow *pWin = nil; 1658 1659 1659 1660 Assert(fIsMain); 1660 1661 … … 1666 1667 [pWin setContentView: nil]; 1667 1668 [[pWin parentWindow] removeChildWindow: pWin]; 1668 1669 1669 1670 if (fIsMain) 1670 1671 [pWin release]; … … 1673 1674 /* We can NOT run synchronously with the main thread since this may lead to a deadlock, 1674 1675 caused by main thread waiting xpcom thread, xpcom thread waiting to main hgcm thread, 1675 and main hgcm thread waiting for us, this is why use waitUntilDone:NO, 1676 which should cause no harm. */ 1676 and main hgcm thread waiting for us, this is why use waitUntilDone:NO, 1677 which should cause no harm. */ 1677 1678 [pWin performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO]; 1678 1679 } … … 1686 1687 /* We can NOT run synchronously with the main thread since this may lead to a deadlock, 1687 1688 caused by main thread waiting xpcom thread, xpcom thread waiting to main hgcm thread, 1688 and main hgcm thread waiting for us, this is why use waitUntilDone:NO. 1689 and main hgcm thread waiting for us, this is why use waitUntilDone:NO. 1689 1690 We need to avoid concurrency though, so we cleanup some data right away via a cleanupData call. */ 1690 1691 [self performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO]; 1691 1692 } 1692 1693 1693 1694 #ifndef IN_VMSVGA3D 1694 1695 renderspuWinRelease(m_pWinInfo); 1695 1696 #endif 1696 1697 1697 1698 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); 1698 1699 } … … 1728 1729 { 1729 1730 COCOA_LOG_FLOW(("%s: self=%p size=%d,%d\n", __PRETTY_FUNCTION__, (void *)self, (int)size.width, (int)size.height)); 1730 1731 1731 1732 VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance]; 1732 1733 NSValue *pSize = [NSValue valueWithSize:size]; … … 1752 1753 [self vboxBlitterSyncWindow]; 1753 1754 #endif 1754 1755 1755 1756 /* Clear background to transparent. */ 1756 1757 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); … … 1999 2000 (int)m_Pos.x, (int)m_Pos.y, (int)m_Size.width, (int)m_Size.height)); 2000 2001 2001 /* @todo galitsyn: drop this!2002 /** @todo galitsyn: drop this! 2002 2003 * Later we have to correct the texture position in the case the window is 2003 * out of the parents window frame. So save the shift values for later use. */ 2004 * out of the parents window frame. So save the shift values for later use. */ 2004 2005 m_RootRect.origin.x = windowFrameSCS.origin.x - childFrameSCS.origin.x; 2005 2006 m_RootRect.origin.y = childFrameSCS.size.height + childFrameSCS.origin.y - (windowFrameSCS.size.height + windowFrameSCS.origin.y); … … 2022 2023 if (m_pSharedGLCtx) 2023 2024 { 2024 VBOX_CR_RENDER_CTX_INFO CtxInfo; 2025 VBOX_CR_RENDER_CTX_INFO CtxInfo; 2025 2026 vboxCtxEnter(m_pSharedGLCtx, &CtxInfo); 2026 2027 … … 2073 2074 - (void)makeCurrentFBO 2074 2075 { 2075 COCOA_LOG_FLOW(("%s: self=%p - m_pGLCtx=%p m_fNeedCtxUpdate=%d\n", __PRETTY_FUNCTION__, (void *)self, 2076 COCOA_LOG_FLOW(("%s: self=%p - m_pGLCtx=%p m_fNeedCtxUpdate=%d\n", __PRETTY_FUNCTION__, (void *)self, 2076 2077 (void *)m_pGLCtx, m_fNeedCtxUpdate)); 2077 2078 … … 2119 2120 m_fNeedCtxUpdate = false; 2120 2121 } 2121 2122 2122 2123 if (!m_FBOId) 2123 2124 { … … 2139 2140 return true; 2140 2141 } 2141 2142 #ifndef IN_VMSVGA3D 2142 2143 #ifndef IN_VMSVGA3D 2143 2144 Assert(!m_pBlitter); 2144 2145 m_pBlitter = RTMemAlloc(sizeof(*m_pBlitter)); … … 2149 2150 return false; 2150 2151 } 2151 2152 int rc = CrBltInit(m_pBlitter, NULL, false /*fCreateNewCtx*/, false /*fForceDrawBlt*/, 2152 2153 int rc = CrBltInit(m_pBlitter, NULL, false /*fCreateNewCtx*/, false /*fForceDrawBlt*/, 2153 2154 &render_spu.GlobalShaders, &render_spu.blitterDispatch); 2154 2155 if (RT_FAILURE(rc)) … … 2160 2161 COCOA_LOG_FLOW(("%s: returns false - CrBltInit failed with rc=%Rrc\n", __PRETTY_FUNCTION__, rc)); 2161 2162 return false; 2162 } 2163 } 2163 2164 2164 2165 COCOA_LOG_FLOW(("%s: blitter (%p) created successfully for view 0x%p\n", (void *)m_pBlitter, (void *)self)); … … 2168 2169 NSOpenGLPixelFormat *pPixelFormat = [(OverlayOpenGLContext *)m_pGLCtx openGLPixelFormat]; 2169 2170 NSOpenGLContext *pSharedGLCtx = [[NSOpenGLContext alloc] initWithFormat:pPixelFormat shareContext:m_pGLCtx]; 2170 2171 2171 2172 /* Set the new context as non opaque */ 2172 2173 GLint opaque = 0; … … 2178 2179 2179 2180 m_pSharedGLCtx = pSharedGLCtx; 2180 2181 2181 2182 COCOA_LOG_FLOW(("%s: returns true - new m_pSharedGLCtx=%p\n", __PRETTY_FUNCTION__, (void *)m_pSharedGLCtx)); 2182 2183 return true; … … 2188 2189 2189 2190 glFlush(); 2190 2191 2191 2192 /* Issue to the gui thread. */ 2192 2193 [self performSelectorOnMainThread:@selector(vboxTryDrawUI) withObject:nil waitUntilDone:NO]; … … 2198 2199 { 2199 2200 COCOA_LOG_FLOW(("%s: self=%p fVisible=%d\n", __PRETTY_FUNCTION__, (void *)self, fVisible)); 2200 2201 2201 2202 VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance]; 2202 2203 NSNumber *pVisObj = [NSNumber numberWithBool:fVisible]; … … 2217 2218 - (void)vboxSetVisibleUIObj:(NSNumber *)pVisibleObj 2218 2219 { 2219 COCOA_LOG_FLOW(("%s: self=%p pVisibleObj=%p(%d)\n", __PRETTY_FUNCTION__, 2220 COCOA_LOG_FLOW(("%s: self=%p pVisibleObj=%p(%d)\n", __PRETTY_FUNCTION__, 2220 2221 (void *)self, (void *)pVisibleObj, [pVisibleObj boolValue])); 2221 2222 … … 2256 2257 [self vboxReshapeOnReparentPerform]; 2257 2258 } 2258 2259 2259 2260 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); 2260 2261 } … … 2263 2264 { 2264 2265 COCOA_LOG_FLOW(("%s: self=%p\n", __PRETTY_FUNCTION__, (void *)self)); 2265 2266 2266 2267 if ([self isHidden]) 2267 2268 { … … 2289 2290 } 2290 2291 #endif 2291 2292 2292 2293 const VBOXVR_SCR_COMPOSITOR *pCompositor = NULL; 2293 2294 #ifndef IN_VMSVGA3D … … 2319 2320 return; 2320 2321 } 2321 2322 2322 2323 Assert(m_pSharedGLCtx); 2323 2324 2324 2325 pCompositor = renderspuVBoxCompositorAcquire(m_pWinInfo); 2325 2326 Assert(!m_fDataVisible); … … 2341 2342 #endif /* !IN_VMSVGA3D */ 2342 2343 2343 2344 2344 2345 if ([self lockFocusIfCanDraw]) 2345 2346 { 2346 2347 COCOA_LOG_FLOW(("%s: Calling vboxPresent\n", __PRETTY_FUNCTION__)); 2347 [self vboxPresent:pCompositor]; 2348 [self vboxPresent:pCompositor]; 2348 2349 [self unlockFocus]; 2349 2350 } … … 2354 2355 m_fCleanupNeeded = false; 2355 2356 } 2356 #endif 2357 #endif 2357 2358 else 2358 2359 { … … 2360 2361 [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(vboxTryDrawUI) userInfo:nil repeats:NO]; 2361 2362 } 2362 2363 2363 2364 #ifndef IN_VMSVGA3D 2364 2365 renderspuVBoxCompositorUnlock(m_pWinInfo); … … 2382 2383 #endif 2383 2384 2384 VBOX_CR_RENDER_CTX_INFO CtxInfo; 2385 VBOX_CR_RENDER_CTX_INFO CtxInfo; 2385 2386 vboxCtxEnter(m_pSharedGLCtx, &CtxInfo); 2386 2387 2387 2388 [self vboxPresentCS:pCompositor]; 2388 2389 2389 2390 vboxCtxLeave(&CtxInfo); 2390 2391 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); … … 2396 2397 if ([m_pSharedGLCtx view] != self) 2397 2398 { 2398 COCOA_LOG_FLOW(("%s: Not current view of shared ctx! Switching... (self=%p, view=%p, m_pSharedGLCtx)\n", 2399 COCOA_LOG_FLOW(("%s: Not current view of shared ctx! Switching... (self=%p, view=%p, m_pSharedGLCtx)\n", 2399 2400 __PRETTY_FUNCTION__, (void *)self, (void *)[m_pSharedGLCtx view], (void *)m_pSharedGLCtx)); 2400 2401 [m_pSharedGLCtx setView: self]; 2401 2402 m_fNeedViewportUpdate = true; 2402 2403 } 2403 2404 2404 2405 if (m_fNeedViewportUpdate) 2405 2406 { … … 2407 2408 m_fNeedViewportUpdate = false; 2408 2409 } 2409 2410 2410 2411 m_fCleanupNeeded = false; 2411 2412 2412 2413 #ifndef IN_VMSVGA3D 2413 2414 /* Render FBO content to the dock tile when necessary. */ … … 2415 2416 #endif 2416 2417 2417 /* change to #if 0 to see thumbnail image */ 2418 /* change to #if 0 to see thumbnail image */ 2418 2419 #if 1 2419 2420 [self vboxPresentToViewCS:pCompositor]; … … 2453 2454 { 2454 2455 NSRect r = [self frame]; 2455 COCOA_LOG_FLOW(("%s: self=%p - r={%d,%d %d,%d}\n", __PRETTY_FUNCTION__, (void *)self, 2456 COCOA_LOG_FLOW(("%s: self=%p - r={%d,%d %d,%d}\n", __PRETTY_FUNCTION__, (void *)self, 2456 2457 (int)r.origin.x, (int)r.origin.y, (int)r.size.width, (int)r.size.height)); 2457 2458 … … 2479 2480 /* Clear background to transparent */ 2480 2481 glClear(GL_COLOR_BUFFER_BIT); 2481 2482 2482 2483 m_fDataVisible = false; 2483 2484 2484 2485 # ifndef IN_VMSVGA3D 2485 2486 float xStretch; 2486 2487 float yStretch; 2487 2488 CrVrScrCompositorGetStretching(pCompositor, &xStretch, &yStretch); 2488 2489 2489 2490 VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR CIter; 2490 2491 const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry; … … 2501 2502 rc = CrBltEnter(m_pBlitter); 2502 2503 if (RT_SUCCESS(rc)) 2503 { 2504 { 2504 2505 uint32_t i; 2505 2506 for (i = 0; i < cRegions; ++i) … … 2513 2514 vboxNSRectToRect(&m_RootRect, &RestrictDstRect); 2514 2515 VBoxRectIntersected(&RestrictDstRect, pDstRect, &DstRect); 2515 2516 2516 2517 if (VBoxRectIsZero(&DstRect)) 2517 2518 continue; … … 2520 2521 2521 2522 vboxNSRectToRectUnstretched(&m_RootRect, &RestrictSrcRect, xStretch / backingStretchFactor, yStretch / backingStretchFactor); 2522 VBoxRectTranslate(&RestrictSrcRect, 2523 -CrVrScrCompositorEntryRectGet(pEntry)->xLeft, 2523 VBoxRectTranslate(&RestrictSrcRect, 2524 -CrVrScrCompositorEntryRectGet(pEntry)->xLeft, 2524 2525 -CrVrScrCompositorEntryRectGet(pEntry)->yTop); 2525 2526 VBoxRectIntersected(&RestrictSrcRect, pSrcRect, &SrcRect); 2526 2527 2527 2528 if (VBoxRectIsZero(&SrcRect)) 2528 2529 continue; … … 2530 2531 pSrcRect = &SrcRect; 2531 2532 pDstRect = &DstRect; 2532 2533 2533 2534 pTexData = CrVrScrCompositorEntryTexGet(pEntry); 2534 2535 2535 2536 CrBltBlitTexMural(m_pBlitter, true, CrTdTexGet(pTexData), pSrcRect, pDstRect, 1, fFlags | CRBLT_F_NOALPHA); 2536 2537 2537 2538 m_fDataVisible = true; 2538 2539 } … … 2577 2578 CR_BLITTER_WINDOW WinInfo; 2578 2579 NSRect r; 2579 2580 2580 2581 if (!m_pBlitter) 2581 2582 return; 2582 2583 2583 2584 RT_ZERO(WinInfo); 2584 2585 2585 2586 r = [self frame]; 2586 2587 WinInfo.width = r.size.width; 2587 2588 WinInfo.height = r.size.height; 2588 2589 2589 2590 Assert(WinInfo.width == m_RootRect.size.width); 2590 2591 Assert(WinInfo.height == m_RootRect.size.height); 2591 2592 2592 2593 /*CrBltMuralSetCurrentInfo(m_pBlitter, NULL);*/ 2593 2594 2594 2595 CrBltMuralSetCurrentInfo(m_pBlitter, &WinInfo); 2595 2596 CrBltCheckUpdateViewport(m_pBlitter); … … 2612 2613 if ([m_DockTileView thumbBitmap] != nil) 2613 2614 { 2614 /* 2615 /* 2615 2616 * Only update after at least 200 ms, cause glReadPixels is 2616 * heavy performance wise. 2617 */ 2617 * heavy performance wise. 2618 */ 2618 2619 uint64_t msTS = RTTimeSystemMilliTS(); 2619 2620 VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR CIter; 2620 2621 const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry; 2621 2622 2622 2623 if (msTS - m_msDockUpdateTS > 200) 2623 2624 { 2624 2625 m_msDockUpdateTS = msTS; 2625 2626 # if 0 2626 /* todo:check this for optimization */2627 /** @todo check this for optimization */ 2627 2628 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName); 2628 2629 glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE, … … 2646 2647 2647 2648 rr = [m_DockTileView frame]; 2648 2649 2649 2650 CrVrScrCompositorGetStretching(pCompositor, &xStretch, &yStretch); 2650 2651 2651 2652 CrVrScrCompositorConstIterInit(pCompositor, &CIter); 2652 2653 while ((pEntry = CrVrScrCompositorConstIterNext(&CIter)) != NULL) … … 2661 2662 rc = CrBltEnter(m_pBlitter); 2662 2663 if (RT_SUCCESS(rc)) 2663 { 2664 { 2664 2665 uint32_t i; 2665 2666 for (i = 0; i < cRegions; ++i) … … 2670 2671 RTRECT DstRect, RestrictDstRect; 2671 2672 RTRECT SrcRect, RestrictSrcRect; 2672 2673 2673 2674 vboxNSRectToRect(&m_RootRect, &RestrictDstRect); 2674 2675 VBoxRectIntersected(&RestrictDstRect, pDstRect, &DstRect); 2675 2676 2676 2677 VBoxRectTranslate(&DstRect, -RestrictDstRect.xLeft, -RestrictDstRect.yTop); 2677 2678 2678 2679 VBoxRectScale(&DstRect, m_FBOThumbScaleX, m_FBOThumbScaleY); 2679 2680 2680 2681 if (VBoxRectIsZero(&DstRect)) 2681 2682 continue; 2682 2683 2683 2684 vboxNSRectToRectUnstretched(&m_RootRect, &RestrictSrcRect, xStretch, yStretch); 2684 VBoxRectTranslate(&RestrictSrcRect, 2685 -CrVrScrCompositorEntryRectGet(pEntry)->xLeft, 2685 VBoxRectTranslate(&RestrictSrcRect, 2686 -CrVrScrCompositorEntryRectGet(pEntry)->xLeft, 2686 2687 -CrVrScrCompositorEntryRectGet(pEntry)->yTop); 2687 2688 VBoxRectIntersected(&RestrictSrcRect, pSrcRect, &SrcRect); 2688 2689 2689 2690 if (VBoxRectIsZero(&SrcRect)) 2690 2691 continue; … … 2692 2693 pSrcRect = &SrcRect; 2693 2694 pDstRect = &DstRect; 2694 2695 2695 2696 pTexData = CrVrScrCompositorEntryTexGet(pEntry); 2696 2697 2697 2698 CrBltBlitTexMural(m_pBlitter, true, CrTdTexGet(pTexData), pSrcRect, pDstRect, 1, fFlags); 2698 2699 } … … 2713 2714 } 2714 2715 } 2715 2716 2716 2717 glFinish(); 2717 2718 … … 2728 2729 [[m_DockTileView thumbBitmap] bitmapData]); 2729 2730 [m_DockTileView unlock]; 2730 2731 2731 2732 # ifdef VBOX_WITH_CRDUMPER_THUMBNAIL 2732 2733 ++g_cVBoxTgaCtr; 2733 crDumpNamedTGAF((GLint)rr.size.width, (GLint)rr.size.height, 2734 crDumpNamedTGAF((GLint)rr.size.width, (GLint)rr.size.height, 2734 2735 [[m_DockTileView thumbBitmap] bitmapData], "/Users/leo/vboxdumps/dump%d.tga", g_cVBoxTgaCtr); 2735 # endif 2736 # endif 2736 2737 2737 2738 pDT = [[NSApplication sharedApplication] dockTile]; 2738 2739 2739 2740 /* Send a display message to the dock tile in the main thread */ 2740 [[[NSApplication sharedApplication] dockTile] performSelectorOnMainThread:@selector(display) withObject:nil 2741 [[[NSApplication sharedApplication] dockTile] performSelectorOnMainThread:@selector(display) withObject:nil 2741 2742 waitUntilDone:NO]; 2742 2743 } … … 2762 2763 return GL_TRUE; 2763 2764 } 2764 2765 2765 2766 return GL_FALSE; 2766 2767 } … … 2784 2785 m_cClipRects = cRects; 2785 2786 } 2786 2787 2787 2788 COCOA_LOG_FLOW(("%s: returns\n", __PRETTY_FUNCTION__)); 2788 2789 } … … 2796 2797 NSView *pScreenContent = nil; 2797 2798 2798 /* 2799 /* 2799 2800 * First try the new variant which checks if this window is within the 2800 * screen which is previewed in the dock. 2801 */ 2801 * screen which is previewed in the dock. 2802 */ 2802 2803 if ([pContentView respondsToSelector:@selector(screenContentWithParentView:)]) 2803 2804 pScreenContent = [pContentView performSelector:@selector(screenContentWithParentView:) withObject:(id)m_pParentView]; 2804 /* 2805 /* 2805 2806 * If it fails, fall back to the old variant (VBox...). 2806 2807 */ 2807 2808 else if ([pContentView respondsToSelector:@selector(screenContent)]) 2808 2809 pScreenContent = [pContentView performSelector:@selector(screenContent)]; 2809 2810 2810 2811 COCOA_LOG_FLOW(("%s: returns %p (pContentView=%p)\n", __PRETTY_FUNCTION__, (void *)pScreenContent, (void *)pContentView)); 2811 2812 return pScreenContent; … … 2826 2827 m_FBOThumbScaleX = (float)dockFrame.size.width / parentFrame.size.width; 2827 2828 m_FBOThumbScaleY = (float)dockFrame.size.height / parentFrame.size.height; 2828 newFrame = NSMakeRect((int)(m_Pos.x * m_FBOThumbScaleX), 2829 (int)(dockFrame.size.height - (m_Pos.y + m_Size.height - m_yInvRootOffset) * m_FBOThumbScaleY), 2830 (int)(m_Size.width * m_FBOThumbScaleX), 2829 newFrame = NSMakeRect((int)(m_Pos.x * m_FBOThumbScaleX), 2830 (int)(dockFrame.size.height - (m_Pos.y + m_Size.height - m_yInvRootOffset) * m_FBOThumbScaleY), 2831 (int)(m_Size.width * m_FBOThumbScaleX), 2831 2832 (int)(m_Size.height * m_FBOThumbScaleY)); 2832 2833 /* … … 2837 2838 [m_DockTileView setFrame: newFrame]; 2838 2839 } 2839 COCOA_LOG_FLOW(("%s: returns - newFrame={%d,%d %d,%d} pView=%d\n", __PRETTY_FUNCTION__, (int)newFrame.origin.x, 2840 COCOA_LOG_FLOW(("%s: returns - newFrame={%d,%d %d,%d} pView=%d\n", __PRETTY_FUNCTION__, (int)newFrame.origin.x, 2840 2841 (int)newFrame.origin.y, (int)newFrame.size.width, (int)newFrame.size.height, (void *)pView)); 2841 2842 } … … 2902 2903 2903 2904 /* Create our worker view. */ 2904 OverlayView *pView = [[OverlayView alloc] initWithFrame:NSZeroRect 2905 thread:RTThreadSelf() 2906 parentView:pParentView 2905 OverlayView *pView = [[OverlayView alloc] initWithFrame:NSZeroRect 2906 thread:RTThreadSelf() 2907 parentView:pParentView 2907 2908 winInfo:pWinInfo 2908 2909 fVisParams:fVisParams]; … … 2916 2917 return pView; 2917 2918 } 2918 2919 2919 2920 COCOA_LOG_FLOW(("vboxViewCreate: returns NULL\n")); 2920 2921 return NULL; … … 2943 2944 void cocoaViewCreate(NativeNSViewRef *ppView, WindowInfo *pWinInfo, NativeNSViewRef pParentView, GLbitfield fVisParams) 2944 2945 { 2945 COCOA_LOG_FLOW(("cocoaViewCreate: ppView=%p pWinInfo=%p pParentView=%p fVisParams=%#x\n", 2946 COCOA_LOG_FLOW(("cocoaViewCreate: ppView=%p pWinInfo=%p pParentView=%p fVisParams=%#x\n", 2946 2947 (void *)ppView, (void *)pWinInfo, (void *)pParentView, fVisParams)); 2947 2948 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init]; … … 2950 2951 VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance]; 2951 2952 [pRunner runTasksSyncIfPossible]; 2952 2953 2953 2954 #ifndef IN_VMSVGA3D 2954 2955 renderspuWinRetain(pWinInfo); … … 2976 2977 #endif 2977 2978 } 2978 2979 2979 2980 #ifndef IN_VMSVGA3D 2980 2981 if (!*ppView) 2981 2982 renderspuWinRelease(pWinInfo); 2982 2983 #endif 2983 2984 2984 2985 [pPool release]; 2985 2986 COCOA_LOG_FLOW(("cocoaViewCreate: returns *ppView=%p\n", (void *)*ppView)); … … 3076 3077 CR_RCD_GETGEOMETRY *pGetGeometry = (CR_RCD_GETGEOMETRY *)pvUser; 3077 3078 pGetGeometry->rect = [[pGetGeometry->pView window] frame]; 3078 COCOA_LOG_FLOW(("vboxRcdGetGeomerty: (x,y)=(%d,%d) (cx,cy)=(%d,%d)\n", pGetGeometry->rect.origin.x, pGetGeometry->rect.origin.y, 3079 COCOA_LOG_FLOW(("vboxRcdGetGeomerty: (x,y)=(%d,%d) (cx,cy)=(%d,%d)\n", pGetGeometry->rect.origin.x, pGetGeometry->rect.origin.y, 3079 3080 pGetGeometry->rect.size.width, pGetGeometry->rect.size.height)); 3080 3081 } … … 3082 3083 void cocoaViewGetGeometry(NativeNSViewRef pView, int *px, int *py, int *pcx, int *pcy) 3083 3084 { 3084 COCOA_LOG_FLOW(("cocoaViewGetGeometry: pView=%p px=%p py=%p pcx=%p pcy=%p\n", 3085 COCOA_LOG_FLOW(("cocoaViewGetGeometry: pView=%p px=%p py=%p pcx=%p pcy=%p\n", 3085 3086 (void *)pView, (void *)px, (void *)py, (void *)pcx, (void *)pcy)); 3086 3087 NSAutoreleasePool *pPool; … … 3090 3091 VBoxMainThreadTaskRunner *pRunner = [VBoxMainThreadTaskRunner globalInstance]; 3091 3092 [pRunner runTasksSyncIfPossible]; 3092 3093 3093 3094 NSRect frame; 3094 3095 #ifndef IN_VMSVGA3D … … 3106 3107 frame = [[pView window] frame]; 3107 3108 } 3108 3109 3109 3110 *px = frame.origin.x; 3110 3111 *py = frame.origin.y; … … 3134 3135 { 3135 3136 DEBUG_WARN(("renderspuDefaultSharedContextAcquire returned NULL")); 3136 3137 3137 3138 [pPool release]; 3138 3139 DEBUG_FUNC_LEAVE(); 3139 3140 return; 3140 3141 } 3141 3142 3142 3143 pCtx = pCtxInfo->context; 3143 3144 3144 3145 [(OverlayView *)pView setGLCtx:pCtx]; 3145 3146 } 3146 3147 # endif 3147 3148 3148 3149 [(OverlayView *)pView presentComposition:pChangedEntry]; 3149 3150 … … 3176 3177 } 3177 3178 #endif 3178 3179 [NSOpenGLContext clearCurrentContext]; 3179 3180 } 3180 3181 … … 3272 3273 DEBUG_FUNC_ENTER(); 3273 3274 NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init]; 3274 3275 3275 3276 Assert([(OverlayView *)pView glCtx] == pCtx); 3276 3277 Assert([pCtx view] == pView); -
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_config.c
-
Property svn:keywords
changed from
Id
toId Revision
-
Property svn:keywords
changed from
-
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_glx.c
-
Property svn:keywords
changed from
Id
toId Revision
-
Property svn:keywords
changed from
-
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
-
Property svn:keywords
changed from
Id
toId Revision
r62088 r69390 243 243 if (pcpwSetting) 244 244 { 245 /* TODO:need proper blitter synchronization, do not use so far!245 /** @todo need proper blitter synchronization, do not use so far! 246 246 * the problem is that rendering can be done in multiple thread: the main command (hgcm) thread and the redraw thread 247 247 * we currently use per-window synchronization, while we'll need a per-blitter synchronization if one blitter is used for multiple windows -
Property svn:keywords
changed from
-
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_wgl.c
-
Property svn:keywords
changed from
Id
toId Revision
r62679 r69390 1391 1391 */ 1392 1392 1393 /* @todo Chromium has no correct code to remove window ids and associated info from1393 /** @todo Chromium has no correct code to remove window ids and associated info from 1394 1394 * various tables. This is hack which just hides the root case. 1395 1395 */ -
Property svn:keywords
changed from
Note:
See TracChangeset
for help on using the changeset viewer.