Re: GdkGLPixmap troubles
- From: Jean Bréfort <jean brefort normalesup org>
- To: Lindley M French <lfrench1 gmu edu>
- Cc: gtkglext-list gnome org, gtk-list gnome org
- Subject: Re: GdkGLPixmap troubles
- Date: Wed, 26 Aug 2009 23:01:59 +0200
Exporting a GL view is just a nightmare. Things seem to depend upon the
used driver. The solutioin I use can be seen at
http://svn.savannah.gnu.org/viewvc/trunk/gchemutils/libs/gcu/glview.cc?annotate=1098&root=gchemutils
starting from line 368. Not sure it works in all cases.
Regards,
Jean
Le mercredi 26 août 2009 à 15:59 -0400, Lindley M French a écrit :
> 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
> >
> _______________________________________________
> gtk-list mailing list
> gtk-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-list
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]