Hi, I have written a small programme using GTK+ and GtkGLExt. When "dri" is disabled, my programme runs fine. But when "dri" is enabled, my programme crashes with the following error message: myprompt> ./test_glext --sync [*** I got as far as glXMakeCurrent ***] The program 'test_glext' received an X Window System error. This probably reflects a bug in the program. The error was 'BadValue (integer parameter out of range for operation)'. (Details: serial 266 error_code 2 request_code 128 minor_code 7) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() function.) I originally suspected this could be a graphics driver problem. So I set out to try my program out on both my systems. Here is what I found: . First machine: Card: Intel 915 GM X Protocol Version 11, Revision 0, Release 7.0 Build Operating System:Linux 2.6.12-1-686 i686 Kernel: 2.6.18 Processor: one Intel Pentium M processor 2.00GHz (32 bit) with Driver "i810" + Direct Rendering ENABLED = X error with Driver "i810" + Direct Rendering DISABLED = Works . Second machine: Card: ATI Radeon 9200 PRO/SE (Rev 280) X Protocol Version 11, Revision 0, Release 7.0 Build Operating System: Linux 2.6.16-1-vserver-amd64-k8 x86_64 Kernel: 2.6.17-2-amd64 Processor: two AMD Opteron Processor 250 (64 bit) with Driver "fglrx" + Direct Rendering ENABLED = X error with Driver "ati" + Direct Rendering ENABLED = X error with Driver "ati" + Direct Rendering DISABLED = Works So it then appeared as though the problem was with DRI. I started breaking down my code to find exactly where the crash occurs and tracked it down to the function gdk_gl_drawable_gl_begin(gldrawable, glcontext) I downloaded the code for GtkGLExt to find where within this function the crash occurs. I tracked it down to the function glXMakeCurrent(xdisplay, glxpixmap, glxcontext) So it would appear that the problem is not with GtkGLExt. Which brought me back to suspecting a problem with "dri". I recently found on the DRI User Guide: http://dri.sourceforge.net/doc/DRIuserguide.html The following message: 11.2 GLX ... GLXPixmap rendering is only supported for indirect rendering contexts. This is a common OpenGL limitation. Attempting to use a direct rendering context with a GLXPixmap will result in an X protocol error. This seems highly relevant to the bug I am experiencing so if someone could give me details about this, I would greatly appreciate it. Anyways, I pasted below the code which replicates the bug. Could someone help me resolve this problem? Thanks, cbeau. /* Test programme demonstrating the crash when "dri" is enabled */ #include <stdlib.h> #include <gtk/gtk.h> #include <gtk/gtkgl.h> #include <gdk/x11/gdkglx.h> int main(int argc, char **argv) { GtkWidget *main_window, *image; GdkGLConfig *glconfig; GdkPixmap *pixmap; GdkGLPixmap *glpixmap; GdkGLContext *glcontext; GdkGLDrawable *gldrawable; GLXPixmap glxpixmap; GLXContext glxcontext; gtk_init(&argc,&argv); /* Allowing GtkGLExt to retreive its command line options */ gdk_gl_init(&argc,&argv); /* Check if the OpenGL extension is supported. */ if( gdk_gl_query_extension() == FALSE ) { g_print("OpenGL extension not supported\n"); exit(1); } /* Create new top level window. */ main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* Set the main window's title */ gtk_window_set_title(GTK_WINDOW(main_window), "Testing GdkGLExt"); /* Add the destroy even to the main window */ gtk_quit_add_destroy(1,GTK_OBJECT(main_window)); /* Connect the destroy event to gtk_main_quit */ gtk_signal_connect(GTK_OBJECT(main_window),"destroy",G_CALLBACK(gtk_main_quit),NULL); /* Create OpenGL config */ /* No double-buffer because rendering to Off-screen Pixmap */ glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGBA|GDK_GL_MODE_DEPTH); if( glconfig == NULL ) { g_print ("*** Problem with GtkGLExt.\n"); exit(1); } /* Create a GdkPixmap */ pixmap = gdk_pixmap_new(NULL,100,100,gdk_gl_config_get_depth(glconfig)); /* Set GL capability of GdkPixmap */ glpixmap = gdk_pixmap_set_gl_capability(pixmap,glconfig,NULL); /* Bind GdkPixmap to the GtkImage for display */ image = gtk_image_new_from_pixmap(pixmap,NULL); /* Get GL drawable (rendering surface) from GL-capable GdkPixmap */ gldrawable = gdk_pixmap_get_gl_drawable(pixmap); /* Create a new GL context (rendering context) from GL drawable */ glcontext = gdk_gl_context_new(gldrawable,NULL,TRUE,GDK_GL_RGBA_TYPE); /* Add GtkImage to which the GdkPixmap is attached to main_window */ gtk_container_add(GTK_CONTAINER(main_window),image); gtk_widget_show_all(main_window); /* The code below is from the gl_begin function of gtkglext */ /* as defined in gdk/x11/gdkglpixmap-x11.c (with slight modifs) */ glxpixmap = GDK_GL_PIXMAP_GLXPIXMAP(glpixmap); glxcontext = GDK_GL_CONTEXT_GLXCONTEXT(glcontext); Display* xdisplay = GDK_GL_CONFIG_XDISPLAY(glconfig); /* This crashes if DRI enabled but works if DRI disabled */ fprintf( stderr, "[*** I got as far as glXMakeCurrent ***]\n" ); glXMakeCurrent(xdisplay,glxpixmap,glxcontext); fprintf( stderr, "[*** I survived glXMakeCurrent ***]\n" ); gtk_main(); return(0); }
cbeau Do you still experience this issue with newer soft ? Please check the status of your issue.
Hi, Freedesktop's Bugzilla instance is EOLed and open bugs are about to be migrated to http://gitlab.freedesktop.org. To avoid migrating out of date bugs, I am now closing all the bugs that did not see any activity in the past year. If the issue is still happening, please create a new bug in the relevant project at https://gitlab.freedesktop.org/drm (use misc by default). Sorry about the noise!
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.