| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | 
							- /*
 -  * 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 <stdlib.h>
 - #include <stdio.h>
 - #include <unistd.h>
 - #include <string.h>
 - #include <X11/Xlib.h>
 - #include <GL/gl.h>
 - #include <GL/glx.h>
 - 
 - /** \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 = ":0";
 -    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;
 - }
 
 
  |