diff options
Diffstat (limited to 'progs')
-rw-r--r-- | progs/wgl/sharedtex_mt/sharedtex_mt.c | 30 | ||||
-rw-r--r-- | progs/wgl/wglthreads/wglthreads.c | 31 | ||||
-rw-r--r-- | progs/xdemos/glxcontexts.c | 160 |
3 files changed, 94 insertions, 127 deletions
diff --git a/progs/wgl/sharedtex_mt/sharedtex_mt.c b/progs/wgl/sharedtex_mt/sharedtex_mt.c index 010eb87..779e150 100644 --- a/progs/wgl/sharedtex_mt/sharedtex_mt.c +++ b/progs/wgl/sharedtex_mt/sharedtex_mt.c @@ -50,6 +50,7 @@ struct window { float Angle; int Id; HGLRC sharedContext; + HANDLE hEventInitialised; }; @@ -414,6 +415,10 @@ threadRunner (void *arg) Error("Couldn't obtain HDC"); } + /* Wait for the previous thread */ + if(tia->id > 0) + WaitForSingleObject(Windows[tia->id - 1].hEventInitialised, INFINITE); + pfd.cColorBits = 24; pfd.cDepthBits = 24; pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; @@ -434,9 +439,16 @@ threadRunner (void *arg) } if (win->sharedContext) { - wglShareLists(win->sharedContext, win->Context); + if(!wglShareLists(win->sharedContext, win->Context)) + Error("Couldn't share WGL context lists"); } + SetEvent(win->hEventInitialised); + + /* Wait for all threads to initialize otherwise wglShareLists will fail */ + if(tia->id < NumWindows - 1) + WaitForSingleObject(Windows[NumWindows - 1].hEventInitialised, INFINITE); + SendMessage(win->Win, WM_SIZE, 0, 0); while (1) { @@ -511,20 +523,26 @@ main(int argc, char *argv[]) h[2] = AddWindow( 10, 350, gCtx); h[3] = AddWindow(330, 350, gCtx); - if (!wglMakeCurrent(gHDC, gCtx)) { - Error("wglMakeCurrent failed for init thread."); - return -1; + for (i = 0; i < NumWindows; i++) { + Windows[i].hEventInitialised = CreateEvent(NULL, TRUE, FALSE, NULL); } - InitGLstuff(); - for (i = 0; i < NumWindows; i++) { DWORD id; tia[i].id = i; threads[i] = CreateThread(NULL, 0, threadRunner, &tia[i], 0, &id); + + WaitForSingleObject(Windows[i].hEventInitialised, INFINITE); + } + + if (!wglMakeCurrent(gHDC, gCtx)) { + Error("wglMakeCurrent failed for init thread."); + return -1; } + InitGLstuff(); + while (1) { MSG msg; diff --git a/progs/wgl/wglthreads/wglthreads.c b/progs/wgl/wglthreads/wglthreads.c index 1a8219c..27dca10 100644 --- a/progs/wgl/wglthreads/wglthreads.c +++ b/progs/wgl/wglthreads/wglthreads.c @@ -331,7 +331,9 @@ draw_loop(struct winthread *wt) if (Locking) EnterCriticalSection(&Mutex); + SwapBuffers(wt->hDC); + if (Locking) LeaveCriticalSection(&Mutex); @@ -443,7 +445,7 @@ create_window(struct winthread *wt, HGLRC shareCtx) win = CreateWindowEx(0, wc.lpszClassName, "wglthreads", - WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, + WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TILEDWINDOW, xpos, ypos, width, @@ -481,7 +483,8 @@ create_window(struct winthread *wt, HGLRC shareCtx) } if (shareCtx) { - wglShareLists(shareCtx, ctx); + if(!wglShareLists(shareCtx, ctx)) + Error("Couldn't share WGL context lists"); } /* save the info for this window/context */ @@ -504,10 +507,22 @@ ThreadProc(void *p) struct winthread *wt = (struct winthread *) p; HGLRC share; + /* Wait for the previous thread */ + if(Texture && wt->Index > 0) { + WaitForSingleObject(WinThreads[wt->Index - 1].hEventInitialised, INFINITE); + share = WinThreads[0].Context; + } + else + share = 0; + share = (Texture && wt->Index > 0) ? WinThreads[0].Context : 0; create_window(wt, share); SetEvent(wt->hEventInitialised); + /* Wait for all threads to initialize otherwise wglShareLists will fail */ + if(wt->Index < NumWinThreads - 1) + WaitForSingleObject(WinThreads[NumWinThreads - 1].hEventInitialised, INFINITE); + draw_loop(wt); return 0; } @@ -591,13 +606,17 @@ main(int argc, char *argv[]) printf("wglthreads: creating threads\n"); - /* Create the threads */ + /* Create the events */ for (i = 0; i < NumWinThreads; i++) { - DWORD id; - WinThreads[i].Index = i; WinThreads[i].hEventInitialised = CreateEvent(NULL, TRUE, FALSE, NULL); WinThreads[i].hEventRedraw = CreateEvent(NULL, FALSE, FALSE, NULL); + } + + /* Create the threads */ + for (i = 0; i < NumWinThreads; i++) { + DWORD id; + WinThreads[i].Thread = CreateThread(NULL, 0, ThreadProc, @@ -606,8 +625,6 @@ main(int argc, char *argv[]) &id); printf("wglthreads: Created thread %p\n", (void *) WinThreads[i].Thread); - WaitForSingleObject(WinThreads[i].hEventInitialised, INFINITE); - threads[i] = WinThreads[i].Thread; } diff --git a/progs/xdemos/glxcontexts.c b/progs/xdemos/glxcontexts.c index a97b62a..481749b 100644 --- a/progs/xdemos/glxcontexts.c +++ b/progs/xdemos/glxcontexts.c @@ -20,16 +20,17 @@ */ /* - * This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT) - * Port by Brian Paul 23 March 2001 + * Version of glxgears that creates/destroys the rendering context for each + * frame. Also periodically destroy/recreate the window. + * Good for finding memory leaks, etc. * * Command line options: * -info print GL implementation information - * -stereo use stereo enabled GLX visual * */ +#include <assert.h> #include <math.h> #include <stdlib.h> #include <stdio.h> @@ -92,13 +93,8 @@ static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; static GLint gear1, gear2, gear3; static GLfloat angle = 0.0; -static GLboolean fullscreen = GL_FALSE; /* Create a single fullscreen window */ -static GLboolean stereo = GL_FALSE; /* Enable stereo. */ -static GLfloat eyesep = 5.0; /* Eye separation. */ -static GLfloat fix_point = 40.0; /* Fixation point distance. */ -static GLfloat left, right, asp; /* Stereo frustum params. */ - - XVisualInfo *visinfo; +static XVisualInfo *visinfo = NULL; +static int WinWidth = 300, WinHeight = 300; /* @@ -272,22 +268,13 @@ do_draw(void) } - /* new window size or exposure */ static void reshape(int width, int height) { glViewport(0, 0, (GLint) width, (GLint) height); - if (stereo) { - GLfloat w; - - asp = (GLfloat) height / (GLfloat) width; - w = fix_point * (1.0 / 5.0); - - left = -5.0 * ((w - 0.5 * eyesep) / fix_point); - right = 5.0 * ((w + 0.5 * eyesep) / fix_point); - } else { + { GLfloat h = (GLfloat) height / (GLfloat) width; glMatrixMode(GL_PROJECTION); @@ -299,7 +286,6 @@ reshape(int width, int height) glLoadIdentity(); glTranslatef(0.0, 0.0, -40.0); } - static void @@ -337,7 +323,7 @@ init(void) glEnable(GL_NORMALIZE); } - + static void draw( Display *dpy, Window win ) @@ -354,36 +340,9 @@ draw( Display *dpy, Window win ) init(); - if (stereo) { - /* First left eye. */ - glDrawBuffer(GL_BACK_LEFT); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(left, right, -asp, asp, 5.0, 60.0); + reshape(WinWidth, WinHeight); - glMatrixMode(GL_MODELVIEW); - - glPushMatrix(); - glTranslated(+0.5 * eyesep, 0.0, 0.0); - do_draw(); - glPopMatrix(); - - /* Then right eye. */ - glDrawBuffer(GL_BACK_RIGHT); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-right, -left, -asp, asp, 5.0, 60.0); - - glMatrixMode(GL_MODELVIEW); - - glPushMatrix(); - glTranslated(-0.5 * eyesep, 0.0, 0.0); - do_draw(); - glPopMatrix(); - } else - do_draw(); + do_draw(); glDeleteLists(gear1, 1); glDeleteLists(gear2, 1); @@ -410,14 +369,6 @@ make_window( Display *dpy, const char *name, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 1, None }; - int stereoAttribs[] = { GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_DEPTH_SIZE, 1, - GLX_STEREO, - None }; int scrnum; XSetWindowAttributes attr; unsigned long mask; @@ -427,22 +378,9 @@ make_window( Display *dpy, const char *name, scrnum = DefaultScreen( dpy ); root = RootWindow( dpy, scrnum ); - if (fullscreen) { - x = 0; y = 0; - width = DisplayWidth( dpy, scrnum ); - height = DisplayHeight( dpy, scrnum ); - } - - if (stereo) - visinfo = glXChooseVisual( dpy, scrnum, stereoAttribs ); - else - visinfo = glXChooseVisual( dpy, scrnum, attribs ); + visinfo = glXChooseVisual( dpy, scrnum, attribs ); if (!visinfo) { - if (stereo) { - printf("Error: couldn't get an RGB, " - "Double-buffered, Stereo visual\n"); - } else - printf("Error: couldn't get an RGB, Double-buffered visual\n"); + printf("Error: couldn't get an RGB, Double-buffered visual\n"); exit(1); } @@ -451,7 +389,7 @@ make_window( Display *dpy, const char *name, attr.border_pixel = 0; attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; - attr.override_redirect = fullscreen; + attr.override_redirect = 0; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect; win = XCreateWindow( dpy, root, x, y, width, height, @@ -479,10 +417,9 @@ static void event_loop(Display *dpy) { Window win; - make_window(dpy, "glxgears", 0, 0, 300, 300, &win); + make_window(dpy, "glxgears", 0, 0, WinWidth, WinHeight, &win); XMapWindow(dpy, win); - while (1) { while (XPending(dpy) > 0) { XEvent event; @@ -492,34 +429,35 @@ event_loop(Display *dpy) /* we'll redraw below */ break; case ConfigureNotify: - reshape(event.xconfigure.width, event.xconfigure.height); + WinWidth = event.xconfigure.width; + WinHeight = event.xconfigure.height; break; case KeyPress: - { - char buffer[10]; - int r, code; - code = XLookupKeysym(&event.xkey, 0); - if (code == XK_Left) { - view_roty += 5.0; - } - else if (code == XK_Right) { - view_roty -= 5.0; - } - else if (code == XK_Up) { - view_rotx += 5.0; - } - else if (code == XK_Down) { - view_rotx -= 5.0; - } - else { - r = XLookupString(&event.xkey, buffer, sizeof(buffer), - NULL, NULL); - if (buffer[0] == 27) { - /* escape */ - return; - } - } - } + { + char buffer[10]; + int r, code; + code = XLookupKeysym(&event.xkey, 0); + if (code == XK_Left) { + view_roty += 5.0; + } + else if (code == XK_Right) { + view_roty -= 5.0; + } + else if (code == XK_Up) { + view_rotx += 5.0; + } + else if (code == XK_Down) { + view_rotx -= 5.0; + } + else { + r = XLookupString(&event.xkey, buffer, sizeof(buffer), + NULL, NULL); + if (buffer[0] == 27) { + /* escape */ + return; + } + } + } } } @@ -550,9 +488,12 @@ event_loop(Display *dpy) printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps); tRate0 = t; - + + /* Destroy window and create new one */ XDestroyWindow(dpy, win); - make_window(dpy, "glxgears", (int)(fps * 100) % 100, (int)(fps * 100) % 100, 300, 300, &win); + make_window(dpy, "glxgears", + (int)(fps * 100) % 100, (int)(fps * 100) % 100, /* x,y */ + WinWidth, WinHeight, &win); XMapWindow(dpy, win); frames = 0; @@ -562,7 +503,6 @@ event_loop(Display *dpy) } - int main(int argc, char *argv[]) { @@ -579,12 +519,6 @@ main(int argc, char *argv[]) else if (strcmp(argv[i], "-info") == 0) { printInfo = GL_TRUE; } - else if (strcmp(argv[i], "-stereo") == 0) { - stereo = GL_TRUE; - } - else if (strcmp(argv[i], "-fullscreen") == 0) { - fullscreen = GL_TRUE; - } else printf("Warrning: unknown parameter: %s\n", argv[i]); } @@ -596,7 +530,6 @@ main(int argc, char *argv[]) return -1; } - if (printInfo) { printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); @@ -604,7 +537,6 @@ main(int argc, char *argv[]) printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS)); } - event_loop(dpy); XCloseDisplay(dpy); |