| Summary: | X error when using off-screen rendering with DRI enabled | ||
|---|---|---|---|
| Product: | DRI | Reporter: | cbeau <cbeauc> |
| Component: | General | Assignee: | Default DRI bug account <dri-devel> |
| Status: | RESOLVED INVALID | QA Contact: | |
| Severity: | normal | ||
| Priority: | high | ||
| Version: | unspecified | ||
| Hardware: | x86 (IA32) | ||
| OS: | Linux (All) | ||
| Whiteboard: | |||
| i915 platform: | i915 features: | ||
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.
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); }