Re: [GtkGLExt] GdkGLPixmap troubles
- From: Lindley M French <lfrench1 gmu edu>
- To: gtk-list gnome org
- Cc: gtkglext-list gnome org
- Subject: Re: [GtkGLExt] GdkGLPixmap troubles
- Date: Wed, 26 Aug 2009 15:59:40 -0400
Well, I've solve the initial issue---I was trying to cast a GdkPixmap when I should have been trying to cast a GdkGLPixmap. The bad cast warning was hidden because I'd forgotten I'd closed stderr on that program.
However, the images aren't coming out right when the "host window" isn't on-screen. This is odd, since the pixmap is supposed to be sharing lists, textures, etc with the window's context, but not otherwise related to anything on-screen.
It *looks* to me like what's getting drawn when the window is off-screen is a small part of the image, almost as if the orthographic projection were messed up; but I've checked that, it's fine. So is the viewport. So it must be something else?
----- Original Message -----
From: Lindley M French <lfrench1 gmu edu>
Date: Wednesday, August 26, 2009 2:46 pm
Subject: [GtkGLExt] GdkGLPixmap troubles
> 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?
> _______________________________________________
> gtkglext-list mailing list
> gtkglext-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtkglext-list
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]