|
From: <cad...@li...> - 2006-04-10 02:07:42
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns=3D"http://www.w3.org/1999/xhtml"> <head><style type=3D"text/css"><!-- body {background:#ffffff;font-family:Verdana,Helvetica,Arial,sans-serif;} h3 {margin:15px 0;padding:0;line-height:0;} #msg {margin: 0 0 2em 0;} #msg dl, #msg ul, #msg pre {padding:1em;border:1px dashed black;margin: 1= 0px 0 30px 0;} #msg dl {background:#ccccff;} #msg pre {background:#ffffcc;} #msg ul {background:#cc99ff;list-style:none;} #msg dt {font-weight:bold;float:left;width: 6em;} #msg dt:after { content:':';} #patch h4 {padding: 0 10px;line-height:1.5em;margin:0;background:#ccffff;= border-bottom:1px solid black;margin:0 0 10px 0;} #patch .propset h4, #patch .binary h4 {margin: 0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {background:#eeeeee;padding: 0 0 10px 0;} #patch .propset .diff, #patch .binary .diff {padding: 10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patc= h .binary {border:1px solid black;margin:10px 0;} #patch .add {background:#ddffdd;} #patch .rem {background:#ffdddd;} #patch .lines, .info {color:#888888;background:#ffffff;} --></style> <title>[308] tiki/win32/src: tiki: Make GL threading more proper in win32= </title> </head> <body> <div id=3D"msg"> <dl> <dt>Revision</dt> <dd>308</dd> <dt>Author</dt> <dd>bard</dd> <dt>Date</dt> <dd>2006-03-26 16:18:11 -0800 (Sun, 26 Mar 2006)</dd> </dl> <h3>Log Message</h3> <pre>tiki: Make GL threading more proper in win32</pre> <h3>Modified Paths</h3> <ul> <li><a href=3D"#tikiwin32includeTikiglhdrsh">tiki/win32/include/Tiki/glhd= rs.h</a></li> <li><a href=3D"#tikiwin32includepchh">tiki/win32/include/pch.h</a></li> <li><a href=3D"#tikiwin32srcplatglcpp">tiki/win32/src/platgl.cpp</a></li> <li><a href=3D"#tikiwin32srcplatthreadcpp">tiki/win32/src/platthread.cpp<= /a></li> </ul> </div> <div id=3D"patch"> <h3>Diff</h3> <a id=3D"tikiwin32includeTikiglhdrsh"></a> <div class=3D"modfile"><h4>Modified: tiki/win32/include/Tiki/glhdrs.h (30= 7 =3D> 308)</h4> <pre class=3D"diff"> <span class=3D"info">--- tiki/win32/include/Tiki/glhdrs.h 2006-03-27 00:1= 4:11 UTC (rev 307) +++ tiki/win32/include/Tiki/glhdrs.h 2006-03-27 00:18:11 UTC (rev 308) </span><span class=3D"lines">@@ -6,7 +6,11 @@ </span><span class=3D"cx"> #include <GL/glu.h> =20 namespace Tiki { </span><span class=3D"add">+ // Returns a handle to the Win32 window. </span><span class=3D"cx"> HWND GetWin32Window(); </span><span class=3D"add">+ + // Returns a handle to the primary GL context. + HGLRC GetWin32MainHGLRC(); </span><span class=3D"cx"> }; =20 =20 </span></pre></div> <a id=3D"tikiwin32includepchh"></a> <div class=3D"modfile"><h4>Modified: tiki/win32/include/pch.h (307 =3D> 3= 08)</h4> <pre class=3D"diff"> <span class=3D"info">--- tiki/win32/include/pch.h 2006-03-27 00:14:11 UTC= (rev 307) +++ tiki/win32/include/pch.h 2006-03-27 00:18:11 UTC (rev 308) </span><span class=3D"lines">@@ -11,6 +11,10 @@ </span><span class=3D"cx"> #define VC_EXTRALEAN // Exclude rarely-used s= tuff from Windows headers #endif =20 </span><span class=3D"add">+// Dumb VS8.0 stuff +#define _CRT_SECURE_NO_DEPRECATE 1 +#define _ATL_SECURE_NO_DEPRECATE 1 + </span><span class=3D"cx"> #include <windows.h> #include <shellapi.h> =20 </span></pre></div> <a id=3D"tikiwin32srcplatglcpp"></a> <div class=3D"modfile"><h4>Modified: tiki/win32/src/platgl.cpp (307 =3D> = 308)</h4> <pre class=3D"diff"> <span class=3D"info">--- tiki/win32/src/platgl.cpp 2006-03-27 00:14:11 UT= C (rev 307) +++ tiki/win32/src/platgl.cpp 2006-03-27 00:18:11 UTC (rev 308) </span><span class=3D"lines">@@ -24,7 +24,7 @@ </span><span class=3D"cx"> // Windows globals static HWND m_hWndMain; static HINSTANCE m_hInstance; </span><span class=3D"rem">-static HGLRC m_hrc; </span><span class=3D"add">+static HGLRC m_hrc, m_hThreadRc; </span><span class=3D"cx"> static DWORD m_dwThreadID; static HANDLE m_hThread; static HDC m_hThreadDc; </span><span class=3D"lines">@@ -54,6 +54,10 @@ </span><span class=3D"cx"> return m_hWndMain; } =20 </span><span class=3D"add">+HGLRC Tiki::GetWin32MainHGLRC() { + return m_hrc; +} + </span><span class=3D"cx"> //////////////////////////////////// // Tiki::DoMain // initialization </span><span class=3D"lines">@@ -237,35 +241,38 @@ </span><span class=3D"cx">=20 // Set up our GL context so that texture loading and such works as well= . m_hThreadDc =3D GetDC(m_hWndMain); </span><span class=3D"rem">- wglMakeCurrent(m_hThreadDc, m_hrc); </span><span class=3D"add">+ m_hThreadRc =3D wglCreateContext(m_hThreadDc= ); + wglShareLists(m_hrc, m_hThreadRc); + wglMakeCurrent(m_hThreadDc, m_hThreadRc); </span><span class=3D"cx">=20 int argc =3D 0; LPWSTR *args =3D CommandLineToArgvW(GetCommandLineW(), &argc); // if we have 1 or more command line args, pass it down nicely to tiki_= main if(argc > 0) { </span><span class=3D"rem">- char ** argv =3D new char*[argc]; - for(int i =3D 0; i < argc; i++) - { - argv[i] =3D new char [wcslen(args[i])]; - sprintf(argv[i], "%ws", args[i]); - } - LocalFree(args); </span><span class=3D"add">+ char ** argv =3D new char*[argc]; + for(int i =3D 0; i < argc; i++) + { + argv[i] =3D new char[wcslen(args[i]) + 2]; + sprintf(argv[i], "%ws", args[i]); + } + LocalFree(args); </span><span class=3D"cx">=20 </span><span class=3D"rem">- tiki_main(argc, argv); </span><span class=3D"add">+ tiki_main(argc, argv); </span><span class=3D"cx">=20 </span><span class=3D"rem">- // cleanup allocated memory for cmd l= ine args - for(int i =3D 0; i < argc; i++) - { - delete [] argv[i]; - } - delete [] argv; </span><span class=3D"add">+ // cleanup allocated memory for cmd line ar= gs + for(int i =3D 0; i < argc; i++) + { + delete [] argv[i]; + } + delete [] argv; </span><span class=3D"cx"> } else { </span><span class=3D"rem">- tiki_main(0, NULL); </span><span class=3D"add">+ tiki_main(0, NULL); </span><span class=3D"cx"> } =20 </span><span class=3D"add">+ wglDeleteContext(m_hThreadRc); </span><span class=3D"cx"> ReleaseDC(m_hWndMain, m_hThreadDc); m_hThreadDc =3D NULL; =20 </span><span class=3D"lines">@@ -293,8 +300,10 @@ </span><span class=3D"cx"> } =20 extern "C" void tiki_scene_begin_hook() { </span><span class=3D"rem">- // Set up our GL context for painting. - wglMakeCurrent(m_hThreadDc, m_hrc); </span><span class=3D"add">+ // Set up our GL context for painting, if ne= eded. If this is another + // thread besides the main game thread, it might have its own. + if ( wglGetCurrentContext() =3D=3D NULL ) + wglMakeCurrent(m_hThreadDc, m_hrc); </span><span class=3D"cx">=20 // Every so often we should reset the frame counters, to avoid // having a super long term averaging effect. </span></pre></div> <a id=3D"tikiwin32srcplatthreadcpp"></a> <div class=3D"modfile"><h4>Modified: tiki/win32/src/platthread.cpp (307 =3D= > 308)</h4> <pre class=3D"diff"> <span class=3D"info">--- tiki/win32/src/platthread.cpp 2006-03-27 00:14:1= 1 UTC (rev 307) +++ tiki/win32/src/platthread.cpp 2006-03-27 00:18:11 UTC (rev 308) </span><span class=3D"lines">@@ -1,6 +1,7 @@ </span><span class=3D"cx"> #include "pch.h" =20 #include "Tiki/thread.h" </span><span class=3D"add">+#include "Tiki/glhdrs.h" </span><span class=3D"cx">=20 struct StubInfo { void * (*func)(void *); </span><span class=3D"lines">@@ -11,8 +12,18 @@ </span><span class=3D"cx"> assert( data ); StubInfo * inf =3D (StubInfo *)data; =20 </span><span class=3D"add">+ // Set up our GL context so that texture loa= ding and such works here as well. + HDC threadDc =3D GetDC(Tiki::GetWin32Window()); + HGLRC threadRc =3D wglCreateContext(threadDc); + wglShareLists(Tiki::GetWin32MainHGLRC(), threadRc); + wglMakeCurrent(threadDc, threadRc); + </span><span class=3D"cx"> void * result =3D inf->func(inf->data); delete inf; </span><span class=3D"add">+ + wglDeleteContext(threadRc); + ReleaseDC(Tiki::GetWin32Window(), threadDc); + </span><span class=3D"cx"> return (DWORD)(DWORD_PTR)result; } =20 </span> </pre> </div> </div> </body> </html> |