Hello Stéphane, I've applied your Patch against git mesa from yesterday. It also results in the same SEGFAULT running simple from the gtkglext examples. (see backtrace below, in st_visual_to_context_mode(..) visual is not initialized properly).
When I try pure mesa git from yesterday, no SEGFAULT occurs but the gem_object leak occurs with the modified simple.c. (Running the attached modified simple.c from the gtkglext examples for 2 minutes results in 500 MB object bytes) Thread [1] 15321 (Suspended : Signal : SIGSEGV:Segmentation fault) st_visual_to_context_mode() at st_manager.c:310 0xb63fdd20 st_framebuffer_create() at st_manager.c:436 0xb63fe4a9 st_api_make_current() at st_manager.c:729 0xb63fe586 dri_make_current() at dri_context.c:194 0xb636e79f driBindContext() at dri_util.c:196 0xb636a4f9 dri2_bind_context() at dri2_glx.c:151 0xb7476950 MakeContextCurrent() at glxcurrent.c:275 0xb744f63b glXMakeCurrent() at glxcurrent.c:294 0xb744f753 gdk_gl_window_impl_x11_make_context_current() at gdkglwindow-x11.c:250 0xb7fc483e gdk_gl_drawable_gl_begin() at gdkgldrawable.c:143 0xb7fa284d configure_event() at simple.c:83 0x80496c2 _gtk_marshal_BOOLEAN__BOXED() at gtkmarshalers.c:84 0xb7c19d40 IA__g_closure_invoke() at gclosure.c:767 0xb72ee2bb signal_emit_unlocked_R() at gsignal.c:3.244 0xb72ff61d IA__g_signal_emit_valist() at gsignal.c:2.987 0xb730092f IA__g_signal_emit() at gsignal.c:3.034 0xb7300c49 gtk_widget_event_internal() at gtkwidget.c:4.761 0xb7d29134 gtk_drawing_area_send_configure() at gtkdrawingarea.c:148 0xb7b96b50 gtk_drawing_area_realize() at gtkdrawingarea.c:110 0xb7b96d47 IA__g_cclosure_marshal_VOID__VOID() at gmarshal.c:77 0xb72fb82b <...more frames...> Von: marc...@google.com [mailto:marc...@google.com] Im Auftrag von Stéphane Marchesin Gesendet: Donnerstag, 16. Juni 2011 19:29 An: Lampersperger Andreas Cc: mesa-dev@lists.freedesktop.org Betreff: Re: [Mesa-dev] leak of gem_objects on intel i965 On Thu, Jun 16, 2011 at 02:05, Lampersperger Andreas <lampersperger.andr...@heidenhain.de<mailto:lampersperger.andr...@heidenhain.de>> wrote: Hello Stéphane, your are right, I forgot to attach, here it is... Erm, you miss half the patch in there... Can you try with my patch on git mesa instead? Stéphane </PRE><p> ------------------------------------------------------------------------------------------------------ <br> Registergericht: Traunstein / Registry Court: HRB 275 - Sitz / Head Office: Traunreut <br> Aufsichtsratsvorsitzender / Chairman of Supervisory Board: Rainer Burkhard <br> Geschäftsführung / Management Board: Thomas Sesselmann (Vorsitzender / Chairman),<br> Michael Grimm, Matthias Fauser, Sebastian Tondorf<br><br> <a href="http://www.heidenhain.de/disclaimer" target="_blank">E-Mail Haftungsausschluss / E-Mail Disclaimer</a><br><pre>
/* * simple.c: * Simple GtkGLExt example. * * written by Naofumi Yasufuku <naof...@users.sourceforge.net> */ #include <stdlib.h> #include <gtk/gtk.h> #include <gdk/gdkx.h> #include <gtk/gtkgl.h> #ifdef G_OS_WIN32 #define WIN32_LEAN_AND_MEAN 1 #include <windows.h> #endif #include <GL/gl.h> #include <GL/glu.h> #include <X11/Xlib.h> static void realize (GtkWidget *widget, gpointer data) { if (!GTK_WIDGET_REALIZED(widget)) gtk_widget_realize(widget); GdkGLContext *glcontext = gtk_widget_get_gl_context (widget); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget); GLUquadricObj *qobj; static GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0}; static GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; /*** OpenGL BEGIN ***/ if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext)) return; qobj = gluNewQuadric (); gluQuadricDrawStyle (qobj, GLU_FILL); glNewList (1, GL_COMPILE); gluSphere (qobj, 1.0, 20, 20); glEndList (); glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv (GL_LIGHT0, GL_POSITION, light_position); glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); glEnable (GL_DEPTH_TEST); glClearColor (1.0, 1.0, 1.0, 1.0); glClearDepth (1.0); glViewport (0, 0, widget->allocation.width, widget->allocation.height); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (40.0, 1.0, 1.0, 10.0); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); gluLookAt (0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef (0.0, 0.0, -3.0); gdk_gl_drawable_gl_end (gldrawable); /*** OpenGL END ***/ } static gboolean configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer data) { GdkGLContext *glcontext = gtk_widget_get_gl_context (widget); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget); printf("configure_event gl_context %p \n", glcontext); /*** OpenGL BEGIN ***/ if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext)) return FALSE; glViewport (0, 0, widget->allocation.width, widget->allocation.height); gdk_gl_drawable_gl_end (gldrawable); /*** OpenGL END ***/ return TRUE; } static gboolean expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data) { GdkGLContext *glcontext = gtk_widget_get_gl_context (widget); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget); /*** OpenGL BEGIN ***/ if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext)) return FALSE; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glCallList (1); if (gdk_gl_drawable_is_double_buffered (gldrawable)) gdk_gl_drawable_swap_buffers (gldrawable); else glFlush (); gdk_gl_drawable_gl_end (gldrawable); /*** OpenGL END ***/ return TRUE; } static int TAKT=50; static guint timeout_id = 0; static GtkWidget *window = NULL; static void timeout_add (GtkWidget *widget); static void timeout_remove (GtkWidget *widget); static GtkWidget *vbox = NULL; static GtkWidget *drawing_area = NULL; static GtkWidget *tempPlug = NULL; static gboolean timeout (GtkWidget *widget) { static int is_unmapped = 0; timeout_remove(widget); if (is_unmapped == 0) { GdkGLContext *glcontext = gtk_widget_get_gl_context (drawing_area); printf("map out --- gl_context %p \n", glcontext); gtk_widget_reparent(drawing_area, tempPlug); is_unmapped = 1; } else { printf("map in ---- gl_context \n"); gtk_widget_reparent(drawing_area, vbox); gtk_widget_show(drawing_area); gtk_widget_realize(drawing_area); is_unmapped = 0; } timeout_add (widget); return TRUE; } static void timeout_remove (GtkWidget *widget) { if (timeout_id != 0) { g_source_remove (timeout_id); timeout_id = 0; } } static void timeout_add (GtkWidget *widget) { if (timeout_id == 0) { timeout_id = g_timeout_add (TAKT, (GSourceFunc) timeout, window); } } int main (int argc, char *argv[]) { GdkGLConfig *glconfig; gint major, minor; GtkWidget *button; /* * Init GTK. */ gtk_init (&argc, &argv); if (argc > 1) { if (atoi(argv[1]) > 0) TAKT = atoi(argv[1]); } XSynchronize(GDK_DISPLAY(), True); /* * Init GtkGLExt. */ gtk_gl_init (&argc, &argv); /* * Query OpenGL extension version. */ gdk_gl_query_version (&major, &minor); g_print ("\nOpenGL extension version - %d.%d\n", major, minor); /* * Configure OpenGL-capable visual. */ /* Try double-buffered visual */ glconfig = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE); if (glconfig == NULL) { g_print ("*** Cannot find the double-buffered visual.\n"); g_print ("*** Trying single-buffered visual.\n"); /* Try single-buffered visual */ glconfig = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH); if (glconfig == NULL) { g_print ("*** No appropriate OpenGL-capable visual found.\n"); exit (1); } } //examine_gl_config_attrib (glconfig); /* * Top-level window. */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "simple"); /* Get automatically redrawn if any of their children changed allocation. */ gtk_container_set_reallocate_redraws (GTK_CONTAINER (window), TRUE); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL); /* * VBox. */ vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); /* * Drawing area for drawing OpenGL scene. */ drawing_area = gtk_drawing_area_new (); gtk_widget_set_size_request (drawing_area, 200, 200); /* Set OpenGL-capability to the widget. */ gtk_widget_set_gl_capability (drawing_area, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); g_signal_connect_after (G_OBJECT (drawing_area), "realize", G_CALLBACK (realize), NULL); g_signal_connect (G_OBJECT (drawing_area), "configure_event", G_CALLBACK (configure_event), NULL); g_signal_connect (G_OBJECT (drawing_area), "expose_event", G_CALLBACK (expose_event), NULL); gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0); gtk_widget_show (drawing_area); /* * Simple quit button. */ button = gtk_button_new_with_label ("Quit"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (gtk_main_quit), NULL); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); if (! tempPlug) tempPlug = gtk_plug_new(0); /* * Show window. */ gtk_widget_show (window); timeout_add (window); /* * Main loop. */ gtk_main (); return 0; }
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev