Revision: 281 http://trac.macosforge.org/projects/xquartz/changeset/281 Author: gstaplin@apple.com Date: 2009-03-03 16:13:42 -0800 (Tue, 03 Mar 2009) Log Message: ----------- Add an improved version of the surface test. This version destroys the window between: glXMakeCurrent(dpy, None, ctx); and glXMakeCurrent(dpy, mainwin, ctx); It seems to be leaking in the client here, but leaks is reporting 0 leaks, which would seem to indicate we have a list or similar data structure that isn't being delinked. Modified Paths: -------------- AppleSGLX/trunk/tests/tests.mk AppleSGLX/trunk/tests/triangle_glx/triangle_glx.mk Added Paths: ----------- AppleSGLX/trunk/tests/triangle_glx/triangle_glx_surface-2.c Modified: AppleSGLX/trunk/tests/tests.mk =================================================================== --- AppleSGLX/trunk/tests/tests.mk 2009-03-03 20:22:24 UTC (rev 280) +++ AppleSGLX/trunk/tests/tests.mk 2009-03-04 00:13:42 UTC (rev 281) @@ -32,5 +32,7 @@ $(TEST_BUILD_DIR)/glxpixmap_destroy_invalid \ $(TEST_BUILD_DIR)/multisample_glx \ $(TEST_BUILD_DIR)/glthreads \ - $(TEST_BUILD_DIR)/triangle_glx_surface + $(TEST_BUILD_DIR)/triangle_glx_surface \ + $(TEST_BUILD_DIR)/triangle_glx_surface-2 + Modified: AppleSGLX/trunk/tests/triangle_glx/triangle_glx.mk =================================================================== --- AppleSGLX/trunk/tests/triangle_glx/triangle_glx.mk 2009-03-03 20:22:24 UTC (rev 280) +++ AppleSGLX/trunk/tests/triangle_glx/triangle_glx.mk 2009-03-04 00:13:42 UTC (rev 281) @@ -3,3 +3,6 @@ $(TEST_BUILD_DIR)/triangle_glx_surface: tests/triangle_glx/triangle_glx_surface.c $(LIBGL) $(CC) tests/triangle_glx/triangle_glx_surface.c -Iinclude -o $(TEST_BUILD_DIR)/triangle_glx_surface $(LINK_TEST) + +$(TEST_BUILD_DIR)/triangle_glx_surface-2: tests/triangle_glx/triangle_glx_surface-2.c $(LIBGL) + $(CC) tests/triangle_glx/triangle_glx_surface-2.c -Iinclude -o $(TEST_BUILD_DIR)/triangle_glx_surface-2 $(LINK_TEST) Added: AppleSGLX/trunk/tests/triangle_glx/triangle_glx_surface-2.c =================================================================== --- AppleSGLX/trunk/tests/triangle_glx/triangle_glx_surface-2.c (rev 0) +++ AppleSGLX/trunk/tests/triangle_glx/triangle_glx_surface-2.c 2009-03-04 00:13:42 UTC (rev 281) @@ -0,0 +1,132 @@ +#include <stdio.h> +#include <stdlib.h> +#include <X11/Xlib.h> +#include <GL/glx.h> + +Window mainwin; +GLXContext ctx; +Window root, win; +XVisualInfo *visinfo; +XSetWindowAttributes attr; + +void draw(Display *dpy, Window w) { + printf("draw window 0x%lx\n", w); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); + glColor3f(0.5f, 0.5f, 1.0f); + glBegin(GL_TRIANGLES); + glVertex3f( 0.0f, 1.0f, 0.0f); + glVertex3f(-1.0f,-1.0f, 0.0f); + glVertex3f( 1.0f,-1.0f, 0.0f); + glEnd(); + glXSwapBuffers(dpy, w); +} + +void resize(Display *dpy, Window w, int width, int height) { + glViewport(0, 0, width, height); + draw(dpy, w); +} + +void event_loop(Display *dpy) { + XEvent event; + + while(1) { + if(XPending(dpy) > 0) { + XNextEvent(dpy, &event); + + switch(event.type) { + case Expose: + draw(dpy, mainwin); + break; + + case ConfigureNotify: + resize(dpy, mainwin, event.xconfigure.width, + event.xconfigure.height); + break; + } + } + + draw(dpy, mainwin); + /* This should destroy the surface. */ + glXMakeCurrent(dpy, None, ctx); + + XSync(dpy, False); + + printf("destroying mainwin 0x%lx\n", mainwin); + XDestroyWindow(dpy, mainwin); + + mainwin = XCreateWindow(dpy, root, /*x*/ 0, /*y*/ 0, + /*width*/ 400, /*height*/ 400, + 0, visinfo->depth, InputOutput, + visinfo->visual, + CWBackPixel | CWBorderPixel + | CWColormap | CWEventMask, + &attr); + + printf("created mainwin 0x%lx\n", mainwin); + + /* This should recreate the surface. */ + glXMakeCurrent(dpy, mainwin, ctx); + } +} + +int main() { + Display *dpy; + int attrib[] = { GLX_RGBA, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 24, + GLX_DOUBLEBUFFER, + None }; + int eventbase, errorbase; + int screen; + + dpy = XOpenDisplay(NULL); + + if(NULL == dpy) { + fprintf(stderr, "error: unable to open display!\n"); + return EXIT_FAILURE; + } + + if(!glXQueryExtension(dpy, &eventbase, &errorbase)) { + fprintf(stderr, "GLX is not available!\n"); + return EXIT_FAILURE; + } + + screen = DefaultScreen(dpy); + root = RootWindow(dpy, screen); + + visinfo = glXChooseVisual(dpy, screen, attrib); + + if(!visinfo) { + fprintf(stderr, "error: couldn't get an RGBA, double-buffered visual!\n"); + return EXIT_FAILURE; + } + + attr.background_pixel = 0; + attr.border_pixel = 0; + attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone); + attr.event_mask = StructureNotifyMask | ExposureMask; + + mainwin = win = XCreateWindow(dpy, root, /*x*/ 0, /*y*/ 0, + /*width*/ 400, /*height*/ 400, + 0, visinfo->depth, InputOutput, + visinfo->visual, + CWBackPixel | CWBorderPixel | CWColormap | CWEventMask, + &attr); + + ctx = glXCreateContext(dpy, visinfo, NULL, True ); + if(!ctx) { + fprintf(stderr, "error: glXCreateContext failed!\n"); + return EXIT_FAILURE; + } + + XMapWindow(dpy, win); + + glXMakeCurrent(dpy, win, ctx); + + event_loop(dpy); + + return EXIT_SUCCESS; +}
participants (1)
-
source_changes@macosforge.org