Update of /cvsroot/openvrml/openvrml/lib/gtkglext/gdk/x11 In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7146/lib/gtkglext/gdk/x11 Added Files: Tag: OpenVRML-0_16-BRANCH .cvsignore Makefile.am gdkglconfig-x11.c gdkglconfig-x11.h gdkglcontext-x11.c gdkglcontext-x11.h gdkgldrawable-x11.c gdkglfont-x11.c gdkglglxext.c gdkglglxext.h gdkgloverlay-x11.c gdkgloverlay-x11.h gdkglpixmap-x11.c gdkglpixmap-x11.h gdkglprivate-x11.h gdkglquery-x11.c gdkglwindow-x11.c gdkglwindow-x11.h gdkglx.h Log Message: Build/package the GtkPlug application separately from the Mozilla plug-in. The Mozilla plug-in is just one possible client for this application. --- NEW FILE: .cvsignore --- Makefile.in --- NEW FILE: gdkglpixmap-x11.c --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include <string.h> #include "gdkglx.h" #include "gdkglprivate-x11.h" #include "gdkglconfig-x11.h" #include "gdkglcontext-x11.h" #include "gdkglpixmap-x11.h" static gboolean gdk_gl_pixmap_impl_x11_make_context_current (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext); static gboolean gdk_gl_pixmap_impl_x11_is_double_buffered (GdkGLDrawable *gldrawable); static void gdk_gl_pixmap_impl_x11_swap_buffers (GdkGLDrawable *gldrawable); /* static gboolean gdk_gl_pixmap_impl_x11_gl_begin (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext); */ static void gdk_gl_pixmap_impl_x11_gl_end (GdkGLDrawable *gldrawable); static GdkGLConfig *gdk_gl_pixmap_impl_x11_get_gl_config (GdkGLDrawable *gldrawable); static void gdk_gl_pixmap_impl_x11_class_init (GdkGLPixmapImplX11Class *klass); static void gdk_gl_pixmap_impl_x11_finalize (GObject *object); static void gdk_gl_pixmap_impl_x11_gl_drawable_interface_init (GdkGLDrawableClass *iface); static gpointer parent_class = NULL; GType gdk_gl_pixmap_impl_x11_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo type_info = { sizeof (GdkGLPixmapImplX11Class), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gdk_gl_pixmap_impl_x11_class_init, (GClassFinalizeFunc) NULL, NULL, /* class_data */ sizeof (GdkGLPixmapImplX11), 0, /* n_preallocs */ (GInstanceInitFunc) NULL }; static const GInterfaceInfo gl_drawable_interface_info = { (GInterfaceInitFunc) gdk_gl_pixmap_impl_x11_gl_drawable_interface_init, (GInterfaceFinalizeFunc) NULL, NULL /* interface_data */ }; type = g_type_register_static (GDK_TYPE_GL_PIXMAP, "GdkGLPixmapImplX11", &type_info, 0); g_type_add_interface_static (type, GDK_TYPE_GL_DRAWABLE, &gl_drawable_interface_info); } return type; } static void gdk_gl_pixmap_impl_x11_class_init (GdkGLPixmapImplX11Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GDK_GL_NOTE_FUNC_PRIVATE (); parent_class = g_type_class_peek_parent (klass); object_class->finalize = gdk_gl_pixmap_impl_x11_finalize; } void _gdk_gl_pixmap_destroy (GdkGLPixmap *glpixmap) { GdkGLPixmapImplX11 *impl = GDK_GL_PIXMAP_IMPL_X11 (glpixmap); Display *xdisplay; GDK_GL_NOTE_FUNC_PRIVATE (); if (impl->is_destroyed) return; xdisplay = GDK_GL_CONFIG_XDISPLAY (impl->glconfig); if (impl->glxpixmap == glXGetCurrentDrawable ()) { glXWaitGL (); GDK_GL_NOTE_FUNC_IMPL ("glXMakeCurrent"); glXMakeCurrent (xdisplay, None, NULL); } GDK_GL_NOTE_FUNC_IMPL ("glXDestroyGLXPixmap"); glXDestroyGLXPixmap (xdisplay, impl->glxpixmap); impl->glxpixmap = None; impl->is_destroyed = TRUE; } static void gdk_gl_pixmap_impl_x11_finalize (GObject *object) { GdkGLPixmapImplX11 *impl = GDK_GL_PIXMAP_IMPL_X11 (object); GDK_GL_NOTE_FUNC_PRIVATE (); _gdk_gl_pixmap_destroy (GDK_GL_PIXMAP (object)); g_object_unref (G_OBJECT (impl->glconfig)); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gdk_gl_pixmap_impl_x11_gl_drawable_interface_init (GdkGLDrawableClass *iface) { GDK_GL_NOTE_FUNC_PRIVATE (); iface->create_new_context = _gdk_x11_gl_context_new; iface->make_context_current = gdk_gl_pixmap_impl_x11_make_context_current; iface->is_double_buffered = gdk_gl_pixmap_impl_x11_is_double_buffered; iface->swap_buffers = gdk_gl_pixmap_impl_x11_swap_buffers; iface->wait_gl = _gdk_gl_drawable_impl_x11_wait_gl; iface->wait_gdk = _gdk_gl_drawable_impl_x11_wait_gdk; iface->gl_begin = gdk_gl_pixmap_impl_x11_make_context_current; iface->gl_end = gdk_gl_pixmap_impl_x11_gl_end; iface->get_gl_config = gdk_gl_pixmap_impl_x11_get_gl_config; iface->get_size = _gdk_gl_pixmap_get_size; } /** * gdk_gl_pixmap_new: * @glconfig: a #GdkGLConfig. * @pixmap: the #GdkPixmap to be used as the rendering area. * @attrib_list: this must be set to NULL or empty (first attribute of None). * * Creates an off-screen rendering area. * attrib_list is currently unused. This must be set to NULL or empty * (first attribute of None). See GLX 1.3 spec. * * Return value: the new #GdkGLPixmap. **/ GdkGLPixmap * gdk_gl_pixmap_new (GdkGLConfig *glconfig, GdkPixmap *pixmap, const int *attrib_list) { GdkGLPixmap *glpixmap; GdkGLPixmapImplX11 *impl; Display *xdisplay; XVisualInfo *xvinfo; Pixmap xpixmap; GLXPixmap glxpixmap; Window root_return; int x_return, y_return; unsigned int width_return, height_return; unsigned int border_width_return; unsigned int depth_return; GdkGL_GLX_MESA_pixmap_colormap *mesa_ext; GDK_GL_NOTE_FUNC (); g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_X11 (glconfig), NULL); g_return_val_if_fail (GDK_IS_PIXMAP (pixmap), NULL); xdisplay = GDK_GL_CONFIG_XDISPLAY (glconfig); xvinfo = GDK_GL_CONFIG_XVINFO (glconfig); /* * Get X Pixmap. */ xpixmap = GDK_DRAWABLE_XID (GDK_DRAWABLE (pixmap)); /* * Check depth of the X pixmap. */ if (!XGetGeometry (xdisplay, xpixmap, &root_return, &x_return, &y_return, &width_return, &height_return, &border_width_return, &depth_return)) return NULL; if (depth_return != (unsigned int) xvinfo->depth) return NULL; /* * Create GLXPixmap. */ mesa_ext = gdk_gl_get_GLX_MESA_pixmap_colormap (glconfig); if (mesa_ext) { /* If GLX_MESA_pixmap_colormap is supported. */ GDK_GL_NOTE_FUNC_IMPL ("glXCreateGLXPixmapMESA"); glxpixmap = mesa_ext->glXCreateGLXPixmapMESA (xdisplay, xvinfo, xpixmap, GDK_GL_CONFIG_XCOLORMAP (glconfig)); } else { GDK_GL_NOTE_FUNC_IMPL ("glXCreateGLXPixmap"); glxpixmap = glXCreateGLXPixmap (xdisplay, xvinfo, xpixmap); } if (glxpixmap == None) return NULL; /* * Instantiate the GdkGLPixmapImplX11 object. */ glpixmap = g_object_new (GDK_TYPE_GL_PIXMAP_IMPL_X11, NULL); impl = GDK_GL_PIXMAP_IMPL_X11 (glpixmap); glpixmap->drawable = GDK_DRAWABLE (pixmap); g_object_add_weak_pointer (G_OBJECT (glpixmap->drawable), (gpointer *) &(glpixmap->drawable)); impl->glxpixmap = glxpixmap; impl->glconfig = glconfig; g_object_ref (G_OBJECT (impl->glconfig)); impl->is_destroyed = FALSE; return glpixmap; } static gboolean gdk_gl_pixmap_impl_x11_make_context_current (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext) { GdkGLConfig *glconfig; GLXPixmap glxpixmap; GLXContext glxcontext; g_return_val_if_fail (GDK_IS_GL_PIXMAP_IMPL_X11 (draw), FALSE); g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), FALSE); glconfig = GDK_GL_PIXMAP_IMPL_X11 (draw)->glconfig; glxpixmap = GDK_GL_PIXMAP_IMPL_X11 (draw)->glxpixmap; glxcontext = GDK_GL_CONTEXT_GLXCONTEXT (glcontext); if (glxpixmap == None || glxcontext == NULL) return FALSE; #ifdef GDKGLEXT_MULTIHEAD_SUPPORT GDK_GL_NOTE (MISC, g_message (" -- Pixmap: screen number = %d", GDK_SCREEN_XNUMBER (gdk_drawable_get_screen (GDK_DRAWABLE (draw))))); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ GDK_GL_NOTE (MISC, g_message (" -- Pixmap: visual id = 0x%lx", GDK_VISUAL_XVISUAL (gdk_drawable_get_visual (GDK_DRAWABLE (draw)))->visualid)); GDK_GL_NOTE_FUNC_IMPL ("glXMakeCurrent"); if (!glXMakeCurrent (GDK_GL_CONFIG_XDISPLAY (glconfig), glxpixmap, glxcontext)) { g_warning ("glXMakeCurrent() failed"); _gdk_gl_context_set_gl_drawable (glcontext, NULL); /* currently unused. */ /* _gdk_gl_context_set_gl_drawable_read (glcontext, NULL); */ return FALSE; } _gdk_gl_context_set_gl_drawable (glcontext, draw); /* currently unused. */ /* _gdk_gl_context_set_gl_drawable_read (glcontext, read); */ if (_GDK_GL_CONFIG_AS_SINGLE_MODE (glconfig)) { /* We do this because we are treating a double-buffered frame buffer as a single-buffered frame buffer because the system does not appear to export any suitable single-buffered visuals (in which the following are necessary). */ glDrawBuffer (GL_FRONT); glReadBuffer (GL_FRONT); } GDK_GL_NOTE (MISC, _gdk_gl_print_gl_info ()); return TRUE; } static gboolean gdk_gl_pixmap_impl_x11_is_double_buffered (GdkGLDrawable *gldrawable) { g_return_val_if_fail (GDK_IS_GL_PIXMAP_IMPL_X11 (gldrawable), FALSE); return gdk_gl_config_is_double_buffered (GDK_GL_PIXMAP_IMPL_X11 (gldrawable)->glconfig); } static void gdk_gl_pixmap_impl_x11_swap_buffers (GdkGLDrawable *gldrawable) { Display *xdisplay; GLXPixmap glxpixmap; g_return_if_fail (GDK_IS_GL_PIXMAP_IMPL_X11 (gldrawable)); xdisplay = GDK_GL_CONFIG_XDISPLAY (GDK_GL_PIXMAP_IMPL_X11 (gldrawable)->glconfig); glxpixmap = GDK_GL_PIXMAP_IMPL_X11 (gldrawable)->glxpixmap; if (glxpixmap == None) return; GDK_GL_NOTE_FUNC_IMPL ("glXSwapBuffers"); glXSwapBuffers (xdisplay, glxpixmap); } /* static gboolean gdk_gl_pixmap_impl_x11_gl_begin (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext) { return gdk_gl_pixmap_impl_x11_make_context_current (draw, read, glcontext); } */ static void gdk_gl_pixmap_impl_x11_gl_end (GdkGLDrawable *gldrawable) { /* do nothing */ } static GdkGLConfig * gdk_gl_pixmap_impl_x11_get_gl_config (GdkGLDrawable *gldrawable) { g_return_val_if_fail (GDK_IS_GL_PIXMAP_IMPL_X11 (gldrawable), NULL); return GDK_GL_PIXMAP_IMPL_X11 (gldrawable)->glconfig; } /** * gdk_x11_gl_pixmap_get_glxpixmap: * @glpixmap: a #GdkGLPixmap. * * Gets GLXPixmap. * * Return value: the GLXPixmap. **/ GLXPixmap gdk_x11_gl_pixmap_get_glxpixmap (GdkGLPixmap *glpixmap) { g_return_val_if_fail (GDK_IS_GL_PIXMAP_IMPL_X11 (glpixmap), None); return GDK_GL_PIXMAP_IMPL_X11 (glpixmap)->glxpixmap; } --- NEW FILE: gdkglcontext-x11.c --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include <gdk/gdk.h> /* for gdk_error_trap_(push|pop) () */ #include "gdkglx.h" #include "gdkglprivate-x11.h" #include "gdkgldrawable.h" #include "gdkglconfig-x11.h" #include "gdkglcontext-x11.h" static void gdk_gl_context_insert (GdkGLContext *glcontext); static void gdk_gl_context_remove (GdkGLContext *glcontext); static GdkGLContext *gdk_gl_context_lookup (GLXContext glxcontext); static guint gdk_gl_context_hash (GLXContext *glxcontext); static gboolean gdk_gl_context_equal (GLXContext *a, GLXContext *b); static void gdk_gl_context_impl_x11_class_init (GdkGLContextImplX11Class *klass); static void gdk_gl_context_impl_x11_finalize (GObject *object); static gpointer parent_class = NULL; GType gdk_gl_context_impl_x11_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo type_info = { sizeof (GdkGLContextImplX11Class), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gdk_gl_context_impl_x11_class_init, (GClassFinalizeFunc) NULL, NULL, /* class_data */ sizeof (GdkGLContextImplX11), 0, /* n_preallocs */ (GInstanceInitFunc) NULL }; type = g_type_register_static (GDK_TYPE_GL_CONTEXT, "GdkGLContextImplX11", &type_info, 0); } return type; } static void gdk_gl_context_impl_x11_class_init (GdkGLContextImplX11Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GDK_GL_NOTE_FUNC_PRIVATE (); parent_class = g_type_class_peek_parent (klass); object_class->finalize = gdk_gl_context_impl_x11_finalize; } void _gdk_gl_context_destroy (GdkGLContext *glcontext) { GdkGLContextImplX11 *impl = GDK_GL_CONTEXT_IMPL_X11 (glcontext); Display *xdisplay; GDK_GL_NOTE_FUNC_PRIVATE (); if (impl->is_destroyed) return; gdk_gl_context_remove (glcontext); xdisplay = GDK_GL_CONFIG_XDISPLAY (impl->glconfig); if (impl->glxcontext == glXGetCurrentContext ()) { glXWaitGL (); GDK_GL_NOTE_FUNC_IMPL ("glXMakeCurrent"); glXMakeCurrent (xdisplay, None, NULL); } if (!impl->is_foreign) { GDK_GL_NOTE_FUNC_IMPL ("glXDestroyContext"); glXDestroyContext (xdisplay, impl->glxcontext); impl->glxcontext = NULL; } if (impl->gldrawable != NULL) { g_object_remove_weak_pointer (G_OBJECT (impl->gldrawable), (gpointer *) &(impl->gldrawable)); impl->gldrawable = NULL; } /* currently unused. */ /* if (impl->gldrawable_read != NULL) { g_object_remove_weak_pointer (G_OBJECT (impl->gldrawable_read), (gpointer *) &(impl->gldrawable_read)); impl->gldrawable_read = NULL; } */ impl->is_destroyed = TRUE; } static void gdk_gl_context_impl_x11_finalize (GObject *object) { GdkGLContextImplX11 *impl = GDK_GL_CONTEXT_IMPL_X11 (object); GDK_GL_NOTE_FUNC_PRIVATE (); _gdk_gl_context_destroy (GDK_GL_CONTEXT (object)); g_object_unref (G_OBJECT (impl->glconfig)); if (impl->share_list != NULL) g_object_unref (G_OBJECT (impl->share_list)); G_OBJECT_CLASS (parent_class)->finalize (object); } static GdkGLContext * gdk_gl_context_new_common (GdkGLConfig *glconfig, GdkGLContext *share_list, int render_type, GLXContext glxcontext, gboolean is_foreign) { GdkGLContext *glcontext; GdkGLContextImplX11 *impl; Display *xdisplay; GDK_GL_NOTE_FUNC_PRIVATE (); /* * Instantiate the GdkGLContextImplX11 object. */ glcontext = g_object_new (GDK_TYPE_GL_CONTEXT_IMPL_X11, NULL); impl = GDK_GL_CONTEXT_IMPL_X11 (glcontext); impl->glxcontext = glxcontext; if (share_list != NULL && GDK_IS_GL_CONTEXT (share_list)) { impl->share_list = share_list; g_object_ref (G_OBJECT (impl->share_list)); } else { impl->share_list = NULL; } xdisplay = GDK_GL_CONFIG_XDISPLAY (glconfig); impl->is_direct = glXIsDirect (xdisplay, glxcontext) ? TRUE : FALSE; impl->render_type = render_type; impl->glconfig = glconfig; g_object_ref (G_OBJECT (impl->glconfig)); impl->gldrawable = NULL; impl->gldrawable_read = NULL; impl->is_foreign = is_foreign; impl->is_destroyed = FALSE; /* * Insert into the GL context hash table. */ gdk_gl_context_insert (glcontext); return glcontext; } /*< private >*/ GdkGLContext * _gdk_x11_gl_context_new (GdkGLDrawable *gldrawable, GdkGLContext *share_list, gboolean direct, int render_type) { GdkGLConfig *glconfig; GdkGLContextImplX11 *share_impl = NULL; GLXContext share_glxcontext = NULL; Display *xdisplay; XVisualInfo *xvinfo; GLXContext glxcontext; GDK_GL_NOTE_FUNC_PRIVATE (); /* * Create an OpenGL rendering context. */ glconfig = gdk_gl_drawable_get_gl_config (gldrawable); xdisplay = GDK_GL_CONFIG_XDISPLAY (glconfig); xvinfo = GDK_GL_CONFIG_XVINFO (glconfig); if (share_list != NULL && GDK_IS_GL_CONTEXT (share_list)) { share_impl = GDK_GL_CONTEXT_IMPL_X11 (share_list); share_glxcontext = share_impl->glxcontext; } GDK_GL_NOTE_FUNC_IMPL ("glXCreateContext"); if (_gdk_gl_context_force_indirect) { GDK_GL_NOTE (MISC, g_message (" -- Force indirect")); glxcontext = glXCreateContext (xdisplay, xvinfo, share_glxcontext, False); } else { glxcontext = glXCreateContext (xdisplay, xvinfo, share_glxcontext, (direct == TRUE) ? True : False); } if (glxcontext == NULL) return NULL; GDK_GL_NOTE (MISC, g_message (" -- Context: screen number = %d", xvinfo->screen)); GDK_GL_NOTE (MISC, g_message (" -- Context: visual id = 0x%lx", xvinfo->visualid)); /* * Instantiate the GdkGLContextImplX11 object. */ return gdk_gl_context_new_common (glconfig, share_list, render_type, glxcontext, FALSE); } /** * gdk_x11_gl_context_foreign_new: * @glconfig: #GdkGLConfig that represents the visual the GLXContext uses. * @share_list: the #GdkGLContext which shares display lists with the * GLXContext, or NULL. * @glxcontext: exsisting GLXContext. * * Creates #GdkGLContext from existing GLXContext. * * Return value: the newly-created #GdkGLContext wrapper. **/ GdkGLContext * gdk_x11_gl_context_foreign_new (GdkGLConfig *glconfig, GdkGLContext *share_list, GLXContext glxcontext) { GDK_GL_NOTE_FUNC (); g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_X11 (glconfig), NULL); g_return_val_if_fail (glxcontext != NULL, NULL); /* * Instantiate the GdkGLContextImplX11 object. */ return gdk_gl_context_new_common (glconfig, share_list, (glconfig->is_rgba) ? GDK_GL_RGBA_TYPE : GDK_GL_COLOR_INDEX_TYPE, glxcontext, TRUE); } /** * gdk_gl_context_copy: * @glcontext: a #GdkGLContext. * @src: the source context. * @mask: which portions of @src state are to be copied to @glcontext. * * Copy state from @src rendering context to @glcontext. * * @mask contains the bitwise-OR of the same symbolic names that are passed to * the glPushAttrib() function. You can use GL_ALL_ATTRIB_BITS to copy all the * rendering state information. * * Return value: FALSE if it fails, TRUE otherwise. **/ gboolean gdk_gl_context_copy (GdkGLContext *glcontext, GdkGLContext *src, unsigned long mask) { GLXContext dst_glxcontext, src_glxcontext; GdkGLConfig *glconfig; GDK_GL_NOTE_FUNC (); g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), FALSE); g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (src), FALSE); dst_glxcontext = GDK_GL_CONTEXT_GLXCONTEXT (glcontext); if (dst_glxcontext == NULL) return FALSE; src_glxcontext = GDK_GL_CONTEXT_GLXCONTEXT (src); if (src_glxcontext == NULL) return FALSE; glconfig = GDK_GL_CONTEXT_IMPL_X11 (glcontext)->glconfig; gdk_error_trap_push (); glXCopyContext (GDK_GL_CONFIG_XDISPLAY (glconfig), src_glxcontext, dst_glxcontext, mask); return gdk_error_trap_pop () == Success; } /*< private >*/ void _gdk_gl_context_set_gl_drawable (GdkGLContext *glcontext, GdkGLDrawable *gldrawable) { GdkGLContextImplX11 *impl = GDK_GL_CONTEXT_IMPL_X11 (glcontext); GDK_GL_NOTE_FUNC_PRIVATE (); if (impl->gldrawable == gldrawable) return; if (impl->gldrawable != NULL) { g_object_remove_weak_pointer (G_OBJECT (impl->gldrawable), (gpointer *) &(impl->gldrawable)); impl->gldrawable = NULL; } if (gldrawable != NULL && GDK_IS_GL_DRAWABLE (gldrawable)) { impl->gldrawable = gldrawable; g_object_add_weak_pointer (G_OBJECT (impl->gldrawable), (gpointer *) &(impl->gldrawable)); } } /*< private >*/ /* currently unused. */ /* void _gdk_gl_context_set_gl_drawable_read (GdkGLContext *glcontext, GdkGLDrawable *gldrawable_read) { GdkGLContextImplX11 *impl = GDK_GL_CONTEXT_IMPL_X11 (glcontext); GDK_GL_NOTE_FUNC_PRIVATE (); if (impl->gldrawable_read == gldrawable_read) return; if (impl->gldrawable_read != NULL) { g_object_remove_weak_pointer (G_OBJECT (impl->gldrawable_read), (gpointer *) &(impl->gldrawable_read)); impl->gldrawable_read = NULL; } if (gldrawable_read != NULL && GDK_IS_GL_DRAWABLE (gldrawable_read)) { impl->gldrawable_read = gldrawable_read; g_object_add_weak_pointer (G_OBJECT (impl->gldrawable_read), (gpointer *) &(impl->gldrawable_read)); } } */ /** * gdk_gl_context_get_gl_drawable: * @glcontext: a #GdkGLContext. * * Gets #GdkGLDrawable to which the @glcontext is bound. * * Return value: the #GdkGLDrawable or NULL if no #GdkGLDrawable is bound. **/ GdkGLDrawable * gdk_gl_context_get_gl_drawable (GdkGLContext *glcontext) { g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), NULL); return GDK_GL_CONTEXT_IMPL_X11 (glcontext)->gldrawable; } /** * gdk_gl_context_get_gl_config: * @glcontext: a #GdkGLContext. * * Gets #GdkGLConfig with which the @glcontext is configured. * * Return value: the #GdkGLConfig. **/ GdkGLConfig * gdk_gl_context_get_gl_config (GdkGLContext *glcontext) { g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), NULL); return GDK_GL_CONTEXT_IMPL_X11 (glcontext)->glconfig; } /** * gdk_gl_context_get_share_list: * @glcontext: a #GdkGLContext. * * Gets #GdkGLContext with which the @glcontext shares the display lists and * texture objects. * * Return value: the #GdkGLContext. **/ GdkGLContext * gdk_gl_context_get_share_list (GdkGLContext *glcontext) { g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), NULL); return GDK_GL_CONTEXT_IMPL_X11 (glcontext)->share_list; } /** * gdk_gl_context_is_direct: * @glcontext: a #GdkGLContext. * * Returns whether the @glcontext is a direct rendering context. * * Return value: TRUE if the @glcontext is a direct rendering contest. **/ gboolean gdk_gl_context_is_direct (GdkGLContext *glcontext) { g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), FALSE); return GDK_GL_CONTEXT_IMPL_X11 (glcontext)->is_direct; } /** * gdk_gl_context_get_render_type: * @glcontext: a #GdkGLContext. * * Gets render_type of the @glcontext. * * Return value: GDK_GL_RGBA_TYPE or GDK_GL_COLOR_INDEX_TYPE. **/ int gdk_gl_context_get_render_type (GdkGLContext *glcontext) { g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), 0); return GDK_GL_CONTEXT_IMPL_X11 (glcontext)->render_type; } /** * gdk_gl_context_get_current: * * Returns the current #GdkGLContext. * * Return value: the current #GdkGLContext or NULL if there is no current * context. **/ GdkGLContext * gdk_gl_context_get_current (void) { static GdkGLContext *current = NULL; GLXContext glxcontext; GDK_GL_NOTE_FUNC (); glxcontext = glXGetCurrentContext (); if (glxcontext == NULL) return NULL; if (current && GDK_GL_CONTEXT_GLXCONTEXT (current) == glxcontext) return current; current = gdk_gl_context_lookup (glxcontext); return current; } /** * gdk_x11_gl_context_get_glxcontext: * @glcontext: a #GdkGLContext. * * Gets GLXContext. * * Return value: the GLXContext. **/ GLXContext gdk_x11_gl_context_get_glxcontext (GdkGLContext *glcontext) { g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), NULL); return GDK_GL_CONTEXT_IMPL_X11 (glcontext)->glxcontext; } /* * GdkGLContext hash table. */ static GHashTable *gl_context_ht = NULL; static void gdk_gl_context_insert (GdkGLContext *glcontext) { GdkGLContextImplX11 *impl; GDK_GL_NOTE_FUNC_PRIVATE (); if (gl_context_ht == NULL) { GDK_GL_NOTE (MISC, g_message (" -- Create GL context hash table.")); gl_context_ht = g_hash_table_new ((GHashFunc) gdk_gl_context_hash, (GEqualFunc) gdk_gl_context_equal); } impl = GDK_GL_CONTEXT_IMPL_X11 (glcontext); g_hash_table_insert (gl_context_ht, &(impl->glxcontext), glcontext); } static void gdk_gl_context_remove (GdkGLContext *glcontext) { GdkGLContextImplX11 *impl; GDK_GL_NOTE_FUNC_PRIVATE (); if (gl_context_ht == NULL) return; impl = GDK_GL_CONTEXT_IMPL_X11 (glcontext); g_hash_table_remove (gl_context_ht, &(impl->glxcontext)); if (g_hash_table_size (gl_context_ht) == 0) { GDK_GL_NOTE (MISC, g_message (" -- Destroy GL context hash table.")); g_hash_table_destroy (gl_context_ht); gl_context_ht = NULL; } } static GdkGLContext * gdk_gl_context_lookup (GLXContext glxcontext) { GDK_GL_NOTE_FUNC_PRIVATE (); if (gl_context_ht == NULL) return NULL; return g_hash_table_lookup (gl_context_ht, &glxcontext); } static guint gdk_gl_context_hash (GLXContext *glxcontext) { return (guint) *glxcontext; } static gboolean gdk_gl_context_equal (GLXContext *a, GLXContext *b) { return (*a == *b); } --- NEW FILE: gdkglconfig-x11.h --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef __GDK_GL_CONFIG_X11_H__ #define __GDK_GL_CONFIG_X11_H__ #include <gdk/gdkglconfig.h> #include <gdk/x11/gdkglx.h> G_BEGIN_DECLS typedef struct _GdkGLConfigImplX11 GdkGLConfigImplX11; typedef struct _GdkGLConfigImplX11Class GdkGLConfigImplX11Class; #define GDK_TYPE_GL_CONFIG_IMPL_X11 (gdk_gl_config_impl_x11_get_type ()) #define GDK_GL_CONFIG_IMPL_X11(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GL_CONFIG_IMPL_X11, GdkGLConfigImplX11)) #define GDK_GL_CONFIG_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GL_CONFIG_IMPL_X11, GdkGLConfigImplX11Class)) #define GDK_IS_GL_CONFIG_IMPL_X11(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GL_CONFIG_IMPL_X11)) #define GDK_IS_GL_CONFIG_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GL_CONFIG_IMPL_X11)) #define GDK_GL_CONFIG_IMPL_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GL_CONFIG_IMPL_X11, GdkGLConfigImplX11Class)) struct _GdkGLConfigImplX11 { GdkGLConfig parent_instance; Display *xdisplay; int screen_num; XVisualInfo *xvinfo; GdkScreen *screen; GdkColormap *colormap; guint is_mesa_glx : 1; }; struct _GdkGLConfigImplX11Class { GdkGLConfigClass parent_class; }; GType gdk_gl_config_impl_x11_get_type (void); G_END_DECLS #endif /* __GDK_GL_CONFIG_X11_H__ */ --- NEW FILE: gdkgloverlay-x11.h --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef __GDK_GL_OVERLAY_X11_H__ #define __GDK_GL_OVERLAY_X11_H__ #include <gdk/x11/gdkglx.h> G_BEGIN_DECLS typedef enum { GDK_GL_OVERLAY_TRANSPARENT_NONE, GDK_GL_OVERLAY_TRANSPARENT_PIXEL, GDK_GL_OVERLAY_TRANSPARENT_MASK } GdkGLOverlayTransparentType; typedef struct _GdkGLOverlayInfo GdkGLOverlayInfo; struct _GdkGLOverlayInfo { GdkVisual *visual; GdkGLOverlayTransparentType transparent_type; guint32 value; gint32 layer; }; /* private at present... */ gboolean _gdk_x11_gl_overlay_get_info (GdkVisual *visual, GdkGLOverlayInfo *overlay_info); G_END_DECLS #endif /* __GDK_GL_OVERLAY_X11_H__ */ --- NEW FILE: gdkglwindow-x11.h --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef __GDK_GL_WINDOW_X11_H__ #define __GDK_GL_WINDOW_X11_H__ #include <gdk/gdkglwindow.h> #include <gdk/x11/gdkglx.h> G_BEGIN_DECLS typedef struct _GdkGLWindowImplX11 GdkGLWindowImplX11; typedef struct _GdkGLWindowImplX11Class GdkGLWindowImplX11Class; #define GDK_TYPE_GL_WINDOW_IMPL_X11 (gdk_gl_window_impl_x11_get_type ()) #define GDK_GL_WINDOW_IMPL_X11(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GL_WINDOW_IMPL_X11, GdkGLWindowImplX11)) #define GDK_GL_WINDOW_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GL_WINDOW_IMPL_X11, GdkGLWindowImplX11Class)) #define GDK_IS_GL_WINDOW_IMPL_X11(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GL_WINDOW_IMPL_X11)) #define GDK_IS_GL_WINDOW_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GL_WINDOW_IMPL_X11)) #define GDK_GL_WINDOW_IMPL_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GL_WINDOW_IMPL_X11, GdkGLWindowImplX11Class)) struct _GdkGLWindowImplX11 { GdkGLWindow parent_instance; /* GLXWindow glxwindow; */ Window glxwindow; GdkGLConfig *glconfig; guint is_destroyed : 1; }; struct _GdkGLWindowImplX11Class { GdkGLWindowClass parent_class; }; GType gdk_gl_window_impl_x11_get_type (void); G_END_DECLS #endif /* __GDK_GL_WINDOW_X11_H__ */ --- NEW FILE: gdkglpixmap-x11.h --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef __GDK_GL_PIXMAP_X11_H__ #define __GDK_GL_PIXMAP_X11_H__ #include <gdk/gdkglpixmap.h> #include <gdk/x11/gdkglx.h> G_BEGIN_DECLS typedef struct _GdkGLPixmapImplX11 GdkGLPixmapImplX11; typedef struct _GdkGLPixmapImplX11Class GdkGLPixmapImplX11Class; #define GDK_TYPE_GL_PIXMAP_IMPL_X11 (gdk_gl_pixmap_impl_x11_get_type ()) #define GDK_GL_PIXMAP_IMPL_X11(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GL_PIXMAP_IMPL_X11, GdkGLPixmapImplX11)) #define GDK_GL_PIXMAP_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GL_PIXMAP_IMPL_X11, GdkGLPixmapImplX11Class)) #define GDK_IS_GL_PIXMAP_IMPL_X11(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GL_PIXMAP_IMPL_X11)) #define GDK_IS_GL_PIXMAP_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GL_PIXMAP_IMPL_X11)) #define GDK_GL_PIXMAP_IMPL_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GL_PIXMAP_IMPL_X11, GdkGLPixmapImplX11Class)) struct _GdkGLPixmapImplX11 { GdkGLPixmap parent_instance; GLXPixmap glxpixmap; GdkGLConfig *glconfig; guint is_destroyed : 1; }; struct _GdkGLPixmapImplX11Class { GdkGLPixmapClass parent_class; }; GType gdk_gl_pixmap_impl_x11_get_type (void); G_END_DECLS #endif /* __GDK_GL_PIXMAP_X11_H__ */ --- NEW FILE: gdkglwindow-x11.c --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include <string.h> #include "gdkglx.h" #include "gdkglprivate-x11.h" #include "gdkglconfig-x11.h" #include "gdkglcontext-x11.h" #include "gdkglwindow-x11.h" #include <gdk/gdkglquery.h> static gboolean gdk_gl_window_impl_x11_make_context_current (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext); static gboolean gdk_gl_window_impl_x11_is_double_buffered (GdkGLDrawable *gldrawable); static void gdk_gl_window_impl_x11_swap_buffers (GdkGLDrawable *gldrawable); /* static gboolean gdk_gl_window_impl_x11_gl_begin (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext); */ static void gdk_gl_window_impl_x11_gl_end (GdkGLDrawable *gldrawable); static GdkGLConfig *gdk_gl_window_impl_x11_get_gl_config (GdkGLDrawable *gldrawable); static void gdk_gl_window_impl_x11_class_init (GdkGLWindowImplX11Class *klass); static void gdk_gl_window_impl_x11_finalize (GObject *object); static void gdk_gl_window_impl_x11_gl_drawable_interface_init (GdkGLDrawableClass *iface); static gpointer parent_class = NULL; GType gdk_gl_window_impl_x11_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo type_info = { sizeof (GdkGLWindowImplX11Class), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gdk_gl_window_impl_x11_class_init, (GClassFinalizeFunc) NULL, NULL, /* class_data */ sizeof (GdkGLWindowImplX11), 0, /* n_preallocs */ (GInstanceInitFunc) NULL }; static const GInterfaceInfo gl_drawable_interface_info = { (GInterfaceInitFunc) gdk_gl_window_impl_x11_gl_drawable_interface_init, (GInterfaceFinalizeFunc) NULL, NULL /* interface_data */ }; type = g_type_register_static (GDK_TYPE_GL_WINDOW, "GdkGLWindowImplX11", &type_info, 0); g_type_add_interface_static (type, GDK_TYPE_GL_DRAWABLE, &gl_drawable_interface_info); } return type; } static void gdk_gl_window_impl_x11_class_init (GdkGLWindowImplX11Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GDK_GL_NOTE_FUNC_PRIVATE (); parent_class = g_type_class_peek_parent (klass); object_class->finalize = gdk_gl_window_impl_x11_finalize; } void _gdk_gl_window_destroy (GdkGLWindow *glwindow) { GdkGLWindowImplX11 *impl = GDK_GL_WINDOW_IMPL_X11 (glwindow); Display *xdisplay; GdkGL_GLX_MESA_release_buffers *mesa_ext; GDK_GL_NOTE_FUNC_PRIVATE (); if (impl->is_destroyed) return; xdisplay = GDK_GL_CONFIG_XDISPLAY (impl->glconfig); if (impl->glxwindow == glXGetCurrentDrawable ()) { glXWaitGL (); GDK_GL_NOTE_FUNC_IMPL ("glXMakeCurrent"); glXMakeCurrent (xdisplay, None, NULL); } /* If GLX_MESA_release_buffers is supported. */ mesa_ext = gdk_gl_get_GLX_MESA_release_buffers (impl->glconfig); if (mesa_ext) { GDK_GL_NOTE_FUNC_IMPL ("glXReleaseBuffersMESA"); mesa_ext->glXReleaseBuffersMESA (xdisplay, impl->glxwindow); } impl->glxwindow = None; impl->is_destroyed = TRUE; } static void gdk_gl_window_impl_x11_finalize (GObject *object) { GdkGLWindowImplX11 *impl = GDK_GL_WINDOW_IMPL_X11 (object); GDK_GL_NOTE_FUNC_PRIVATE (); _gdk_gl_window_destroy (GDK_GL_WINDOW (object)); g_object_unref (G_OBJECT (impl->glconfig)); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gdk_gl_window_impl_x11_gl_drawable_interface_init (GdkGLDrawableClass *iface) { GDK_GL_NOTE_FUNC_PRIVATE (); iface->create_new_context = _gdk_x11_gl_context_new; iface->make_context_current = gdk_gl_window_impl_x11_make_context_current; iface->is_double_buffered = gdk_gl_window_impl_x11_is_double_buffered; iface->swap_buffers = gdk_gl_window_impl_x11_swap_buffers; iface->wait_gl = _gdk_gl_drawable_impl_x11_wait_gl; iface->wait_gdk = _gdk_gl_drawable_impl_x11_wait_gdk; iface->gl_begin = gdk_gl_window_impl_x11_make_context_current; iface->gl_end = gdk_gl_window_impl_x11_gl_end; iface->get_gl_config = gdk_gl_window_impl_x11_get_gl_config; iface->get_size = _gdk_gl_window_get_size; } /* * attrib_list is currently unused. This must be set to NULL or empty * (first attribute of None). See GLX 1.3 spec. */ /** * gdk_gl_window_new: * @glconfig: a #GdkGLConfig. * @window: the #GdkWindow to be used as the rendering area. * @attrib_list: this must be set to NULL or empty (first attribute of None). * * Creates an on-screen rendering area. * attrib_list is currently unused. This must be set to NULL or empty * (first attribute of None). See GLX 1.3 spec. * * Return value: the new #GdkGLWindow. **/ GdkGLWindow * gdk_gl_window_new (GdkGLConfig *glconfig, GdkWindow *window, const int *attrib_list) { GdkGLWindow *glwindow; GdkGLWindowImplX11 *impl; /* GLXWindow glxwindow; */ Window glxwindow; GDK_GL_NOTE_FUNC (); g_return_val_if_fail (GDK_IS_GL_CONFIG_IMPL_X11 (glconfig), NULL); g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); /* * Get X Window. */ glxwindow = GDK_DRAWABLE_XID (GDK_DRAWABLE (window)); /* * Instantiate the GdkGLWindowImplX11 object. */ glwindow = g_object_new (GDK_TYPE_GL_WINDOW_IMPL_X11, NULL); impl = GDK_GL_WINDOW_IMPL_X11 (glwindow); glwindow->drawable = GDK_DRAWABLE (window); g_object_add_weak_pointer (G_OBJECT (glwindow->drawable), (gpointer *) &(glwindow->drawable)); impl->glxwindow = glxwindow; impl->glconfig = glconfig; g_object_ref (G_OBJECT (impl->glconfig)); impl->is_destroyed = FALSE; return glwindow; } static gboolean gdk_gl_window_impl_x11_make_context_current (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext) { GdkGLConfig *glconfig; Window glxwindow; GLXContext glxcontext; g_return_val_if_fail (GDK_IS_GL_WINDOW_IMPL_X11 (draw), FALSE); g_return_val_if_fail (GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext), FALSE); glconfig = GDK_GL_WINDOW_IMPL_X11 (draw)->glconfig; glxwindow = GDK_GL_WINDOW_IMPL_X11 (draw)->glxwindow; glxcontext = GDK_GL_CONTEXT_GLXCONTEXT (glcontext); if (glxwindow == None || glxcontext == NULL) return FALSE; #ifdef GDKGLEXT_MULTIHEAD_SUPPORT GDK_GL_NOTE (MISC, g_message (" -- Window: screen number = %d", GDK_SCREEN_XNUMBER (gdk_drawable_get_screen (GDK_DRAWABLE (draw))))); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ GDK_GL_NOTE (MISC, g_message (" -- Window: visual id = 0x%lx", GDK_VISUAL_XVISUAL (gdk_drawable_get_visual (GDK_DRAWABLE (draw)))->visualid)); GDK_GL_NOTE_FUNC_IMPL ("glXMakeCurrent"); if (!glXMakeCurrent (GDK_GL_CONFIG_XDISPLAY (glconfig), glxwindow, glxcontext)) { g_warning ("glXMakeCurrent() failed"); _gdk_gl_context_set_gl_drawable (glcontext, NULL); /* currently unused. */ /* _gdk_gl_context_set_gl_drawable_read (glcontext, NULL); */ return FALSE; } _gdk_gl_context_set_gl_drawable (glcontext, draw); /* currently unused. */ /* _gdk_gl_context_set_gl_drawable_read (glcontext, read); */ if (_GDK_GL_CONFIG_AS_SINGLE_MODE (glconfig)) { /* We do this because we are treating a double-buffered frame buffer as a single-buffered frame buffer because the system does not appear to export any suitable single-buffered visuals (in which the following are necessary). */ glDrawBuffer (GL_FRONT); glReadBuffer (GL_FRONT); } GDK_GL_NOTE (MISC, _gdk_gl_print_gl_info ()); return TRUE; } static gboolean gdk_gl_window_impl_x11_is_double_buffered (GdkGLDrawable *gldrawable) { g_return_val_if_fail (GDK_IS_GL_WINDOW_IMPL_X11 (gldrawable), FALSE); return gdk_gl_config_is_double_buffered (GDK_GL_WINDOW_IMPL_X11 (gldrawable)->glconfig); } static void gdk_gl_window_impl_x11_swap_buffers (GdkGLDrawable *gldrawable) { Display *xdisplay; Window glxwindow; g_return_if_fail (GDK_IS_GL_WINDOW_IMPL_X11 (gldrawable)); xdisplay = GDK_GL_CONFIG_XDISPLAY (GDK_GL_WINDOW_IMPL_X11 (gldrawable)->glconfig); glxwindow = GDK_GL_WINDOW_IMPL_X11 (gldrawable)->glxwindow; if (glxwindow == None) return; GDK_GL_NOTE_FUNC_IMPL ("glXSwapBuffers"); glXSwapBuffers (xdisplay, glxwindow); } /* static gboolean gdk_gl_window_impl_x11_gl_begin (GdkGLDrawable *draw, GdkGLDrawable *read, GdkGLContext *glcontext) { return gdk_gl_window_impl_x11_make_context_current (draw, read, glcontext); } */ static void gdk_gl_window_impl_x11_gl_end (GdkGLDrawable *gldrawable) { /* do nothing */ } static GdkGLConfig * gdk_gl_window_impl_x11_get_gl_config (GdkGLDrawable *gldrawable) { g_return_val_if_fail (GDK_IS_GL_WINDOW_IMPL_X11 (gldrawable), NULL); return GDK_GL_WINDOW_IMPL_X11 (gldrawable)->glconfig; } /** * gdk_x11_gl_window_get_glxwindow: * @glwindow: a #GdkGLWindow. * * Gets X Window. * * Return value: the Window. **/ Window gdk_x11_gl_window_get_glxwindow (GdkGLWindow *glwindow) { g_return_val_if_fail (GDK_IS_GL_WINDOW_IMPL_X11 (glwindow), None); return GDK_GL_WINDOW_IMPL_X11 (glwindow)->glxwindow; } --- NEW FILE: gdkgloverlay-x11.c --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "gdkglx.h" #include "gdkglprivate-x11.h" #include "gdkgloverlay-x11.h" #ifdef GDKGLEXT_MULTIHEAD_SUPPORT #include <gdk/gdkscreen.h> #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ #include <X11/Xmd.h> /* * SERVER_OVERLAY_VISUALS property entry format * * format: 32 * * <Name> <Type> <Description> * overlay_visual VisualID Visual ID of visual. * transparent_type CARD32 None (0). * TransparentPixel (1). * TransparentMask (2). * value CARD32 Pixel value or transparency mask. * layer INT32 The layer the visual resides in. */ /* * SOV property. * (format is 32: the returned data is represented as a long array) */ typedef struct { long overlay_visual; long transparent_type; long value; long layer; } __SOVProp; /* SOV properties data. */ typedef struct { __SOVProp *prop; unsigned long num; } __SOVPropArray; static const gchar quark_sov_props_string[] = "gdk-gl-overlay-sov-props"; static GQuark quark_sov_props = 0; static void sov_prop_array_destroy (__SOVPropArray *sov_props) { if (sov_props->prop != NULL) XFree (sov_props->prop); g_free (sov_props); } static __SOVPropArray * gdk_gl_overlay_get_sov_props (GdkScreen *screen) { __SOVPropArray *sov_props; GdkWindow *root_window; #ifdef GDKGLEXT_MULTIHEAD_SUPPORT GdkDisplay *display; #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ Display *xdisplay; Atom xa_sov; Status status; Atom actual_type; int actual_format; unsigned long nitems, bytes_after; unsigned char *prop = NULL; GDK_GL_NOTE_FUNC_PRIVATE (); #ifdef GDKGLEXT_MULTIHEAD_SUPPORT root_window = gdk_screen_get_root_window (screen); #else /* GDKGLEXT_MULTIHEAD_SUPPORT */ root_window = gdk_get_default_root_window (); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ if (quark_sov_props == 0) quark_sov_props = g_quark_from_static_string (quark_sov_props_string); sov_props = g_object_get_qdata (G_OBJECT (root_window), quark_sov_props); if (sov_props != NULL) return sov_props; sov_props = g_malloc (sizeof (__SOVPropArray)); #ifdef GDKGLEXT_MULTIHEAD_SUPPORT display = gdk_screen_get_display (screen); xdisplay = GDK_DISPLAY_XDISPLAY (display); xa_sov = gdk_x11_get_xatom_by_name_for_display (display, "SERVER_OVERLAY_VISUALS"); #else /* GDKGLEXT_MULTIHEAD_SUPPORT */ xdisplay = gdk_x11_get_default_xdisplay (); xa_sov = gdk_x11_get_xatom_by_name ("SERVER_OVERLAY_VISUALS"); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ status = XGetWindowProperty (xdisplay, GDK_WINDOW_XWINDOW (root_window), xa_sov, 0L, 1000000L, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &prop); if (status != Success || actual_type == None || actual_format != 32 || nitems < 4) { GDK_GL_NOTE (MISC, g_message (" -- SERVER_OVERLAY_VISUALS: not supported")); if (prop != NULL) XFree (prop); sov_props->prop = NULL; sov_props->num = 0; } else { GDK_GL_NOTE (MISC, g_message (" -- SERVER_OVERLAY_VISUALS: supported")); sov_props->prop = (__SOVProp *) prop; sov_props->num = nitems / (sizeof (__SOVProp) / 4); } g_object_set_qdata_full (G_OBJECT (root_window), quark_sov_props, sov_props, (GDestroyNotify) sov_prop_array_destroy); #ifdef G_ENABLE_DEBUG if (gdk_gl_debug_flags & GDK_GL_DEBUG_MISC) { #ifdef GDKGLEXT_MULTIHEAD_SUPPORT int screen_num = GDK_SCREEN_XNUMBER (screen); #else /* GDKGLEXT_MULTIHEAD_SUPPORT */ int screen_num = gdk_x11_get_default_screen (); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ int i; g_message (" -- SERVER_OVERLAY_VISUALS: properties"); g_print ("screen\tvisual\ttype\tvalue\tlayer\n"); for (i = 0; i < sov_props->num; i++) { g_print ("%d\t0x%lx\t%lu\t%lu\t%ld\n", screen_num, (VisualID) (sov_props->prop[i].overlay_visual), (CARD32) (sov_props->prop[i].transparent_type), (CARD32) (sov_props->prop[i].value), (INT32) (sov_props->prop[i].layer)); } } #endif /* G_ENABLE_DEBUG */ return sov_props; } /* private at present... */ gboolean _gdk_x11_gl_overlay_get_info (GdkVisual *visual, GdkGLOverlayInfo *overlay_info) { __SOVPropArray *sov_props; VisualID xvisualid; int i; GDK_GL_NOTE_FUNC_PRIVATE (); g_return_val_if_fail (GDK_IS_VISUAL (visual), FALSE); g_return_val_if_fail (overlay_info != NULL, FALSE); /* Get SOV properties. */ #ifdef GDKGLEXT_MULTIHEAD_SUPPORT sov_props = gdk_gl_overlay_get_sov_props (gdk_visual_get_screen (visual)); #else /* GDKGLEXT_MULTIHEAD_SUPPORT */ sov_props = gdk_gl_overlay_get_sov_props (NULL); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ /* Look up SOV property for the visual. */ xvisualid = GDK_VISUAL_XVISUAL (visual)->visualid; for (i = 0; i < sov_props->num; i++) { if ((VisualID) (sov_props->prop[i].overlay_visual) == xvisualid) { overlay_info->visual = visual; overlay_info->transparent_type = sov_props->prop[i].transparent_type; overlay_info->value = sov_props->prop[i].value; overlay_info->layer = sov_props->prop[i].layer; GDK_GL_NOTE (MISC, g_message (" -- overlay visual")); GDK_GL_NOTE (MISC, g_print ("transparent_type = %d\n", overlay_info->transparent_type)); GDK_GL_NOTE (MISC, g_print ("value = %u\n", overlay_info->value)); GDK_GL_NOTE (MISC, g_print ("layer = %d\n", overlay_info->layer)); return TRUE; } } /* meaningless */ overlay_info->visual = visual; overlay_info->transparent_type = GDK_GL_OVERLAY_TRANSPARENT_NONE; overlay_info->value = 0; overlay_info->layer = 0; GDK_GL_NOTE (MISC, g_message (" -- not overlay visual")); return FALSE; } --- NEW FILE: gdkglconfig-x11.c --- /* GdkGLExt - OpenGL Extension to GDK * Copyright (C) 2002-2004 Naofumi Yasufuku * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ #include <string.h> #include "gdkglx.h" #include "gdkglprivate-x11.h" #include "gdkgloverlay-x11.h" #include "gdkglconfig-x11.h" #ifdef GDKGLEXT_MULTIHEAD_SUPPORT #include <gdk/gdkscreen.h> #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ #ifdef HAVE_LIBXMU #include <X11/Xatom.h> /* for XA_RGB_DEFAULT_MAP atom */ #ifdef HAVE_XMU_STDCMAP_H #include <Xmu/StdCmap.h> /* for XmuLookupStandardColormap */ #else #include <X11/Xmu/StdCmap.h> /* for XmuLookupStandardColormap */ #endif #endif /* HAVE_LIBXMU */ static void gdk_gl_config_impl_x11_class_init (GdkGLConfigImplX11Class *klass); static void gdk_gl_config_impl_x11_finalize (GObject *object); static gpointer parent_class = NULL; GType gdk_gl_config_impl_x11_get_type (void) { static GType type = 0; if (!type) { static const GTypeInfo type_info = { sizeof (GdkGLConfigImplX11Class), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gdk_gl_config_impl_x11_class_init, (GClassFinalizeFunc) NULL, NULL, /* class_data */ sizeof (GdkGLConfigImplX11), 0, /* n_preallocs */ (GInstanceInitFunc) NULL, (const GTypeValueTable *) NULL }; type = g_type_register_static (GDK_TYPE_GL_CONFIG, "GdkGLConfigImplX11", &type_info, 0); } return type; } static void gdk_gl_config_impl_x11_class_init (GdkGLConfigImplX11Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GDK_GL_NOTE_FUNC_PRIVATE (); parent_class = g_type_class_peek_parent (klass); object_class->finalize = gdk_gl_config_impl_x11_finalize; } static void gdk_gl_config_impl_x11_finalize (GObject *object) { GdkGLConfigImplX11 *impl = GDK_GL_CONFIG_IMPL_X11 (object); GDK_GL_NOTE_FUNC_PRIVATE (); XFree (impl->xvinfo); g_object_unref (G_OBJECT (impl->colormap)); G_OBJECT_CLASS (parent_class)->finalize (object); } /* * Get standard RGB colormap */ #ifdef HAVE_GDK_X11_COLORMAP_FOREIGN_NEW static GdkColormap * gdk_gl_config_get_std_rgb_colormap (GdkScreen *screen, XVisualInfo *xvinfo, gboolean is_mesa_glx) { GdkDisplay *display; Display *xdisplay; int screen_num; Window xroot_window; Status status; Colormap xcolormap = None; XStandardColormap *standard_cmaps; int i, num_cmaps; GdkVisual *visual; GDK_GL_NOTE_FUNC_PRIVATE (); display = gdk_screen_get_display (screen); xdisplay = GDK_DISPLAY_XDISPLAY (display); screen_num = xvinfo->screen; xroot_window = RootWindow (xdisplay, screen_num); /* * (ripped from GLUT) * Hewlett-Packard supports a feature called "HP Color Recovery". * Mesa has code to use HP Color Recovery. For Mesa to use this feature, * the atom _HP_RGB_SMOOTH_MAP_LIST must be defined on the root window AND * the colormap obtainable by XGetRGBColormaps for that atom must be set on * the window. If that colormap is not set, the output will look stripy. */ if (is_mesa_glx && xvinfo->visual->class == TrueColor && xvinfo->depth == 8) { Atom xa_hp_cr_maps; GDK_GL_NOTE (MISC, g_message (" -- Try to find a standard RGB colormap with HP Color Recovery")); xa_hp_cr_maps = gdk_x11_get_xatom_by_name_for_display (display, "_HP_RGB_SMOOTH_MAP_LIST"); status = XGetRGBColormaps (xdisplay, xroot_window, &standard_cmaps, &num_cmaps, xa_hp_cr_maps); if (status) { for (i = 0; i < num_cmaps; i++) { if (standard_cmaps[i].visualid == xvinfo->visualid) { xcolormap = standard_cmaps[i].colormap; break; } } XFree (standard_cmaps); if (xcolormap != None) { GDK_GL_NOTE (MISC, g_message (" -- Colormap: standard RGB with HP Color Recovery")); visual = gdk_x11_screen_lookup_visual (screen, xvinfo->visualid); return gdk_x11_colormap_foreign_new (visual, xcolormap); } } } #if defined(HAVE_LIBXMU) && !defined(_DISABLE_STANDARD_RGB_CMAP) /* * (ripped from GLUT) * Solaris 2.4 and 2.5 have a bug in their XmuLookupStandardColormap * implementations. Please compile your Solaris 2.4 or 2.5 version of * GtkGLExt with -D_DISABLE_STANDARD_RGB_CMAP to work around this bug. * The symptom of the bug is that programs will get a BadMatch error * from XCreateWindow when creating a window because Solaris 2.4 and 2.5 * create a corrupted RGB_DEFAULT_MAP property. Note that this workaround * prevents colormap sharing between applications, perhaps leading * unnecessary colormap installations or colormap flashing. Sun fixed * this bug in Solaris 2.6. */ if (!_gdk_gl_config_no_standard_colormap) { GDK_GL_NOTE (MISC, g_message (" -- Try to find a standard RGB colormap")); status = XmuLookupStandardColormap (xdisplay, screen_num, xvinfo->visualid, xvinfo->depth, ... [truncated message content] |