/* * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. * (C) Copyright IBM Corporation 2003 * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include /** \file opencloseopen.c * Simple test for Mesa bug #508473. Create a window and rendering context. * Draw a single frame. Close the window, destroy the context, and close * the display. Re-open the display, create a new window and context. This * should work, but, at least as of Mesa 5.1, it segfaults. See the bug * report for more details. * * Most of the code here was lifed from various other Mesa xdemos. */ static void draw(void) { glViewport(0, 0, 300, 300); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glShadeModel(GL_FLAT); glClearColor(0.5, 0.5, 0.5, 1.0); glClear(GL_COLOR_BUFFER_BIT); /* draw blue quad */ glLoadIdentity(); glColor3f(0.3, 0.3, 1.0); glPushMatrix(); glRotatef(0, 0, 0, 1); glBegin(GL_POLYGON); glVertex2f(-0.5, -0.25); glVertex2f( 0.5, -0.25); glVertex2f( 0.5, 0.25); glVertex2f(-0.5, 0.25); glEnd(); glPopMatrix();} /* * Create an RGB, double-buffered window. * Return the window and context handles. */ static void make_window( const char * dpyName, const char *name, int x, int y, int width, int height, Display **dpyRet, Window *winRet, GLXContext *ctxRet) { int attrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, None }; int scrnum; XSetWindowAttributes attr; unsigned long mask; Window root; Window win; GLXContext ctx; XVisualInfo *visinfo; Display *dpy; dpy = XOpenDisplay(dpyName); if (!dpy) { printf("Error: couldn't open display %s\n", XDisplayName(dpyName)); exit(1); } *dpyRet = dpy; scrnum = DefaultScreen( dpy ); root = RootWindow( dpy, scrnum ); visinfo = glXChooseVisual( dpy, scrnum, attrib ); if (!visinfo) { printf("Error: couldn't get an RGB, Double-buffered visual\n"); exit(1); } /* window attributes */ attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; win = XCreateWindow( dpy, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr ); /* set hints and properties */ { XSizeHints sizehints; sizehints.x = x; sizehints.y = y; sizehints.width = width; sizehints.height = height; sizehints.flags = USSize | USPosition; XSetNormalHints(dpy, win, &sizehints); XSetStandardProperties(dpy, win, name, name, None, (char **)NULL, 0, &sizehints); } ctx = glXCreateContext( dpy, visinfo, NULL, True ); if (!ctx) { printf("Error: glXCreateContext failed\n"); exit(1); } XFree(visinfo); *winRet = win; *ctxRet = ctx; } static void destroy_window( Display *dpy, Window win, GLXContext ctx ) { glXMakeCurrent(dpy, None, NULL); glXDestroyContext(dpy, ctx); XDestroyWindow(dpy, win); XCloseDisplay(dpy); } int main(int argc, char *argv[]) { Display *dpy; Window win; GLXContext ctx; char *dpyName = NULL; int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-display") == 0) { dpyName = argv[i+1]; i++; } } printf("If this program segfaults, then Mesa bug #508473 is probably " "back.\n"); make_window(dpyName, "Open-close-open", 0, 0, 300, 300, &dpy, &win, &ctx); XMapWindow(dpy, win); glXMakeCurrent(dpy, win, ctx); draw(); glXSwapBuffers(dpy, win); sleep(2); destroy_window(dpy, win, ctx); make_window(dpyName, "Open-close-open", 0, 0, 300, 300, &dpy, &win, &ctx); XMapWindow(dpy, win); glXMakeCurrent(dpy, win, ctx); destroy_window(dpy, win, ctx); return 0; }