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: [email protected] [mailto:[email protected]] Im Auftrag von Stéphane
Marchesin
Gesendet: Donnerstag, 16. Juni 2011 19:29
An: Lampersperger Andreas
Cc: [email protected]
Betreff: Re: [Mesa-dev] leak of gem_objects on intel i965
On Thu, Jun 16, 2011 at 02:05, Lampersperger Andreas
<[email protected]<mailto:[email protected]>>
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 <[email protected]>
*/
#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
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev