Date: Mon, 18 May 2009 23:10:32 -0400
From: Braden McDaniel braden endoframe com>
Subject: Re: [GtkGLExt] reparenting a GtkDrawingArea with OpenGL
To: gtkglext-list gnome org
Message-ID:
Content-Type: text/plain
On Fri, 2009-05-15 at 14:40 -0600, Jeff Eberl wrote:
I have a window with two GtkDrawingArea's. One is a map and one is a
picture, I'm trying to swap the two windows with the click of a
button. Surrounding each drawing is a bunch of buttons and things.
This is how I reparent them:
gtk_widget_ref(map_widget);
gtk_widget_ref(pic_widget);
gtk_container_remove(left_
container, map_widget);
gtk_container_remove(right_container, pic_widget);
gtk_container_add(left_container, pic_widget);
gtk_container_add(right_container, map_widget);
gtk_widget_unref(map_widget);
gtk_widget_unref(pic_widget);
The buttons, the boxes, and everything in the widgets swaps out, but
the next time I try to draw in either of them, the
gdk_gl_drawable_gl_begin fails:
GdkGKExt-CRITICAL **: gdk_gl_window_impl_x11_make_context_current:
assertion 'GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext)' failed
So, that's a bummer. I didn't write the code I'm using to instantiate
the widgets, or draw the pic/map. I'm wondering if maybe the problem
is that the "realize" event gets called twice, but all the gdk setup
stuff is actually in a different method, one that doesn't get called
twice. The realize callback doesn't really have anything in it.
Hm... Is it getting unrealized? If that happens, and it isn't getting
realized again, that may explain the behavior you're observing.
To debug this, you'd need to track the lifetime of the GdkGLDrawable
that's supposed to be handed off to gdk_gl_drawable_begin; obviously
it's invalid by the time it's getting there. A stack trace should give
you some starting points for places to put breakpoints.
--
Braden McDaniel braden endoframe com>
After a lot of print statements, and some new callbacks, I've discoveredhalf of the problem.I was keeping the gtkContext* around, and it's been invalidated. So asimple call to gtk_widget_get_gl_context fixed that.I connected to the realize and unrealize signals, and the remove callsunrealize, and the add calls realize. But there is another problem, theglLists and glTextures seem to be getting invalidated. Looking at thegears code, it looks like the realize creates a new list (glGenList) butthere's no where that the list gets deleted. Does this mean the gearsapp is leaking video resources? Or is it getting cleaned up somewhere? For now, I'm going to delete all lists and textures in the unrealizeevent, and create them again in the realize event. I'm hoping this isoverkill, and someone knows how to fix, or revalidate the lists/textureswithout completely reallocating them.Jeff
|