Re: [GtkGLExt] GdkGLPixmap troubles



Okay, this is really odd.

I figured out why the on-screen case was working, that was just a remnant of my old code. But the GdkGLPixmap approach still isn't behaving itself. See the below code, with this inserted at the "OPENGL DRAWING HERE" point:

glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1,0,0);
glBegin(GL_LINES);
glVertex2d(me->ortho.x,me->ortho.y+me->ortho.height);
glVertex2d(me->ortho.x+me->ortho.width,me->ortho.y);
glEnd();

Obviously, this should draw a simple red line diagonally from one corner of the image to the other, since I'm using the same values for the vertexes as I did for the glOrtho() call.

However, the attached image is what comes out. One corner right, the other....not. *Something* fishy is going on....

----- Original Message -----
From: Lindley M French <lfrench1 gmu edu>
Date: Wednesday, August 26, 2009 3:59 pm
Subject: Re: [GtkGLExt] GdkGLPixmap troubles

> 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
> > 
> _______________________________________________
> gtkglext-list mailing list
> gtkglext-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtkglext-list
> 

Attachment: test1.png
Description: PNG image



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]