[GtkGLExt] GdkGLPixmap troubles
- From: Lindley M French <lfrench1 gmu edu>
- To: gtk-list gnome org
- Cc: gtkglext-list gnome org
- Subject: [GtkGLExt] GdkGLPixmap troubles
- Date: Wed, 26 Aug 2009 14:46:58 -0400
I'm trying to allow an offscreen render to a pixmap to occur now, instead of trying to force an expose event while a window is offscreen like I was before.
I've looked over the example code in pixmap.c that comes with GtkGLExt, but my adaptation of it isn't working.
My configure-event handler:
gboolean reshapeGL(GtkWidget *widget, GdkEventConfigure *evnt, gpointer data)
{
GUIWindow* me = (GUIWindow*)data;
GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
assert(pthread_equal(me->mainthread, pthread_self()));
fprintf(stderr,"reshaping window %d, %d %d %d %d\n",me->window_id,evnt->x,evnt->y,evnt->width,evnt->height);
if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
return FALSE;
me->lock();
me->xviewport = evnt->x;
me->widthvp = evnt->width;
me->yviewport = evnt->y;
me->heightvp = evnt->height;
glViewport(me->xviewport,me->yviewport,me->widthvp,me->heightvp);
me->unlock();
gdk_gl_drawable_gl_end (gldrawable);
if (me->osPixmap)
g_object_unref(me->osPixmap);
if (me->osContext)
gdk_gl_context_destroy(me->osContext);
me->osPixmap = gdk_pixmap_new (widget->window,
widget->allocation.width,
widget->allocation.height,
-1);
GdkGLConfig *glconfig = gdk_gl_config_new_by_mode (
GdkGLConfigMode(GDK_GL_MODE_RGB |
GDK_GL_MODE_SINGLE));
GdkGLDrawable *osDrawable = GDK_GL_DRAWABLE (
gdk_pixmap_set_gl_capability (me->osPixmap,
glconfig,
NULL));
me->osContext = gdk_gl_context_new (osDrawable,
glcontext,
FALSE,
GDK_GL_RGBA_TYPE);
return FALSE;
}
That all works fine so far as I can tell. There may be some issues with when exactly I'm supposed to unref something; the whole reference counting scheme is less than well-documented. However, I'm not concerned about that for now.
I also have this function, which is not linked to any particular event:
gboolean doTakeScreenshot(gpointer data)
{
GUIWindow *me = (GUIWindow *)data;
assert(pthread_equal(me->mainthread, pthread_self()));
me->lock();
GdkGLDrawable *osDrawable = GDK_GL_DRAWABLE(me->osPixmap);
if (!osDrawable || !me->osContext)
{
fprintf(stderr, "Warning, no offscreen pixbuf configured in aeGraphWindow::doTakeScreenshot.\n");
me->signal(&me->screenshot_complete);
me->unlock();
return FALSE;
}
if (!gdk_gl_drawable_gl_begin (osDrawable, me->osContext))
{
me->signal(&me->screenshot_complete);
me->unlock();
return FALSE;
}
// OPENGL DRAWING HERE
gdk_gl_drawable_wait_gl(osDrawable);
glReadBuffer(GL_FRONT);
glReadPixels(me->xviewport,me->yviewport,me->widthvp,me->heightvp,
GL_RGBA,GL_UNSIGNED_BYTE,me->screenshot_dest->data[0]);
me->signal(&me->screenshot_complete);
me->unlock();
gdk_gl_drawable_gl_end (osDrawable);
return FALSE;
}
It appears that gdk_gl_drawable_gl_begin() is failing here. What could cause that? Both the context and drawable being passed are valid pointers. However, I did notice that gdk_gl_context_get_gl_drawable(me->osContext) returned NULL, which I thought was odd.
I'm not positive that my glReadPixels() is valid either, but I want to get past this hurdle before worrying about that one.
Any ideas?
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]