Mesa (master): progs/wgl: Create GL context in a thread that actually uses it.

Michał Król michal at kemper.freedesktop.org
Fri Mar 20 15:17:18 UTC 2009


Module: Mesa
Branch: master
Commit: 9bbffcced4355ff11e11c5b01c4d0eea6b020119
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9bbffcced4355ff11e11c5b01c4d0eea6b020119

Author: Michal Krol <michal at vmware.com>
Date:   Fri Mar 20 16:16:12 2009 +0100

progs/wgl: Create GL context in a thread that actually uses it.

---

 progs/wgl/sharedtex_mt/sharedtex_mt.c |   65 ++++++++++++++++++---------------
 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 137c9c1..c461530 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)) {




More information about the mesa-commit mailing list