summaryrefslogtreecommitdiff
path: root/progs
diff options
context:
space:
mode:
authorMichal Krol <michal@vmware.com>2009-03-20 16:16:12 +0100
committerMichal Krol <michal@vmware.com>2009-03-20 16:16:49 +0100
commit9bbffcced4355ff11e11c5b01c4d0eea6b020119 (patch)
tree1b310dd0344599ad5a1af4d6962ebb26220b7627 /progs
parente8aa5a10185623a820364141b756d128a1171919 (diff)
progs/wgl: Create GL context in a thread that actually uses it.
Diffstat (limited to 'progs')
-rw-r--r--progs/wgl/sharedtex_mt/sharedtex_mt.c65
1 files changed, 35 insertions, 30 deletions
diff --git a/progs/wgl/sharedtex_mt/sharedtex_mt.c b/progs/wgl/sharedtex_mt/sharedtex_mt.c
index 137c9c10af..c461530e4b 100644
--- a/progs/wgl/sharedtex_mt/sharedtex_mt.c
+++ b/progs/wgl/sharedtex_mt/sharedtex_mt.c
@@ -49,6 +49,7 @@ struct window {
HGLRC Context;
float Angle;
int Id;
+ HGLRC sharedContext;
};
@@ -172,8 +173,6 @@ AddWindow(int xpos, int ypos, HGLRC sCtx)
{
struct window *win = &Windows[NumWindows];
WNDCLASS wc = {0};
- PIXELFORMATDESCRIPTOR pfd = {0};
- int visinfo;
int width = 300, height = 300;
if (NumWindows >= MAX_WINDOWS)
@@ -208,33 +207,7 @@ AddWindow(int xpos, int ypos, HGLRC sCtx)
Error("Couldn't create window");
}
- win->hDC = GetDC(win->Win);
- if (!win->hDC) {
- Error("Couldn't obtain HDC");
- }
-
- pfd.cColorBits = 24;
- pfd.cDepthBits = 24;
- pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
- pfd.iLayerType = PFD_MAIN_PLANE;
- pfd.iPixelType = PFD_TYPE_RGBA;
- pfd.nSize = sizeof(pfd);
- pfd.nVersion = 1;
-
- visinfo = ChoosePixelFormat(win->hDC, &pfd);
- if (!visinfo) {
- Error("Unable to find RGB, Z, double-buffered visual");
- }
-
- SetPixelFormat(win->hDC, visinfo, &pfd);
- win->Context = wglCreateContext(win->hDC);
- if (!win->Context) {
- Error("Couldn't create WGL context");
- }
-
- if (sCtx) {
- wglShareLists(sCtx, win->Context);
- }
+ win->sharedContext = sCtx;
ShowWindow(win->Win, SW_SHOW);
@@ -244,7 +217,6 @@ AddWindow(int xpos, int ypos, HGLRC sCtx)
static void
InitGLstuff(void)
-
{
glGenTextures(3, Textures);
@@ -432,9 +404,39 @@ threadRunner (void *arg)
{
struct thread_init_arg *tia = (struct thread_init_arg *) arg;
struct window *win;
+ PIXELFORMATDESCRIPTOR pfd = {0};
+ int visinfo;
win = &Windows[tia->id];
+ win->hDC = GetDC(win->Win);
+ if (!win->hDC) {
+ Error("Couldn't obtain HDC");
+ }
+
+ pfd.cColorBits = 24;
+ pfd.cDepthBits = 24;
+ pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
+ pfd.iLayerType = PFD_MAIN_PLANE;
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.nSize = sizeof(pfd);
+ pfd.nVersion = 1;
+
+ visinfo = ChoosePixelFormat(win->hDC, &pfd);
+ if (!visinfo) {
+ Error("Unable to find RGB, Z, double-buffered visual");
+ }
+
+ SetPixelFormat(win->hDC, visinfo, &pfd);
+ win->Context = wglCreateContext(win->hDC);
+ if (!win->Context) {
+ Error("Couldn't create WGL context");
+ }
+
+ if (win->sharedContext) {
+ wglShareLists(win->sharedContext, win->Context);
+ }
+
while (1) {
MSG msg;
@@ -464,6 +466,9 @@ threadRunner (void *arg)
static void
Resize(struct window *h, unsigned int width, unsigned int height)
{
+ if (!h->Context)
+ return;
+
EnterCriticalSection(&h->drawMutex);
if (!wglMakeCurrent(h->hDC, h->Context)) {