From: Andy Spencer Date: Tue, 15 Nov 2011 09:03:06 +0000 (+0000) Subject: Revert "Switch from GtkGLExt to internal OpenGL handling" X-Git-Url: http://pileus.org/git/?p=grits;a=commitdiff_plain;h=b45085a627ceb0a99418a18121e1b70d8abe32ac Revert "Switch from GtkGLExt to internal OpenGL handling" This reverts commit 07448c519e963bae1cfde4f1ff353478dd28136c. Conflicts: src/Makefile.am src/gtkgl.c src/plugins/Makefile.am src/plugins/test.c --- diff --git a/configure.ac b/configure.ac index 363d30f..70aeff9 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ GTK_DOC_CHECK(1.9) # Check for required packages PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.14 gobject-2.0 gthread-2.0) PKG_CHECK_MODULES(CAIRO, cairo) -PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.16) +PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.16 gtkglext-1.0) PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.26) # Check for glut for example plugin @@ -45,17 +45,6 @@ fi AM_CONDITIONAL([WIN32], test "$WIN32" = "yes") AM_CONDITIONAL([NOTWIN32], test "$WIN32" = "no") -# Configure GL flags -if test "$WIN32" = yes; then - GL_CFLAGS="" - GL_LIBS="-lglu32 -lopengl32" -else - GL_CFLAGS="" - GL_LIBS="-lGL -lGLU" -fi -AC_SUBST([GL_CFLAGS]) -AC_SUBST([GL_LIBS]) - # Output AC_CONFIG_FILES([ Makefile diff --git a/examples/plugin/teapot.c b/examples/plugin/teapot.c index 90ad2e2..ecc5628 100644 --- a/examples/plugin/teapot.c +++ b/examples/plugin/teapot.c @@ -15,8 +15,8 @@ * along with this program. If not, see . */ +#include #include -#include #include @@ -59,7 +59,7 @@ static void expose(GritsCallback *callback, GritsOpenGL *opengl, gpointer _teapo glRotatef(teapot->rotation, 1, 1, 0); glColor4f(0.9, 0.9, 0.7, 1.0); glDisable(GL_CULL_FACE); - glutSolidTeapot(2.5); + gdk_gl_draw_teapot(TRUE, 0.25); } diff --git a/src/Makefile.am b/src/Makefile.am index 18659d3..258a442 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,8 +1,8 @@ SUBDIRS = data objects . plugins AM_CFLAGS = -Wall --std=gnu99 -I$(top_srcdir)/src -AM_CPPFLAGS = $(GLIB_CFLAGS) $(GTK_CFLAGS) $(GL_CFLAGS) $(SOUP_CFLAGS) -AM_LDADD = $(GLIB_LIBS) $(GTK_LIBS) $(GL_LIBS) $(SOUP_LIBS) +AM_CPPFLAGS = $(GLIB_CFLAGS) $(GTK_CFLAGS) $(SOUP_CFLAGS) +AM_LDADD = $(GLIB_LIBS) $(GTK_LIBS) $(SOUP_LIBS) AM_LDFLAGS = -Wl,--as-needed -Wl,--no-undefined BUILT_SOURCES = grits-marshal.c grits-marshal.h @@ -35,7 +35,6 @@ libgrits_la_SOURCES = grits.h \ grits-marshal.c grits-marshal.h \ grits-util.c grits-util.h \ roam.c roam.h \ - gtkgl.c gtkgl.h \ gpqueue.c gpqueue.h libgrits_la_CPPFLAGS = $(AM_CPPFLAGS) \ -DPKGDATADIR="\"$(dots)$(datadir)/$(GRITS_SUBDIR)\"" \ @@ -48,11 +47,8 @@ libgrits_la_LDFLAGS = $(AM_LDFLAGS) \ # Demo program if WIN32 -AM_CPPFLAGS += -DUSE_WGL -AM_LDFLAGS += -mwindows -no-undefined -dots = .. -else -AM_CPPFLAGS += -DUSE_GLX +AM_LDFLAGS += -mwindows -no-undefined +dots = .. endif bin_PROGRAMS = grits-demo diff --git a/src/grits-opengl.c b/src/grits-opengl.c index 277c11e..794d776 100644 --- a/src/grits-opengl.c +++ b/src/grits-opengl.c @@ -24,7 +24,7 @@ * algorithm for updating surface mesh the planet. The only thing GritsOpenGL * can actually render on it's own is a wireframe of a sphere. * - * GritsOpenGL requires (at least) OpenGL 2.0. + * GritsOpenGL relies on #GtkGlExt and requires (at least) OpenGL 2.0. */ #include @@ -32,12 +32,12 @@ #include #include #include +#include #include #include #include "grits-opengl.h" #include "grits-util.h" -#include "gtkgl.h" #include "roam.h" // #define ROAM_DEBUG @@ -223,7 +223,8 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _ g_mutex_unlock(opengl->objects_lock); #endif - gtk_gl_end(GTK_WIDGET(opengl)); + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(opengl)); + gdk_gl_drawable_swap_buffers(gldrawable); g_debug("GritsOpenGL: on_expose - end\n"); return FALSE; @@ -342,7 +343,12 @@ static gboolean on_idle(GritsOpenGL *opengl) static void on_realize(GritsOpenGL *opengl, gpointer _) { g_debug("GritsOpenGL: on_realize"); - gtk_gl_begin(GTK_WIDGET(opengl)); + + /* Start OpenGL */ + GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(opengl)); + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(opengl)); + if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) + g_assert_not_reached(); /* Connect signals and idle functions now that opengl is fully initialized */ gtk_widget_add_events(GTK_WIDGET(opengl), GDK_KEY_PRESS_MASK); @@ -528,7 +534,19 @@ static void grits_opengl_init(GritsOpenGL *opengl) opengl->objects_lock = g_mutex_new(); opengl->sphere = roam_sphere_new(opengl); opengl->sphere_lock = g_mutex_new(); - gtk_gl_enable(GTK_WIDGET(opengl)); + + /* Set OpenGL before "realize" */ + GdkGLConfig *glconfig = gdk_gl_config_new_by_mode( + GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | + GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA); + if (!glconfig) + g_error("Failed to create glconfig"); + if (!gtk_widget_set_gl_capability(GTK_WIDGET(opengl), + glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE)) + g_error("GL lacks required capabilities"); + g_object_unref(glconfig); + + /* Finish OpenGL init after it's realized */ g_signal_connect(opengl, "realize", G_CALLBACK(on_realize), NULL); } static void grits_opengl_dispose(GObject *_opengl) diff --git a/src/grits-test.c b/src/grits-test.c index 3a44f02..52e0145 100644 --- a/src/grits-test.c +++ b/src/grits-test.c @@ -17,6 +17,7 @@ #include #include +#include #include #include "grits.h" @@ -68,6 +69,7 @@ int main(int argc, char **argv) g_thread_init(NULL); gdk_threads_init(); gtk_init(&argc, &argv); + gtk_gl_init(&argc, &argv); prefs = grits_prefs_new(NULL, NULL); plugins = grits_plugins_new(g_getenv("GRITS_PLUGIN_PATH"), prefs); diff --git a/src/grits.pc.in b/src/grits.pc.in index da0ea6a..541f222 100644 --- a/src/grits.pc.in +++ b/src/grits.pc.in @@ -6,6 +6,6 @@ includedir=@includedir@ Name: Grits Description: Grits is a Virtual Globe library Version: @VERSION@ -Requires: gmodule-2.0 gtk+-2.0 libsoup-2.4 -Libs: -L${libdir} -lgrits @GL_LIBS@ -Cflags: -I${includedir}/grits @GL_CFLAGS@ +Requires: gmodule-2.0 gtk+-2.0 gtkglext-1.0 libsoup-2.4 +Libs: -L${libdir} -lgrits +Cflags: -I${includedir}/grits diff --git a/src/gtkgl.c b/src/gtkgl.c deleted file mode 100644 index b495987..0000000 --- a/src/gtkgl.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) 2009-2011 Andy Spencer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -/*************************** - * GtkGlExt implementation * - ***************************/ -#if defined(USE_GTKGLEXT) -#include -void gtk_gl_enable(GtkWidget *widget) -{ - GdkGLConfig *glconfig = gdk_gl_config_new_by_mode( - GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | - GDK_GL_MODE_ALPHA | GDK_GL_MODE_DOUBLE); - gtk_widget_set_gl_capability(widget, - glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); -} - -void gtk_gl_begin(GtkWidget *widget) -{ - GdkGLContext *glcontext = gtk_widget_get_gl_context(widget); - GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget); - gdk_gl_drawable_gl_begin(gldrawable, glcontext); -} - -void gtk_gl_end(GtkWidget *widget) -{ - GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget); - gdk_gl_drawable_swap_buffers(gldrawable); - gdk_gl_drawable_gl_end(gldrawable); -} - -void gtk_gl_disable(GtkWidget *widget) -{ -} - - -/********************** - * X11 implementation * - **********************/ -#elif defined(USE_GLX) -#include -#include -void gtk_gl_enable(GtkWidget *widget) -{ - g_debug("GtkGl: enable"); - GdkScreen *screen = gdk_screen_get_default(); - Display *xdisplay = GDK_SCREEN_XDISPLAY(screen); - gint nscreen = GDK_SCREEN_XNUMBER(screen); - - /* Create context */ - int attribs[] = {GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_ALPHA_SIZE, 1, - GLX_DOUBLEBUFFER, - GLX_DEPTH_SIZE, 1, - None}; - XVisualInfo *xvinfo = glXChooseVisual(xdisplay, nscreen, attribs); - if (!xvinfo) - g_error("GtkGl: enable - unable to get valid OpenGL Visual"); - GLXContext context = glXCreateContext(xdisplay, xvinfo, NULL, False); - g_object_set_data(G_OBJECT(widget), "glcontext", context); - - /* Fix up colormap */ - GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid); - GdkColormap *cmap = gdk_colormap_new(visual, FALSE); - gtk_widget_set_colormap(widget, cmap); - - /* Disable GTK double buffering */ - gtk_widget_set_double_buffered(widget, FALSE); -} - -void gtk_gl_begin(GtkWidget *widget) -{ - g_debug("GtkGl: begin"); - Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget)); - Window xwindow = GDK_WINDOW_XID(gtk_widget_get_window(widget)); - GLXContext context = g_object_get_data(G_OBJECT(widget), "glcontext"); - glXMakeCurrent(xdisplay, xwindow, context); -} - -void gtk_gl_end(GtkWidget *widget) -{ - g_debug("GtkGl: end"); - Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget)); - Window xwindow = GDK_WINDOW_XID(gtk_widget_get_window(widget)); - glXSwapBuffers(xdisplay, xwindow); -} - -void gtk_gl_disable(GtkWidget *widget) -{ - g_debug("GtkGl: disable"); - Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget)); - GLXContext context = g_object_get_data(G_OBJECT(widget), "glcontext"); - glXDestroyContext(xdisplay, context); -} - - -/************************ - * Win32 implementation * - ************************/ -#elif defined(USE_WGL) -#include -#include -static void on_realize(GtkWidget *widget, gpointer _) -{ - g_debug("GtkGl: on_realize"); - gdk_window_ensure_native(gtk_widget_get_window(widget)); - gtk_widget_set_double_buffered(widget, FALSE); - - HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget)); - HDC hDC = GetDC(hwnd); - - PIXELFORMATDESCRIPTOR pfd = { - .nSize = sizeof(pfd), - .nVersion = 1, - .dwFlags = PFD_DRAW_TO_WINDOW - | PFD_SUPPORT_OPENGL - | PFD_DOUBLEBUFFER, - //.dwFlags = PFD_SUPPORT_OPENGL - // | PFD_DRAW_TO_WINDOW, - .iPixelType = PFD_TYPE_RGBA, - .cColorBits = 24, - .cAlphaBits = 8, - .cDepthBits = 32, - .iLayerType = PFD_MAIN_PLANE, - }; - int pf = ChoosePixelFormat(hDC, &pfd); - if (pf == 0) - g_error("GtkGl: ChoosePixelFormat failed"); - if (!SetPixelFormat(hDC, pf, &pfd)) - g_error("GtkGl: SetPixelFormat failed"); - HGLRC hRC = wglCreateContext(hDC); - if (hRC == NULL) - g_error("GtkGl: wglCreateContext failed"); - g_object_set_data(G_OBJECT(widget), "glcontext", hRC); -} - -void gtk_gl_enable(GtkWidget *widget) -{ - g_debug("GtkGl: enable"); - g_signal_connect(widget, "realize", G_CALLBACK(on_realize), NULL); -} - -void gtk_gl_begin(GtkWidget *widget) -{ - g_debug("GtkGl: begin"); - HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget)); - HDC hDC = GetDC(hwnd); - HGLRC hRC = g_object_get_data(G_OBJECT(widget), "glcontext"); - if (!wglMakeCurrent(hDC, hRC)) - g_error("GtkGl: wglMakeCurrent failed"); -} - -void gtk_gl_end(GtkWidget *widget) -{ - g_debug("GtkGl: end"); - HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget)); - HDC hDC = GetDC(hwnd); - if (!SwapBuffers(hDC)) - g_error("GtkGl: SwapBuffers failed"); -} - -void gtk_gl_disable(GtkWidget *widget) -{ - g_debug("GtkGl: disable"); - HGLRC hRC = g_object_get_data(G_OBJECT(widget), "glcontext"); - wglDeleteContext(hRC); -} - - - -/************************** - * Mac OSX implementation * - **************************/ -#elif defined(USE_CGL) -void gtk_gl_enable(GtkWidget *widget) -{ - CGDisplayCapture( kCGDirectMainDisplay ); - CGLPixelFormatAttribute attribs[] = - { - kCGLPFANoRecovery, - kCGLPFADoubleBuffer, - kCGLPFAFullScreen, - kCGLPFAStencilSize, ( CGLPixelFormatAttribute ) 8, - kCGLPFADisplayMask, ( CGLPixelFormatAttribute ) CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ), - ( CGLPixelFormatAttribute ) NULL - }; - - CGLPixelFormatObj pixelFormatObj; - GLint numPixelFormats; - CGLChoosePixelFormat( attribs, &pixelFormatObj, &numPixelFormats ); - - CGLCreateContext( pixelFormatObj, NULL, &contextObj ); - - CGLDestroyPixelFormat( pixelFormatObj ); - - CGLSetCurrentContext( contextObj ); - CGLSetFullScreen( contextObj ); -} - -void gtk_gl_begin(GtkWidget *widget) -{ -} - -void gtk_gl_end(GtkWidget *widget) -{ -} - -void gtk_gl_disable(GtkWidget *widget) -{ -} - - -/**************************** - * Undefined implementation * - ****************************/ -#else -#warning "Unimplemented GtkGl" -void gtk_gl_enable(GtkWidget *widget) { } -void gtk_gl_begin(GtkWidget *widget) { } -void gtk_gl_end(GtkWidget *widget) { } -void gtk_gl_disable(GtkWidget *widget) { } -#endif diff --git a/src/gtkgl.h b/src/gtkgl.h deleted file mode 100644 index 174fc76..0000000 --- a/src/gtkgl.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2011 Andy Spencer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __GTK_GL_H__ -#define __GTK_GL_H__ - -/* Call before widget is realized */ -void gtk_gl_enable(GtkWidget *widget); - -/* Call at the start of "expose" */ -void gtk_gl_begin(GtkWidget *widget); - -/* Call at the end of "expose-event" */ -void gtk_gl_end(GtkWidget *widget); - -/* Call when done to cleanup data */ -void gtk_gl_disable(GtkWidget *widget); - -#endif diff --git a/src/objects/grits-volume.c b/src/objects/grits-volume.c index 2579600..d2ec235 100644 --- a/src/objects/grits-volume.c +++ b/src/objects/grits-volume.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "grits-volume.h" /* Drawing */ diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index ff5ee2d..bcdac95 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -18,12 +18,10 @@ if WIN32 AM_LDFLAGS += -no-undefined endif -if HAVE_GLUT noinst_LTLIBRARIES = teapot.la teapot_la_SOURCES = \ $(top_srcdir)/examples/plugin/teapot.c \ $(top_srcdir)/examples/plugin/teapot.h -endif test: ( cd ../; make test ) diff --git a/src/plugins/elev.c b/src/plugins/elev.c index 383c509..2420a3e 100644 --- a/src/plugins/elev.c +++ b/src/plugins/elev.c @@ -25,6 +25,7 @@ * greyscale elevation overlay on the planets surface. */ +#include #include #include diff --git a/src/plugins/env.c b/src/plugins/env.c index cdafb5c..c69de38 100644 --- a/src/plugins/env.c +++ b/src/plugins/env.c @@ -25,6 +25,7 @@ */ #include +#include #include #include