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

Reply via email to